mm1
--- diff/Documentation/Changes	2003-10-09 09:47:33.000000000 +0100
+++ source/Documentation/Changes	2003-12-29 09:30:39.000000000 +0000
@@ -56,7 +56,7 @@
 o  e2fsprogs              1.29                    # tune2fs
 o  jfsutils               1.1.3                   # fsck.jfs -V
 o  reiserfsprogs          3.6.3                   # reiserfsck -V 2>&1|grep reiserfsprogs
-o  xfsprogs               2.1.0                   # xfs_db -V
+o  xfsprogs               2.6.0                   # xfs_db -V
 o  pcmcia-cs              3.1.21                  # cardmgr -V
 o  quota-tools            3.09                    # quota -V
 o  PPP                    2.4.0                   # pppd --version
@@ -183,9 +183,8 @@
 The latest version of xfsprogs contains mkfs.xfs, xfs_db, and the
 xfs_repair utilities, among others, for the XFS filesystem.  It is
 architecture independent and any version from 2.0.0 onward should
-work correctly with this version of the XFS kernel code.  For the new
-(v2) log format that has better support for stripe-size aligning on
-LVM and MD devices at least xfsprogs 2.1.0 is needed.
+work correctly with this version of the XFS kernel code (2.6.0 or
+later is recommended, due to some significant improvements).
 
 
 Pcmcia-cs
@@ -359,7 +358,7 @@
 
 Xfsprogs
 --------
-o  <ftp://oss.sgi.com/projects/xfs/download/cmd_tars/xfsprogs-2.1.0.src.tar.gz>
+o  <ftp://oss.sgi.com/projects/xfs/download/>
 
 Pcmcia-cs
 ---------
--- diff/Documentation/DocBook/kernel-locking.tmpl	2003-09-30 15:46:10.000000000 +0100
+++ source/Documentation/DocBook/kernel-locking.tmpl	2003-12-29 09:30:39.000000000 +0000
@@ -6,8 +6,7 @@
   
   <authorgroup>
    <author>
-    <firstname>Paul</firstname>
-    <othername>Rusty</othername>
+    <firstname>Rusty</firstname>
     <surname>Russell</surname>
     <affiliation>
      <address>
@@ -18,8 +17,8 @@
   </authorgroup>
 
   <copyright>
-   <year>2000</year>
-   <holder>Paul Russell</holder>
+   <year>2003</year>
+   <holder>Rusty Russell</holder>
   </copyright>
 
   <legalnotice>
@@ -58,16 +57,17 @@
    <para>
      Welcome, to Rusty's Remarkably Unreliable Guide to Kernel
      Locking issues.  This document describes the locking systems in
-     the Linux Kernel as we approach 2.4.
+     the Linux Kernel in 2.6.
    </para>
    <para>
-     It looks like <firstterm linkend="gloss-smp"><acronym>SMP</acronym>
-     </firstterm> is here to stay; so everyone hacking on the kernel 
-     these days needs to know the fundamentals of concurrency and locking 
-     for SMP.
+     With the wide availability of HyperThreading, and <firstterm
+     linkend="gloss-preemption">preemption </firstterm> in the Linux
+     Kernel, everyone hacking on the kernel needs to know the
+     fundamentals of concurrency and locking for
+     <firstterm linkend="gloss-smp"><acronym>SMP</acronym></firstterm>.
    </para>
 
-   <sect1 id="races">
+   <chapter id="races">
     <title>The Problem With Concurrency</title>
     <para>
       (Skip this if you know what a Race Condition is).
@@ -169,15 +169,23 @@
      </tgroup>
     </table>
 
+    <sect1 id="race-condition">
+    <title>Race Conditions and Critical Regions</title>
     <para>
-      This overlap, where what actually happens depends on the
-      relative timing of multiple tasks, is called a race condition.
+      This overlap, where the result depends on the
+      relative timing of multiple tasks, is called a <firstterm>race condition</firstterm>.
       The piece of code containing the concurrency issue is called a
-      critical region.  And especially since Linux starting running
+      <firstterm>critical region</firstterm>.  And especially since Linux starting running
       on SMP machines, they became one of the major issues in kernel
       design and implementation.
     </para>
     <para>
+      Preemption can have the same effect, even if there is only one
+      CPU: by preempting one task during the critical region, we have
+      exactly the same race condition.  In this case the thread which
+      preempts might run the critical region itself.
+    </para>
+    <para>
       The solution is to recognize when these simultaneous accesses
       occur, and use locks to make sure that only one instance can
       enter the critical region at any time.  There are many
@@ -185,10 +193,28 @@
       And then there are the unfriendly primitives, but I'll pretend
       they don't exist.
     </para>
-   </sect1>
   </chapter>
 
   <chapter id="locks">
+   <title>Locking in the Linux Kernel</title>
+
+   <para>
+     If I could give you one piece of advice: never sleep with anyone
+     crazier than yourself.  But if I had to give you advice on
+     locking: <emphasis>keep it simple</emphasis>.
+   </para>
+
+   <para>
+     Be reluctant to introduce new locks.
+   </para>
+
+   <para>
+     Strangely enough, this last one is the exact reverse of my advice when
+     you <emphasis>have</emphasis> slept with someone crazier than yourself.
+     And you should think about getting a big dog.
+   </para>
+
+   <sect1 id="lock-intro">
    <title>Two Main Types of Kernel Locks: Spinlocks and Semaphores</title>
 
    <para>
@@ -213,23 +239,32 @@
    </para>
    <para>
      Neither type of lock is recursive: see
-     <xref linkend="techniques-deadlocks">.
+     <xref linkend="deadlock">.
    </para>
+   </sect1>
  
    <sect1 id="uniprocessor">
     <title>Locks and Uniprocessor Kernels</title>
 
     <para>
-      For kernels compiled without <symbol>CONFIG_SMP</symbol>, spinlocks 
-      do not exist at all.  This is an excellent design decision: when
-      no-one else can run at the same time, there is no reason to
-      have a lock at all.
+      For kernels compiled without <symbol>CONFIG_SMP</symbol>, and
+      without <symbol>CONFIG_PREEMPT</symbol> spinlocks do not exist at
+      all.  This is an excellent design decision: when no-one else can
+      run at the same time, there is no reason to have a lock.
+    </para>
+
+    <para>
+      If the kernel is compiled without <symbol>CONFIG_SMP</symbol>,
+      but <symbol>CONFIG_PREEMPT</symbol> is set, then spinlocks
+      simply disable preemption, which is sufficient to prevent any
+      races.  For most purposes, we can think of preemption as
+      equivalent to SMP, and not worry about it separately.
     </para>
 
     <para>
       You should always test your locking code with <symbol>CONFIG_SMP</symbol>
-      enabled, even if you don't have an SMP test box, because it
-      will still catch some (simple) kinds of deadlock.
+      and <symbol>CONFIG_PREEMPT</symbol> enabled, even if you don't have an SMP test box, because it
+      will still catch some kinds of locking bugs.
     </para>
 
     <para>
@@ -239,25 +274,6 @@
     </para>
    </sect1>
 
-   <sect1 id="rwlocks">
-    <title>Read/Write Lock Variants</title>
-
-    <para>
-      Both spinlocks and semaphores have read/write variants:
-      <type>rwlock_t</type> and <structname>struct rw_semaphore</structname>. 
-      These divide users into two classes: the readers and the writers.  If 
-      you are only reading the data, you can get a read lock, but to write to 
-      the data you need the write lock.  Many people can hold a read lock,
-      but a writer must be sole holder.
-    </para>
-
-    <para>
-      This means much smoother locking if your code divides up
-      neatly along reader/writer lines.  All the discussions below
-      also apply to read/write variants.
-    </para>
-   </sect1>
-
     <sect1 id="usercontextlocking">
      <title>Locking Only In User Context</title>
 
@@ -289,17 +305,26 @@
    </sect1>
 
    <sect1 id="lock-user-bh">
-    <title>Locking Between User Context and BHs</title>
+    <title>Locking Between User Context and Softirqs</title>
 
     <para>
-      If a <firstterm linkend="gloss-bh">bottom half</firstterm> shares 
+      If a <firstterm linkend="gloss-softirq">softirq</firstterm> shares
       data with user context, you have two problems.  Firstly, the current 
-      user context can be interrupted by a bottom half, and secondly, the 
+      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 
-      used.  It disables bottom halves on that CPU, then grabs the lock.
-      <function>spin_unlock_bh()</function> does the reverse.
+      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
+      old name for software interrupts.  It should really be
+      called spin_lock_softirq()' in a perfect world).
+    </para>
+
+    <para>
+      Note that you can also use <function>spin_lock_irq()</function>
+      or <function>spin_lock_irqsave()</function> here, which stop
+      hardware interrupts as well: see <xref linkend="hardirq-context">.
     </para>
 
     <para>
@@ -307,70 +332,41 @@
       </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
-      protects you from the bottom half being run.
+      protects you from the softirq being run.
     </para>
    </sect1>
 
    <sect1 id="lock-user-tasklet">
-    <title>Locking Between User Context and Tasklets/Soft IRQs</title>
+    <title>Locking Between User Context and Tasklets</title>
 
     <para>
-      This is exactly the same as above, because
-      <function>local_bh_disable()</function> actually disables all 
-      softirqs and <firstterm linkend="gloss-tasklet">tasklets</firstterm>
-      on that CPU as well.  It should really be 
-      called `local_softirq_disable()', but the name has been preserved 
-      for historical reasons.  Similarly,
-      <function>spin_lock_bh()</function> would now be called 
-      spin_lock_softirq() in a perfect world.
+      This is exactly the same as above, because <firstterm
+      linkend="gloss-tasklet">tasklets</firstterm> are actually run
+      from a softirq.
     </para>
    </sect1>
 
-   <sect1 id="lock-bh">
-    <title>Locking Between Bottom Halves</title>
+   <sect1 id="lock-user-timers">
+    <title>Locking Between User Context and Timers</title>
 
     <para>
-      Sometimes a bottom half might want to share data with
-      another bottom half (especially remember that timers are run
-      off a bottom half).
+      This, too, is exactly the same as above, because <firstterm
+      linkend="gloss-timers">timers</firstterm> are actually run from
+      a softirq.  From a locking point of view, tasklets and timers
+      are identical.
     </para>
-
-    <sect2 id="lock-bh-same">
-     <title>The Same BH</title>
-
-     <para>
-       Since a bottom half is never run on two CPUs at once, you
-       don't need to worry about your bottom half being run twice
-       at once, even on SMP.
-     </para>
-    </sect2>
-
-    <sect2 id="lock-bh-different">
-     <title>Different BHs</title>
-
-     <para>
-       Since only one bottom half ever runs at a time once, you
-       don't need to worry about race conditions with other bottom
-       halves.  Beware that things might change under you, however,
-       if someone changes your bottom half to a tasklet.  If you
-       want to make your code future-proof, pretend you're already
-       running from a tasklet (see below), and doing the extra
-       locking.  Of course, if it's five years before that happens,
-       you're gonna look like a damn fool.
-     </para>
-    </sect2>
    </sect1>
 
    <sect1 id="lock-tasklets">
-    <title>Locking Between Tasklets</title>
+    <title>Locking Between Tasklets/Timers</title>
 
     <para>
-      Sometimes a tasklet might want to share data with another
-      tasklet, or a bottom half.
+      Sometimes a tasklet or timer might want to share data with
+      another tasklet or timer.
     </para>
 
     <sect2 id="lock-tasklets-same">
-     <title>The Same Tasklet</title>
+     <title>The Same Tasklet/Timer</title>
      <para>
        Since a tasklet is never run on two CPUs at once, you don't
        need to worry about your tasklet being reentrant (running
@@ -379,10 +375,10 @@
     </sect2>
 
     <sect2 id="lock-tasklets-different">
-     <title>Different Tasklets</title>
+     <title>Different Tasklets/Timers</title>
      <para>
-       If another tasklet (or bottom half, such as a timer) wants
-       to share data with your tasklet, you will both need to use
+       If another tasklet/timer wants
+       to share data with your tasklet or timer , you will both need to use
        <function>spin_lock()</function> and
        <function>spin_unlock()</function> calls.  
        <function>spin_lock_bh()</function> is
@@ -396,8 +392,8 @@
     <title>Locking Between Softirqs</title>
 
     <para>
-      Often a <firstterm linkend="gloss-softirq">softirq</firstterm> might 
-      want to share data with itself, a tasklet, or a bottom half.
+      Often a softirq might
+      want to share data with itself or a tasklet/timer.
     </para>
 
     <sect2 id="lock-softirqs-same">
@@ -421,10 +417,10 @@
      <title>Different Softirqs</title>
 
      <para>
-       You'll need to use <function>spin_lock()</function> and 
-       <function>spin_unlock()</function> for shared data, whether it 
-       be a timer (which can be running on a different CPU), bottom half, 
-       tasklet or the same or another softirq.
+       You'll need to use <function>spin_lock()</function> and
+       <function>spin_unlock()</function> for shared data, whether it
+       be a timer, tasklet, different softirq or the same or another
+       softirq: any of them could be running on a different CPU.
      </para>
     </sect2>
    </sect1>
@@ -434,13 +430,13 @@
    <title>Hard IRQ Context</title>
 
    <para>
-     Hardware interrupts usually communicate with a bottom half,
+     Hardware interrupts usually communicate with a
      tasklet or softirq.  Frequently this involves putting work in a
-     queue, which the BH/softirq will take out.
+     queue, which the softirq will take out.
    </para>
 
    <sect1 id="hardirq-softirq">
-    <title>Locking Between Hard IRQ and Softirqs/Tasklets/BHs</title>
+    <title>Locking Between Hard IRQ and Softirqs/Tasklets</title>
 
     <para>
       If a hardware irq handler shares data with a softirq, you have
@@ -453,6 +449,16 @@
     </para>
 
     <para>
+      The irq handler does not to use
+      <function>spin_lock_irq()</function>, because the softirq cannot
+      run while the irq handler is running: it can use
+      <function>spin_lock()</function>, which is slightly faster.  The
+      only exception would be if a different hardware irq handler uses
+      the same lock: <function>spin_lock_irq()</function> will stop
+      that from interrupting us.
+    </para>
+
+    <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 
@@ -468,60 +474,766 @@
       interrupts are already off) and in softirqs (where the irq
       disabling is required).
     </para>
+
+    <para>
+      Note that softirqs (and hence tasklets and timers) are run on
+      return from hardware interrupts, so
+      <function>spin_lock_irq()</function> also stops these.  In that
+      sense, <function>spin_lock_irqsave()</function> is the most
+      general and powerful locking function.
+    </para>
+
+   </sect1>
+   <sect1 id="hardirq-hardirq">
+    <title>Locking Between Two Hard IRQ Handlers</title>
+    <para>
+      It is rare to have to share data between two IRQ handlers, but
+      if you do, <function>spin_lock_irqsave()</function> should be
+      used: it is architecture-specific whether all interrupts are
+      disabled inside irq handlers themselves.
+    </para>
    </sect1>
-  </chapter>
 
-  <chapter id="common-techniques">
-   <title>Common Techniques</title>
+  </chapter>
 
+  <chapter id="cheatsheet">
+   <title>Cheat Sheet For Locking</title>
    <para>
-     This section lists some common dilemmas and the standard
-     solutions used in the Linux kernel code.  If you use these,
-     people will find your code simpler to understand.
+     Pete Zaitcev gives the following summary:
    </para>
+   <itemizedlist>
+      <listitem>
+	<para>
+          If you are in a process context (any syscall) and want to
+	lock other process out, use a semaphore.  You can take a semaphore
+	and sleep (<function>copy_from_user*(</function> or
+	<function>kmalloc(x,GFP_KERNEL)</function>).
+      </para>
+      </listitem>
+      <listitem>
+	<para>
+	Otherwise (== data can be touched in an interrupt), use
+	<function>spin_lock_irqsave()</function> and
+	<function>spin_unlock_irqrestore()</function>.
+	</para>
+      </listitem>
+      <listitem>
+	<para>
+	Avoid holding spinlock for more than 5 lines of code and
+	across any function call (except accessors like
+	<function>readb</function>).
+	</para>
+      </listitem>
+    </itemizedlist>
 
-   <para>
-     If I could give you one piece of advice: never sleep with anyone
-     crazier than yourself.  But if I had to give you advice on
-     locking: <emphasis>keep it simple</emphasis>.
-   </para>
+   <sect1 id="minimum-lock-reqirements">
+   <title>Table of Minimum Requirements</title>
 
-   <para>
-     Lock data, not code.
+   <para> The following table lists the <emphasis>minimum</emphasis>
+	locking requirements between various contexts.  In some cases,
+	the same context can only be running on one CPU at a time, so
+	no locking is required for that context (eg. a particular
+	thread can only run on one CPU at a time, but if it needs
+	shares data with another thread, locking is required).
    </para>
-
    <para>
-     Be reluctant to introduce new locks.
+	Remember the advice above: you can always use
+	<function>spin_lock_irqsave()</function>, which is a superset
+	of all other spinlock primitives.
    </para>
+   <table>
+<title>Table of Locking Requirements</title>
+<TGROUP COLS=11>
+<TBODY>
+<ROW>
+<ENTRY></ENTRY>
+<ENTRY>IRQ Handler A</ENTRY>
+<ENTRY>IRQ Handler B</ENTRY>
+<ENTRY>Softirq A</ENTRY>
+<ENTRY>Softirq B</ENTRY>
+<ENTRY>Tasklet A</ENTRY>
+<ENTRY>Tasklet B</ENTRY>
+<ENTRY>Timer A</ENTRY>
+<ENTRY>Timer B</ENTRY>
+<ENTRY>User Context A</ENTRY>
+<ENTRY>User Context B</ENTRY>
+</ROW>
+
+<ROW>
+<ENTRY>IRQ Handler A</ENTRY>
+<ENTRY>None</ENTRY>
+</ROW>
+
+<ROW>
+<ENTRY>IRQ Handler B</ENTRY>
+<ENTRY>spin_lock_irqsave</ENTRY>
+<ENTRY>None</ENTRY>
+</ROW>
+
+<ROW>
+<ENTRY>Softirq A</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+</ROW>
+
+<ROW>
+<ENTRY>Softirq B</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+</ROW>
+
+<ROW>
+<ENTRY>Tasklet A</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>None</ENTRY>
+</ROW>
+
+<ROW>
+<ENTRY>Tasklet B</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>None</ENTRY>
+</ROW>
+
+<ROW>
+<ENTRY>Timer A</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>None</ENTRY>
+</ROW>
+
+<ROW>
+<ENTRY>Timer B</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>None</ENTRY>
+</ROW>
+
+<ROW>
+<ENTRY>User Context A</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock_bh</ENTRY>
+<ENTRY>spin_lock_bh</ENTRY>
+<ENTRY>spin_lock_bh</ENTRY>
+<ENTRY>spin_lock_bh</ENTRY>
+<ENTRY>spin_lock_bh</ENTRY>
+<ENTRY>spin_lock_bh</ENTRY>
+<ENTRY>None</ENTRY>
+</ROW>
+
+<ROW>
+<ENTRY>User Context B</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock_bh</ENTRY>
+<ENTRY>spin_lock_bh</ENTRY>
+<ENTRY>spin_lock_bh</ENTRY>
+<ENTRY>spin_lock_bh</ENTRY>
+<ENTRY>spin_lock_bh</ENTRY>
+<ENTRY>spin_lock_bh</ENTRY>
+<ENTRY>down_interruptible</ENTRY>
+<ENTRY>None</ENTRY>
+</ROW>
+
+</TBODY>
+</TGROUP>
+</TABLE>
+</chapter>
+
+  <chapter id="Examples">
+   <title>Common Examples</title>
+    <para>
+Let's step through a simple example: a cache of number to name
+mappings.  The cache keeps a count of how often each of the objects is
+used, and when it gets full, throws out the least used one.
+
+    </para>
+
+   <sect1 id="examples-usercontext">
+    <title>All In User Context</title>
+    <para>
+For our first example, we assume that all operations are in user
+context (ie. from system calls), so we can sleep.  This means we can
+use a semaphore to protect the cache and all the objects within
+it.  Here's the code:
+    </para>
 
-   <para>
-     Strangely enough, this is the exact reverse of my advice when
-     you <emphasis>have</emphasis> slept with someone crazier than yourself.
-   </para>
+    <programlisting>
+#include &lt;linux/list.h&gt;
+#include &lt;linux/slab.h&gt;
+#include &lt;linux/string.h&gt;
+#include &lt;asm/semaphore.h&gt;
+#include &lt;asm/errno.h&gt;
+
+struct object
+{
+        struct list_head list;
+        int id;
+        char name[32];
+        int popularity;
+};
+
+/* Protects the cache, cache_num, and the objects within it */
+static DECLARE_MUTEX(cache_lock);
+static LIST_HEAD(cache);
+static unsigned int cache_num = 0;
+#define MAX_CACHE_SIZE 10
+
+/* Must be holding cache_lock */
+static struct object *__cache_find(int id)
+{
+        struct object *i;
+
+        list_for_each_entry(i, &amp;cache, list)
+                if (i-&gt;id == id) {
+                        i-&gt;popularity++;
+                        return i;
+                }
+        return NULL;
+}
 
-   <sect1 id="techniques-no-writers">
-    <title>No Writers in Interrupt Context</title>
+/* Must be holding cache_lock */
+static void __cache_delete(struct object *obj)
+{
+        BUG_ON(!obj);
+        list_del(&amp;obj-&gt;list);
+        kfree(obj);
+        cache_num--;
+}
+
+/* Must be holding cache_lock */
+static void __cache_add(struct object *obj)
+{
+        list_add(&amp;obj-&gt;list, &amp;cache);
+        if (++cache_num > MAX_CACHE_SIZE) {
+                struct object *i, *outcast = NULL;
+                list_for_each_entry(i, &amp;cache, list) {
+                        if (!outcast || i-&gt;popularity &lt; outcast-&gt;popularity)
+                                outcast = i;
+                }
+                __cache_delete(outcast);
+        }
+}
 
-    <para>
-      There is a fairly common case where an interrupt handler needs
-      access to a critical region, but does not need write access.
-      In this case, you do not need to use
-      <function>read_lock_irq()</function>, but only
-      <function>read_lock()</function> everywhere (since if an interrupt 
-      occurs, the irq handler will only try to grab a read lock, which 
-      won't deadlock).  You will still need to use 
-      <function>write_lock_irq()</function>.
+int cache_add(int id, const char *name)
+{
+        struct object *obj;
+
+        if ((obj = kmalloc(sizeof(*obj), GFP_KERNEL)) == NULL)
+                return -ENOMEM;
+
+        strlcpy(obj-&gt;name, name, sizeof(obj-&gt;name));
+        obj-&gt;id = id;
+        obj-&gt;popularity = 0;
+
+        down(&amp;cache_lock);
+        __cache_add(obj);
+        up(&amp;cache_lock);
+        return 0;
+}
+
+void cache_delete(int id)
+{
+        down(&amp;cache_lock);
+        __cache_delete(__cache_find(id));
+        up(&amp;cache_lock);
+}
+
+int cache_find(int id, char *name)
+{
+        struct object *obj;
+        int ret = -ENOENT;
+
+        down(&amp;cache_lock);
+        obj = __cache_find(id);
+        if (obj) {
+                ret = 0;
+                strcpy(name, obj-&gt;name);
+        }
+        up(&amp;cache_lock);
+        return ret;
+}
+</programlisting>
+
+    <para>
+Note that we always make sure we have the cache_lock when we add,
+delete, or look up the cache: both the cache infrastructure itself and
+the contents of the objects are protected by the lock.  In this case
+it's easy, since we copy the data for the user, and never let them
+access the objects directly.
+    </para>
+    <para>
+There is a slight (and common) optimization here: in
+<function>cache_add</function> we set up the fields of the object
+before grabbing the lock.  This is safe, as no-one else can access it
+until we put it in cache.
+    </para>
+    </sect1>
+
+   <sect1 id="examples-interrupt">
+    <title>Accessing From Interrupt Context</title>
+    <para>
+Now consider the case where <function>cache_find</function> can be
+called from interrupt context: either a hardware interrupt or a
+softirq.  An example would be a timer which deletes object from the
+cache.
+    </para>
+    <para>
+The change is shown below, in standard patch format: the
+<symbol>-</symbol> are lines which are taken away, and the
+<symbol>+</symbol> are lines which are added.
+    </para>
+<programlisting>
+--- cache.c.usercontext	2003-12-09 13:58:54.000000000 +1100
++++ cache.c.interrupt	2003-12-09 14:07:49.000000000 +1100
+@@ -12,7 +12,7 @@
+         int popularity;
+ };
+
+-static DECLARE_MUTEX(cache_lock);
++static spinlock_t cache_lock = SPIN_LOCK_UNLOCKED;
+ static LIST_HEAD(cache);
+ static unsigned int cache_num = 0;
+ #define MAX_CACHE_SIZE 10
+@@ -55,6 +55,7 @@
+ int cache_add(int id, const char *name)
+ {
+         struct object *obj;
++        unsigned long flags;
+
+         if ((obj = kmalloc(sizeof(*obj), GFP_KERNEL)) == NULL)
+                 return -ENOMEM;
+@@ -63,30 +64,33 @@
+         obj-&gt;id = id;
+         obj-&gt;popularity = 0;
+
+-        down(&amp;cache_lock);
++        spin_lock_irqsave(&amp;cache_lock, flags);
+         __cache_add(obj);
+-        up(&amp;cache_lock);
++        spin_unlock_irqrestore(&amp;cache_lock, flags);
+         return 0;
+ }
+
+ void cache_delete(int id)
+ {
+-        down(&amp;cache_lock);
++        unsigned long flags;
++
++        spin_lock_irqsave(&amp;cache_lock, flags);
+         __cache_delete(__cache_find(id));
+-        up(&amp;cache_lock);
++        spin_unlock_irqrestore(&amp;cache_lock, flags);
+ }
+
+ int cache_find(int id, char *name)
+ {
+         struct object *obj;
+         int ret = -ENOENT;
++        unsigned long flags;
+
+-        down(&amp;cache_lock);
++        spin_lock_irqsave(&amp;cache_lock, flags);
+         obj = __cache_find(id);
+         if (obj) {
+                 ret = 0;
+                 strcpy(name, obj-&gt;name);
+         }
+-        up(&amp;cache_lock);
++        spin_unlock_irqrestore(&amp;cache_lock, flags);
+         return ret;
+ }
+</programlisting>
+
+    <para>
+Note that the <function>spin_lock_irqsave</function> will turn off
+interrupts if they are on, otherwise does nothing (if we are already
+in an interrupt handler), hence these functions are safe to call from
+any context.
+    </para>
+    <para>
+Unfortunately, <function>cache_add</function> calls
+<function>kmalloc</function> with the <symbol>GFP_KERNEL</symbol>
+flag, which is only legal in user context.  I have assumed that
+<function>cache_add</function> is still only called in user context,
+otherwise this should become a parameter to
+<function>cache_add</function>.
+    </para>
+  </sect1>
+   <sect1 id="examples-refcnt">
+    <title>Exposing Objects Outside This File</title>
+    <para>
+If our objects contained more information, it might not be sufficient
+to copy the information in and out: other parts of the code might want
+to keep pointers to these objects, for example, rather than looking up
+the id every time.  This produces two problems.
+    </para>
+    <para>
+The first problem is that we use the <symbol>cache_lock</symbol> to
+protect objects: we'd need to make this non-static so the rest of the
+code can use it.  This makes locking trickier, as it is no longer all
+in one place.
+    </para>
+    <para>
+The second problem is the lifetime problem: if another structure keeps
+a pointer to an object, it presumably expects that pointer to remain
+valid.  Unfortunately, this is only guaranteed while you hold the
+lock, otherwise someone might call <function>cache_delete</function>
+and even worse, add another object, re-using the same address.
+    </para>
+    <para>
+As there is only one lock, you can't hold it forever: no-one else would
+get any work done.
+    </para>
+    <para>
+The solution to this problem is to use a reference count: everyone who
+has a pointer to the object increases it when they first get the
+object, and drops the reference count when they're finished with it.
+Whoever drops it to zero knows it is unused, and can actually delete it.
+    </para>
+    <para>
+Here is the code:
+    </para>
+
+<programlisting>
+--- cache.c.interrupt	2003-12-09 14:25:43.000000000 +1100
++++ cache.c.refcnt	2003-12-09 14:33:05.000000000 +1100
+@@ -7,6 +7,7 @@
+ struct object
+ {
+         struct list_head list;
++        unsigned int refcnt;
+         int id;
+         char name[32];
+         int popularity;
+@@ -17,6 +18,35 @@
+ static unsigned int cache_num = 0;
+ #define MAX_CACHE_SIZE 10
+
++static void __object_put(struct object *obj)
++{
++        if (--obj-&gt;refcnt == 0)
++                kfree(obj);
++}
++
++static void __object_get(struct object *obj)
++{
++        obj-&gt;refcnt++;
++}
++
++void object_put(struct object *obj)
++{
++        unsigned long flags;
++
++        spin_lock_irqsave(&amp;cache_lock, flags);
++        __object_put(obj);
++        spin_unlock_irqrestore(&amp;cache_lock, flags);
++}
++
++void object_get(struct object *obj)
++{
++        unsigned long flags;
++
++        spin_lock_irqsave(&amp;cache_lock, flags);
++        __object_get(obj);
++        spin_unlock_irqrestore(&amp;cache_lock, flags);
++}
++
+ /* Must be holding cache_lock */
+ static struct object *__cache_find(int id)
+ {
+@@ -35,6 +65,7 @@
+ {
+         BUG_ON(!obj);
+         list_del(&amp;obj-&gt;list);
++        __object_put(obj);
+         cache_num--;
+ }
+
+@@ -63,6 +94,7 @@
+         strlcpy(obj-&gt;name, name, sizeof(obj-&gt;name));
+         obj-&gt;id = id;
+         obj-&gt;popularity = 0;
++        obj-&gt;refcnt = 1; /* The cache holds a reference */
+
+         spin_lock_irqsave(&amp;cache_lock, flags);
+         __cache_add(obj);
+@@ -79,18 +111,15 @@
+         spin_unlock_irqrestore(&amp;cache_lock, flags);
+ }
+
+-int cache_find(int id, char *name)
++struct object *cache_find(int id)
+ {
+         struct object *obj;
+-        int ret = -ENOENT;
+         unsigned long flags;
+
+         spin_lock_irqsave(&amp;cache_lock, flags);
+         obj = __cache_find(id);
+-        if (obj) {
+-                ret = 0;
+-                strcpy(name, obj-&gt;name);
+-        }
++        if (obj)
++                __object_get(obj);
+         spin_unlock_irqrestore(&amp;cache_lock, flags);
+-        return ret;
++        return obj;
+ }
+</programlisting>
+
+<para>
+We encapsulate the reference counting in the standard 'get' and 'put'
+functions.  Now we can return the object itself from
+<function>cache_find</function> which has the advantage that the user
+can now sleep holding the object (eg. to
+<function>copy_to_user</function> to name to userspace).
+</para>
+<para>
+The other point to note is that I said a reference should be held for
+every pointer to the object: thus the reference count is 1 when first
+inserted into the cache.  In some versions the framework does not hold
+a reference count, but they are more complicated.
+</para>
+
+   <sect2 id="examples-refcnt-atomic">
+    <title>Using Atomic Operations For The Reference Count</title>
+<para>
+In practice, <type>atomic_t</type> would usually be used for
+<structfield>refcnt</structfield>.  There are a number of atomic
+operations defined in
+
+<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
+<function>atomic_inc</function> and
+<function>atomic_dec_and_test</function> are used instead of the
+standard increment and decrement operators, and the lock is no longer
+used to protect the reference count itself.
+</para>
+
+<programlisting>
+--- cache.c.refcnt	2003-12-09 15:00:35.000000000 +1100
++++ cache.c.refcnt-atomic	2003-12-11 15:49:42.000000000 +1100
+@@ -7,7 +7,7 @@
+ struct object
+ {
+         struct list_head list;
+-        unsigned int refcnt;
++        atomic_t refcnt;
+         int id;
+         char name[32];
+         int popularity;
+@@ -18,33 +18,15 @@
+ static unsigned int cache_num = 0;
+ #define MAX_CACHE_SIZE 10
+
+-static void __object_put(struct object *obj)
+-{
+-        if (--obj-&gt;refcnt == 0)
+-                kfree(obj);
+-}
+-
+-static void __object_get(struct object *obj)
+-{
+-        obj-&gt;refcnt++;
+-}
+-
+ void object_put(struct object *obj)
+ {
+-        unsigned long flags;
+-
+-        spin_lock_irqsave(&amp;cache_lock, flags);
+-        __object_put(obj);
+-        spin_unlock_irqrestore(&amp;cache_lock, flags);
++        if (atomic_dec_and_test(&amp;obj-&gt;refcnt))
++                kfree(obj);
+ }
+
+ void object_get(struct object *obj)
+ {
+-        unsigned long flags;
+-
+-        spin_lock_irqsave(&amp;cache_lock, flags);
+-        __object_get(obj);
+-        spin_unlock_irqrestore(&amp;cache_lock, flags);
++        atomic_inc(&amp;obj-&gt;refcnt);
+ }
+
+ /* Must be holding cache_lock */
+@@ -65,7 +47,7 @@
+ {
+         BUG_ON(!obj);
+         list_del(&amp;obj-&gt;list);
+-        __object_put(obj);
++        object_put(obj);
+         cache_num--;
+ }
+
+@@ -94,7 +76,7 @@
+         strlcpy(obj-&gt;name, name, sizeof(obj-&gt;name));
+         obj-&gt;id = id;
+         obj-&gt;popularity = 0;
+-        obj-&gt;refcnt = 1; /* The cache holds a reference */
++        atomic_set(&amp;obj-&gt;refcnt, 1); /* The cache holds a reference */
+
+         spin_lock_irqsave(&amp;cache_lock, flags);
+         __cache_add(obj);
+@@ -119,7 +101,7 @@
+         spin_lock_irqsave(&amp;cache_lock, flags);
+         obj = __cache_find(id);
+         if (obj)
+-                __object_get(obj);
++                object_get(obj);
+         spin_unlock_irqrestore(&amp;cache_lock, flags);
+         return obj;
+ }
+</programlisting>
+</sect1>
+
+   <sect1 id="examples-lock-per-obj">
+    <title>Protecting The Objects Themselves</title>
+    <para>
+In these examples, we assumed that the objects (except the reference
+counts) never changed once they are created.  If we wanted to allow
+the name to change, there are three possibilities:
     </para>
+    <itemizedlist>
+      <listitem>
+	<para>
+You can make <symbol>cache_lock</symbol> non-static, and tell people
+to grab that lock before changing the name in any object.
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+You can provide a <function>cache_obj_rename</function> which grabs
+this lock and changes the name for the caller, and tell everyone to
+use that function.
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+You can make the <symbol>cache_lock</symbol> protect only the cache
+itself, and use another lock to protect the name.
+        </para>
+      </listitem>
+    </itemizedlist>
 
-    <para>
-      Similar logic applies to locking between softirqs/tasklets/BHs
-      which never need a write lock, and user context: 
-      <function>read_lock()</function> and
-      <function>write_lock_bh()</function>.
-    </para>
-   </sect1>
+      <para>
+Theoretically, you can make the locks as fine-grained as one lock for
+every field, for every object.  In practice, the most common variants
+are:
+</para>
+    <itemizedlist>
+      <listitem>
+	<para>
+One lock which protects the infrastructure (the <symbol>cache</symbol>
+list in this example) and all the objects.  This is what we have done
+so far.
+	</para>
+      </listitem>
+      <listitem>
+        <para>
+One lock which protects the infrastructure (including the list
+pointers inside the objects), and one lock inside the object which
+protects the rest of that object.
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+Multiple locks to protect the infrastructure (eg. one lock per hash
+chain), possibly with a separate per-object lock.
+        </para>
+      </listitem>
+    </itemizedlist>
 
-   <sect1 id="techniques-deadlocks">
+<para>
+Here is the "lock-per-object" implementation:
+</para>
+<programlisting>
+--- cache.c.refcnt-atomic	2003-12-11 15:50:54.000000000 +1100
++++ cache.c.perobjectlock	2003-12-11 17:15:03.000000000 +1100
+@@ -6,11 +6,17 @@
+
+ struct object
+ {
++        /* These two protected by cache_lock. */
+         struct list_head list;
++        int popularity;
++
+         atomic_t refcnt;
++
++        /* Doesn't change once created. */
+         int id;
++
++        spinlock_t lock; /* Protects the name */
+         char name[32];
+-        int popularity;
+ };
+
+ static spinlock_t cache_lock = SPIN_LOCK_UNLOCKED;
+@@ -77,6 +84,7 @@
+         obj-&gt;id = id;
+         obj-&gt;popularity = 0;
+         atomic_set(&amp;obj-&gt;refcnt, 1); /* The cache holds a reference */
++        spin_lock_init(&amp;obj-&gt;lock);
+
+         spin_lock_irqsave(&amp;cache_lock, flags);
+         __cache_add(obj);
+</programlisting>
+
+<para>
+Note that I decide that the <structfield>popularity</structfield>
+count should be protected by the <symbol>cache_lock</symbol> rather
+than the per-object lock: this is because it (like the
+<structname>struct list_head</structname> inside the object) is
+logically part of the infrastructure.  This way, I don't need to grab
+the lock of every object in <function>__cache_add</function> when
+seeking the least popular.
+</para>
+
+<para>
+I also decided that the <structfield>id</structfield> member is
+unchangeable, so I don't need to grab each object lock in
+<function>__cache_find()</function> to examine the
+<structfield>id</structfield>: the object lock is only used by a
+caller who wants to read or write the <structfield>name</structfield>
+field.
+</para>
+
+<para>
+Note also that I added a comment describing what data was protected by
+which locks.  This is extremely important, as it describes the runtime
+behavior of the code, and can be hard to gain from just reading.  And
+as Alan Cox says, <quote>Lock data, not code</quote>.
+</para>
+</chapter>
+
+   <chapter id="common-problems">
+    <title>Common Problems</title>
+    <sect1 id="deadlock">
     <title>Deadlock: Simple and Advanced</title>
 
     <para>
@@ -535,10 +1247,10 @@
 
     <para>
       For a slightly more complex case, imagine you have a region
-      shared by a bottom half and user context.  If you use a
+      shared by a softirq and user context.  If you use a
       <function>spin_lock()</function> call to protect it, it is 
-      possible that the user context will be interrupted by the bottom 
-      half while it holds the lock, and the bottom half will then spin 
+      possible that the user context will be interrupted by the softirq
+      while it holds the lock, and the softirq will then spin
       forever trying to get the same lock.
     </para>
 
@@ -558,7 +1270,7 @@
     </para>
 
     <para>
-      A more complex problem is the so-called `deadly embrace',
+      A more complex problem is the so-called 'deadly embrace',
       involving two or more locks.  Say you have a hash table: each
       entry in the table is a spinlock, and a chain of hashed
       objects.  Inside a softirq handler, you sometimes want to
@@ -606,7 +1318,7 @@
       their lock.  It will look, smell, and feel like a crash.
     </para>
 
-    <sect2 id="techs-deadlock-prevent">
+    <sect1 id="techs-deadlock-prevent">
      <title>Preventing Deadlock</title>
 
      <para>
@@ -634,7 +1346,6 @@
        will do?).  Remember, the other programmers are out to get
        you, so don't do this.
      </para>
-    </sect2>
 
     <sect2 id="techs-deadlock-overprevent">
      <title>Overzealous Prevention Of Deadlocks</title>
@@ -650,266 +1361,481 @@
        If you don't see why, please stay the fuck away from my code.
      </para>
     </sect2>
-   </sect1>
+    </sect1>
 
-   <sect1 id="per-cpu">
-    <title>Per-CPU Data</title>
-      
-    <para>
-      A great technique for avoiding locking which is used fairly
-      widely is to duplicate information for each CPU.  For example,
-      if you wanted to keep a count of a common condition, you could
-      use a spin lock and a single counter.  Nice and simple.
-    </para>
+   <sect1 id="racing-timers">
+    <title>Racing Timers: A Kernel Pastime</title>
 
     <para>
-      If that was too slow [it's probably not], you could instead
-      use a counter for each CPU [don't], then none of them need an
-      exclusive lock [you're wasting your time here].  To make sure
-      the CPUs don't have to synchronize caches all the time, align
-      the counters to cache boundaries by appending
-      `__cacheline_aligned' to the declaration
-      (<filename class=headerfile>include/linux/cache.h</filename>). 
-      [Can't you think of anything better to do?]
+      Timers can produce their own special problems with races.
+      Consider a collection of objects (list, hash, etc) where each
+      object has a timer which is due to destroy it.
     </para>
 
     <para>
-      They will need a read lock to access their own counters,
-      however.  That way you can use a write lock to grant exclusive
-      access to all of them at once, to tally them up.
+      If you want to destroy the entire collection (say on module
+      removal), you might do the following:
     </para>
-   </sect1>
 
-   <sect1 id="brlock">
-    <title>Big Reader Locks</title>
+    <programlisting>
+        /* THIS CODE BAD BAD BAD BAD: IF IT WAS ANY WORSE IT WOULD USE
+           HUNGARIAN NOTATION */
+        spin_lock_bh(&amp;list_lock);
 
-    <para>
-      A classic example of per-CPU information is Ingo's `big
-      reader' locks 
-      (<filename class=headerfile>linux/include/brlock.h</filename>).  These 
-      use the Per-CPU Data techniques described above to create a lock which 
-      is very fast to get a read lock, but agonizingly slow for a write
-      lock.
-    </para>
+        while (list) {
+                struct foo *next = list-&gt;next;
+                del_timer(&amp;list-&gt;timer);
+                kfree(list);
+                list = next;
+        }
+
+        spin_unlock_bh(&amp;list_lock);
+    </programlisting>
 
     <para>
-      Fortunately, there are a limited number of these locks
-      available: you have to go through a strict interview process
-      to get one.
+      Sooner or later, this will crash on SMP, because a timer can
+      have just gone off before the <function>spin_lock_bh()</function>,
+      and it will only get the lock after we
+      <function>spin_unlock_bh()</function>, and then try to free
+      the element (which has already been freed!).
     </para>
-   </sect1>
-
-   <sect1 id="lock-avoidance-rw">
-    <title>Avoiding Locks: Read And Write Ordering</title>
 
     <para>
-      Sometimes it is possible to avoid locking.  Consider the
-      following case from the 2.2 firewall code, which inserted an
-      element into a single linked list in user context:
+      This can be avoided by checking the result of
+      <function>del_timer()</function>: if it returns
+      <returnvalue>1</returnvalue>, the timer has been deleted.
+      If <returnvalue>0</returnvalue>, it means (in this
+      case) that it is currently running, so we can do:
     </para>
 
     <programlisting>
-        new-&gt;next = i-&gt;next;
-        i-&gt;next = new;
-    </programlisting>
+        retry:
+                spin_lock_bh(&amp;list_lock);
 
-    <para>
-      Here the author (Alan Cox, who knows what he's doing) assumes
-      that the pointer assignments are atomic.  This is important,
-      because networking packets would traverse this list on bottom
-      halves without a lock.  Depending on their exact timing, they
-      would either see the new element in the list with a valid 
-      <structfield>next</structfield> pointer, or it would not be in the 
-      list yet.  A lock is still required against other CPUs inserting
-      or deleting from the list, of course.
-    </para>
+                while (list) {
+                        struct foo *next = list-&gt;next;
+                        if (!del_timer(&amp;list-&gt;timer)) {
+                                /* Give timer a chance to delete this */
+                                spin_unlock_bh(&amp;list_lock);
+                                goto retry;
+                        }
+                        kfree(list);
+                        list = next;
+                }
 
-    <para>
-      Of course, the writes <emphasis>must</emphasis> be in this
-      order, otherwise the new element appears in the list with an
-      invalid <structfield>next</structfield> pointer, and any other 
-      CPU iterating at the wrong time will jump through it into garbage.  
-      Because modern CPUs reorder, Alan's code actually read as follows:
-    </para>
-      
-    <programlisting>
-        new-&gt;next = i-&gt;next;
-        wmb();
-        i-&gt;next = new;
+                spin_unlock_bh(&amp;list_lock);
     </programlisting>
 
     <para>
-      The <function>wmb()</function> is a write memory barrier 
-      (<filename class=headerfile>include/asm/system.h</filename>): neither 
-      the compiler nor the CPU will allow any writes to memory after the 
-      <function>wmb()</function> to be visible to other hardware
-      before any of the writes before the <function>wmb()</function>.
+      Another common problem is deleting timers which restart
+      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>)
+      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.
     </para>
+   </sect1>
 
-    <para>
-      As i386 does not do write reordering, this bug would never
-      show up on that platform.  On other SMP platforms, however, it
-      will.
-    </para>
+   <sect1 id="sparc">
+    <title>The Fucked Up Sparc</title>
 
     <para>
-      There is also <function>rmb()</function> for read ordering: to ensure 
-      any previous variable reads occur before following reads.  The simple
-      <function>mb()</function> macro combines both 
-      <function>rmb()</function> and <function>wmb()</function>.
+      Alan Cox says <quote>the irq disable/enable is in the register
+      window on a sparc</quote>.  Andi Kleen says <quote>when you do
+      restore_flags in a different function you mess up all the
+      register windows</quote>.
     </para>
 
     <para>
-      Some atomic operations are defined to act as a memory barrier
-      (ie. as per the <function>mb()</function> macro, but if in
-      doubt, be explicit.
-      <!-- Rusty Russell 2 May 2001, 2.4.4 -->
-      Also,
-      spinlock operations act as partial barriers: operations after
-      gaining a spinlock will never be moved to precede the
-      <function>spin_lock()</function> call, and operations before
-      releasing a spinlock will never be moved after the
-      <function>spin_unlock()</function> call.
-      <!-- Manfred Spraul <manfreds@colorfullife.com>
-           24 May 2000 2.3.99-pre9 -->
+      So never pass the flags word set by
+      <function>spin_lock_irqsave()</function> and brethren to another
+      function (unless it's declared <type>inline</type>).  Usually no-one
+      does this, but now you've been warned.  Dave Miller can never do
+      anything in a straightforward manner (I can say that, because I have
+      pictures of him and a certain PowerPC maintainer in a compromising
+      position).
     </para>
    </sect1>
 
-   <sect1 id="lock-avoidance-atomic-ops">
-    <title>Avoiding Locks: Atomic Operations</title>
+  </chapter>
+
+ <chapter id="Efficiency">
+    <title>Locking Speed</title>
 
     <para>
-      There are a number of atomic operations defined in
-      <filename class=headerfile>include/asm/atomic.h</filename>: these 
-      are guaranteed to be seen atomically from all CPUs in the system, thus 
-      avoiding races. If your shared data consists of a single counter, say, 
-      these operations might be simpler than using spinlocks (although for
-      anything non-trivial using spinlocks is clearer).
+There are three main things to worry about when considering speed of
+some code which does locking.  First is concurrency: how many things
+are going to be waiting while someone else is holding a lock.  Second
+is the time taken to actually acquire and release an uncontended lock.
+Third is using fewer, or smarter locks.  I'm assuming that the lock is
+used fairly often: otherwise, you wouldn't be concerned about
+efficiency.
+</para>
+    <para>
+Concurrency depends on how long the lock is usually held: you should
+hold the lock for as long as needed, but no longer.  In the cache
+example, we always create the object without the lock held, and then
+grab the lock only when we are ready to insert it in the list.
+</para>
+    <para>
+Acquisition times depend on how much damage the lock operations do to
+the pipeline (pipeline stalls) and how likely it is that this CPU was
+the last one to grab the lock (ie. is the lock cache-hot for this
+CPU): on a machine with more CPUs, this likelihood drops fast.
+Consider a 700MHz Intel Pentium III: an instruction takes about 0.7ns,
+an atomic increment takes about 58ns, a lock which is cache-hot on
+this CPU takes 160ns, and a cacheline transfer from another CPU takes
+an additional 170 to 360ns.  (These figures from Paul McKenney's
+<ulink url="http://www.linuxjournal.com/article.php?sid=6993"> Linux
+Journal RCU article</ulink>).
+</para>
+    <para>
+These two aims conflict: holding a lock for a short time might be done
+by splitting locks into parts (such as in our final per-object-lock
+example), but this increases the number of lock acquisitions, and the
+results are often slower than having a single lock.  This is another
+reason to advocate locking simplicity.
+</para>
+    <para>
+The third concern is addressed below: there are some methods to reduce
+the amount of locking which needs to be done.
+</para>
+
+  <sect1 id="efficiency-rwlocks">
+   <title>Read/Write Lock Variants</title>
+
+   <para>
+      Both spinlocks and semaphores have read/write variants:
+      <type>rwlock_t</type> and <structname>struct rw_semaphore</structname>.
+      These divide users into two classes: the readers and the writers.  If
+      you are only reading the data, you can get a read lock, but to write to
+      the data you need the write lock.  Many people can hold a read lock,
+      but a writer must be sole holder.
     </para>
 
-    <para>
-      Note that the atomic operations do in general not act as memory
-      barriers. Instead you can insert a memory barrier before or
-      after <function>atomic_inc()</function> or
-      <function>atomic_dec()</function> by inserting
-      <function>smp_mb__before_atomic_inc()</function>,
-      <function>smp_mb__after_atomic_inc()</function>,
-      <function>smp_mb__before_atomic_dec()</function> or
-      <function>smp_mb__after_atomic_dec()</function>
-      respectively. The advantage of using those macros instead of
-      <function>smp_mb()</function> is, that they are cheaper on some
-      platforms.    
-      <!-- Sebastian Wilhelmi <seppi@seppi.de> 2002-03-04 -->
+   <para>
+      If your code divides neatly along reader/writer lines (as our
+      cache code does), and the lock is held by readers for
+      significant lengths of time, using these locks can help.  They
+      are slightly slower than the normal locks though, so in practice
+      <type>rwlock_t</type> is not usually worthwhile.
     </para>
    </sect1>
 
-   <sect1 id="ref-counts">
-    <title>Protecting A Collection of Objects: Reference Counts</title>
+   <sect1 id="efficiency-read-copy-update">
+    <title>Avoiding Locks: Read Copy Update</title>
 
     <para>
-      Locking a collection of objects is fairly easy: you get a
-      single spinlock, and you make sure you grab it before
-      searching, adding or deleting an object.
+      There is a special method of read/write locking called Read Copy
+      Update.  Using RCU, the readers can avoid taking a lock
+      altogether: as we expect our cache to be read more often than
+      updated (otherwise the cache is a waste of time), it is a
+      candidate for this optimization.
     </para>
 
     <para>
-      The purpose of this lock is not to protect the individual
-      objects: you might have a separate lock inside each one for
-      that.  It is to protect the <emphasis>data structure
-      containing the objects</emphasis> from race conditions.  Often
-      the same lock is used to protect the contents of all the
-      objects as well, for simplicity, but they are inherently
-      orthogonal (and many other big words designed to confuse).
+      How do we get rid of read locks?  Getting rid of read locks
+      means that writers may be changing the list underneath the
+      readers.  That is actually quite simple: we can read a linked
+      list while an element is being added if the writer adds the
+      element very carefully.  For example, adding
+      <symbol>new</symbol> to a single linked list called
+      <symbol>list</symbol>:
     </para>
 
+    <programlisting>
+        new-&gt;next = list-&gt;next;
+        wmb();
+        list-&gt;next = new;
+    </programlisting>
+
     <para>
-      Changing this to a read-write lock will often help markedly if
-      reads are far more common that writes.  If not, there is
-      another approach you can use to reduce the time the lock is
-      held: reference counts.
+      The <function>wmb()</function> is a write memory barrier.  It
+      ensures that the first operation (setting the new element's
+      <symbol>next</symbol> pointer) is complete and will be seen by
+      all CPUs, before the second operation is (putting the new
+      element into the list).  This is important, since modern
+      compilers and modern CPUs can both reorder instructions unless
+      told otherwise: we want a reader to either not see the new
+      element at all, or see the new element with the
+      <symbol>next</symbol> pointer correctly pointing at the rest of
+      the list.
+    </para>
+    <para>
+      Fortunately, there is a function to do this for standard
+      <structname>struct list_head</structname> lists:
+      <function>list_add_rcu()</function>
+      (<filename>include/linux/list.h</filename>).
+    </para>
+    <para>
+      Removing an element from the list is even simpler: we replace
+      the pointer to the old element with a pointer to its successor,
+      and readers will either see it, or skip over it.
     </para>
+    <programlisting>
+        list-&gt;next = old-&gt;next;
+    </programlisting>
+    <para>
+      There is <function>list_del_rcu()</function>
+      (<filename>include/linux/list.h</filename>) which does this (the
+      normal version poisons the old object, which we don't want).
+    </para>
+    <para>
+      The reader must also be careful: some CPUs can look through the
+      <symbol>next</symbol> pointer to start reading the contents of
+      the next element early, but don't realize that the pre-fetched
+      contents is wrong when the <symbol>next</symbol> pointer changes
+      underneath them.  Once again, there is a
+      <function>list_for_each_entry_rcu()</function>
+      (<filename>include/linux/list.h</filename>) to help you.  Of
+      course, writers can just use
+      <function>list_for_each_entry()</function>, since there cannot
+      be two simultaneous writers.
+    </para>
+    <para>
+      Our final dilemma is this: when can we actually destroy the
+      removed element?  Remember, a reader might be stepping through
+      this element in the list right now: it we free this element and
+      the <symbol>next</symbol> pointer changes, the reader will jump
+      off into garbage and crash.  We need to wait until we know that
+      all the readers who were traversing the list when we deleted the
+      element are finished.  We use <function>call_rcu()</function> to
+      register a callback which will actually destroy the object once
+      the readers are finished.
+    </para>
+    <para>
+      But how does Read Copy Update know when the readers are
+      finished?  The method is this: firstly, the readers always
+      traverse the list inside
+      <function>rcu_read_lock()</function>/<function>rcu_read_unlock()</function>
+      pairs: these simply disable preemption so the reader won't go to
+      sleep while reading the list.
+    </para>
+    <para>
+      RCU then waits until every other CPU has slept at least once:
+      since readers cannot sleep, we know that any readers which were
+      traversing the list during the deletion are finished, and the
+      callback is triggered.  The real Read Copy Update code is a
+      little more optimized than this, but this is the fundamental
+      idea.
+    </para>
+
+<programlisting>
+--- cache.c.perobjectlock	2003-12-11 17:15:03.000000000 +1100
++++ cache.c.rcupdate	2003-12-11 17:55:14.000000000 +1100
+@@ -1,15 +1,18 @@
+ #include &lt;linux/list.h&gt;
+ #include &lt;linux/slab.h&gt;
+ #include &lt;linux/string.h&gt;
++#include &lt;linux/rcupdate.h&gt;
+ #include &lt;asm/semaphore.h&gt;
+ #include &lt;asm/errno.h&gt;
+
+ struct object
+ {
+-        /* These two protected by cache_lock. */
++        /* This is protected by RCU */
+         struct list_head list;
+         int popularity;
+
++        struct rcu_head rcu;
++
+         atomic_t refcnt;
+
+         /* Doesn't change once created. */
+@@ -40,7 +43,7 @@
+ {
+         struct object *i;
+
+-        list_for_each_entry(i, &amp;cache, list) {
++        list_for_each_entry_rcu(i, &amp;cache, list) {
+                 if (i-&gt;id == id) {
+                         i-&gt;popularity++;
+                         return i;
+@@ -49,19 +52,25 @@
+         return NULL;
+ }
+
++/* Final discard done once we know no readers are looking. */
++static void cache_delete_rcu(void *arg)
++{
++        object_put(arg);
++}
++
+ /* Must be holding cache_lock */
+ static void __cache_delete(struct object *obj)
+ {
+         BUG_ON(!obj);
+-        list_del(&amp;obj-&gt;list);
+-        object_put(obj);
++        list_del_rcu(&amp;obj-&gt;list);
+         cache_num--;
++        call_rcu(&amp;obj-&gt;rcu, cache_delete_rcu, obj);
+ }
+
+ /* Must be holding cache_lock */
+ static void __cache_add(struct object *obj)
+ {
+-        list_add(&amp;obj-&gt;list, &amp;cache);
++        list_add_rcu(&amp;obj-&gt;list, &amp;cache);
+         if (++cache_num > MAX_CACHE_SIZE) {
+                 struct object *i, *outcast = NULL;
+                 list_for_each_entry(i, &amp;cache, list) {
+@@ -85,6 +94,7 @@
+         obj-&gt;popularity = 0;
+         atomic_set(&amp;obj-&gt;refcnt, 1); /* The cache holds a reference */
+         spin_lock_init(&amp;obj-&gt;lock);
++        INIT_RCU_HEAD(&amp;obj-&gt;rcu);
+
+         spin_lock_irqsave(&amp;cache_lock, flags);
+         __cache_add(obj);
+@@ -104,12 +114,11 @@
+ struct object *cache_find(int id)
+ {
+         struct object *obj;
+-        unsigned long flags;
+
+-        spin_lock_irqsave(&amp;cache_lock, flags);
++        rcu_read_lock();
+         obj = __cache_find(id);
+         if (obj)
+                 object_get(obj);
+-        spin_unlock_irqrestore(&amp;cache_lock, flags);
++        rcu_read_unlock();
+         return obj;
+ }
+</programlisting>
+
+<para>
+Note that the reader will alter the
+<structfield>popularity</structfield> member in
+<function>__cache_find()</function>, and now it doesn't hold a lock.
+One solution would be to make it an <type>atomic_t</type>, but for
+this usage, we don't really care about races: an approximate result is
+good enough, so I didn't change it.
+</para>
+
+<para>
+The result is that <function>cache_find()</function> requires no
+synchronization with any other functions, so is almost as fast on SMP
+as it would be on UP.
+</para>
+
+<para>
+There is a furthur optimization possible here: remember our original
+cache code, where there were no reference counts and the caller simply
+held the lock whenever using the object?  This is still possible: if
+you hold the lock, noone can delete the object, so you don't need to
+get and put the reference count.
+</para>
+
+<para>
+Now, because the 'read lock' in RCU is simply disabling preemption, a
+caller which always has preemption disabled between calling
+<function>cache_find()</function> and
+<function>object_put()</function> does not need to actually get and
+put the reference count: we could expose
+<function>__cache_find()</function> by making it non-static, and
+such callers could simply call that.
+</para>
+<para>
+The benefit here is that the reference count is not written to: the
+object is not altered in any way, which is much faster on SMP
+machines due to caching.
+</para>
+  </sect1>
+
+   <sect1 id="per-cpu">
+    <title>Per-CPU Data</title>
 
     <para>
-      In this approach, an object has an owner, who sets the
-      reference count to one.  Whenever you get a pointer to the
-      object, you increment the reference count (a `get' operation).
-      Whenever you relinquish a pointer, you decrement the reference
-      count (a `put' operation).  When the owner wants to destroy
-      it, they mark it dead, and do a put.
+      Another technique for avoiding locking which is used fairly
+      widely is to duplicate information for each CPU.  For example,
+      if you wanted to keep a count of a common condition, you could
+      use a spin lock and a single counter.  Nice and simple.
     </para>
 
     <para>
-      Whoever drops the reference count to zero (usually implemented
-      with <function>atomic_dec_and_test()</function>) actually cleans 
-      up and frees the object.
+      If that was too slow (it's usually not, but if you've got a
+      really big machine to test on and can show that it is), you
+      could instead use a counter for each CPU, then none of them need
+      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>).
     </para>
 
     <para>
-      This means that you are guaranteed that the object won't
-      vanish underneath you, even though you no longer have a lock
-      for the collection.
+      Of particular use for simple per-cpu counters is the
+      <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>).
     </para>
 
     <para>
-      Here's some skeleton code:
+      Note that there is no simple, reliable way of getting an exact
+      value of such a counter, without introducing more locks.  This
+      is not a problem for some uses.
     </para>
+   </sect1>
 
-    <programlisting>
-        void create_foo(struct foo *x)
-        {
-                atomic_set(&amp;x-&gt;use, 1);
-                spin_lock_bh(&amp;list_lock);
-                ... insert in list ...
-                spin_unlock_bh(&amp;list_lock);
-        }
-
-        struct foo *get_foo(int desc)
-        {
-                struct foo *ret;
-
-                spin_lock_bh(&amp;list_lock);
-                ... find in list ...
-                if (ret) atomic_inc(&amp;ret-&gt;use);
-                spin_unlock_bh(&amp;list_lock);
-
-                return ret;
-        }
+   <sect1 id="mostly-hardirq">
+    <title>Data Which Mostly Used By An IRQ Handler</title>
 
-        void put_foo(struct foo *x)
-        {
-                if (atomic_dec_and_test(&amp;x-&gt;use))
-                        kfree(foo);
-        }
+    <para>
+      If data is always accessed from within the same IRQ handler, you
+      don't need a lock at all: the kernel already guarantees that the
+      irq handler will not run simultaneously on multiple CPUs.
+    </para>
+    <para>
+      Manfred Spraul points out that you can still do this, even if
+      the data is very occasionally accessed in user context or
+      softirqs/tasklets.  The irq handler doesn't use a lock, and
+      all other accesses are done as so:
+    </para>
+
+<programlisting>
+	spin_lock(&amp;lock);
+	disable_irq(irq);
+	...
+	enable_irq(irq);
+	spin_unlock(&amp;lock);
+</programlisting>
+    <para>
+      The <function>disable_irq()</function> prevents the irq handler
+      from running (and waits for it to finish if it's currently
+      running on other CPUs).  The spinlock prevents any other
+      accesses happening at the same time.  Naturally, this is slower
+      than just a <function>spin_lock_irq()</function> call, so it
+      only makes sense if this type of access happens extremely
+      rarely.
+    </para>
+   </sect1>
+  </chapter>
 
-        void destroy_foo(struct foo *x)
-        {
-                spin_lock_bh(&amp;list_lock);
-                ... remove from list ...
-                spin_unlock_bh(&amp;list_lock);
+ <chapter id="sleeping-things">
+    <title>What Functions Are Safe To Call From Interrupts?</title>
 
-                put_foo(x);
-        }
-    </programlisting>
+    <para>
+      Many functions in the kernel sleep (ie. call schedule())
+      directly or indirectly: you can never call them while holding a
+      spinlock, or with preemption disabled.  This also means you need
+      to be in user context: calling them from an interrupt is illegal.
+    </para>
 
-    <sect2 id="helpful-macros">
-     <title>Macros To Help You</title>
-     <para>
-       There are a set of debugging macros tucked inside
-       <filename class=headerfile>include/linux/netfilter_ipv4/lockhelp.h</filename>
-       and <filename class=headerfile>listhelp.h</filename>: these are very
-       useful for ensuring that locks are held in the right places to protect
-       infrastructure.
-     </para>
-    </sect2>
-   </sect1>
-   
-   <sect1 id="sleeping-things">
-    <title>Things Which Sleep</title>
+   <sect1 id="sleeping">
+    <title>Some Functions Which Sleep</title>
 
     <para>
-      You can never call the following routines while holding a
-      spinlock, as they may sleep.  This also means you need to be in
-      user context.
+      The most common ones are listed below, but you usually have to
+      read the code to find out if other calls are safe.  If everyone
+      else who calls it can sleep, you probably need to be able to
+      sleep, too.  In particular, registration and deregistration
+      functions usually expect to be called from user context, and can
+      sleep.
     </para>
 
     <itemizedlist>
@@ -961,106 +1887,31 @@
      </listitem>
     </itemizedlist>
 
-    <para>
-     <function>printk()</function> can be called in
-     <emphasis>any</emphasis> context, interestingly enough.
-    </para>
-   </sect1>
-
-   <sect1 id="sparc">
-    <title>The Fucked Up Sparc</title>
+   <sect1 id="dont-sleep">
+    <title>Some Functions Which Don't Sleep</title>
 
     <para>
-      Alan Cox says <quote>the irq disable/enable is in the register
-      window on a sparc</quote>.  Andi Kleen says <quote>when you do
-      restore_flags in a different function you mess up all the
-      register windows</quote>.
-    </para>
-
-    <para>
-      So never pass the flags word set by 
-      <function>spin_lock_irqsave()</function> and brethren to another 
-      function (unless it's declared <type>inline</type>.  Usually no-one 
-      does this, but now you've been warned.  Dave Miller can never do 
-      anything in a straightforward manner (I can say that, because I have
-      pictures of him and a certain PowerPC maintainer in a compromising 
-      position).
-    </para>
-   </sect1>
-
-   <sect1 id="racing-timers">
-    <title>Racing Timers: A Kernel Pastime</title>
-
-    <para>
-      Timers can produce their own special problems with races.
-      Consider a collection of objects (list, hash, etc) where each
-      object has a timer which is due to destroy it.
+     Some functions are safe to call from any context, or holding
+     almost any lock.
     </para>
 
-    <para>
-      If you want to destroy the entire collection (say on module
-      removal), you might do the following:
-    </para>
-
-    <programlisting>
-        /* THIS CODE BAD BAD BAD BAD: IF IT WAS ANY WORSE IT WOULD USE
-           HUNGARIAN NOTATION */
-        spin_lock_bh(&amp;list_lock);
-
-        while (list) {
-                struct foo *next = list-&gt;next;
-                del_timer(&amp;list-&gt;timer);
-                kfree(list);
-                list = next;
-        }
-
-        spin_unlock_bh(&amp;list_lock);
-    </programlisting>
-
-    <para>
-      Sooner or later, this will crash on SMP, because a timer can
-      have just gone off before the <function>spin_lock_bh()</function>, 
-      and it will only get the lock after we 
-      <function>spin_unlock_bh()</function>, and then try to free
-      the element (which has already been freed!).
-    </para>
-
-    <para>
-      This can be avoided by checking the result of 
-      <function>del_timer()</function>: if it returns
-      <returnvalue>1</returnvalue>, the timer has been deleted.  
-      If <returnvalue>0</returnvalue>, it means (in this
-      case) that it is currently running, so we can do:
-    </para>
-
-    <programlisting>
-        retry:  
-                spin_lock_bh(&amp;list_lock);
-
-                while (list) {
-                        struct foo *next = list-&gt;next;
-                        if (!del_timer(&amp;list-&gt;timer)) {
-                                /* Give timer a chance to delete this */
-                                spin_unlock_bh(&amp;list_lock);
-                                goto retry;
-                        }
-                        kfree(list);
-                        list = next;
-                }
-
-                spin_unlock_bh(&amp;list_lock);
-    </programlisting>
-
-    <para>
-      Another common problem is deleting timers which restart
-      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>) 
-      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.
-    </para>
+    <itemizedlist>
+     <listitem>
+      <para>
+	<function>printk()</function>
+      </para>
+     </listitem>
+     <listitem>
+      <para>
+        <function>kfree()</function>
+      </para>
+     </listitem>
+     <listitem>
+      <para>
+	<function>add_timer()</function> and <function>del_timer()</function>
+      </para>
+     </listitem>
+    </itemizedlist>
    </sect1>
   </chapter>
 
@@ -1101,8 +1952,9 @@
 
     <para>
       Thanks to Martin Pool, Philipp Rumpf, Stephen Rothwell, Paul
-      Mackerras, Ruedi Aschwanden, Alan Cox, Manfred Spraul and Tim
-      Waugh for proofreading, correcting, flaming, commenting.
+      Mackerras, Ruedi Aschwanden, Alan Cox, Manfred Spraul, Tim
+      Waugh, Pete Zaitcev, James Morris, Robert Love, Paul McKenney,
+      John Ashby for proofreading, correcting, flaming, commenting.
     </para>
 
     <para>
@@ -1113,12 +1965,27 @@
   <glossary id="glossary">
    <title>Glossary</title>
 
+   <glossentry id="gloss-preemption">
+    <glossterm>preemption</glossterm>
+     <glossdef>
+      <para>
+        Prior to 2.5, or when <symbol>CONFIG_PREEMPT</symbol> is
+        unset, processes in user context inside the kernel would not
+        preempt each other (ie. you had that CPU until you have it up,
+        except for interrupts).  With the addition of
+        <symbol>CONFIG_PREEMPT</symbol> in 2.5.4, this changed: when
+        in user context, higher priority tasks can "cut in": spinlocks
+        were changed to disable preemption, even on UP.
+     </para>
+    </glossdef>
+   </glossentry>
+
    <glossentry id="gloss-bh">
     <glossterm>bh</glossterm>
      <glossdef>
       <para>
         Bottom Half: for historical reasons, functions with
-        `_bh' in them often now refer to any software interrupt, e.g.
+        '_bh' in them often now refer to any software interrupt, e.g.
         <function>spin_lock_bh()</function> blocks any software interrupt 
         on the current CPU.  Bottom halves are deprecated, and will 
         eventually be replaced by tasklets.  Only one bottom half will be 
@@ -1132,8 +1999,7 @@
     <glossdef>
      <para>
        Hardware interrupt request.  <function>in_irq()</function> returns 
-       <returnvalue>true</returnvalue> in a hardware interrupt handler (it 
-       also returns true when interrupts are blocked).
+       <returnvalue>true</returnvalue> in a hardware interrupt handler.
      </para>
     </glossdef>
    </glossentry>
@@ -1144,8 +2010,7 @@
      <para>
        Not user context: processing a hardware irq or software irq.
        Indicated by the <function>in_interrupt()</function> macro 
-       returning <returnvalue>true</returnvalue> (although it also
-       returns true when interrupts or BHs are blocked).
+       returning <returnvalue>true</returnvalue>.
      </para>
     </glossdef>
    </glossentry>
@@ -1161,35 +2026,40 @@
    </glossentry>
 
    <glossentry id="gloss-softirq">
-    <glossterm>softirq</glossterm>
+    <glossterm>Software Interrupt / softirq</glossterm>
     <glossdef>
      <para>
-       Strictly speaking, one of up to 32 enumerated software
+       Software interrupt handler.  <function>in_irq()</function> returns
+       <returnvalue>false</returnvalue>; <function>in_softirq()</function>
+       returns <returnvalue>true</returnvalue>.  Tasklets and softirqs
+	both fall into the category of 'software interrupts'.
+     </para>
+     <para>
+       Strictly speaking a softirq is one of up to 32 enumerated software
        interrupts which can run on multiple CPUs at once.
-       Sometimes used to refer to tasklets and bottom halves as
+       Sometimes used to refer to tasklets as
        well (ie. all software interrupts).
      </para>
     </glossdef>
    </glossentry>
 
-   <glossentry id="gloss-swinterrupt">
-    <glossterm>Software Interrupt / Software IRQ</glossterm>
+   <glossentry id="gloss-tasklet">
+    <glossterm>tasklet</glossterm>
     <glossdef>
      <para>
-       Software interrupt handler.  <function>in_irq()</function> returns 
-       <returnvalue>false</returnvalue>; <function>in_softirq()</function>
-       returns <returnvalue>true</returnvalue>.  Tasklets, softirqs and 
-       bottom halves all fall into the category of `software interrupts'.
+       A dynamically-registrable software interrupt,
+       which is guaranteed to only run on one CPU at a time.
      </para>
     </glossdef>
    </glossentry>
 
-   <glossentry id="gloss-tasklet">
-    <glossterm>tasklet</glossterm>
+   <glossentry id="gloss-timers">
+    <glossterm>timer</glossterm>
     <glossdef>
      <para>
-       A dynamically-registrable software interrupt,
-       which is guaranteed to only run on one CPU at a time.
+       A dynamically-registrable software interrupt, which is run at
+       (or close to) a given time.  When running, it is just like a
+       tasklet (in fact, they are called from the TIMER_SOFTIRQ).
      </para>
     </glossdef>
    </glossentry>
@@ -1207,10 +2077,11 @@
     <glossterm>User Context</glossterm>
     <glossdef>
      <para>
-       The kernel executing on behalf of a particular
-       process or kernel thread (given by the <function>current()</function>
-       macro.)  Not to be confused with userspace.  Can be interrupted by 
-       software  or hardware interrupts.
+       The kernel executing on behalf of a particular process (ie. a
+       system call or trap) or kernel thread.  You can tell which
+       process with the <symbol>current</symbol> macro.)  Not to
+       be confused with userspace.  Can be interrupted by software or
+       hardware interrupts.
      </para>
     </glossdef>
    </glossentry>
--- diff/Documentation/SubmittingDrivers	2003-07-11 09:39:49.000000000 +0100
+++ source/Documentation/SubmittingDrivers	2003-12-29 09:30:39.000000000 +0000
@@ -34,14 +34,13 @@
 	maintainer then please contact Alan Cox <alan@lxorguk.ukuu.org.uk>
 
 Linux 2.4:
-	The same rules apply as 2.2 but this kernel tree is under active
-	development. The final contact point for Linux 2.4 submissions is
-	Marcelo Tosatti <marcelo@conectiva.com.br>.
+	The same rules apply as 2.2. The final contact point for Linux 2.4
+	submissions is Marcelo Tosatti <marcelo.tosatti@cyclades.com>.
 
-Linux 2.5:
+Linux 2.6:
 	The same rules apply as 2.4 except that you should follow linux-kernel
-	to track changes in API's. The final contact point for Linux 2.5
-	submissions is Linus Torvalds <torvalds@osdl.org>.
+	to track changes in API's. The final contact point for Linux 2.6
+	submissions is Andrew Morton <akpm@osdl.org>.
 
 What Criteria Determine Acceptance
 ----------------------------------
--- diff/Documentation/filesystems/Locking	2003-08-26 10:00:51.000000000 +0100
+++ source/Documentation/filesystems/Locking	2003-12-29 09:30:39.000000000 +0000
@@ -420,7 +420,7 @@
 prototypes:
 	void (*open)(struct vm_area_struct*);
 	void (*close)(struct vm_area_struct*);
-	struct page *(*nopage)(struct vm_area_struct*, unsigned long, int);
+	struct page *(*nopage)(struct vm_area_struct*, unsigned long, int *);
 
 locking rules:
 		BKL	mmap_sem
--- diff/Documentation/filesystems/proc.txt	2003-09-17 12:28:01.000000000 +0100
+++ source/Documentation/filesystems/proc.txt	2003-12-29 09:30:39.000000000 +0000
@@ -900,6 +900,15 @@
 Every mounted file system needs a super block, so if you plan to mount lots of
 file systems, you may want to increase these numbers.
 
+aio-nr and aio-max-nr
+---------------------
+
+aio-nr is the running total of the number of events specified on the
+io_setup system call for all currently active aio contexts.  If aio-nr
+reaches aio-max-nr then io_setup will fail with EAGAIN.  Note that
+raising aio-max-nr does not result in the pre-allocation or re-sizing
+of any kernel data structures.
+
 2.2 /proc/sys/fs/binfmt_misc - Miscellaneous binary formats
 -----------------------------------------------------------
 
--- diff/Documentation/filesystems/xfs.txt	2003-10-27 09:20:36.000000000 +0000
+++ source/Documentation/filesystems/xfs.txt	2003-12-29 09:30:39.000000000 +0000
@@ -29,10 +29,11 @@
 	The preferred buffered I/O size can also be altered on an
 	individual file basis using the ioctl(2) system call.
 
-  ikeep
+  ikeep/noikeep
 	When inode clusters are emptied of inodes, keep them around
-	on the disk, this is the old XFS behavior. Default is now to
-	return the inode cluster to the free space pool.
+	on the disk (ikeep) - this is the traditional XFS behaviour
+	and is still the default for now.  Using the noikeep option,
+	inode clusters are returned to the free space pool.
 
   logbufs=value
 	Set the number of in-memory log buffers.  Valid numbers range
@@ -75,6 +76,10 @@
 	Filesystems mounted "norecovery" must be mounted read-only or
 	the mount will fail.
 
+  nouuid
+	Don't check for double mounted file systems using the file system uuid.
+	This is useful to mount LVM snapshot volumes.
+
   osyncisosync
 	Make O_SYNC writes implement true O_SYNC.  WITHOUT this option,
 	Linux XFS behaves as if an "osyncisdsync" option is used,
@@ -108,10 +113,6 @@
 	The "swidth" option is required if the "sunit" option has been
 	specified, and must be a multiple of the "sunit" value.
 
-  nouuid
-        Don't check for double mounted file systems using the file system uuid.
-        This is useful to mount LVM snapshot volumes.
-
 sysctls
 =======
 
@@ -139,14 +140,14 @@
 	Causes certain error conditions to call BUG(). Value is a bitmask; 
 	AND together the tags which represent errors which should cause panics:
 	
-		XFS_NO_PTAG                     0LL
-		XFS_PTAG_IFLUSH                 0x0000000000000001LL
-		XFS_PTAG_LOGRES                 0x0000000000000002LL
-		XFS_PTAG_AILDELETE              0x0000000000000004LL
-		XFS_PTAG_ERROR_REPORT           0x0000000000000008LL
-		XFS_PTAG_SHUTDOWN_CORRUPT       0x0000000000000010LL
-		XFS_PTAG_SHUTDOWN_IOERROR       0x0000000000000020LL
-		XFS_PTAG_SHUTDOWN_LOGERROR      0x0000000000000040LL
+		XFS_NO_PTAG                     0
+		XFS_PTAG_IFLUSH                 0x00000001
+		XFS_PTAG_LOGRES                 0x00000002
+		XFS_PTAG_AILDELETE              0x00000004
+		XFS_PTAG_ERROR_REPORT           0x00000008
+		XFS_PTAG_SHUTDOWN_CORRUPT       0x00000010
+		XFS_PTAG_SHUTDOWN_IOERROR       0x00000020
+		XFS_PTAG_SHUTDOWN_LOGERROR      0x00000040
 
 	This option is intended for debugging only.		
 
@@ -165,6 +166,21 @@
   	Controls whether unprivileged users can use chown to "give away"
 	a file to another user.
 
+  fs.xfs.inherit_sync		(Min: 0  Default: 1  Max 1)
+	Setting this to "1" will cause the "sync" flag set
+	by the chattr(1) command on a directory to be
+	inherited by files in that directory.
+
+  fs.xfs.inherit_nodump		(Min: 0  Default: 1  Max 1)
+	Setting this to "1" will cause the "nodump" flag set
+	by the chattr(1) command on a directory to be
+	inherited by files in that directory.
+
+  fs.xfs.inherit_noatime	(Min: 0  Default: 1  Max 1)
+	Setting this to "1" will cause the "noatime" flag set
+	by the chattr(1) command on a directory to be
+	inherited by files in that directory.
+
   vm.pagebuf.stats_clear	(Min: 0  Default: 0  Max: 1)
 	Setting this to "1" clears accumulated pagebuf statistics 
 	in /proc/fs/pagebuf/stat.  It then immediately reset to "0".
--- diff/Documentation/i386/zero-page.txt	2002-11-11 11:09:30.000000000 +0000
+++ source/Documentation/i386/zero-page.txt	2003-12-29 09:30:39.000000000 +0000
@@ -22,6 +22,7 @@
 			  0x90000 + contents of CL_OFFSET
 			(only taken, when CL_MAGIC = 0xA33F)
  0x40	20 bytes	struct apm_bios_info, APM_BIOS_INFO
+ 0x60	16 bytes	Intel SpeedStep (IST) BIOS support information
  0x80	16 bytes	hd0-disk-parameter from intvector 0x41
  0x90	16 bytes	hd1-disk-parameter from intvector 0x46
 
--- diff/Documentation/kernel-parameters.txt	2003-10-09 09:47:33.000000000 +0100
+++ source/Documentation/kernel-parameters.txt	2003-12-29 09:30:39.000000000 +0000
@@ -24,6 +24,7 @@
 	HW	Appropriate hardware is enabled.
 	IA-32	IA-32 aka i386 architecture is enabled.
 	IA-64	IA-64 architecture is enabled.
+	IOSCHED	More than one I/O scheduler is enabled.
 	IP_PNP	IP DCHP, BOOTP, or RARP is enabled.
 	ISAPNP	ISA PnP code is enabled.
 	ISDN	Appropriate ISDN support is enabled.
@@ -91,6 +92,23 @@
 			ht -- run only enough ACPI to enable Hyper Threading
 			See also Documentation/pm.txt.
  
+	acpi_pic_sci=	[HW,ACPI] ACPI System Control Interrupt trigger mode
+			Format: { level | edge }
+			level   Force PIC-mode SCI to Level Trigger (default)
+			edge    Force PIC-mode SCI to Edge Trigge
+
+	acpi_irq_balance	[HW,ACPI] ACPI will balance active IRQs
+				default in APIC mode
+
+	acpi_irq_nobalance	[HW,ACPI] ACPI will not move active IRQs (default)
+				default in PIC mode
+
+	acpi_irq_pci=	[HW,ACPI] If irq_balance, Clear listed IRQs for use by PCI
+			Format: <irq>,<irq>...
+
+	acpi_irq_isa=	[HW,ACPI] If irq_balance, Mark listed IRQs used by ISA
+			Format: <irq>,<irq>...
+
 	ad1816=		[HW,OSS]
 			Format: <io>,<irq>,<dma>,<dma2>
 			See also Documentation/sound/oss/AD1816.
@@ -214,7 +232,7 @@
 			Forces specified timesource (if avaliable) to be used
 			when calculating gettimeofday(). If specicified timesource
 			is not avalible, it defaults to PIT. 
-			Format: { pit | tsc | cyclone | ... }
+			Format: { pit | tsc | cyclone | pmtmr }
 
 	hpet=		[IA-32,HPET] option to disable HPET and use PIT.
 			Format: disable
@@ -303,6 +321,10 @@
 			See comment before function elanfreq_setup() in
 			arch/i386/kernel/cpu/cpufreq/elanfreq.c.
 
+	elevator=	[IOSCHED]
+			Format: {"as"|"cfq"|"deadline"|"noop"}
+			See Documentation/as-iosched.txt for details
+
 	es1370=		[HW,OSS]
 			Format: <lineout>[,<micbias>]
 			See also header of sound/oss/es1370.c.
@@ -790,7 +812,8 @@
 			before loading.
 			See Documentation/ramdisk.txt.
 
-	psmouse_noext	[HW,MOUSE] Disable probing for PS2 mouse protocol extensions
+	psmouse_proto=  [HW,MOUSE] Highest PS2 mouse protocol extension to
+			probe for (bare|imps|exps).
 
 	psmouse_resetafter=
 			[HW,MOUSE] Try to reset Synaptics Touchpad after so many
--- diff/Documentation/kobject.txt	2003-09-17 12:28:01.000000000 +0100
+++ source/Documentation/kobject.txt	2003-12-29 09:30:39.000000000 +0000
@@ -2,7 +2,7 @@
 
 Patrick Mochel <mochel@osdl.org>
 
-Updated: 3 June 2003
+Updated: 12 November 2003
 
 
 Copyright (c)  2003 Patrick Mochel
@@ -128,7 +128,33 @@
 (like the networking layer). 
 
 
-1.4 sysfs
+1.4 Order dependencies
+
+Fields in a kobject must be initialized before they are used, as
+indicated in this table:
+
+	k_name		Before kobject_add() (1)
+	name		Before kobject_add() (1)
+	refcount	Before kobject_init() (2)
+	entry		Set by kobject_init()
+	parent		Before kobject_add() (3)
+	kset		Before kobject_init() (4)
+	ktype		Before kobject_add() (4)
+	dentry		Set by kobject_add()
+
+(1) If k_name isn't already set when kobject_add() is called,
+it will be set to name.
+
+(2) Although kobject_init() sets refcount to 1, a warning will be logged
+if refcount is not equal to 0 beforehand.
+
+(3) If parent isn't already set when kobject_add() is called,
+it will be set to kset's embedded kobject.
+
+(4) kset and ktype are optional. If they are used, they should be set
+at the times indicated.
+
+1.5 sysfs
 
 Each kobject receives a directory in sysfs. This directory is created
 under the kobject's parent directory. 
@@ -210,7 +236,25 @@
 name. The kobject, if found, is returned. 
 
 
-2.3 sysfs
+2.3 Order dependencies
+
+Fields in a kset must be initialized before they are used, as indicated
+in this table:
+
+	subsys		Before kset_add()
+	ktype		Before kset_add() (1)
+	list		Set by kset_init()
+	kobj		Before kset_init() (2)
+	hotplug_ops	Before kset_add() (1)
+
+(1) ktype and hotplug_ops are optional. If they are used, they should
+be set at the times indicated.
+
+(2) kobj is passed to kobject_init() during kset_init() and to
+kobject_add() during kset_add(); it must initialized accordingly.
+
+
+2.4 sysfs
 
 ksets are represented in sysfs when their embedded kobjects are
 registered. They follow the same rules of parenting, with one
@@ -352,7 +396,21 @@
 - Sets obj->subsys.kset.kobj.kset to the subsystem's embedded kset.
 
 
-4.4 sysfs
+4.4 Order dependencies
+
+Fields in a subsystem must be initialized before they are used,
+as indicated in this table:
+
+	kset		Before subsystem_register() (1)
+	rwsem		Set by subsystem_register()
+
+(1) kset is minimally initialized by the decl_subsys macro. It is
+passed to kset_init() and kset_add() by subsystem_register(). If its
+subsys member isn't already set, subsystem_register() sets it to the
+containing subsystem.
+
+
+4.5 sysfs
 
 subsystems are represented in sysfs via their embedded kobjects. They
 follow the same rules as previously mentioned with no exceptions. They
--- diff/Documentation/scsi/BusLogic.txt	2003-08-20 14:16:23.000000000 +0100
+++ source/Documentation/scsi/BusLogic.txt	2003-12-29 09:30:39.000000000 +0000
@@ -577,7 +577,7 @@
 INSMOD Loadable Kernel Module Installation Facility:
 
   insmod BusLogic.o \
-      'BusLogic_Options="QueueDepth:[,7,15];QueueDepth:31,BusSettleTime:30"'
+      'BusLogic="QueueDepth:[,7,15];QueueDepth:31,BusSettleTime:30"'
 
 NOTE: Module Utilities 2.1.71 or later is required for correct parsing
       of driver options containing commas.
--- diff/Documentation/sysctl/fs.txt	2003-01-02 10:43:02.000000000 +0000
+++ source/Documentation/sysctl/fs.txt	2003-12-29 09:30:39.000000000 +0000
@@ -138,3 +138,13 @@
 can have. You only need to increase super-max if you need to
 mount more filesystems than the current value in super-max
 allows you to.
+
+==============================================================
+
+aio-nr & aio-max-nr:
+
+aio-nr shows the current system-wide number of asynchronous io
+requests.  aio-max-nr allows you to change the maximum value
+aio-nr can grow to.
+
+==============================================================
--- diff/Documentation/watchdog/watchdog-api.txt	2003-09-17 12:28:01.000000000 +0100
+++ source/Documentation/watchdog/watchdog-api.txt	2003-12-29 09:30:39.000000000 +0000
@@ -358,6 +358,15 @@
 
 	No bits set in GETSUPPORT
 
+w83627hf_wdt.c -- w83627hf watchdog
+
+	Timeout that defaults to 60 seconds, supports SETTIMEOUT.
+
+	Supports CONFIG_WATCHDOG_NOWAYOUT
+
+	GETSUPPORT returns WDIOF_KEEPALIVEPING and WDIOF_SETTIMEOUT.
+	The GETSTATUS call returns if the device is open or not.
+
 wdt.c -- ICS WDT500/501 ISA and
 wdt_pci.c -- ICS WDT500/501 PCI
 
--- diff/MAINTAINERS	2003-11-25 15:24:57.000000000 +0000
+++ source/MAINTAINERS	2003-12-29 09:30:42.000000000 +0000
@@ -73,7 +73,7 @@
 3C359 NETWORK DRIVER
 P:	Mike Phillips
 M:	mikep@linuxtr.net
-L:	linux-net@vger.rutgers.edu
+L:	linux-net@vger.kernel.org
 L:	linux-tr@linuxtr.net
 W:	http://www.linuxtr.net
 S:	Maintained
@@ -929,8 +929,9 @@
 S:	Maintained
 
 SN-IA64 (Itanium) SUB-PLATFORM
-P:	John Hesterberg
-M:	jh@sgi.com
+P:	Jesse Barnes
+M:	jbarnes@sgi.com
+L:	linux-altix@sgi.com
 L:	linux-ia64@linuxia64.org
 W:	http://www.sgi.com/altix
 S:	Maintained
@@ -1154,6 +1155,12 @@
 W:	http://developer.osdl.org/rddunlap/kj-patches/
 S:	Maintained
 
+KGDB FOR I386 PLATFORM
+P:	George Anzinger
+M:	george@mvista.com
+L:	linux-net@vger.kernel.org
+S:	Supported
+
 KERNEL NFSD
 P:	Neil Brown
 M:	neilb@cse.unsw.edu.au
@@ -1234,8 +1241,8 @@
 S:	Maintained
 
 LSILOGIC/SYMBIOS/NCR 53C8XX and 53C1010 PCI-SCSI drivers
-P:	Gerard Roudier
-M:	groudier@free.fr
+P:	Matthew Wilcox
+M:	matthew@wil.cx
 L:	linux-scsi@vger.kernel.org
 S:	Maintained
 
@@ -1468,7 +1475,7 @@
 P:	Willem Riede
 M:	osst@riede.org
 L:	osst@linux1.onstream.nl
-L:	linux-scsi@vger.rutgers.edu
+L:	linux-scsi@vger.kernel.org
 S:	Maintained
 
 OPL3-SA2, SA3, and SAx DRIVER
@@ -1556,11 +1563,8 @@
 S:	Maintained
 
 PCMCIA SUBSYSTEM
-P:	David Hinds
-M:	dahinds@users.sourceforge.net
-L:	linux-kernel@vger.kernel.org
-W:	http://pcmcia-cs.sourceforge.net
-S:	Maintained
+L:	http://lists.infradead.org/mailman/listinfo/linux-pcmcia
+S:	Unmaintained
 
 PCNET32 NETWORK DRIVER
 P:	Thomas Bogend�rfer
--- diff/Makefile	2003-12-19 09:51:11.000000000 +0000
+++ source/Makefile	2003-12-29 09:30:42.000000000 +0000
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 6
 SUBLEVEL = 0
-EXTRAVERSION =
+EXTRAVERSION = -mm1
 
 # *DOCUMENTATION*
 # To see a list of typical targets execute "make help"
@@ -275,7 +275,7 @@
 CPPFLAGS        := -D__KERNEL__ -Iinclude \
 		   $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include)
 
-CFLAGS 		:= -Wall -Wstrict-prototypes -Wno-trigraphs -O2 \
+CFLAGS 		:= -Wall -Wstrict-prototypes -Wno-trigraphs \
 	  	   -fno-strict-aliasing -fno-common
 AFLAGS		:= -D__ASSEMBLY__
 
@@ -431,6 +431,12 @@
 # ---------------------------------------------------------------------------
 
 
+ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
+CFLAGS		+= -Os
+else
+CFLAGS		+= -O2
+endif
+
 ifndef CONFIG_FRAME_POINTER
 CFLAGS		+= -fomit-frame-pointer
 endif
--- diff/README	2003-10-09 09:47:33.000000000 +0100
+++ source/README	2003-12-29 09:30:42.000000000 +0000
@@ -119,7 +119,7 @@
    cd /usr/src/linux-2.6.N
    make O=/home/name/build/kernel menuconfig
    make O=/home/name/build/kernel
-   sudo make O=/home/name/build/kernel install_modules install
+   sudo make O=/home/name/build/kernel modules_install install
 
    Please note: If the 'O=output/dir' option is used then it must be
    used for all invocations of make.
--- diff/arch/alpha/kernel/irq.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/alpha/kernel/irq.c	2003-12-29 09:30:38.000000000 +0000
@@ -252,9 +252,11 @@
 irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
+	if (count - len < 2)
 		return -EINVAL;
-	return sprintf (page, "%016lx\n", irq_affinity[(long)data]);
+	len += sprintf(page + len, "\n");
+	return len;
 }
 
 static unsigned int
@@ -331,10 +333,11 @@
 prof_cpu_mask_read_proc(char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	unsigned long *mask = (unsigned long *) data;
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
+	if (count - len < 2)
 		return -EINVAL;
-	return sprintf (page, "%016lx\n", *mask);
+	len += sprintf(page + len, "\n");
+	return len;
 }
 
 static int
@@ -529,19 +532,21 @@
 #ifdef CONFIG_SMP
 	int j;
 #endif
-	int i;
+	int i = *(loff_t *) v;
 	struct irqaction * action;
 	unsigned long flags;
 
 #ifdef CONFIG_SMP
-	seq_puts(p, "           ");
-	for (i = 0; i < NR_CPUS; i++)
-		if (cpu_online(i))
-			seq_printf(p, "CPU%d       ", i);
-	seq_putc(p, '\n');
+	if (i == 0) {
+		seq_puts(p, "           ");
+		for (i = 0; i < NR_CPUS; i++)
+			if (cpu_online(i))
+				seq_printf(p, "CPU%d       ", i);
+		seq_putc(p, '\n');
+	}
 #endif
 
-	for (i = 0; i < ACTUAL_NR_IRQS; i++) {
+	if (i < ACTUAL_NR_IRQS) {
 		spin_lock_irqsave(&irq_desc[i].lock, flags);
 		action = irq_desc[i].action;
 		if (!action) 
@@ -568,15 +573,16 @@
 		seq_putc(p, '\n');
 unlock:
 		spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-	}
+	} else if (i == ACTUAL_NR_IRQS) {
 #ifdef CONFIG_SMP
-	seq_puts(p, "IPI: ");
-	for (i = 0; i < NR_CPUS; i++)
-		if (cpu_online(i))
-			seq_printf(p, "%10lu ", cpu_data[i].ipi_count);
-	seq_putc(p, '\n');
+		seq_puts(p, "IPI: ");
+		for (i = 0; i < NR_CPUS; i++)
+			if (cpu_online(i))
+				seq_printf(p, "%10lu ", cpu_data[i].ipi_count);
+		seq_putc(p, '\n');
 #endif
-	seq_printf(p, "ERR: %10lu\n", irq_err_count);
+		seq_printf(p, "ERR: %10lu\n", irq_err_count);
+	}
 	return 0;
 }
 
--- diff/arch/alpha/kernel/traps.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/alpha/kernel/traps.c	2003-12-29 09:30:38.000000000 +0000
@@ -636,6 +636,7 @@
 	lock_kernel();
 	printk("Bad unaligned kernel access at %016lx: %p %lx %ld\n",
 		pc, va, opcode, reg);
+	dump_stack();
 	do_exit(SIGSEGV);
 
 got_exception:
--- diff/arch/arm/Makefile	2003-10-27 09:20:36.000000000 +0000
+++ source/arch/arm/Makefile	2003-12-29 09:30:38.000000000 +0000
@@ -14,8 +14,6 @@
 GZFLAGS		:=-9
 #CFLAGS		+=-pipe
 
-CFLAGS		:=$(CFLAGS:-O2=-Os)
-
 ifeq ($(CONFIG_FRAME_POINTER),y)
 CFLAGS		+=-fno-omit-frame-pointer -mapcs -mno-sched-prolog
 endif
--- diff/arch/arm/kernel/irq.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/arm/kernel/irq.c	2003-12-29 09:30:38.000000000 +0000
@@ -169,11 +169,11 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 	struct irqaction * action;
 	unsigned long flags;
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		spin_lock_irqsave(&irq_controller_lock, flags);
 	    	action = irq_desc[i].action;
 		if (!action)
@@ -187,12 +187,12 @@
 		seq_putc(p, '\n');
 unlock:
 		spin_unlock_irqrestore(&irq_controller_lock, flags);
-	}
-
+	} else if (i == NR_IRQS) {
 #ifdef CONFIG_ARCH_ACORN
-	show_fiq_list(p, v);
+		show_fiq_list(p, v);
 #endif
-	seq_printf(p, "Err: %10lu\n", irq_err_count);
+		seq_printf(p, "Err: %10lu\n", irq_err_count);
+	}
 	return 0;
 }
 
--- diff/arch/arm26/kernel/irq.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/arm26/kernel/irq.c	2003-12-29 09:30:38.000000000 +0000
@@ -135,10 +135,10 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 	struct irqaction * action;
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 	    	action = irq_desc[i].action;
 		if (!action)
 			continue;
@@ -148,10 +148,10 @@
 			seq_printf(p, ", %s", action->name);
 		}
 		seq_putc(p, '\n');
+	} else if (i == NR_IRQS) {
+		show_fiq_list(p, v);
+		seq_printf(p, "Err: %10lu\n", irq_err_count);
 	}
-
-	show_fiq_list(p, v);
-	seq_printf(p, "Err: %10lu\n", irq_err_count);
 	return 0;
 }
 
--- diff/arch/cris/kernel/irq.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/cris/kernel/irq.c	2003-12-29 09:30:38.000000000 +0000
@@ -89,11 +89,11 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 	struct irqaction * action;
 	unsigned long flags;
 
-	for (i = 0; i < NR_IRQS; i++) {
+	if (i < NR_IRQS) {
 		local_irq_save(flags);
 		action = irq_action[i];
 		if (!action) 
--- diff/arch/h8300/Kconfig	2003-10-27 09:20:36.000000000 +0000
+++ source/arch/h8300/Kconfig	2003-12-29 09:30:38.000000000 +0000
@@ -5,6 +5,10 @@
 
 mainmenu "uClinux/h8300 (w/o MMU) Kernel Configuration"
 
+config H8300
+	bool
+	default y
+
 config MMU
 	bool
 	default n
--- diff/arch/h8300/Makefile	2003-08-26 10:00:51.000000000 +0100
+++ source/arch/h8300/Makefile	2003-12-29 09:30:38.000000000 +0000
@@ -34,7 +34,7 @@
 ldflags-$(CONFIG_CPU_H8S)	:= -mh8300self
 
 CFLAGS += $(cflags-y)
-CFLAGS += -mint32 -fno-builtin -Os
+CFLAGS += -mint32 -fno-builtin
 CFLAGS += -g
 CFLAGS += -D__linux__
 CFLAGS += -DUTS_SYSNAME=\"uClinux\"
--- diff/arch/h8300/platform/h8300h/ints.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/h8300/platform/h8300h/ints.c	2003-12-29 09:30:38.000000000 +0000
@@ -228,9 +228,9 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 
-	for (i = 0; i < NR_IRQS; i++) {
+	if (i < NR_IRQS) {
 		if (irq_list[i]) {
 			seq_printf(p, "%3d: %10u ",i,irq_list[i]->count);
 			seq_printf(p, "%s\n", irq_list[i]->devname);
--- diff/arch/h8300/platform/h8s/ints.c	2003-10-27 09:20:36.000000000 +0000
+++ source/arch/h8300/platform/h8s/ints.c	2003-12-29 09:30:38.000000000 +0000
@@ -280,9 +280,9 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 
-	for (i = 0; i < NR_IRQS; i++) {
+	if (i < NR_IRQS) {
 		if (irq_list[i]) {
 			seq_printf(p, "%3d: %10u ",i,irq_list[i]->count);
 			seq_printf(p, "%s\n", irq_list[i]->devname);
--- diff/arch/i386/Kconfig	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/i386/Kconfig	2003-12-29 09:30:38.000000000 +0000
@@ -115,10 +115,15 @@
 	default y
 	depends on NUMA && (X86_SUMMIT || X86_GENERICARCH)
 
+config X86_SUMMIT_NUMA
+	bool
+	default y
+	depends on NUMA && (X86_SUMMIT || X86_GENERICARCH)
+
 config X86_CYCLONE_TIMER
-       bool 
-       default y
-       depends on X86_SUMMIT || X86_GENERICARCH
+	bool
+	default y
+	depends on X86_SUMMIT || X86_GENERICARCH
 
 config ES7000_CLUSTERED_APIC
 	bool
@@ -397,6 +402,54 @@
 	depends on MWINCHIP3D || MWINCHIP2 || MWINCHIPC6
 	default y
 
+config X86_4G
+	bool "4 GB kernel-space and 4 GB user-space virtual memory support"
+	help
+          This option is only useful for systems that have more than 1 GB
+          of RAM.
+
+          The default kernel VM layout leaves 1 GB of virtual memory for
+          kernel-space mappings, and 3 GB of VM for user-space applications.
+          This option ups both the kernel-space VM and the user-space VM to
+          4 GB.
+
+          The cost of this option is additional TLB flushes done at
+          system-entry points that transition from user-mode into kernel-mode.
+          I.e. system calls and page faults, and IRQs that interrupt user-mode
+          code. There's also additional overhead to kernel operations that copy
+          memory to/from user-space. The overhead from this is hard to tell and
+          depends on the workload - it can be anything from no visible overhead
+          to 20-30% overhead. A good rule of thumb is to count with a runtime
+          overhead of 20%.
+
+          The upside is the much increased kernel-space VM, which more than
+          quadruples the maximum amount of RAM supported. Kernels compiled with
+          this option boot on 64GB of RAM and still have more than 3.1 GB of
+          'lowmem' left. Another bonus is that highmem IO bouncing decreases,
+          if used with drivers that still use bounce-buffers.
+
+          There's also a 33% increase in user-space VM size - database
+          applications might see a boost from this.
+
+          But the cost of the TLB flushes and the runtime overhead has to be
+          weighed against the bonuses offered by the larger VM spaces. The
+          dividing line depends on the actual workload - there might be 4 GB
+          systems that benefit from this option. Systems with less than 4 GB
+          of RAM will rarely see a benefit from this option - but it's not
+          out of question, the exact circumstances have to be considered.
+
+config X86_SWITCH_PAGETABLES
+	def_bool X86_4G
+
+config X86_4G_VM_LAYOUT
+	def_bool X86_4G
+
+config X86_UACCESS_INDIRECT
+	def_bool X86_4G
+
+config X86_HIGH_ENTRY
+	def_bool X86_4G
+
 config HPET_TIMER
 	bool "HPET Timer Support"
 	help
@@ -784,6 +837,25 @@
 
 	  See <file:Documentation/mtrr.txt> for more information.
 
+config EFI
+	bool "Boot from EFI support (EXPERIMENTAL)"
+	depends on ACPI
+	default n
+	---help---
+
+	This enables the the kernel to boot on EFI platforms using
+	system configuration information passed to it from the firmware.
+	This also enables the kernel to use any EFI runtime services that are
+	available (such as the EFI variable services).
+
+	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
+	anything about EFI).  However, even with this option, the resultant
+	kernel should continue to boot on existing non-EFI platforms.
+
 config HAVE_DEC_LOCK
 	bool
 	depends on (SMP || PREEMPT) && X86_CMPXCHG
@@ -793,7 +865,7 @@
 # Summit needs it only when NUMA is on
 config BOOT_IOREMAP
 	bool
-	depends on ((X86_SUMMIT || X86_GENERICARCH) && NUMA)
+	depends on (((X86_SUMMIT || X86_GENERICARCH) && NUMA) || (X86 && EFI))
 	default y
 
 endmenu
@@ -1030,6 +1102,25 @@
  	depends on PCI && ((PCI_GODIRECT || PCI_GOANY) || X86_VISWS)
 	default y
 
+config PCI_USE_VECTOR
+	bool "Vector-based interrupt indexing"
+	depends on X86_LOCAL_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 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"
 
 config ISA
@@ -1187,6 +1278,15 @@
 	  This results in a large slowdown, but helps to find certain types
 	  of memory corruptions.
 
+config SPINLINE
+	bool "Spinlock inlining"
+	depends on DEBUG_KERNEL
+	help
+	  This will change spinlocks from out of line to inline, making them
+	  account cost to the callers in readprofile, rather than the lock
+	  itself (as ".text.lock.filename"). This can be helpful for finding
+	  the callers of locks.
+
 config DEBUG_HIGHMEM
 	bool "Highmem debugging"
 	depends on DEBUG_KERNEL && HIGHMEM
@@ -1203,20 +1303,208 @@
 	  Say Y here only if you plan to use gdb to debug the kernel.
 	  If you don't debug the kernel, you can say N.
 	  
+config LOCKMETER
+	bool "Kernel lock metering"
+	depends on SMP
+	help
+	  Say Y to enable kernel lock metering, which adds overhead to SMP locks,
+	  but allows you to see various statistics using the lockstat command.
+
 config DEBUG_SPINLOCK_SLEEP
 	bool "Sleep-inside-spinlock checking"
 	help
 	  If you say Y here, various routines which may sleep will become very
 	  noisy if they are called with a spinlock held.	
 
+config KGDB
+	bool "Include kgdb kernel debugger"
+	depends on DEBUG_KERNEL
+	help
+	  If you say Y here, the system will be compiled with the debug
+	  option (-g) and a debugging stub will be included in the
+	  kernel.  This stub communicates with gdb on another (host)
+	  computer via a serial port.  The host computer should have
+	  access to the kernel binary file (vmlinux) and a serial port
+	  that is connected to the target machine.  Gdb can be made to
+	  configure the serial port or you can use stty and setserial to
+	  do this. See the 'target' command in gdb. This option also
+	  configures in the ability to request a breakpoint early in the
+	  boot process.  To request the breakpoint just include 'kgdb'
+	  as a boot option when booting the target machine.  The system
+	  will then break as soon as it looks at the boot options.  This
+	  option also installs a breakpoint in panic and sends any
+	  kernel faults to the debugger. For more information see the
+	  Documentation/i386/kgdb.txt file.
+
+choice
+	depends on KGDB
+    	prompt "Debug serial port BAUD"
+	default KGDB_115200BAUD
+	help
+	  Gdb and the kernel stub need to agree on the baud rate to be
+	  used.  Some systems (x86 family at this writing) allow this to
+	  be configured.
+
+config KGDB_9600BAUD
+	bool "9600"
+
+config KGDB_19200BAUD
+	bool "19200"
+
+config KGDB_38400BAUD
+	bool "38400"
+
+config KGDB_57600BAUD
+	bool "57600"
+
+config KGDB_115200BAUD
+	bool "115200"
+endchoice
+
+config KGDB_PORT
+	hex "hex I/O port address of the debug serial port"
+	depends on KGDB
+	default  3f8
+	help
+	  Some systems (x86 family at this writing) allow the port
+	  address to be configured.  The number entered is assumed to be
+	  hex, don't put 0x in front of it.  The standard address are:
+	  COM1 3f8 , irq 4 and COM2 2f8 irq 3.  Setserial /dev/ttySx
+	  will tell you what you have.  It is good to test the serial
+	  connection with a live system before trying to debug.
+
+config KGDB_IRQ
+	int "IRQ of the debug serial port"
+	depends on KGDB
+	default 4
+	help
+	  This is the irq for the debug port.  If everything is working
+	  correctly and the kernel has interrupts on a control C to the
+	  port should cause a break into the kernel debug stub.
+
+config DEBUG_INFO
+	bool
+	depends on KGDB
+	default y
+
+config KGDB_MORE
+	bool "Add any additional compile options"
+	depends on KGDB
+	default n
+	help
+	  Saying yes here turns on the ability to enter additional
+	  compile options.
+
+
+config KGDB_OPTIONS
+	depends on KGDB_MORE
+	string "Additional compile arguments"
+	default "-O1"
+	help
+	  This option allows you enter additional compile options for
+	  the whole kernel compile.  Each platform will have a default
+	  that seems right for it.  For example on PPC "-ggdb -O1", and
+	  for i386 "-O1".  Note that by configuring KGDB "-g" is already
+	  turned on.  In addition, on i386 platforms
+	  "-fomit-frame-pointer" is deleted from the standard compile
+	  options.
+
+config NO_KGDB_CPUS
+	int "Number of CPUs"
+	depends on KGDB && SMP
+	default NR_CPUS
+	help
+
+	  This option sets the number of cpus for kgdb ONLY.  It is used
+	  to prune some internal structures so they look "nice" when
+	  displayed with gdb.  This is to overcome possibly larger
+	  numbers that may have been entered above.  Enter the real
+	  number to get nice clean kgdb_info displays.
+
+config KGDB_TS
+	bool "Enable kgdb time stamp macros?"
+	depends on KGDB
+	default n
+	help
+	  Kgdb event macros allow you to instrument your code with calls
+	  to the kgdb event recording function.  The event log may be
+	  examined with gdb at a break point.  Turning on this
+	  capability also allows you to choose how many events to
+	  keep. Kgdb always keeps the lastest events.
+
+choice
+	depends on KGDB_TS
+	prompt "Max number of time stamps to save?"
+	default KGDB_TS_128
+
+config KGDB_TS_64
+	bool "64"
+
+config KGDB_TS_128
+	bool "128"
+
+config KGDB_TS_256
+	bool "256"
+
+config KGDB_TS_512
+	bool "512"
+
+config KGDB_TS_1024
+	bool "1024"
+
+endchoice
+
+config STACK_OVERFLOW_TEST
+	bool "Turn on kernel stack overflow testing?"
+	depends on KGDB
+	default n
+	help
+	  This option enables code in the front line interrupt handlers
+	  to check for kernel stack overflow on interrupts and system
+	  calls.  This is part of the kgdb code on x86 systems.
+
+config KGDB_CONSOLE
+	bool "Enable serial console thru kgdb port"
+	depends on KGDB
+	default n
+	help
+	  This option enables the command line "console=kgdb" option.
+	  When the system is booted with this option in the command line
+	  all kernel printk output is sent to gdb (as well as to other
+	  consoles).  For this to work gdb must be connected.  For this
+	  reason, this command line option will generate a breakpoint if
+	  gdb has not yet connected.  After the gdb continue command is
+	  given all pent up console output will be printed by gdb on the
+	  host machine.  Neither this option, nor KGDB require the
+	  serial driver to be configured.
+
+config KGDB_SYSRQ
+	bool "Turn on SysRq 'G' command to do a break?"
+	depends on KGDB
+	default y
+	help
+	  This option includes an option in the SysRq code that allows
+	  you to enter SysRq G which generates a breakpoint to the KGDB
+	  stub.  This will work if the keyboard is alive and can
+	  interrupt the system.  Because of constraints on when the
+	  serial port interrupt can be enabled, this code may allow you
+	  to interrupt the system before the serial port control C is
+	  available.  Just say yes here.
+
 config FRAME_POINTER
 	bool "Compile the kernel with frame pointers"
+	default KGDB
 	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
+	depends on KGDB_SYSRQ
+	default y
+
 config X86_EXTRA_IRQS
 	bool
 	depends on X86_LOCAL_APIC || X86_VOYAGER
--- diff/arch/i386/Makefile	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/Makefile	2003-12-29 09:30:38.000000000 +0000
@@ -84,6 +84,9 @@
 # default subarch .h files
 mflags-y += -Iinclude/asm-i386/mach-default
 
+mflags-$(CONFIG_KGDB) += -gdwarf-2
+mflags-$(CONFIG_KGDB_MORE) += $(shell echo $(CONFIG_KGDB_OPTIONS) | sed -e 's/"//g')
+
 head-y := arch/i386/kernel/head.o arch/i386/kernel/init_task.o
 
 libs-y 					+= arch/i386/lib/
--- diff/arch/i386/boot/setup.S	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/boot/setup.S	2003-12-29 09:30:38.000000000 +0000
@@ -162,7 +162,7 @@
 					# can be located anywhere in
 					# low memory 0x10000 or higher.
 
-ramdisk_max:	.long MAXMEM-1		# (Header version 0x0203 or later)
+ramdisk_max:	.long __MAXMEM-1	# (Header version 0x0203 or later)
 					# The highest safe address for
 					# the contents of an initrd
 
--- diff/arch/i386/kernel/Makefile	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/kernel/Makefile	2003-12-29 09:30:38.000000000 +0000
@@ -7,13 +7,14 @@
 obj-y	:= process.o semaphore.o signal.o entry.o traps.o irq.o vm86.o \
 		ptrace.o i8259.o ioport.o ldt.o setup.o time.o sys_i386.o \
 		pci-dma.o i386_ksyms.o i387.o dmi_scan.o bootflag.o \
-		doublefault.o
+		doublefault.o entry_trampoline.o
 
 obj-y				+= cpu/
 obj-y				+= timers/
 obj-$(CONFIG_ACPI_BOOT)		+= acpi/
 obj-$(CONFIG_X86_BIOS_REBOOT)	+= reboot.o
 obj-$(CONFIG_MCA)		+= mca.o
+obj-$(CONFIG_KGDB)		+= kgdb_stub.o
 obj-$(CONFIG_X86_MSR)		+= msr.o
 obj-$(CONFIG_X86_CPUID)		+= cpuid.o
 obj-$(CONFIG_MICROCODE)		+= microcode.o
@@ -24,12 +25,13 @@
 obj-$(CONFIG_X86_LOCAL_APIC)	+= apic.o nmi.o
 obj-$(CONFIG_X86_IO_APIC)	+= io_apic.o
 obj-$(CONFIG_X86_NUMAQ)		+= numaq.o
-obj-$(CONFIG_X86_SUMMIT)	+= summit.o
+obj-$(CONFIG_X86_SUMMIT_NUMA)	+= summit.o
 obj-$(CONFIG_EDD)             	+= edd.o
 obj-$(CONFIG_MODULES)		+= module.o
 obj-y				+= sysenter.o vsyscall.o
 obj-$(CONFIG_ACPI_SRAT) 	+= srat.o
 obj-$(CONFIG_HPET_TIMER) 	+= time_hpet.o
+obj-$(CONFIG_EFI) 		+= efi.o efi_stub.o
 
 EXTRA_AFLAGS   := -traditional
 
--- diff/arch/i386/kernel/acpi/boot.c	2003-11-25 15:24:57.000000000 +0000
+++ source/arch/i386/kernel/acpi/boot.c	2003-12-29 09:30:38.000000000 +0000
@@ -26,6 +26,7 @@
 #include <linux/init.h>
 #include <linux/config.h>
 #include <linux/acpi.h>
+#include <linux/efi.h>
 #include <asm/pgalloc.h>
 #include <asm/io_apic.h>
 #include <asm/apic.h>
@@ -40,9 +41,8 @@
 
 #define PREFIX			"ACPI: "
 
-extern int acpi_disabled;
-extern int acpi_irq;
-extern int acpi_ht;
+int acpi_noirq __initdata = 0;	/* skip ACPI IRQ initialization */
+int acpi_ht __initdata = 1;	/* enable HT */
 
 int acpi_lapic = 0;
 int acpi_ioapic = 0;
@@ -249,29 +249,66 @@
 
 #ifdef	CONFIG_ACPI_BUS
 /*
- * Set specified PIC IRQ to level triggered mode.
+ * "acpi_pic_sci=level" (current default)
+ * programs the PIC-mode SCI to Level Trigger.
+ * (NO-OP if the BIOS set Level Trigger already)
+ *
+ * If a PIC-mode SCI is not recogznied or gives spurious IRQ7's
+ * it may require Edge Trigger -- use "acpi_pic_sci=edge"
+ * (NO-OP if the BIOS set Edge Trigger already)
  *
  * Port 0x4d0-4d1 are ECLR1 and ECLR2, the Edge/Level Control Registers
  * for the 8259 PIC.  bit[n] = 1 means irq[n] is Level, otherwise Edge.
  * ECLR1 is IRQ's 0-7 (IRQ 0, 1, 2 must be 0)
  * ECLR2 is IRQ's 8-15 (IRQ 8, 13 must be 0)
- *
- * As the BIOS should have done this for us,
- * print a warning if the IRQ wasn't already set to level.
  */
 
-void acpi_pic_set_level_irq(unsigned int irq)
+static int __initdata	acpi_pic_sci_trigger;	/* 0: level, 1: edge */
+
+void __init
+acpi_pic_sci_set_trigger(unsigned int irq)
 {
 	unsigned char mask = 1 << (irq & 7);
 	unsigned int port = 0x4d0 + (irq >> 3);
 	unsigned char val = inb(port);
 
+	
+	printk(PREFIX "IRQ%d SCI:", irq);
 	if (!(val & mask)) {
-		printk(KERN_WARNING PREFIX "IRQ %d was Edge Triggered, "
-			"setting to Level Triggerd\n", irq);
-		outb(val | mask, port);
+		printk(" Edge");
+
+		if (!acpi_pic_sci_trigger) {
+			printk(" set to Level");
+			outb(val | mask, port);
+		}
+	} else {
+		printk(" Level");
+
+		if (acpi_pic_sci_trigger) {
+			printk(" set to Edge");
+			outb(val | mask, port);
+		}
+	}
+	printk(" Trigger.\n");
+}
+
+int __init
+acpi_pic_sci_setup(char *str)
+{
+	while (str && *str) {
+		if (strncmp(str, "level", 5) == 0)
+			acpi_pic_sci_trigger = 0;	/* force level trigger */
+		if (strncmp(str, "edge", 4) == 0)
+			acpi_pic_sci_trigger = 1;	/* force edge trigger */
+		str = strchr(str, ',');
+		if (str)
+			str += strspn(str, ", \t");
 	}
+	return 1;
 }
+
+__setup("acpi_pic_sci=", acpi_pic_sci_setup);
+
 #endif /* CONFIG_ACPI_BUS */
 
 
@@ -326,11 +363,48 @@
 }
 #endif
 
+/* detect the location of the ACPI PM Timer */
+#ifdef CONFIG_X86_PM_TIMER
+extern u32 pmtmr_ioport;
+
+static int __init acpi_parse_fadt(unsigned long phys, unsigned long size)
+{
+	struct fadt_descriptor_rev2 *fadt =0;
+
+	fadt = (struct fadt_descriptor_rev2*) __acpi_map_table(phys,size);
+	if(!fadt) {
+		printk(KERN_WARNING PREFIX "Unable to map FADT\n");
+		return 0;
+	}
+
+	if (fadt->revision >= FADT2_REVISION_ID) {
+		/* FADT rev. 2 */
+		if (fadt->xpm_tmr_blk.address_space_id != ACPI_ADR_SPACE_SYSTEM_IO)
+			return 0;
+
+		pmtmr_ioport = fadt->xpm_tmr_blk.address;
+	} else {
+		/* FADT rev. 1 */
+		pmtmr_ioport = fadt->V1_pm_tmr_blk;
+	}
+	if (pmtmr_ioport)
+		printk(KERN_INFO PREFIX "PM-Timer IO Port: %#x\n", pmtmr_ioport);
+	return 0;
+}
+#endif
+
+
 unsigned long __init
 acpi_find_rsdp (void)
 {
 	unsigned long		rsdp_phys = 0;
 
+	if (efi_enabled) {
+		if (efi.acpi20)
+			return __pa(efi.acpi20);
+		else if (efi.acpi)
+			return __pa(efi.acpi);
+	}
 	/*
 	 * Scan memory looking for the RSDP signature. First search EBDA (low
 	 * memory) paragraphs and then search upper memory (E0000-FFFFF).
@@ -380,8 +454,10 @@
 	 * Initialize the ACPI boot-time table parser.
 	 */
 	result = acpi_table_init();
-	if (result)
+	if (result) {
+		acpi_disabled = 1;
 		return result;
+	}
 
 	result = acpi_blacklisted();
 	if (result) {
@@ -462,7 +538,7 @@
 	 * If MPS is present, it will handle them,
 	 * otherwise the system will stay in PIC mode
 	 */
-	if (acpi_disabled || !acpi_irq) {
+	if (acpi_disabled || acpi_noirq) {
 		return 1;
         }
 
@@ -504,6 +580,8 @@
 
 	acpi_irq_model = ACPI_IRQ_MODEL_IOAPIC;
 
+	acpi_irq_balance_set(NULL);
+
 	acpi_ioapic = 1;
 
 #endif /* CONFIG_X86_IO_APIC && CONFIG_ACPI_INTERPRETER */
@@ -519,5 +597,9 @@
 	acpi_table_parse(ACPI_HPET, acpi_parse_hpet);
 #endif
 
+#ifdef CONFIG_X86_PM_TIMER
+	acpi_table_parse(ACPI_FADT, acpi_parse_fadt);
+#endif
+
 	return 0;
 }
--- diff/arch/i386/kernel/asm-offsets.c	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/kernel/asm-offsets.c	2003-12-29 09:30:38.000000000 +0000
@@ -4,9 +4,11 @@
  * to extract and format the required data.
  */
 
+#include <linux/sched.h>
 #include <linux/signal.h>
 #include <asm/ucontext.h>
 #include "sigframe.h"
+#include <asm/fixmap.h>
 
 #define DEFINE(sym, val) \
         asm volatile("\n->" #sym " %0 " #val : : "i" (val))
@@ -28,4 +30,17 @@
 
 	DEFINE(RT_SIGFRAME_sigcontext,
 	       offsetof (struct rt_sigframe, uc.uc_mcontext));
+	DEFINE(TI_task, offsetof (struct thread_info, task));
+	DEFINE(TI_exec_domain, offsetof (struct thread_info, exec_domain));
+	DEFINE(TI_flags, offsetof (struct thread_info, flags));
+	DEFINE(TI_preempt_count, offsetof (struct thread_info, preempt_count));
+	DEFINE(TI_addr_limit, offsetof (struct thread_info, addr_limit));
+	DEFINE(TI_real_stack, offsetof (struct thread_info, real_stack));
+	DEFINE(TI_virtual_stack, offsetof (struct thread_info, virtual_stack));
+	DEFINE(TI_user_pgd, offsetof (struct thread_info, user_pgd));
+
+	DEFINE(FIX_ENTRY_TRAMPOLINE_0_addr, __fix_to_virt(FIX_ENTRY_TRAMPOLINE_0));
+	DEFINE(FIX_VSYSCALL_addr, __fix_to_virt(FIX_VSYSCALL));
+	DEFINE(PAGE_SIZE_asm, PAGE_SIZE);
+	DEFINE(task_thread_db7, offsetof (struct task_struct, thread.debugreg[7]));
 }
--- diff/arch/i386/kernel/cpu/common.c	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/kernel/cpu/common.c	2003-12-29 09:30:38.000000000 +0000
@@ -510,16 +510,20 @@
 		BUG();
 	enter_lazy_tlb(&init_mm, current);
 
-	load_esp0(t, thread->esp0);
+	load_esp0(t, thread);
 	set_tss_desc(cpu,t);
 	cpu_gdt_table[cpu][GDT_ENTRY_TSS].b &= 0xfffffdff;
 	load_TR_desc();
-	load_LDT(&init_mm.context);
+	if (cpu)
+		load_LDT(&init_mm.context);
 
 	/* Set up doublefault TSS pointer in the GDT */
 	__set_tss_desc(cpu, GDT_ENTRY_DOUBLEFAULT_TSS, &doublefault_tss);
 	cpu_gdt_table[cpu][GDT_ENTRY_DOUBLEFAULT_TSS].b &= 0xfffffdff;
 
+	if (cpu)
+		trap_init_virtual_GDT();
+
 	/* Clear %fs and %gs. */
 	asm volatile ("xorl %eax, %eax; movl %eax, %fs; movl %eax, %gs");
 
--- diff/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c	2003-09-17 12:28:01.000000000 +0100
+++ source/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c	2003-12-29 09:30:38.000000000 +0000
@@ -73,6 +73,16 @@
 	{ .frequency = CPUFREQ_TABLE_END }
 };
 
+/* Ultra Low Voltage Intel Pentium M processor 1000MHz */
+static struct cpufreq_frequency_table op_1000[] =
+  {
+    OP(600,  844),
+    OP(800,  972),
+    OP(900, 988),
+    OP(1000, 1004),
+    { .frequency = CPUFREQ_TABLE_END }
+  };
+
 /* Low Voltage Intel Pentium M processor 1.10GHz */
 static struct cpufreq_frequency_table op_1100[] =
 {
@@ -165,6 +175,7 @@
 static const struct cpu_model models[] = 
 {
        _CPU( 900, " 900"),
+       CPU(1000),
 	CPU(1100),
 	CPU(1200),
 	CPU(1300),
--- diff/arch/i386/kernel/cpu/intel.c	2003-11-25 15:24:57.000000000 +0000
+++ source/arch/i386/kernel/cpu/intel.c	2003-12-29 09:30:38.000000000 +0000
@@ -8,11 +8,10 @@
 #include <asm/processor.h>
 #include <asm/msr.h>
 #include <asm/uaccess.h>
+#include <asm/desc.h>
 
 #include "cpu.h"
 
-extern int trap_init_f00f_bug(void);
-
 #ifdef CONFIG_X86_INTEL_USERCOPY
 /*
  * Alignment at which movsl is preferred for bulk memory copies.
@@ -157,7 +156,7 @@
 
 		c->f00f_bug = 1;
 		if ( !f00f_workaround_enabled ) {
-			trap_init_f00f_bug();
+			trap_init_virtual_IDT();
 			printk(KERN_NOTICE "Intel Pentium with F0 0F bug - workaround enabled.\n");
 			f00f_workaround_enabled = 1;
 		}
@@ -240,6 +239,12 @@
 	/* SEP CPUID bug: Pentium Pro reports SEP but doesn't have it until model 3 mask 3 */
 	if ((c->x86<<8 | c->x86_model<<4 | c->x86_mask) < 0x633)
 		clear_bit(X86_FEATURE_SEP, c->x86_capability);
+	/*
+	 * FIXME: SEP is disabled for 4G/4G for now:
+	 */
+#ifdef CONFIG_X86_HIGH_ENTRY
+	clear_bit(X86_FEATURE_SEP, c->x86_capability);
+#endif
 
 	/* Names for the Pentium II/Celeron processors 
 	   detectable only by also checking the cache size.
--- diff/arch/i386/kernel/dmi_scan.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/i386/kernel/dmi_scan.c	2003-12-29 09:30:38.000000000 +0000
@@ -6,6 +6,7 @@
 #include <linux/module.h>
 #include <linux/apm_bios.h>
 #include <linux/slab.h>
+#include <asm/acpi.h>
 #include <asm/io.h>
 #include <linux/pm.h>
 #include <asm/system.h>
@@ -16,6 +17,7 @@
 
 int is_sony_vaio_laptop;
 int is_unsafe_smbus;
+int es7000_plat = 0;
 
 struct dmi_header
 {
@@ -504,6 +506,7 @@
 }
 
 
+#ifdef	CONFIG_ACPI_BOOT
 extern int acpi_disabled, acpi_force;
 
 static __init __attribute__((unused)) int acpi_disable(struct dmi_blacklist *d) 
@@ -518,8 +521,6 @@
 	return 0;
 } 
 
-
-#ifdef	CONFIG_ACPI_BOOT
 extern int acpi_ht;
 
 /*
@@ -542,10 +543,8 @@
 #ifdef	CONFIG_ACPI_PCI
 static __init int disable_acpi_pci(struct dmi_blacklist *d) 
 { 
-	extern __init void pci_disable_acpi(void) ;
-
 	printk(KERN_NOTICE "%s detected: force use of pci=noacpi\n", d->ident); 	
-	pci_disable_acpi();
+	acpi_noirq_set();
 	return 0;
 } 
 #endif
@@ -1011,6 +1010,7 @@
 				printk(KERN_NOTICE "ACPI disabled because your bios is from %s and too old\n", s);
 				printk(KERN_NOTICE "You can enable it with acpi=force\n");
 				acpi_disabled = 1; 
+				acpi_ht = 0;
 			} 
 		}
 	}
--- diff/arch/i386/kernel/doublefault.c	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/kernel/doublefault.c	2003-12-29 09:30:38.000000000 +0000
@@ -7,12 +7,13 @@
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
 #include <asm/desc.h>
+#include <asm/fixmap.h>
 
 #define DOUBLEFAULT_STACKSIZE (1024)
 static unsigned long doublefault_stack[DOUBLEFAULT_STACKSIZE];
 #define STACK_START (unsigned long)(doublefault_stack+DOUBLEFAULT_STACKSIZE)
 
-#define ptr_ok(x) ((x) > 0xc0000000 && (x) < 0xc1000000)
+#define ptr_ok(x) (((x) > __PAGE_OFFSET && (x) < (__PAGE_OFFSET + 0x01000000)) || ((x) >= FIXADDR_START))
 
 static void doublefault_fn(void)
 {
@@ -38,8 +39,8 @@
 
 			printk("eax = %08lx, ebx = %08lx, ecx = %08lx, edx = %08lx\n",
 				t->eax, t->ebx, t->ecx, t->edx);
-			printk("esi = %08lx, edi = %08lx\n",
-				t->esi, t->edi);
+			printk("esi = %08lx, edi = %08lx, ebp = %08lx\n",
+				t->esi, t->edi, t->ebp);
 		}
 	}
 
--- diff/arch/i386/kernel/entry.S	2003-11-25 15:24:57.000000000 +0000
+++ source/arch/i386/kernel/entry.S	2003-12-29 09:30:38.000000000 +0000
@@ -43,11 +43,25 @@
 #include <linux/config.h>
 #include <linux/linkage.h>
 #include <asm/thread_info.h>
+#include <asm/asm_offsets.h>
 #include <asm/errno.h>
 #include <asm/segment.h>
+#include <asm/page.h>
 #include <asm/smp.h>
 #include <asm/page.h>
 #include "irq_vectors.h"
+        /* We do not recover from a stack overflow, but at least
+         * we know it happened and should be able to track it down.
+         */
+#ifdef CONFIG_STACK_OVERFLOW_TEST
+#define STACK_OVERFLOW_TEST \
+        testl $7680,%esp;    \
+        jnz   10f;            \
+        call  stack_overflow; \
+10:
+#else
+#define STACK_OVERFLOW_TEST
+#endif
 
 #define nr_syscalls ((syscall_table_size)/4)
 
@@ -87,7 +101,102 @@
 #define resume_kernel		restore_all
 #endif
 
-#define SAVE_ALL \
+#ifdef CONFIG_X86_HIGH_ENTRY
+
+#ifdef CONFIG_X86_SWITCH_PAGETABLES
+
+#if defined(CONFIG_PREEMPT) && defined(CONFIG_SMP)
+/*
+ * If task is preempted in __SWITCH_KERNELSPACE, and moved to another cpu,
+ * __switch_to repoints %esp to the appropriate virtual stack; but %ebp is
+ * left stale, so we must check whether to repeat the real stack calculation.
+ */
+#define repeat_if_esp_changed				\
+	xorl %esp, %ebp;				\
+	testl $0xffffe000, %ebp;			\
+	jnz 0b
+#else
+#define repeat_if_esp_changed
+#endif
+
+/* clobbers ebx, edx and ebp */
+
+#define __SWITCH_KERNELSPACE				\
+	cmpl $0xff000000, %esp;				\
+	jb 1f;						\
+							\
+	/*						\
+	 * switch pagetables and load the real stack,	\
+	 * keep the stack offset:			\
+	 */						\
+							\
+	movl $swapper_pg_dir-__PAGE_OFFSET, %edx;	\
+							\
+	/* GET_THREAD_INFO(%ebp) intermixed */		\
+0:							\
+	movl %esp, %ebp;				\
+	movl %esp, %ebx;				\
+	andl $0xffffe000, %ebp;				\
+	andl $0x00001fff, %ebx;				\
+	orl TI_real_stack(%ebp), %ebx;			\
+	repeat_if_esp_changed;				\
+							\
+	movl %edx, %cr3;				\
+	movl %ebx, %esp;				\
+1:
+
+#endif
+
+
+#define __SWITCH_USERSPACE \
+	/* interrupted any of the user return paths? */	\
+							\
+	movl EIP(%esp), %eax;				\
+							\
+	cmpl $int80_ret_start_marker, %eax;		\
+	jb 33f; /* nope - continue with sysexit check */\
+	cmpl $int80_ret_end_marker, %eax;		\
+	jb 22f; /* yes - switch to virtual stack */	\
+33:							\
+	cmpl $sysexit_ret_start_marker, %eax;		\
+	jb 44f; /* nope - continue with user check */	\
+	cmpl $sysexit_ret_end_marker, %eax;		\
+	jb 22f; /* yes - switch to virtual stack */	\
+	/* return to userspace? */			\
+44:							\
+	movl EFLAGS(%esp),%ecx;				\
+	movb CS(%esp),%cl;				\
+	testl $(VM_MASK | 3),%ecx;			\
+	jz 2f;						\
+22:							\
+	/*						\
+	 * switch to the virtual stack, then switch to	\
+	 * the userspace pagetables.			\
+	 */						\
+							\
+	GET_THREAD_INFO(%ebp);				\
+	movl TI_virtual_stack(%ebp), %edx;		\
+	movl TI_user_pgd(%ebp), %ecx;			\
+							\
+	movl %esp, %ebx;				\
+	andl $0x1fff, %ebx;				\
+	orl %ebx, %edx;					\
+int80_ret_start_marker:					\
+	movl %edx, %esp; 				\
+	movl %ecx, %cr3;				\
+							\
+	__RESTORE_ALL;					\
+int80_ret_end_marker:					\
+2:
+
+#else /* !CONFIG_X86_HIGH_ENTRY */
+
+#define __SWITCH_KERNELSPACE
+#define __SWITCH_USERSPACE
+
+#endif
+
+#define __SAVE_ALL \
 	cld; \
 	pushl %es; \
 	pushl %ds; \
@@ -102,7 +211,7 @@
 	movl %edx, %ds; \
 	movl %edx, %es;
 
-#define RESTORE_INT_REGS \
+#define __RESTORE_INT_REGS \
 	popl %ebx;	\
 	popl %ecx;	\
 	popl %edx;	\
@@ -111,29 +220,28 @@
 	popl %ebp;	\
 	popl %eax
 
-#define RESTORE_REGS	\
-	RESTORE_INT_REGS; \
-1:	popl %ds;	\
-2:	popl %es;	\
+#define __RESTORE_REGS	\
+	__RESTORE_INT_REGS; \
+111:	popl %ds;	\
+222:	popl %es;	\
 .section .fixup,"ax";	\
-3:	movl $0,(%esp);	\
-	jmp 1b;		\
-4:	movl $0,(%esp);	\
-	jmp 2b;		\
+444:	movl $0,(%esp);	\
+	jmp 111b;	\
+555:	movl $0,(%esp);	\
+	jmp 222b;	\
 .previous;		\
 .section __ex_table,"a";\
 	.align 4;	\
-	.long 1b,3b;	\
-	.long 2b,4b;	\
+	.long 111b,444b;\
+	.long 222b,555b;\
 .previous
 
-
-#define RESTORE_ALL	\
-	RESTORE_REGS	\
+#define __RESTORE_ALL	\
+	__RESTORE_REGS	\
 	addl $4, %esp;	\
-1:	iret;		\
+333:	iret;		\
 .section .fixup,"ax";   \
-2:	sti;		\
+666:	sti;		\
 	movl $(__USER_DS), %edx; \
 	movl %edx, %ds; \
 	movl %edx, %es; \
@@ -142,10 +250,19 @@
 .previous;		\
 .section __ex_table,"a";\
 	.align 4;	\
-	.long 1b,2b;	\
+	.long 333b,666b;\
 .previous
 
+#define SAVE_ALL \
+	__SAVE_ALL;					\
+	__SWITCH_KERNELSPACE;				\
+        STACK_OVERFLOW_TEST;
+
+#define RESTORE_ALL					\
+	__SWITCH_USERSPACE;				\
+	__RESTORE_ALL;
 
+.section .entry.text,"ax"
 
 ENTRY(lcall7)
 	pushfl			# We get a different stack layout with call
@@ -163,7 +280,7 @@
 	movl %edx,EIP(%ebp)	# Now we move them to their "normal" places
 	movl %ecx,CS(%ebp)	#
 	andl $-8192, %ebp	# GET_THREAD_INFO
-	movl TI_EXEC_DOMAIN(%ebp), %edx	# Get the execution domain
+	movl TI_exec_domain(%ebp), %edx	# Get the execution domain
 	call *4(%edx)		# Call the lcall7 handler for the domain
 	addl $4, %esp
 	popl %eax
@@ -208,7 +325,7 @@
  	cli				# make sure we don't miss an interrupt
 					# setting need_resched or sigpending
 					# between sampling and the iret
-	movl TI_FLAGS(%ebp), %ecx
+	movl TI_flags(%ebp), %ecx
 	andl $_TIF_WORK_MASK, %ecx	# is there any work to be done on
 					# int/exception return?
 	jne work_pending
@@ -216,18 +333,18 @@
 
 #ifdef CONFIG_PREEMPT
 ENTRY(resume_kernel)
-	cmpl $0,TI_PRE_COUNT(%ebp)	# non-zero preempt_count ?
+	cmpl $0,TI_preempt_count(%ebp)	# non-zero preempt_count ?
 	jnz restore_all
 need_resched:
-	movl TI_FLAGS(%ebp), %ecx	# need_resched set ?
+	movl TI_flags(%ebp), %ecx	# need_resched set ?
 	testb $_TIF_NEED_RESCHED, %cl
 	jz restore_all
 	testl $IF_MASK,EFLAGS(%esp)     # interrupts off (exception path) ?
 	jz restore_all
-	movl $PREEMPT_ACTIVE,TI_PRE_COUNT(%ebp)
+	movl $PREEMPT_ACTIVE,TI_preempt_count(%ebp)
 	sti
 	call schedule
-	movl $0,TI_PRE_COUNT(%ebp)
+	movl $0,TI_preempt_count(%ebp)
 	cli
 	jmp need_resched
 #endif
@@ -246,37 +363,50 @@
 	pushl $(__USER_CS)
 	pushl $SYSENTER_RETURN
 
-/*
- * Load the potential sixth argument from user stack.
- * Careful about security.
- */
-	cmpl $__PAGE_OFFSET-3,%ebp
-	jae syscall_fault
-1:	movl (%ebp),%ebp
-.section __ex_table,"a"
-	.align 4
-	.long 1b,syscall_fault
-.previous
-
 	pushl %eax
 	SAVE_ALL
 	GET_THREAD_INFO(%ebp)
 	cmpl $(nr_syscalls), %eax
 	jae syscall_badsys
 
-	testb $_TIF_SYSCALL_TRACE,TI_FLAGS(%ebp)
+	testb $_TIF_SYSCALL_TRACE,TI_flags(%ebp)
 	jnz syscall_trace_entry
 	call *sys_call_table(,%eax,4)
 	movl %eax,EAX(%esp)
 	cli
-	movl TI_FLAGS(%ebp), %ecx
+	movl TI_flags(%ebp), %ecx
 	testw $_TIF_ALLWORK_MASK, %cx
 	jne syscall_exit_work
+
+#ifdef CONFIG_X86_SWITCH_PAGETABLES
+
+	GET_THREAD_INFO(%ebp)
+	movl TI_virtual_stack(%ebp), %edx
+	movl TI_user_pgd(%ebp), %ecx
+	movl %esp, %ebx
+	andl $0x1fff, %ebx
+	orl %ebx, %edx
+sysexit_ret_start_marker:
+	movl %edx, %esp
+	movl %ecx, %cr3
+#endif
+	/*
+	 * only ebx is not restored by the userspace sysenter vsyscall
+	 * code, it assumes it to be callee-saved.
+	 */
+	movl EBX(%esp), %ebx
+
 /* if something modifies registers it must also disable sysexit */
+
 	movl EIP(%esp), %edx
 	movl OLDESP(%esp), %ecx
+
 	sti
 	sysexit
+#ifdef CONFIG_X86_SWITCH_PAGETABLES
+sysexit_ret_end_marker:
+	nop
+#endif
 
 
 	# system call handler stub
@@ -287,7 +417,7 @@
 	cmpl $(nr_syscalls), %eax
 	jae syscall_badsys
 					# system call tracing in operation
-	testb $_TIF_SYSCALL_TRACE,TI_FLAGS(%ebp)
+	testb $_TIF_SYSCALL_TRACE,TI_flags(%ebp)
 	jnz syscall_trace_entry
 syscall_call:
 	call *sys_call_table(,%eax,4)
@@ -296,10 +426,23 @@
 	cli				# make sure we don't miss an interrupt
 					# setting need_resched or sigpending
 					# between sampling and the iret
-	movl TI_FLAGS(%ebp), %ecx
+	movl TI_flags(%ebp), %ecx
 	testw $_TIF_ALLWORK_MASK, %cx	# current->work
 	jne syscall_exit_work
 restore_all:
+#ifdef CONFIG_TRAP_BAD_SYSCALL_EXITS
+	movl EFLAGS(%esp), %eax		# mix EFLAGS and CS
+	movb CS(%esp), %al
+	testl $(VM_MASK | 3), %eax
+	jz resume_kernelX		# returning to kernel or vm86-space
+
+	cmpl $0,TI_preempt_count(%ebp)	# non-zero preempt_count ?
+	jz resume_kernelX
+
+        int $3
+
+resume_kernelX:
+#endif
 	RESTORE_ALL
 
 	# perform work that needs to be done immediately before resumption
@@ -312,7 +455,7 @@
 	cli				# make sure we don't miss an interrupt
 					# setting need_resched or sigpending
 					# between sampling and the iret
-	movl TI_FLAGS(%ebp), %ecx
+	movl TI_flags(%ebp), %ecx
 	andl $_TIF_WORK_MASK, %ecx	# is there any work to be done other
 					# than syscall tracing?
 	jz restore_all
@@ -327,6 +470,22 @@
 					# vm86-space
 	xorl %edx, %edx
 	call do_notify_resume
+
+#if CONFIG_X86_HIGH_ENTRY
+	/*
+	 * Reload db7 if necessary:
+	 */
+	movl TI_flags(%ebp), %ecx
+	testb $_TIF_DB7, %cl
+	jnz work_db7
+
+	jmp restore_all
+
+work_db7:
+	movl TI_task(%ebp), %edx;
+	movl task_thread_db7(%edx), %edx;
+	movl %edx, %db7;
+#endif
 	jmp restore_all
 
 	ALIGN
@@ -382,7 +541,7 @@
  */
 .data
 ENTRY(interrupt)
-.text
+.previous
 
 vector=0
 ENTRY(irq_entries_start)
@@ -392,7 +551,7 @@
 	jmp common_interrupt
 .data
 	.long 1b
-.text
+.previous
 vector=vector+1
 .endr
 
@@ -433,12 +592,17 @@
 	movl ES(%esp), %edi		# get the function address
 	movl %eax, ORIG_EAX(%esp)
 	movl %ecx, ES(%esp)
-	movl %esp, %edx
 	pushl %esi			# push the error code
-	pushl %edx			# push the pt_regs pointer
 	movl $(__USER_DS), %edx
 	movl %edx, %ds
 	movl %edx, %es
+
+/* clobbers edx, ebx and ebp */
+	__SWITCH_KERNELSPACE
+
+	leal 4(%esp), %edx		# prepare pt_regs
+	pushl %edx			# push pt_regs
+
 	call *%edi
 	addl $8, %esp
 	jmp ret_from_exception
@@ -529,7 +693,7 @@
 	pushl %edx
 	call do_nmi
 	addl $8, %esp
-	RESTORE_ALL
+	jmp restore_all
 
 nmi_stack_fixup:
 	FIX_STACK(12,nmi_stack_correct, 1)
@@ -606,6 +770,8 @@
 	pushl $do_spurious_interrupt_bug
 	jmp error_code
 
+.previous
+
 .data
 ENTRY(sys_call_table)
 	.long sys_restart_syscall	/* 0 - old "setup()" system call, used for restarting */
--- diff/arch/i386/kernel/head.S	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/kernel/head.S	2003-12-29 09:30:38.000000000 +0000
@@ -16,6 +16,7 @@
 #include <asm/pgtable.h>
 #include <asm/desc.h>
 #include <asm/cache.h>
+#include <asm/asm_offsets.h>
 
 #define OLD_CL_MAGIC_ADDR	0x90020
 #define OLD_CL_MAGIC		0xA33F
@@ -330,7 +331,7 @@
 
 /* This is the default interrupt "handler" :-) */
 int_msg:
-	.asciz "Unknown interrupt\n"
+	.asciz "Unknown interrupt or fault at EIP %p %p %p\n"
 	ALIGN
 ignore_int:
 	cld
@@ -342,9 +343,17 @@
 	movl $(__KERNEL_DS),%eax
 	movl %eax,%ds
 	movl %eax,%es
+	pushl 16(%esp)
+	pushl 24(%esp)
+	pushl 32(%esp)
+	pushl 40(%esp)
 	pushl $int_msg
 	call printk
 	popl %eax
+	popl %eax
+	popl %eax
+	popl %eax
+	popl %eax
 	popl %ds
 	popl %es
 	popl %edx
@@ -377,23 +386,27 @@
 	.fill NR_CPUS-1,8,0		# space for the other GDT descriptors
 
 /*
- * This is initialized to create an identity-mapping at 0-8M (for bootup
- * purposes) and another mapping of the 0-8M area at virtual address
+ * This is initialized to create an identity-mapping at 0-16M (for bootup
+ * purposes) and another mapping of the 0-16M area at virtual address
  * PAGE_OFFSET.
  */
 .org 0x1000
 ENTRY(swapper_pg_dir)
 	.long 0x00102007
 	.long 0x00103007
-	.fill BOOT_USER_PGD_PTRS-2,4,0
-	/* default: 766 entries */
+	.long 0x00104007
+	.long 0x00105007
+	.fill BOOT_USER_PGD_PTRS-4,4,0
+	/* default: 764 entries */
 	.long 0x00102007
 	.long 0x00103007
-	/* default: 254 entries */
-	.fill BOOT_KERNEL_PGD_PTRS-2,4,0
+	.long 0x00104007
+	.long 0x00105007
+	/* default: 252 entries */
+	.fill BOOT_KERNEL_PGD_PTRS-4,4,0
 
 /*
- * The page tables are initialized to only 8MB here - the final page
+ * The page tables are initialized to only 16MB here - the final page
  * tables are set up later depending on memory size.
  */
 .org 0x2000
@@ -402,15 +415,21 @@
 .org 0x3000
 ENTRY(pg1)
 
+.org 0x4000
+ENTRY(pg2)
+
+.org 0x5000
+ENTRY(pg3)
+
 /*
  * empty_zero_page must immediately follow the page tables ! (The
  * initialization loop counts until empty_zero_page)
  */
 
-.org 0x4000
+.org 0x6000
 ENTRY(empty_zero_page)
 
-.org 0x5000
+.org 0x7000
 
 /*
  * Real beginning of normal "text" segment
@@ -419,12 +438,12 @@
 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.
+ * This starts the data section.
  */
 .data
 
+.align PAGE_SIZE_asm
+
 /*
  * The Global Descriptor Table contains 28 quadwords, per-CPU.
  */
@@ -439,7 +458,9 @@
 	.quad 0x00cf9a000000ffff	/* kernel 4GB code at 0x00000000 */
 	.quad 0x00cf92000000ffff	/* kernel 4GB data at 0x00000000 */
 #endif
-	.align L1_CACHE_BYTES
+
+.align PAGE_SIZE_asm
+
 ENTRY(cpu_gdt_table)
 	.quad 0x0000000000000000	/* NULL descriptor */
 	.quad 0x0000000000000000	/* 0x0b reserved */
--- diff/arch/i386/kernel/i386_ksyms.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/i386/kernel/i386_ksyms.c	2003-12-29 09:30:38.000000000 +0000
@@ -98,7 +98,6 @@
 EXPORT_SYMBOL_NOVERS(__down_failed_trylock);
 EXPORT_SYMBOL_NOVERS(__up_wakeup);
 /* Networking helper routines. */
-EXPORT_SYMBOL(csum_partial_copy_generic);
 /* Delay loops */
 EXPORT_SYMBOL(__ndelay);
 EXPORT_SYMBOL(__udelay);
@@ -112,13 +111,17 @@
 EXPORT_SYMBOL(strpbrk);
 EXPORT_SYMBOL(strstr);
 
+#if !defined(CONFIG_X86_UACCESS_INDIRECT)
 EXPORT_SYMBOL(strncpy_from_user);
-EXPORT_SYMBOL(__strncpy_from_user);
+EXPORT_SYMBOL(__direct_strncpy_from_user);
 EXPORT_SYMBOL(clear_user);
 EXPORT_SYMBOL(__clear_user);
 EXPORT_SYMBOL(__copy_from_user_ll);
 EXPORT_SYMBOL(__copy_to_user_ll);
 EXPORT_SYMBOL(strnlen_user);
+#else /* CONFIG_X86_UACCESS_INDIRECT */
+EXPORT_SYMBOL(direct_csum_partial_copy_generic);
+#endif
 
 EXPORT_SYMBOL(dma_alloc_coherent);
 EXPORT_SYMBOL(dma_free_coherent);
--- diff/arch/i386/kernel/i387.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/i386/kernel/i387.c	2003-12-29 09:30:38.000000000 +0000
@@ -218,6 +218,7 @@
 static int convert_fxsr_to_user( struct _fpstate __user *buf,
 					struct i387_fxsave_struct *fxsave )
 {
+	struct _fpreg tmp[8]; /* 80 bytes scratch area */
 	unsigned long env[7];
 	struct _fpreg __user *to;
 	struct _fpxreg *from;
@@ -234,23 +235,25 @@
 	if ( __copy_to_user( buf, env, 7 * sizeof(unsigned long) ) )
 		return 1;
 
-	to = &buf->_st[0];
+	to = tmp;
 	from = (struct _fpxreg *) &fxsave->st_space[0];
 	for ( i = 0 ; i < 8 ; i++, to++, from++ ) {
 		unsigned long *t = (unsigned long *)to;
 		unsigned long *f = (unsigned long *)from;
 
-		if (__put_user(*f, t) ||
-				__put_user(*(f + 1), t + 1) ||
-				__put_user(from->exponent, &to->exponent))
-			return 1;
+		*t = *f;
+		*(t + 1) = *(f+1);
+		to->exponent = from->exponent;
 	}
+	if (copy_to_user(buf->_st, tmp, sizeof(struct _fpreg [8])))
+		return 1;
 	return 0;
 }
 
 static int convert_fxsr_from_user( struct i387_fxsave_struct *fxsave,
 					  struct _fpstate __user *buf )
 {
+	struct _fpreg tmp[8]; /* 80 bytes scratch area */
 	unsigned long env[7];
 	struct _fpxreg *to;
 	struct _fpreg __user *from;
@@ -258,6 +261,8 @@
 
 	if ( __copy_from_user( env, buf, 7 * sizeof(long) ) )
 		return 1;
+	if (copy_from_user(tmp, buf->_st, sizeof(struct _fpreg [8])))
+		return 1;
 
 	fxsave->cwd = (unsigned short)(env[0] & 0xffff);
 	fxsave->swd = (unsigned short)(env[1] & 0xffff);
@@ -269,15 +274,14 @@
 	fxsave->fos = env[6];
 
 	to = (struct _fpxreg *) &fxsave->st_space[0];
-	from = &buf->_st[0];
+	from = tmp;
 	for ( i = 0 ; i < 8 ; i++, to++, from++ ) {
 		unsigned long *t = (unsigned long *)to;
 		unsigned long *f = (unsigned long *)from;
 
-		if (__get_user(*t, f) ||
-				__get_user(*(t + 1), f + 1) ||
-				__get_user(to->exponent, &from->exponent))
-			return 1;
+		*t = *f;
+		*(t + 1) = *(f + 1);
+		to->exponent = from->exponent;
 	}
 	return 0;
 }
--- diff/arch/i386/kernel/i8259.c	2003-06-30 10:07:18.000000000 +0100
+++ source/arch/i386/kernel/i8259.c	2003-12-29 09:30:38.000000000 +0000
@@ -419,8 +419,10 @@
 	 * us. (some of these will be overridden and become
 	 * 'special' SMP interrupts)
 	 */
-	for (i = 0; i < NR_IRQS; i++) {
+	for (i = 0; i < (NR_VECTORS - FIRST_EXTERNAL_VECTOR); i++) {
 		int vector = FIRST_EXTERNAL_VECTOR + i;
+		if (i >= NR_IRQS)
+			break;
 		if (vector != SYSCALL_VECTOR) 
 			set_intr_gate(vector, interrupt[i]);
 	}
--- diff/arch/i386/kernel/init_task.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/i386/kernel/init_task.c	2003-12-29 09:30:38.000000000 +0000
@@ -26,7 +26,7 @@
  */
 union thread_union init_thread_union 
 	__attribute__((__section__(".data.init_task"))) =
-		{ INIT_THREAD_INFO(init_task) };
+		{ INIT_THREAD_INFO(init_task, init_thread_union) };
 
 /*
  * Initial task structure.
@@ -44,5 +44,5 @@
  * section. Since TSS's are completely CPU-local, we want them
  * on exact cacheline boundaries, to eliminate cacheline ping-pong.
  */ 
-struct tss_struct init_tss[NR_CPUS] __cacheline_aligned = { [0 ... NR_CPUS-1] = INIT_TSS };
+struct tss_struct init_tss[NR_CPUS] __attribute__((__section__(".data.tss"))) = { [0 ... NR_CPUS-1] = INIT_TSS };
 
--- diff/arch/i386/kernel/io_apic.c	2003-10-27 09:20:43.000000000 +0000
+++ source/arch/i386/kernel/io_apic.c	2003-12-29 09:30:38.000000000 +0000
@@ -76,6 +76,14 @@
 	int apic, pin, next;
 } irq_2_pin[PIN_MAP_SIZE];
 
+#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
+#define vector_to_irq(vector)	(vector)
+#endif
+
 /*
  * The common case is 1:1 IRQ<->pin mappings. Sometimes there are
  * shared ISA-space IRQs, so we have to support them. We are super
@@ -249,7 +257,7 @@
 			clear_IO_APIC_pin(apic, pin);
 }
 
-static void set_ioapic_affinity(unsigned int irq, cpumask_t cpumask)
+static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t cpumask)
 {
 	unsigned long flags;
 	int pin;
@@ -288,7 +296,7 @@
 
 extern cpumask_t irq_affinity[NR_IRQS];
 
-static cpumask_t __cacheline_aligned pending_irq_balance_cpumask[NR_IRQS];
+cpumask_t __cacheline_aligned pending_irq_balance_cpumask[NR_IRQS];
 
 #define IRQBALANCE_CHECK_ARCH -999
 static int irqbalance_disabled = IRQBALANCE_CHECK_ARCH;
@@ -670,13 +678,11 @@
 
 __setup("noirqbalance", irqbalance_disable);
 
-static void set_ioapic_affinity(unsigned int irq, cpumask_t mask);
-
 static inline void move_irq(int irq)
 {
 	/* note - we hold the desc->lock */
 	if (unlikely(!cpus_empty(pending_irq_balance_cpumask[irq]))) {
-		set_ioapic_affinity(irq, pending_irq_balance_cpumask[irq]);
+		set_ioapic_affinity_irq(irq, pending_irq_balance_cpumask[irq]);
 		cpus_clear(pending_irq_balance_cpumask[irq]);
 	}
 }
@@ -853,7 +859,7 @@
 			if (irq_entry == -1)
 				continue;
 			irq = pin_2_irq(irq_entry, ioapic, pin);
-			set_ioapic_affinity(irq, mask);
+			set_ioapic_affinity_irq(irq, mask);
 		}
 
 	}
@@ -1141,7 +1147,8 @@
 /* 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 };
 
-static int __init assign_irq_vector(int irq)
+#ifndef CONFIG_PCI_USE_VECTOR
+int __init assign_irq_vector(int irq)
 {
 	static int current_vector = FIRST_DEVICE_VECTOR, offset = 0;
 	BUG_ON(irq >= NR_IRQ_VECTORS);
@@ -1158,11 +1165,36 @@
 	}
 
 	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;
 
-static struct hw_interrupt_type ioapic_level_irq_type;
-static struct hw_interrupt_type ioapic_edge_irq_type;
+#define IOAPIC_AUTO	-1
+#define IOAPIC_EDGE	0
+#define IOAPIC_LEVEL	1
+
+static inline void ioapic_register_intr(int irq, int vector, unsigned long trigger)
+{
+	if (use_pci_vector() && !platform_legacy_irq(irq)) {
+		if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
+				trigger == IOAPIC_LEVEL)
+			irq_desc[vector].handler = &ioapic_level_type;
+		else
+			irq_desc[vector].handler = &ioapic_edge_type;
+		set_intr_gate(vector, interrupt[vector]);
+	} else	{
+		if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
+				trigger == IOAPIC_LEVEL)
+			irq_desc[irq].handler = &ioapic_level_type;
+		else
+			irq_desc[irq].handler = &ioapic_edge_type;
+		set_intr_gate(vector, interrupt[irq]);
+	}
+}
 
 void __init setup_IO_APIC_irqs(void)
 {
@@ -1220,13 +1252,7 @@
 		if (IO_APIC_IRQ(irq)) {
 			vector = assign_irq_vector(irq);
 			entry.vector = vector;
-
-			if (IO_APIC_irq_trigger(irq))
-				irq_desc[irq].handler = &ioapic_level_irq_type;
-			else
-				irq_desc[irq].handler = &ioapic_edge_irq_type;
-
-			set_intr_gate(vector, interrupt[irq]);
+			ioapic_register_intr(irq, vector, IOAPIC_AUTO);
 		
 			if (!apic && (irq < 16))
 				disable_8259A_irq(irq);
@@ -1273,7 +1299,7 @@
 	 * The timer IRQ doesn't have to know that behind the
 	 * scene we have a 8259A-master in AEOI mode ...
 	 */
-	irq_desc[0].handler = &ioapic_edge_irq_type;
+	irq_desc[0].handler = &ioapic_edge_type;
 
 	/*
 	 * Add it to the IO-APIC irq-routing table:
@@ -1624,10 +1650,6 @@
 	unsigned char old_id;
 	unsigned long flags;
 
-	if (acpi_ioapic)
-		/* This gets done during IOAPIC enumeration for ACPI. */
-		return;
-
 	/*
 	 * This is broken; anything with a real cpu count has to
 	 * circumvent this idiocy regardless.
@@ -1763,9 +1785,6 @@
  * that was delayed but this is now handled in the device
  * independent code.
  */
-#define enable_edge_ioapic_irq unmask_IO_APIC_irq
-
-static void disable_edge_ioapic_irq (unsigned int irq) { /* nothing */ }
 
 /*
  * Starting up a edge-triggered IO-APIC interrupt is
@@ -1776,7 +1795,6 @@
  * This is not complete - we should be able to fake
  * an edge even if it isn't on the 8259A...
  */
-
 static unsigned int startup_edge_ioapic_irq(unsigned int irq)
 {
 	int was_pending = 0;
@@ -1794,8 +1812,6 @@
 	return was_pending;
 }
 
-#define shutdown_edge_ioapic_irq	disable_edge_ioapic_irq
-
 /*
  * Once we have recorded IRQ_PENDING already, we can mask the
  * interrupt for real. This prevents IRQ storms from unhandled
@@ -1810,9 +1826,6 @@
 	ack_APIC_irq();
 }
 
-static void end_edge_ioapic_irq (unsigned int i) { /* nothing */ }
-
-
 /*
  * Level triggered interrupts can just be masked,
  * and shutting down and starting up the interrupt
@@ -1834,10 +1847,6 @@
 	return 0; /* don't check for pending */
 }
 
-#define shutdown_level_ioapic_irq	mask_IO_APIC_irq
-#define enable_level_ioapic_irq		unmask_IO_APIC_irq
-#define disable_level_ioapic_irq	mask_IO_APIC_irq
-
 static void end_level_ioapic_irq (unsigned int irq)
 {
 	unsigned long v;
@@ -1864,6 +1873,7 @@
  * The idea is from Manfred Spraul.  --macro
  */
 	i = IO_APIC_VECTOR(irq);
+
 	v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
 
 	ack_APIC_irq();
@@ -1898,7 +1908,57 @@
 	}
 }
 
-static void mask_and_ack_level_ioapic_irq (unsigned int irq) { /* nothing */ }
+#ifdef CONFIG_PCI_USE_VECTOR
+static unsigned int startup_edge_ioapic_vector(unsigned int vector)
+{
+	int irq = vector_to_irq(vector);
+
+	return startup_edge_ioapic_irq(irq);
+}
+
+static void ack_edge_ioapic_vector(unsigned int vector)
+{
+	int irq = vector_to_irq(vector);
+
+	ack_edge_ioapic_irq(irq);
+}
+
+static unsigned int startup_level_ioapic_vector (unsigned int vector)
+{
+	int irq = vector_to_irq(vector);
+
+	return startup_level_ioapic_irq (irq);
+}
+
+static void end_level_ioapic_vector (unsigned int vector)
+{
+	int irq = vector_to_irq(vector);
+
+	end_level_ioapic_irq(irq);
+}
+
+static void mask_IO_APIC_vector (unsigned int vector)
+{
+	int irq = vector_to_irq(vector);
+
+	mask_IO_APIC_irq(irq);
+}
+
+static void unmask_IO_APIC_vector (unsigned int vector)
+{
+	int irq = vector_to_irq(vector);
+
+	unmask_IO_APIC_irq(irq);
+}
+
+static void set_ioapic_affinity_vector (unsigned int vector,
+					cpumask_t cpu_mask)
+{
+	int irq = vector_to_irq(vector);
+
+	set_ioapic_affinity_irq(irq, cpu_mask);
+}
+#endif
 
 /*
  * Level and edge triggered IO-APIC interrupts need different handling,
@@ -1908,26 +1968,25 @@
  * edge-triggered handler, without risking IRQ storms and other ugly
  * races.
  */
-
-static struct hw_interrupt_type ioapic_edge_irq_type = {
+static struct hw_interrupt_type ioapic_edge_type = {
 	.typename 	= "IO-APIC-edge",
-	.startup 	= startup_edge_ioapic_irq,
-	.shutdown 	= shutdown_edge_ioapic_irq,
-	.enable 	= enable_edge_ioapic_irq,
-	.disable 	= disable_edge_ioapic_irq,
-	.ack 		= ack_edge_ioapic_irq,
-	.end 		= end_edge_ioapic_irq,
+	.startup 	= startup_edge_ioapic,
+	.shutdown 	= shutdown_edge_ioapic,
+	.enable 	= enable_edge_ioapic,
+	.disable 	= disable_edge_ioapic,
+	.ack 		= ack_edge_ioapic,
+	.end 		= end_edge_ioapic,
 	.set_affinity 	= set_ioapic_affinity,
 };
 
-static struct hw_interrupt_type ioapic_level_irq_type = {
+static struct hw_interrupt_type ioapic_level_type = {
 	.typename 	= "IO-APIC-level",
-	.startup 	= startup_level_ioapic_irq,
-	.shutdown 	= shutdown_level_ioapic_irq,
-	.enable 	= enable_level_ioapic_irq,
-	.disable 	= disable_level_ioapic_irq,
-	.ack 		= mask_and_ack_level_ioapic_irq,
-	.end 		= end_level_ioapic_irq,
+	.startup 	= startup_level_ioapic,
+	.shutdown 	= shutdown_level_ioapic,
+	.enable 	= enable_level_ioapic,
+	.disable 	= disable_level_ioapic,
+	.ack 		= mask_and_ack_level_ioapic,
+	.end 		= end_level_ioapic,
 	.set_affinity 	= set_ioapic_affinity,
 };
 
@@ -1947,7 +2006,13 @@
 	 * 0x80, because int 0x80 is hm, kind of importantish. ;)
 	 */
 	for (irq = 0; irq < NR_IRQS ; irq++) {
-		if (IO_APIC_IRQ(irq) && !IO_APIC_VECTOR(irq)) {
+		int tmp = irq;
+		if (use_pci_vector()) {
+			if (!platform_legacy_irq(tmp))
+				if ((tmp = vector_to_irq(tmp)) == -1)
+					continue;
+		}
+		if (IO_APIC_IRQ(tmp) && !IO_APIC_VECTOR(tmp)) {
 			/*
 			 * Hmm.. We don't have an entry for this,
 			 * so default to an old-fashioned 8259
@@ -2217,12 +2282,14 @@
 	/*
 	 * Set up IO-APIC IRQ routing.
 	 */
-	setup_ioapic_ids_from_mpc();
+	if (!acpi_ioapic)
+		setup_ioapic_ids_from_mpc();
 	sync_Arb_IDs();
 	setup_IO_APIC_irqs();
 	init_IO_APIC_traps();
 	check_timer();
-	print_IO_APIC();
+	if (!acpi_ioapic)
+		print_IO_APIC();
 }
 
 /*
@@ -2379,10 +2446,12 @@
 		"IRQ %d Mode:%i Active:%i)\n", ioapic, 
 		mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq, edge_level, active_high_low);
 
+ 	if (use_pci_vector() && !platform_legacy_irq(irq))
+		irq = IO_APIC_VECTOR(irq);
 	if (edge_level) {
-	irq_desc[irq].handler = &ioapic_level_irq_type;
+		irq_desc[irq].handler = &ioapic_level_type;
 	} else {
-		irq_desc[irq].handler = &ioapic_edge_irq_type;
+		irq_desc[irq].handler = &ioapic_edge_type;
 	}
 
 	set_intr_gate(entry.vector, interrupt[irq]);
--- diff/arch/i386/kernel/irq.c	2003-10-27 09:20:43.000000000 +0000
+++ source/arch/i386/kernel/irq.c	2003-12-29 09:30:38.000000000 +0000
@@ -45,6 +45,7 @@
 #include <asm/delay.h>
 #include <asm/desc.h>
 #include <asm/irq.h>
+#include <asm/kgdb.h>
 
 /*
  * Linux has a controller-independent x86 interrupt architecture.
@@ -138,17 +139,19 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i, j;
+	int i = *(loff_t *) v, j;
 	struct irqaction * action;
 	unsigned long flags;
 
-	seq_printf(p, "           ");
-	for (j=0; j<NR_CPUS; j++)
-		if (cpu_online(j))
-			seq_printf(p, "CPU%d       ",j);
-	seq_putc(p, '\n');
+	if (i == 0) {
+		seq_printf(p, "           ");
+		for (j=0; j<NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "CPU%d       ",j);
+		seq_putc(p, '\n');
+	}
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		spin_lock_irqsave(&irq_desc[i].lock, flags);
 		action = irq_desc[i].action;
 		if (!action) 
@@ -170,28 +173,32 @@
 		seq_putc(p, '\n');
 skip:
 		spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-	}
-	seq_printf(p, "NMI: ");
-	for (j = 0; j < NR_CPUS; j++)
-		if (cpu_online(j))
-			seq_printf(p, "%10u ", nmi_count(j));
-	seq_putc(p, '\n');
+	} else if (i == NR_IRQS) {
+		seq_printf(p, "NMI: ");
+		for (j = 0; j < NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "%10u ", nmi_count(j));
+		seq_putc(p, '\n');
 #ifdef CONFIG_X86_LOCAL_APIC
-	seq_printf(p, "LOC: ");
-	for (j = 0; j < NR_CPUS; j++)
-		if (cpu_online(j))
-			seq_printf(p, "%10u ", irq_stat[j].apic_timer_irqs);
-	seq_putc(p, '\n');
+		seq_printf(p, "LOC: ");
+		for (j = 0; j < NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "%10u ", irq_stat[j].apic_timer_irqs);
+		seq_putc(p, '\n');
 #endif
-	seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
+		seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
 #ifdef CONFIG_X86_IO_APIC
 #ifdef APIC_MISMATCH_DEBUG
-	seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
+		seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
 #endif
 #endif
+	}
 	return 0;
 }
 
+
+
+
 #ifdef CONFIG_SMP
 inline void synchronize_irq(unsigned int irq)
 {
@@ -502,6 +509,17 @@
 
 	irq_exit();
 
+#ifdef CONFIG_KGDB
+	/*
+	 * We need to do this after clearing out of all the interrupt
+	 * machinery because kgdb will reenter the NIC driver and the IRQ
+	 * system.  synchronize_irq() (at least) will deadlock.
+	 */
+	if (kgdb_eth_need_breakpoint[smp_processor_id()]) {
+		kgdb_eth_need_breakpoint[smp_processor_id()] = 0;
+		BREAKPOINT;
+	}
+#endif
 	return 1;
 }
 
@@ -898,48 +916,6 @@
 static struct proc_dir_entry * root_irq_dir;
 static struct proc_dir_entry * irq_dir [NR_IRQS];
 
-#define HEX_DIGITS (2*sizeof(cpumask_t))
-
-static unsigned int parse_hex_value(const char __user *buffer,
-		unsigned long count, cpumask_t *ret)
-{
-	unsigned char hexnum[HEX_DIGITS];
-	cpumask_t value = CPU_MASK_NONE;
-	int i;
-
-	if (!count)
-		return -EINVAL;
-	if (count > HEX_DIGITS)
-		count = HEX_DIGITS;
-	if (copy_from_user(hexnum, buffer, count))
-		return -EFAULT;
-
-	/*
-	 * Parse the first HEX_DIGITS characters as a hex string, any non-hex char
-	 * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
-	 */
-
-	for (i = 0; i < count; i++) {
-		unsigned int c = hexnum[i];
-		int k;
-
-		switch (c) {
-			case '0' ... '9': c -= '0'; break;
-			case 'a' ... 'f': c -= 'a'-10; break;
-			case 'A' ... 'F': c -= 'A'-10; break;
-		default:
-			goto out;
-		}
-		cpus_shift_left(value, value, 4);
-		for (k = 0; k < 4; ++k)
-			if (test_bit(k, (unsigned long *)&c))
-				cpu_set(k, value);
-	}
-out:
-	*ret = value;
-	return 0;
-}
-
 #ifdef CONFIG_SMP
 
 static struct proc_dir_entry *smp_affinity_entry[NR_IRQS];
@@ -949,20 +925,10 @@
 static int irq_affinity_read_proc(char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int k, len;
-	cpumask_t tmp = irq_affinity[(long)data];
-
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
+	if (count - len < 2)
 		return -EINVAL;
-
-	len = 0;
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-	len += sprintf(page, "\n");
+	len += sprintf(page + len, "\n");
 	return len;
 }
 
@@ -975,7 +941,7 @@
 	if (!irq_desc[irq].handler->set_affinity)
 		return -EIO;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 	if (err)
 		return err;
 
@@ -1000,10 +966,11 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	unsigned long *mask = (unsigned long *) data;
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
+	if (count - len < 2)
 		return -EINVAL;
-	return sprintf (page, "%08lx\n", *mask);
+	len += sprintf(page + len, "\n");
+	return len;
 }
 
 static int prof_cpu_mask_write_proc (struct file *file, const char __user *buffer,
@@ -1013,7 +980,7 @@
 	unsigned long full_count = count, err;
 	cpumask_t new_value;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 	if (err)
 		return err;
 
--- diff/arch/i386/kernel/ldt.c	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/kernel/ldt.c	2003-12-29 09:30:38.000000000 +0000
@@ -2,7 +2,7 @@
  * linux/kernel/ldt.c
  *
  * Copyright (C) 1992 Krishna Balasubramanian and Linus Torvalds
- * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com>
+ * Copyright (C) 1999, 2003 Ingo Molnar <mingo@redhat.com>
  */
 
 #include <linux/errno.h>
@@ -18,6 +18,8 @@
 #include <asm/system.h>
 #include <asm/ldt.h>
 #include <asm/desc.h>
+#include <linux/highmem.h>
+#include <asm/atomic_kmap.h>
 
 #ifdef CONFIG_SMP /* avoids "defined but not used" warnig */
 static void flush_ldt(void *null)
@@ -29,34 +31,31 @@
 
 static int alloc_ldt(mm_context_t *pc, int mincount, int reload)
 {
-	void *oldldt;
-	void *newldt;
-	int oldsize;
+	int oldsize, newsize, i;
 
 	if (mincount <= pc->size)
 		return 0;
+	/*
+	 * LDT got larger - reallocate if necessary.
+	 */
 	oldsize = pc->size;
 	mincount = (mincount+511)&(~511);
-	if (mincount*LDT_ENTRY_SIZE > PAGE_SIZE)
-		newldt = vmalloc(mincount*LDT_ENTRY_SIZE);
-	else
-		newldt = kmalloc(mincount*LDT_ENTRY_SIZE, GFP_KERNEL);
-
-	if (!newldt)
-		return -ENOMEM;
-
-	if (oldsize)
-		memcpy(newldt, pc->ldt, oldsize*LDT_ENTRY_SIZE);
-	oldldt = pc->ldt;
-	memset(newldt+oldsize*LDT_ENTRY_SIZE, 0, (mincount-oldsize)*LDT_ENTRY_SIZE);
-	pc->ldt = newldt;
-	wmb();
+	newsize = mincount*LDT_ENTRY_SIZE;
+	for (i = 0; i < newsize; i += PAGE_SIZE) {
+		int nr = i/PAGE_SIZE;
+		BUG_ON(i >= 64*1024);
+		if (!pc->ldt_pages[nr]) {
+			pc->ldt_pages[nr] = alloc_page(GFP_HIGHUSER);
+			if (!pc->ldt_pages[nr])
+				return -ENOMEM;
+			clear_highpage(pc->ldt_pages[nr]);
+		}
+	}
 	pc->size = mincount;
-	wmb();
-
 	if (reload) {
 #ifdef CONFIG_SMP
 		cpumask_t mask;
+
 		preempt_disable();
 		load_LDT(pc);
 		mask = cpumask_of_cpu(smp_processor_id());
@@ -67,21 +66,20 @@
 		load_LDT(pc);
 #endif
 	}
-	if (oldsize) {
-		if (oldsize*LDT_ENTRY_SIZE > PAGE_SIZE)
-			vfree(oldldt);
-		else
-			kfree(oldldt);
-	}
 	return 0;
 }
 
 static inline int copy_ldt(mm_context_t *new, mm_context_t *old)
 {
-	int err = alloc_ldt(new, old->size, 0);
-	if (err < 0)
+	int i, err, size = old->size, nr_pages = (size*LDT_ENTRY_SIZE + PAGE_SIZE-1)/PAGE_SIZE;
+
+	err = alloc_ldt(new, size, 0);
+	if (err < 0) {
+		new->size = 0;
 		return err;
-	memcpy(new->ldt, old->ldt, old->size*LDT_ENTRY_SIZE);
+	}
+	for (i = 0; i < nr_pages; i++)
+		copy_user_highpage(new->ldt_pages[i], old->ldt_pages[i], 0);
 	return 0;
 }
 
@@ -96,6 +94,7 @@
 
 	init_MUTEX(&mm->context.sem);
 	mm->context.size = 0;
+	memset(mm->context.ldt_pages, 0, sizeof(struct page *) * MAX_LDT_PAGES);
 	old_mm = current->mm;
 	if (old_mm && old_mm->context.size > 0) {
 		down(&old_mm->context.sem);
@@ -107,23 +106,21 @@
 
 /*
  * No need to lock the MM as we are the last user
+ * Do not touch the ldt register, we are already
+ * in the next thread.
  */
 void destroy_context(struct mm_struct *mm)
 {
-	if (mm->context.size) {
-		if (mm == current->active_mm)
-			clear_LDT();
-		if (mm->context.size*LDT_ENTRY_SIZE > PAGE_SIZE)
-			vfree(mm->context.ldt);
-		else
-			kfree(mm->context.ldt);
-		mm->context.size = 0;
-	}
+	int i, nr_pages = (mm->context.size*LDT_ENTRY_SIZE + PAGE_SIZE-1) / PAGE_SIZE;
+
+	for (i = 0; i < nr_pages; i++)
+		__free_page(mm->context.ldt_pages[i]);
+	mm->context.size = 0;
 }
 
 static int read_ldt(void __user * ptr, unsigned long bytecount)
 {
-	int err;
+	int err, i;
 	unsigned long size;
 	struct mm_struct * mm = current->mm;
 
@@ -138,8 +135,25 @@
 		size = bytecount;
 
 	err = 0;
-	if (copy_to_user(ptr, mm->context.ldt, size))
-		err = -EFAULT;
+	/*
+	 * This is necessary just in case we got here straight from a
+	 * context-switch where the ptes were set but no tlb flush
+	 * was done yet. We rather avoid doing a TLB flush in the
+	 * context-switch path and do it here instead.
+	 */
+	__flush_tlb_global();
+
+	for (i = 0; i < size; i += PAGE_SIZE) {
+		int nr = i / PAGE_SIZE, bytes;
+		char *kaddr = kmap(mm->context.ldt_pages[nr]);
+
+		bytes = size - i;
+		if (bytes > PAGE_SIZE)
+			bytes = PAGE_SIZE;
+		if (copy_to_user(ptr + i, kaddr, size - i))
+			err = -EFAULT;
+		kunmap(mm->context.ldt_pages[nr]);
+	}
 	up(&mm->context.sem);
 	if (err < 0)
 		return err;
@@ -158,7 +172,7 @@
 
 	err = 0;
 	address = &default_ldt[0];
-	size = 5*sizeof(struct desc_struct);
+	size = 5*LDT_ENTRY_SIZE;
 	if (size > bytecount)
 		size = bytecount;
 
@@ -200,7 +214,15 @@
 			goto out_unlock;
 	}
 
-	lp = (__u32 *) ((ldt_info.entry_number << 3) + (char *) mm->context.ldt);
+	/*
+	 * No rescheduling allowed from this point to the install.
+	 *
+	 * We do a TLB flush for the same reason as in the read_ldt() path.
+	 */
+	preempt_disable();
+	__flush_tlb_global();
+	lp = (__u32 *) ((ldt_info.entry_number << 3) +
+			(char *) __kmap_atomic_vaddr(KM_LDT_PAGE0));
 
    	/* Allow LDTs to be cleared by the user. */
    	if (ldt_info.base_addr == 0 && ldt_info.limit == 0) {
@@ -221,6 +243,7 @@
 	*lp	= entry_1;
 	*(lp+1)	= entry_2;
 	error = 0;
+	preempt_enable();
 
 out_unlock:
 	up(&mm->context.sem);
@@ -248,3 +271,26 @@
 	}
 	return ret;
 }
+
+/*
+ * load one particular LDT into the current CPU
+ */
+void load_LDT_nolock(mm_context_t *pc, int cpu)
+{
+	struct page **pages = pc->ldt_pages;
+	int count = pc->size;
+	int nr_pages, i;
+
+	if (likely(!count)) {
+		pages = &default_ldt_page;
+		count = 5;
+	}
+       	nr_pages = (count*LDT_ENTRY_SIZE + PAGE_SIZE-1) / PAGE_SIZE;
+
+	for (i = 0; i < nr_pages; i++) {
+		__kunmap_atomic_type(KM_LDT_PAGE0 - i);
+		__kmap_atomic(pages[i], KM_LDT_PAGE0 - i);
+	}
+	set_ldt_desc(cpu, (void *)__kmap_atomic_vaddr(KM_LDT_PAGE0), count);
+	load_LDT_desc();
+}
--- diff/arch/i386/kernel/mpparse.c	2003-11-25 15:24:57.000000000 +0000
+++ source/arch/i386/kernel/mpparse.c	2003-12-29 09:30:38.000000000 +0000
@@ -668,7 +668,7 @@
 		 * Read the physical hardware table.  Anything here will
 		 * override the defaults.
 		 */
-		if (!smp_read_mpc((void *)mpf->mpf_physptr)) {
+		if (!smp_read_mpc((void *)phys_to_virt(mpf->mpf_physptr))) {
 			smp_found_config = 0;
 			printk(KERN_ERR "BIOS bug, MP table errors detected!...\n");
 			printk(KERN_ERR "... disabling SMP support. (tell your hw vendor)\n");
@@ -962,7 +962,8 @@
 	 */
 	for (i = 0; i < mp_irq_entries; i++) {
 		if ((mp_irqs[i].mpc_dstapic == intsrc.mpc_dstapic) 
-			&& (mp_irqs[i].mpc_srcbusirq == intsrc.mpc_srcbusirq)) {
+			&& (mp_irqs[i].mpc_srcbusirq == intsrc.mpc_srcbusirq)
+			&& (mp_irqs[i].mpc_irqtype == intsrc.mpc_irqtype)) {
 			mp_irqs[i] = intsrc;
 			found = 1;
 			break;
@@ -1081,8 +1082,14 @@
 
 	ioapic_pin = irq - mp_ioapic_routing[ioapic].irq_start;
 
+	/*
+	 * MPS INTI flags:
+	 *  trigger: 0=default, 1=edge, 3=level
+	 *  polarity: 0=default, 1=high, 3=low
+	 * Per ACPI spec, default for SCI means level/low.
+	 */
 	io_apic_set_pci_routing(ioapic, ioapic_pin, irq, 
-				(flags.trigger >> 1) , (flags.polarity >> 1));
+		(flags.trigger == 1 ? 0 : 1), (flags.polarity == 1 ? 0 : 1));
 }
 
 #ifdef CONFIG_ACPI_PCI
@@ -1129,8 +1136,11 @@
 			continue;
 		ioapic_pin = irq - mp_ioapic_routing[ioapic].irq_start;
 
-		if (!ioapic && (irq < 16))
-			irq += 16;
+		if (es7000_plat) {
+			if (!ioapic && (irq < 16))
+				irq += 16;
+		}
+
 		/* 
 		 * Avoid pin reprogramming.  PRTs typically include entries  
 		 * with redundant pin->irq mappings (but unique PCI devices);
@@ -1147,21 +1157,29 @@
 		if ((1<<bit) & mp_ioapic_routing[ioapic].pin_programmed[idx]) {
 			printk(KERN_DEBUG "Pin %d-%d already programmed\n",
 				mp_ioapic_routing[ioapic].apic_id, ioapic_pin);
-			entry->irq = irq;
+ 			if (use_pci_vector() && !platform_legacy_irq(irq))
+ 				irq = IO_APIC_VECTOR(irq);
+ 			entry->irq = irq;
 			continue;
 		}
 
 		mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<<bit);
 
-		if (!io_apic_set_pci_routing(ioapic, ioapic_pin, irq, edge_level, active_high_low))
-			entry->irq = irq;
-
+		if (!io_apic_set_pci_routing(ioapic, ioapic_pin, irq, edge_level, active_high_low)) {
+ 			if (use_pci_vector() && !platform_legacy_irq(irq))
+ 				irq = IO_APIC_VECTOR(irq);
+ 			entry->irq = irq;
+ 		}
 		printk(KERN_DEBUG "%02x:%02x:%02x[%c] -> %d-%d -> IRQ %d\n",
 			entry->id.segment, entry->id.bus, 
 			entry->id.device, ('A' + entry->pin), 
 			mp_ioapic_routing[ioapic].apic_id, ioapic_pin, 
 			entry->irq);
 	}
+
+	print_IO_APIC();
+
+	return;
 }
 
 #endif /*CONFIG_ACPI_PCI*/
--- diff/arch/i386/kernel/nmi.c	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/kernel/nmi.c	2003-12-29 09:30:38.000000000 +0000
@@ -31,7 +31,16 @@
 #include <asm/mpspec.h>
 #include <asm/nmi.h>
 
+#ifdef CONFIG_KGDB
+#include <asm/kgdb.h>
+#ifdef CONFIG_SMP
+unsigned int nmi_watchdog = NMI_IO_APIC;
+#else
+unsigned int nmi_watchdog = NMI_LOCAL_APIC;
+#endif
+#else
 unsigned int nmi_watchdog = NMI_NONE;
+#endif
 static unsigned int nmi_hz = HZ;
 unsigned int nmi_perfctr_msr;	/* the MSR to reset in NMI handler */
 extern void show_registers(struct pt_regs *regs);
@@ -408,6 +417,9 @@
 	for (i = 0; i < NR_CPUS; i++)
 		alert_counter[i] = 0;
 }
+#ifdef CONFIG_KGDB
+int tune_watchdog = 5*HZ;
+#endif
 
 void nmi_watchdog_tick (struct pt_regs * regs)
 {
@@ -421,12 +433,24 @@
 
 	sum = irq_stat[cpu].apic_timer_irqs;
 
+#ifdef CONFIG_KGDB
+ 	if (! in_kgdb(regs) && last_irq_sums[cpu] == sum ) {
+
+#else
 	if (last_irq_sums[cpu] == sum) {
+#endif
 		/*
 		 * Ayiee, looks like this CPU is stuck ...
 		 * wait a few IRQs (5 seconds) before doing the oops ...
 		 */
 		alert_counter[cpu]++;
+#ifdef CONFIG_KGDB
+                if (alert_counter[cpu] == tune_watchdog) {
+                        kgdb_handle_exception(2, SIGPWR, 0, regs);
+                        last_irq_sums[cpu] = sum;
+                        alert_counter[cpu] = 0;
+                }
+#endif
 		if (alert_counter[cpu] == 5*nmi_hz) {
 			spin_lock(&nmi_print_lock);
 			/*
--- diff/arch/i386/kernel/process.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/i386/kernel/process.c	2003-12-29 09:30:38.000000000 +0000
@@ -47,6 +47,7 @@
 #include <asm/i387.h>
 #include <asm/irq.h>
 #include <asm/desc.h>
+#include <asm/atomic_kmap.h>
 #ifdef CONFIG_MATH_EMULATION
 #include <asm/math_emu.h>
 #endif
@@ -302,6 +303,9 @@
 	struct task_struct *tsk = current;
 
 	memset(tsk->thread.debugreg, 0, sizeof(unsigned long)*8);
+#ifdef CONFIG_X86_HIGH_ENTRY
+	clear_thread_flag(TIF_DB7);
+#endif
 	memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array));	
 	/*
 	 * Forget coprocessor state..
@@ -315,9 +319,8 @@
 	if (dead_task->mm) {
 		// temporary debugging check
 		if (dead_task->mm->context.size) {
-			printk("WARNING: dead process %8s still has LDT? <%p/%d>\n",
+			printk("WARNING: dead process %8s still has LDT? <%d>\n",
 					dead_task->comm,
-					dead_task->mm->context.ldt,
 					dead_task->mm->context.size);
 			BUG();
 		}
@@ -352,7 +355,17 @@
 	p->thread.esp = (unsigned long) childregs;
 	p->thread.esp0 = (unsigned long) (childregs+1);
 
+	/*
+	 * get the two stack pages, for the virtual stack.
+	 *
+	 * IMPORTANT: this code relies on the fact that the task
+	 * structure is an 8K aligned piece of physical memory.
+	 */
+	p->thread.stack_page0 = virt_to_page((unsigned long)p->thread_info);
+	p->thread.stack_page1 = virt_to_page((unsigned long)p->thread_info + PAGE_SIZE);
+
 	p->thread.eip = (unsigned long) ret_from_fork;
+	p->thread_info->real_stack = p->thread_info;
 
 	savesegment(fs,p->thread.fs);
 	savesegment(gs,p->thread.gs);
@@ -504,10 +517,41 @@
 
 	__unlazy_fpu(prev_p);
 
+#ifdef CONFIG_X86_HIGH_ENTRY
+	/*
+	 * Set the ptes of the virtual stack. (NOTE: a one-page TLB flush is
+	 * needed because otherwise NMIs could interrupt the
+	 * user-return code with a virtual stack and stale TLBs.)
+	 */
+	__kunmap_atomic_type(KM_VSTACK0);
+	__kunmap_atomic_type(KM_VSTACK1);
+	__kmap_atomic(next->stack_page0, KM_VSTACK0);
+	__kmap_atomic(next->stack_page1, KM_VSTACK1);
+
+	/*
+	 * NOTE: here we rely on the task being the stack as well
+	 */
+	next_p->thread_info->virtual_stack =
+			(void *)__kmap_atomic_vaddr(KM_VSTACK0);
+
+#if defined(CONFIG_PREEMPT) && defined(CONFIG_SMP)
+	/*
+	 * If next was preempted on entry from userspace to kernel,
+	 * and now it's on a different cpu, we need to adjust %esp.
+	 * This assumes that entry.S does not copy %esp while on the
+	 * virtual stack (with interrupts enabled): which is so,
+	 * except within __SWITCH_KERNELSPACE itself.
+	 */
+	if (unlikely(next->esp >= TASK_SIZE)) {
+		next->esp &= THREAD_SIZE - 1;
+		next->esp |= (unsigned long) next_p->thread_info->virtual_stack;
+	}
+#endif
+#endif
 	/*
 	 * Reload esp0, LDT and the page table pointer:
 	 */
-	load_esp0(tss, next->esp0);
+	load_virtual_esp0(tss, next_p);
 
 	/*
 	 * Load the per-thread Thread-Local Storage descriptor.
--- diff/arch/i386/kernel/reboot.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/i386/kernel/reboot.c	2003-12-29 09:30:38.000000000 +0000
@@ -8,6 +8,7 @@
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/mc146818rtc.h>
+#include <linux/efi.h>
 #include <asm/uaccess.h>
 #include <asm/apic.h>
 #include "mach_reboot.h"
@@ -154,12 +155,11 @@
 	CMOS_WRITE(0x00, 0x8f);
 	spin_unlock_irqrestore(&rtc_lock, flags);
 
-	/* Remap the kernel at virtual address zero, as well as offset zero
-	   from the kernel segment.  This assumes the kernel segment starts at
-	   virtual address PAGE_OFFSET. */
-
-	memcpy (swapper_pg_dir, swapper_pg_dir + USER_PGD_PTRS,
-		sizeof (swapper_pg_dir [0]) * KERNEL_PGD_PTRS);
+	/*
+	 * Remap the first 16 MB of RAM (which includes the kernel image)
+	 * at virtual address zero:
+	 */
+	setup_identity_mappings(swapper_pg_dir, 0, 16*1024*1024);
 
 	/*
 	 * Use `swapper_pg_dir' as our page directory.
@@ -263,7 +263,12 @@
 	disable_IO_APIC();
 #endif
 
-	if(!reboot_thru_bios) {
+	if (!reboot_thru_bios) {
+		if (efi_enabled) {
+			efi.reset_system(EFI_RESET_COLD, EFI_SUCCESS, 0, 0);
+			__asm__ __volatile__("lidt %0": :"m" (no_idt));
+			__asm__ __volatile__("int3");
+		}
 		/* rebooting needs to touch the page at absolute addr 0 */
 		*((unsigned short *)__va(0x472)) = reboot_mode;
 		for (;;) {
@@ -273,6 +278,8 @@
 			__asm__ __volatile__("int3");
 		}
 	}
+	if (efi_enabled)
+		efi.reset_system(EFI_RESET_WARM, EFI_SUCCESS, 0, 0);
 
 	machine_real_restart(jump_to_bios, sizeof(jump_to_bios));
 }
@@ -287,6 +294,8 @@
 
 void machine_power_off(void)
 {
+	if (efi_enabled)
+		efi.reset_system(EFI_RESET_SHUTDOWN, EFI_SUCCESS, 0, 0);
 	if (pm_power_off)
 		pm_power_off();
 }
--- diff/arch/i386/kernel/setup.c	2003-10-27 09:20:43.000000000 +0000
+++ source/arch/i386/kernel/setup.c	2003-12-29 09:30:38.000000000 +0000
@@ -36,6 +36,8 @@
 #include <linux/root_dev.h>
 #include <linux/highmem.h>
 #include <linux/module.h>
+#include <linux/efi.h>
+#include <linux/init.h>
 #include <video/edid.h>
 #include <asm/e820.h>
 #include <asm/mpspec.h>
@@ -56,6 +58,10 @@
  * Machine setup..
  */
 
+#ifdef CONFIG_EFI
+int efi_enabled = 0;
+#endif
+
 /* cpu data as detected by the assembly code in head.S */
 struct cpuinfo_x86 new_cpu_data __initdata = { 0, 0, 0, 0, -1, 1, 0, 0, -1 };
 /* common cpu data for all cpus */
@@ -72,13 +78,10 @@
 EXPORT_SYMBOL(acpi_disabled);
 
 #ifdef	CONFIG_ACPI_BOOT
-	int acpi_irq __initdata = 1;	/* enable IRQ */
-	int acpi_ht __initdata = 1;	/* enable HT */
+extern int __initdata acpi_ht;
+int __initdata acpi_force = 0;
 #endif
 
-int acpi_force __initdata = 0;
-
-
 int MCA_bus;
 /* for MCA, but anyone else can use it if they want */
 unsigned int machine_id;
@@ -144,6 +147,20 @@
 	unsigned long long current_addr = 0;
 	int i;
 
+	if (efi_enabled) {
+		for (i = 0; i < memmap.nr_map; i++) {
+			current_addr = memmap.map[i].phys_addr +
+				       (memmap.map[i].num_pages << 12);
+			if (memmap.map[i].type == EFI_CONVENTIONAL_MEMORY) {
+				if (current_addr >= size) {
+					memmap.map[i].num_pages -=
+						(((current_addr-size) + PAGE_SIZE-1) >> PAGE_SHIFT);
+					memmap.nr_map = i + 1;
+					return;
+				}
+			}
+		}
+	}
 	for (i = 0; i < e820.nr_map; i++) {
 		if (e820.map[i].type == E820_RAM) {
 			current_addr = e820.map[i].addr + e820.map[i].size;
@@ -159,17 +176,21 @@
 static void __init add_memory_region(unsigned long long start,
                                   unsigned long long size, int type)
 {
-	int x = e820.nr_map;
+	int x;
 
-	if (x == E820MAX) {
-	    printk(KERN_ERR "Ooops! Too many entries in the memory map!\n");
-	    return;
-	}
+	if (!efi_enabled) {
+       		x = e820.nr_map;
+
+		if (x == E820MAX) {
+		    printk(KERN_ERR "Ooops! Too many entries in the memory map!\n");
+		    return;
+		}
 
-	e820.map[x].addr = start;
-	e820.map[x].size = size;
-	e820.map[x].type = type;
-	e820.nr_map++;
+		e820.map[x].addr = start;
+		e820.map[x].size = size;
+		e820.map[x].type = type;
+		e820.nr_map++;
+	}
 } /* add_memory_region */
 
 #define E820_DEBUG	1
@@ -446,7 +467,6 @@
 static void __init setup_memory_region(void)
 {
 	char *who = machine_specific_memory_setup();
-
 	printk(KERN_INFO "BIOS-provided physical RAM map:\n");
 	print_memory_map(who);
 } /* setup_memory_region */
@@ -550,7 +570,7 @@
 
 		/* "pci=noacpi" disables ACPI interrupt routing */
 		else if (!memcmp(from, "pci=noacpi", 10)) {
-			acpi_irq = 0;
+			acpi_noirq_set();
 		}
 
 #ifdef CONFIG_X86_LOCAL_APIC
@@ -584,6 +604,23 @@
 }
 
 /*
+ * Callback for efi_memory_walk.
+ */
+static int __init
+efi_find_max_pfn(unsigned long start, unsigned long end, void *arg)
+{
+	unsigned long *max_pfn = arg, pfn;
+
+	if (start < end) {
+		pfn = PFN_UP(end -1);
+		if (pfn > *max_pfn)
+			*max_pfn = pfn;
+	}
+	return 0;
+}
+
+
+/*
  * Find the highest page frame number we have available
  */
 void __init find_max_pfn(void)
@@ -591,6 +628,11 @@
 	int i;
 
 	max_pfn = 0;
+	if (efi_enabled) {
+		efi_memmap_walk(efi_find_max_pfn, &max_pfn);
+		return;
+	}
+
 	for (i = 0; i < e820.nr_map; i++) {
 		unsigned long start, end;
 		/* RAM? */
@@ -665,6 +707,25 @@
 }
 
 #ifndef CONFIG_DISCONTIGMEM
+
+/*
+ * Free all available memory for boot time allocation.  Used
+ * as a callback function by efi_memory_walk()
+ */
+
+static int __init
+free_available_memory(unsigned long start, unsigned long end, void *arg)
+{
+	/* check max_low_pfn */
+	if (start >= ((max_low_pfn + 1) << PAGE_SHIFT))
+		return 0;
+	if (end >= ((max_low_pfn + 1) << PAGE_SHIFT))
+		end = (max_low_pfn + 1) << PAGE_SHIFT;
+	if (start < end)
+		free_bootmem(start, end - start);
+
+	return 0;
+}
 /*
  * Register fully available low RAM pages with the bootmem allocator.
  */
@@ -672,6 +733,10 @@
 {
 	int i;
 
+	if (efi_enabled) {
+		efi_memmap_walk(free_available_memory, NULL);
+		return;
+	}
 	for (i = 0; i < e820.nr_map; i++) {
 		unsigned long curr_pfn, last_pfn, size;
 		/*
@@ -799,9 +864,9 @@
  * Request address space for all standard RAM and ROM resources
  * and also for regions reported as reserved by the e820.
  */
-static void __init register_memory(unsigned long max_low_pfn)
+static void __init
+legacy_init_iomem_resources(struct resource *code_resource, struct resource *data_resource)
 {
-	unsigned long low_mem_size;
 	int i;
 
 	probe_roms();
@@ -826,11 +891,26 @@
 			 *  so we try it repeatedly and let the resource manager
 			 *  test it.
 			 */
-			request_resource(res, &code_resource);
-			request_resource(res, &data_resource);
+			request_resource(res, code_resource);
+			request_resource(res, data_resource);
 		}
 	}
+}
+
+/*
+ * Request address space for all standard resources
+ */
+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 */
 	request_graphics_resource();
 
 	/* request I/O space for devices used on all i[345]86 PCs */
@@ -950,6 +1030,13 @@
 
 __setup("noreplacement", noreplacement_setup); 
 
+/*
+ * Determine if we were loaded by an EFI loader.  If so, then we have also been
+ * passed the efi memmap, systab, etc., so we should use these data structures
+ * for initialization.  Note, the efi init code path is determined by the
+ * global efi_enabled. This allows the same kernel image to be used on existing
+ * systems (with a traditional BIOS) as well as on EFI systems.
+ */
 void __init setup_arch(char **cmdline_p)
 {
 	unsigned long max_low_pfn;
@@ -958,6 +1045,18 @@
 	pre_setup_arch_hook();
 	early_cpu_init();
 
+	/*
+	 * FIXME: This isn't an official loader_type right
+	 * now but does currently work with elilo.
+	 * If we were configured as an EFI kernel, check to make
+	 * sure that we were loaded correctly from elilo and that
+	 * the system table is valid.  If not, then initialize normally.
+	 */
+#ifdef CONFIG_EFI
+	if ((LOADER_TYPE == 0x50) && EFI_SYSTAB)
+		efi_enabled = 1;
+#endif
+
  	ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
  	drive_info = DRIVE_INFO;
  	screen_info = SCREEN_INFO;
@@ -979,7 +1078,11 @@
 	rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0);
 #endif
 	ARCH_SETUP
-	setup_memory_region();
+	if (efi_enabled)
+		efi_init();
+	else
+		setup_memory_region();
+
 	copy_edd();
 
 	if (!MOUNT_ROOT_RDONLY)
@@ -1013,6 +1116,8 @@
 #ifdef CONFIG_X86_GENERICARCH
 	generic_apic_probe(*cmdline_p);
 #endif	
+	if (efi_enabled)
+		efi_map_memmap();
 
 	/*
 	 * Parse the ACPI tables for possible boot-time SMP configuration.
@@ -1028,7 +1133,8 @@
 
 #ifdef CONFIG_VT
 #if defined(CONFIG_VGA_CONSOLE)
-	conswitchp = &vga_con;
+	if (!efi_enabled || (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY))
+		conswitchp = &vga_con;
 #elif defined(CONFIG_DUMMY_CONSOLE)
 	conswitchp = &dummy_con;
 #endif
--- diff/arch/i386/kernel/signal.c	2003-11-25 15:24:57.000000000 +0000
+++ source/arch/i386/kernel/signal.c	2003-12-29 09:30:38.000000000 +0000
@@ -128,28 +128,29 @@
  */
 
 static int
-restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, int *peax)
+restore_sigcontext(struct pt_regs *regs,
+		struct sigcontext __user *__sc, int *peax)
 {
-	unsigned int err = 0;
+	struct sigcontext scratch; /* 88 bytes of scratch area */
 
 	/* Always make any pending restarted system calls return -EINTR */
 	current_thread_info()->restart_block.fn = do_no_restart_syscall;
 
-#define COPY(x)		err |= __get_user(regs->x, &sc->x)
+	if (copy_from_user(&scratch, __sc, sizeof(scratch)))
+		return -EFAULT;
+
+#define COPY(x)		regs->x = scratch.x
 
 #define COPY_SEG(seg)							\
-	{ unsigned short tmp;						\
-	  err |= __get_user(tmp, &sc->seg);				\
+	{ unsigned short tmp = scratch.seg;				\
 	  regs->x##seg = tmp; }
 
 #define COPY_SEG_STRICT(seg)						\
-	{ unsigned short tmp;						\
-	  err |= __get_user(tmp, &sc->seg);				\
+	{ unsigned short tmp = scratch.seg;				\
 	  regs->x##seg = tmp|3; }
 
 #define GET_SEG(seg)							\
-	{ unsigned short tmp;						\
-	  err |= __get_user(tmp, &sc->seg);				\
+	{ unsigned short tmp = scratch.seg;				\
 	  loadsegment(seg,tmp); }
 
 	GET_SEG(gs);
@@ -168,27 +169,23 @@
 	COPY_SEG_STRICT(ss);
 	
 	{
-		unsigned int tmpflags;
-		err |= __get_user(tmpflags, &sc->eflags);
+		unsigned int tmpflags = scratch.eflags;
 		regs->eflags = (regs->eflags & ~0x40DD5) | (tmpflags & 0x40DD5);
 		regs->orig_eax = -1;		/* disable syscall checks */
 	}
 
 	{
-		struct _fpstate __user * buf;
-		err |= __get_user(buf, &sc->fpstate);
+		struct _fpstate * buf = scratch.fpstate;
 		if (buf) {
 			if (verify_area(VERIFY_READ, buf, sizeof(*buf)))
-				goto badframe;
-			err |= restore_i387(buf);
+				return -EFAULT;
+			if (restore_i387(buf))
+				return -EFAULT;
 		}
 	}
 
-	err |= __get_user(*peax, &sc->eax);
-	return err;
-
-badframe:
-	return 1;
+	*peax = scratch.eax;
+	return 0;
 }
 
 asmlinkage int sys_sigreturn(unsigned long __unused)
@@ -266,46 +263,47 @@
  */
 
 static int
-setup_sigcontext(struct sigcontext __user *sc, struct _fpstate __user *fpstate,
+setup_sigcontext(struct sigcontext __user *__sc, struct _fpstate __user *fpstate,
 		 struct pt_regs *regs, unsigned long mask)
 {
-	int tmp, err = 0;
+	struct sigcontext sc; /* 88 bytes of scratch area */
+	int tmp;
 
 	tmp = 0;
 	__asm__("movl %%gs,%0" : "=r"(tmp): "0"(tmp));
-	err |= __put_user(tmp, (unsigned int *)&sc->gs);
+	*(unsigned int *)&sc.gs = tmp;
 	__asm__("movl %%fs,%0" : "=r"(tmp): "0"(tmp));
-	err |= __put_user(tmp, (unsigned int *)&sc->fs);
-
-	err |= __put_user(regs->xes, (unsigned int *)&sc->es);
-	err |= __put_user(regs->xds, (unsigned int *)&sc->ds);
-	err |= __put_user(regs->edi, &sc->edi);
-	err |= __put_user(regs->esi, &sc->esi);
-	err |= __put_user(regs->ebp, &sc->ebp);
-	err |= __put_user(regs->esp, &sc->esp);
-	err |= __put_user(regs->ebx, &sc->ebx);
-	err |= __put_user(regs->edx, &sc->edx);
-	err |= __put_user(regs->ecx, &sc->ecx);
-	err |= __put_user(regs->eax, &sc->eax);
-	err |= __put_user(current->thread.trap_no, &sc->trapno);
-	err |= __put_user(current->thread.error_code, &sc->err);
-	err |= __put_user(regs->eip, &sc->eip);
-	err |= __put_user(regs->xcs, (unsigned int *)&sc->cs);
-	err |= __put_user(regs->eflags, &sc->eflags);
-	err |= __put_user(regs->esp, &sc->esp_at_signal);
-	err |= __put_user(regs->xss, (unsigned int *)&sc->ss);
+	*(unsigned int *)&sc.fs = tmp;
+	*(unsigned int *)&sc.es = regs->xes;
+	*(unsigned int *)&sc.ds = regs->xds;
+	sc.edi = regs->edi;
+	sc.esi = regs->esi;
+	sc.ebp = regs->ebp;
+	sc.esp = regs->esp;
+	sc.ebx = regs->ebx;
+	sc.edx = regs->edx;
+	sc.ecx = regs->ecx;
+	sc.eax = regs->eax;
+	sc.trapno = current->thread.trap_no;
+	sc.err = current->thread.error_code;
+	sc.eip = regs->eip;
+	*(unsigned int *)&sc.cs = regs->xcs;
+	sc.eflags = regs->eflags;
+	sc.esp_at_signal = regs->esp;
+	*(unsigned int *)&sc.ss = regs->xss;
 
 	tmp = save_i387(fpstate);
 	if (tmp < 0)
-	  err = 1;
-	else
-	  err |= __put_user(tmp ? fpstate : NULL, &sc->fpstate);
+		return 1;
+	sc.fpstate = tmp ? fpstate : NULL;
 
 	/* non-iBCS2 extensions.. */
-	err |= __put_user(mask, &sc->oldmask);
-	err |= __put_user(current->thread.cr2, &sc->cr2);
+	sc.oldmask = mask;
+	sc.cr2 = current->thread.cr2;
 
-	return err;
+	if (copy_to_user(__sc, &sc, sizeof(sc)))
+		return 1;
+	return 0;
 }
 
 /*
@@ -443,7 +441,7 @@
 	/* Create the ucontext.  */
 	err |= __put_user(0, &frame->uc.uc_flags);
 	err |= __put_user(0, &frame->uc.uc_link);
-	err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
+	err |= __put_user(current->sas_ss_sp, (unsigned long *)&frame->uc.uc_stack.ss_sp);
 	err |= __put_user(sas_ss_flags(regs->esp),
 			  &frame->uc.uc_stack.ss_flags);
 	err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
--- diff/arch/i386/kernel/smp.c	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/kernel/smp.c	2003-12-29 09:30:38.000000000 +0000
@@ -327,10 +327,12 @@
 		 
 	if (flush_mm == cpu_tlbstate[cpu].active_mm) {
 		if (cpu_tlbstate[cpu].state == TLBSTATE_OK) {
+#ifndef CONFIG_X86_SWITCH_PAGETABLES
 			if (flush_va == FLUSH_ALL)
 				local_flush_tlb();
 			else
 				__flush_tlb_one(flush_va);
+#endif
 		} else
 			leave_mm(cpu);
 	}
@@ -396,21 +398,6 @@
 	spin_unlock(&tlbstate_lock);
 }
 	
-void flush_tlb_current_task(void)
-{
-	struct mm_struct *mm = current->mm;
-	cpumask_t cpu_mask;
-
-	preempt_disable();
-	cpu_mask = mm->cpu_vm_mask;
-	cpu_clear(smp_processor_id(), cpu_mask);
-
-	local_flush_tlb();
-	if (!cpus_empty(cpu_mask))
-		flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
-	preempt_enable();
-}
-
 void flush_tlb_mm (struct mm_struct * mm)
 {
 	cpumask_t cpu_mask;
@@ -442,7 +429,10 @@
 
 	if (current->active_mm == mm) {
 		if(current->mm)
-			__flush_tlb_one(va);
+#ifndef CONFIG_X86_SWITCH_PAGETABLES
+			__flush_tlb_one(va)
+#endif
+				;
 		 else
 		 	leave_mm(smp_processor_id());
 	}
@@ -466,7 +456,17 @@
 {
 	on_each_cpu(do_flush_tlb_all, 0, 1, 1);
 }
-
+#ifdef CONFIG_KGDB
+/*
+ * By using the NMI code instead of a vector we just sneak thru the
+ * word generator coming out with just what we want.  AND it does
+ * not matter if clustered_apic_mode is set or not.
+ */
+void smp_send_nmi_allbutself(void)
+{
+	send_IPI_allbutself(APIC_DM_NMI);
+}
+#endif
 /*
  * this function sends a 'reschedule' IPI to another CPU.
  * it goes straight through and wastes no time serializing
--- diff/arch/i386/kernel/summit.c	2003-08-26 10:00:51.000000000 +0100
+++ source/arch/i386/kernel/summit.c	2003-12-29 09:30:38.000000000 +0000
@@ -29,86 +29,85 @@
 #include <linux/mm.h>
 #include <linux/init.h>
 #include <asm/io.h>
-#include <mach_mpparse.h>
+#include <asm/mach-summit/mach_mpparse.h>
 
-#ifdef CONFIG_NUMA
-static void __init setup_pci_node_map_for_wpeg(int wpeg_num, struct rio_table_hdr *rth, 
-		struct scal_detail **scal_nodes, struct rio_detail **rio_nodes){
-	int twst_num = 0, node = 0, first_bus = 0;
-	int i, bus, num_busses;
-
-	for(i = 0; i < rth->num_rio_dev; i++){
-		if (rio_nodes[i]->node_id == rio_nodes[wpeg_num]->owner_id){
-			twst_num = rio_nodes[i]->owner_id;
+static struct rio_table_hdr *rio_table_hdr __initdata;
+static struct scal_detail   *scal_devs[MAX_NUMNODES] __initdata;
+static struct rio_detail    *rio_devs[MAX_NUMNODES*4] __initdata;
+
+static int __init setup_pci_node_map_for_wpeg(int wpeg_num, int last_bus)
+{
+	int twister = 0, node = 0;
+	int i, bus, num_buses;
+
+	for(i = 0; i < rio_table_hdr->num_rio_dev; i++){
+		if (rio_devs[i]->node_id == rio_devs[wpeg_num]->owner_id){
+			twister = rio_devs[i]->owner_id;
 			break;
 		}
 	}
-	if (i == rth->num_rio_dev){
-		printk("%s: Couldn't find owner Cyclone for Winnipeg!\n", __FUNCTION__);
-		return;
+	if (i == rio_table_hdr->num_rio_dev){
+		printk(KERN_ERR "%s: Couldn't find owner Cyclone for Winnipeg!\n", __FUNCTION__);
+		return last_bus;
 	}
 
-	for(i = 0; i < rth->num_scal_dev; i++){
-		if (scal_nodes[i]->node_id == twst_num){
-			node = scal_nodes[i]->node_id;
+	for(i = 0; i < rio_table_hdr->num_scal_dev; i++){
+		if (scal_devs[i]->node_id == twister){
+			node = scal_devs[i]->node_id;
 			break;
 		}
 	}
-	if (i == rth->num_scal_dev){
-		printk("%s: Couldn't find owner Twister for Cyclone!\n", __FUNCTION__);
-		return;
+	if (i == rio_table_hdr->num_scal_dev){
+		printk(KERN_ERR "%s: Couldn't find owner Twister for Cyclone!\n", __FUNCTION__);
+		return last_bus;
 	}
 
-	switch (rio_nodes[wpeg_num]->type){
+	switch (rio_devs[wpeg_num]->type){
 	case CompatWPEG:
-		/* The Compatability Winnipeg controls the legacy busses
-		   (busses 0 & 1), the 66MHz PCI bus [2 slots] (bus 2), 
-		   and the "extra" busses in case a PCI-PCI bridge card is 
-		   used in either slot (busses 3 & 4): total 5 busses. */
-		num_busses = 5;
-		/* The BIOS numbers the busses starting at 1, and in a 
-		   slightly wierd manner.  You'll have to trust that 
-		   the math used below to determine the number of the 
-		   first bus works. */
-		first_bus = (rio_nodes[wpeg_num]->first_slot - 1) * 2;
+		/* The Compatability Winnipeg controls the 2 legacy buses,
+		 * the 66MHz PCI bus [2 slots] and the 2 "extra" buses in case
+		 * a PCI-PCI bridge card is used in either slot: total 5 buses.
+		 */
+		num_buses = 5;
 		break;
 	case AltWPEG:
-		/* The Alternate/Secondary Winnipeg controls the 1st 133MHz 
-		   bus [1 slot] & its "extra" bus (busses 0 & 1), the 2nd 
-		   133MHz bus [1 slot] & its "extra" bus (busses 2 & 3), the 
-		   100MHz bus [2 slots] (bus 4), and the "extra" busses for 
-		   the 2 100MHz slots (busses 5 & 6): total 7 busses. */
-		num_busses = 7;
-		first_bus = (rio_nodes[wpeg_num]->first_slot * 2) - 1;
+		/* The Alternate Winnipeg controls the 2 133MHz buses [1 slot
+		 * each], their 2 "extra" buses, the 100MHz bus [2 slots] and
+		 * the "extra" buses for each of those slots: total 7 buses.
+		 */
+		num_buses = 7;
 		break;
 	case LookOutAWPEG:
 	case LookOutBWPEG:
-		printk("%s: LookOut Winnipegs not supported yet!\n", __FUNCTION__);
-		return;
+		/* A Lookout Winnipeg controls 3 100MHz buses [2 slots each]
+		 * & the "extra" buses for each of those slots: total 9 buses.
+		 */
+		num_buses = 9;
+		break;
 	default:
-		printk("%s: Unsupported Winnipeg type!\n", __FUNCTION__);
-		return;
+		printk(KERN_INFO "%s: Unsupported Winnipeg type!\n", __FUNCTION__);
+		return last_bus;
 	}
 
-	for(bus = first_bus; bus < first_bus + num_busses; bus++)
+	for(bus = last_bus; bus < last_bus + num_buses; bus++)
 		mp_bus_id_to_node[bus] = node;
+	return bus;
 }
 
-static int __init build_detail_arrays(struct rio_table_hdr *rth,
-		struct scal_detail **sd, struct rio_detail **rd){
+static int __init build_detail_arrays(void)
+{
 	unsigned long ptr;
 	int i, scal_detail_size, rio_detail_size;
 
-	if ((rth->num_scal_dev > MAX_NUMNODES) ||
-	    (rth->num_rio_dev > MAX_NUMNODES * 2)){
-		printk("%s: MAX_NUMNODES too low!  Defined as %d, but system has %d nodes.\n", __FUNCTION__, MAX_NUMNODES, rth->num_scal_dev);
-		return 1;
+	if (rio_table_hdr->num_scal_dev > MAX_NUMNODES){
+		printk(KERN_WARNING "%s: MAX_NUMNODES too low!  Defined as %d, but system has %d nodes.\n", __FUNCTION__, MAX_NUMNODES, rio_table_hdr->num_scal_dev);
+		return 0;
 	}
 
-	switch (rth->version){
+	switch (rio_table_hdr->version){
 	default:
-		printk("%s: Bad Rio Grande Table Version: %d\n", __FUNCTION__, rth->version);
-		return 1;
+		printk(KERN_WARNING "%s: Invalid Rio Grande Table Version: %d\n", __FUNCTION__, rio_table_hdr->version);
+		return 0;
 	case 2:
 		scal_detail_size = 11;
 		rio_detail_size = 13;
@@ -119,32 +118,27 @@
 		break;
 	}
 
-	ptr = (unsigned long)rth + 3;
-	for(i = 0; i < rth->num_scal_dev; i++)
-		sd[i] = (struct scal_detail *)(ptr + (scal_detail_size * i));
-
-	ptr += scal_detail_size * rth->num_scal_dev;
-	for(i = 0; i < rth->num_rio_dev; i++)
-		rd[i] = (struct rio_detail *)(ptr + (rio_detail_size * i));
+	ptr = (unsigned long)rio_table_hdr + 3;
+	for(i = 0; i < rio_table_hdr->num_scal_dev; i++, ptr += scal_detail_size)
+		scal_devs[i] = (struct scal_detail *)ptr;
 
-	return 0;
+	for(i = 0; i < rio_table_hdr->num_rio_dev; i++, ptr += rio_detail_size)
+		rio_devs[i] = (struct rio_detail *)ptr;
+
+	return 1;
 }
 
 void __init setup_summit(void)
 {
-	struct rio_table_hdr	*rio_table_hdr = NULL;
-	struct scal_detail	*scal_devs[MAX_NUMNODES];
-	struct rio_detail	*rio_devs[MAX_NUMNODES*2];
 	unsigned long		ptr;
 	unsigned short		offset;
-	int			i;
-
-	memset(mp_bus_id_to_node, -1, sizeof(mp_bus_id_to_node));
+	int			i, next_wpeg, next_bus = 0;
 
 	/* The pointer to the EBDA is stored in the word @ phys 0x40E(40:0E) */
 	ptr = *(unsigned short *)phys_to_virt(0x40Eul);
 	ptr = (unsigned long)phys_to_virt(ptr << 4);
 
+	rio_table_hdr = NULL;
 	offset = 0x180;
 	while (offset){
 		/* The block id is stored in the 2nd word */
@@ -157,16 +151,30 @@
 		offset = *((unsigned short *)(ptr + offset));
 	}
 	if (!rio_table_hdr){
-		printk("%s: Unable to locate Rio Grande Table in EBDA - bailing!\n", __FUNCTION__);
+		printk(KERN_ERR "%s: Unable to locate Rio Grande Table in EBDA - bailing!\n", __FUNCTION__);
 		return;
 	}
 
-	if (build_detail_arrays(rio_table_hdr, scal_devs, rio_devs))
+	if (!build_detail_arrays())
 		return;
 
-	for(i = 0; i < rio_table_hdr->num_rio_dev; i++)
-		if (is_WPEG(rio_devs[i]->type))
-			/* It's a Winnipeg, it's got PCI Busses */
-			setup_pci_node_map_for_wpeg(i, rio_table_hdr, scal_devs, rio_devs);
+	/* The first Winnipeg we're looking for has an index of 0 */
+	next_wpeg = 0;
+	do {
+		for(i = 0; i < rio_table_hdr->num_rio_dev; i++){
+			if (is_WPEG(rio_devs[i]) && rio_devs[i]->WP_index == next_wpeg){
+				/* It's the Winnipeg we're looking for! */
+				next_bus = setup_pci_node_map_for_wpeg(i, next_bus);
+				next_wpeg++;
+				break;
+			}
+		}
+		/*
+		 * If we go through all Rio devices and don't find one with
+		 * the next index, it means we've found all the Winnipegs,
+		 * and thus all the PCI buses.
+		 */
+		if (i == rio_table_hdr->num_rio_dev)
+			next_wpeg = 0;
+	} while (next_wpeg != 0);
 }
-#endif /* CONFIG_NUMA */
--- diff/arch/i386/kernel/sysenter.c	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/kernel/sysenter.c	2003-12-29 09:30:38.000000000 +0000
@@ -18,13 +18,18 @@
 #include <asm/msr.h>
 #include <asm/pgtable.h>
 #include <asm/unistd.h>
+#include <linux/highmem.h>
 
 extern asmlinkage void sysenter_entry(void);
 
 void enable_sep_cpu(void *info)
 {
 	int cpu = get_cpu();
+#ifdef CONFIG_X86_HIGH_ENTRY
+	struct tss_struct *tss = (struct tss_struct *) __fix_to_virt(FIX_TSS_0) + cpu;
+#else
 	struct tss_struct *tss = init_tss + cpu;
+#endif
 
 	tss->ss1 = __KERNEL_CS;
 	tss->esp1 = sizeof(struct tss_struct) + (unsigned long) tss;
--- diff/arch/i386/kernel/time.c	2003-11-25 15:24:57.000000000 +0000
+++ source/arch/i386/kernel/time.c	2003-12-29 09:30:38.000000000 +0000
@@ -44,6 +44,7 @@
 #include <linux/module.h>
 #include <linux/sysdev.h>
 #include <linux/bcd.h>
+#include <linux/efi.h>
 
 #include <asm/io.h>
 #include <asm/smp.h>
@@ -94,7 +95,7 @@
 {
 	unsigned long seq;
 	unsigned long usec, sec;
-	unsigned long max_ntp_tick = tick_usec - tickadj;
+	unsigned long max_ntp_tick;
 
 	do {
 		unsigned long lost;
@@ -110,13 +111,14 @@
 		 * Better to lose some accuracy than have time go backwards..
 		 */
 		if (unlikely(time_adjust < 0)) {
+			max_ntp_tick = (USEC_PER_SEC / HZ) - tickadj;
 			usec = min(usec, max_ntp_tick);
 
 			if (lost)
 				usec += lost * max_ntp_tick;
 		}
 		else if (unlikely(lost))
-			usec += lost * tick_usec;
+			usec += lost * (USEC_PER_SEC / HZ);
 
 		sec = xtime.tv_sec;
 		usec += (xtime.tv_nsec / 1000);
@@ -174,7 +176,10 @@
 
 	/* gets recalled with irq locally disabled */
 	spin_lock(&rtc_lock);
-	retval = mach_set_rtc_mmss(nowtime);
+	if (efi_enabled)
+		retval = efi_set_rtc_mmss(nowtime);
+	else
+		retval = mach_set_rtc_mmss(nowtime);
 	spin_unlock(&rtc_lock);
 
 	return retval;
@@ -232,7 +237,13 @@
 			>= USEC_AFTER - ((unsigned) TICK_SIZE) / 2 &&
 	    (xtime.tv_nsec / 1000)
 			<= USEC_BEFORE + ((unsigned) TICK_SIZE) / 2) {
-		if (set_rtc_mmss(xtime.tv_sec) == 0)
+		/* horrible...FIXME */
+		if (efi_enabled) {
+	 		if (efi_set_rtc_mmss(xtime.tv_sec) == 0)
+				last_rtc_update = xtime.tv_sec;
+			else
+				last_rtc_update = xtime.tv_sec - 600;
+		} else if (set_rtc_mmss(xtime.tv_sec) == 0)
 			last_rtc_update = xtime.tv_sec;
 		else
 			last_rtc_update = xtime.tv_sec - 600; /* do it again in 60 s */
@@ -286,7 +297,10 @@
 
 	spin_lock(&rtc_lock);
 
-	retval = mach_get_cmos_time();
+	if (efi_enabled)
+		retval = efi_get_time();
+	else
+		retval = mach_get_cmos_time();
 
 	spin_unlock(&rtc_lock);
 
@@ -297,6 +311,7 @@
 	set_kset_name("pit"),
 };
 
+
 /* XXX this driverfs stuff should probably go elsewhere later -john */
 static struct sys_device device_i8253 = {
 	.id	= 0,
@@ -328,6 +343,8 @@
 	}
 
 	cur_timer = select_timer();
+	printk(KERN_INFO "Using %s for high-res timesource\n",cur_timer->name);
+
 	time_init_hook();
 }
 #endif
@@ -344,12 +361,13 @@
 		return;
 	}
 #endif
-
 	xtime.tv_sec = get_cmos_time();
 	wall_to_monotonic.tv_sec = -xtime.tv_sec;
 	xtime.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ);
 	wall_to_monotonic.tv_nsec = -xtime.tv_nsec;
 
 	cur_timer = select_timer();
+	printk(KERN_INFO "Using %s for high-res timesource\n",cur_timer->name);
+
 	time_init_hook();
 }
--- diff/arch/i386/kernel/timers/Makefile	2003-09-30 15:46:11.000000000 +0100
+++ source/arch/i386/kernel/timers/Makefile	2003-12-29 09:30:38.000000000 +0000
@@ -6,3 +6,4 @@
 
 obj-$(CONFIG_X86_CYCLONE_TIMER)	+= timer_cyclone.o
 obj-$(CONFIG_HPET_TIMER)	+= timer_hpet.o
+obj-$(CONFIG_X86_PM_TIMER)	+= timer_pm.o
--- diff/arch/i386/kernel/timers/common.c	2003-09-30 15:46:11.000000000 +0100
+++ source/arch/i386/kernel/timers/common.c	2003-12-29 09:30:38.000000000 +0000
@@ -137,3 +137,23 @@
 }
 #endif
 
+/* calculate cpu_khz */
+void __init init_cpu_khz(void)
+{
+	if (cpu_has_tsc) {
+		unsigned long tsc_quotient = calibrate_tsc();
+		if (tsc_quotient) {
+			/* report CPU clock rate in Hz.
+			 * The formula is (10^6 * 2^32) / (2^32 * 1 / (clocks/us)) =
+			 * clock/second. Our precision is about 100 ppm.
+			 */
+			{	unsigned long eax=0, edx=1000;
+				__asm__("divl %2"
+		       		:"=a" (cpu_khz), "=d" (edx)
+        	       		:"r" (tsc_quotient),
+	                	"0" (eax), "1" (edx));
+				printk("Detected %lu.%03lu MHz processor.\n", cpu_khz / 1000, cpu_khz % 1000);
+			}
+		}
+	}
+}
--- diff/arch/i386/kernel/timers/timer.c	2003-09-17 12:28:01.000000000 +0100
+++ source/arch/i386/kernel/timers/timer.c	2003-12-29 09:30:38.000000000 +0000
@@ -19,6 +19,9 @@
 #ifdef CONFIG_HPET_TIMER
 	&timer_hpet,
 #endif
+#ifdef CONFIG_X86_PM_TIMER
+	&timer_pmtmr,
+#endif
 	&timer_tsc,
 	&timer_pit,
 	NULL,
--- diff/arch/i386/kernel/timers/timer_cyclone.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/i386/kernel/timers/timer_cyclone.c	2003-12-29 09:30:38.000000000 +0000
@@ -71,7 +71,7 @@
 	lost = delta/(1000000/HZ);
 	delay = delta%(1000000/HZ);
 	if (lost >= 2)
-		jiffies += lost-1;
+		jiffies_64 += lost-1;
 	
 	/* update the monotonic base value */
 	this_offset = ((unsigned long long)last_cyclone_high<<32)|last_cyclone_low;
@@ -88,7 +88,7 @@
 	 * usec delta is > 90% # of usecs/tick)
 	 */
 	if (lost && abs(delay - delay_at_last_interrupt) > (900000/HZ))
-		jiffies++;
+		jiffies_64++;
 }
 
 static unsigned long get_offset_cyclone(void)
@@ -212,26 +212,7 @@
 		}
 	}
 
-	/* init cpu_khz.
-	 * XXX - This should really be done elsewhere, 
-	 * 		and in a more generic fashion. -johnstul@us.ibm.com
-	 */
-	if (cpu_has_tsc) {
-		unsigned long tsc_quotient = calibrate_tsc();
-		if (tsc_quotient) {
-			/* report CPU clock rate in Hz.
-			 * The formula is (10^6 * 2^32) / (2^32 * 1 / (clocks/us)) =
-			 * clock/second. Our precision is about 100 ppm.
-			 */
-			{	unsigned long eax=0, edx=1000;
-				__asm__("divl %2"
-		       		:"=a" (cpu_khz), "=d" (edx)
-        	       		:"r" (tsc_quotient),
-	                	"0" (eax), "1" (edx));
-				printk("Detected %lu.%03lu MHz processor.\n", cpu_khz / 1000, cpu_khz % 1000);
-			}
-		}
-	}
+	init_cpu_khz();
 
 	/* Everything looks good! */
 	return 0;
@@ -253,6 +234,7 @@
 
 /* cyclone timer_opts struct */
 struct timer_opts timer_cyclone = {
+	.name = "cyclone",
 	.init = init_cyclone, 
 	.mark_offset = mark_offset_cyclone, 
 	.get_offset = get_offset_cyclone,
--- diff/arch/i386/kernel/timers/timer_hpet.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/i386/kernel/timers/timer_hpet.c	2003-12-29 09:30:38.000000000 +0000
@@ -108,7 +108,7 @@
 	offset = hpet_readl(HPET_T0_CMP) - hpet_tick;
 	if (unlikely(((offset - hpet_last) > hpet_tick) && (hpet_last != 0))) {
 		int lost_ticks = (offset - hpet_last) / hpet_tick;
-		jiffies += lost_ticks;
+		jiffies_64 += lost_ticks;
 	}
 	hpet_last = offset;
 
@@ -178,6 +178,7 @@
 
 /* tsc timer_opts struct */
 struct timer_opts timer_hpet = {
+	.name = 		"hpet",
 	.init =			init_hpet,
 	.mark_offset =		mark_offset_hpet,
 	.get_offset =		get_offset_hpet,
--- diff/arch/i386/kernel/timers/timer_none.c	2003-05-21 11:49:59.000000000 +0100
+++ source/arch/i386/kernel/timers/timer_none.c	2003-12-29 09:30:38.000000000 +0000
@@ -36,6 +36,7 @@
 
 /* tsc timer_opts struct */
 struct timer_opts timer_none = {
+	.name = 	"none",
 	.init =		init_none, 
 	.mark_offset =	mark_offset_none, 
 	.get_offset =	get_offset_none,
--- diff/arch/i386/kernel/timers/timer_pit.c	2003-05-21 11:50:14.000000000 +0100
+++ source/arch/i386/kernel/timers/timer_pit.c	2003-12-29 09:30:38.000000000 +0000
@@ -149,6 +149,7 @@
 
 /* tsc timer_opts struct */
 struct timer_opts timer_pit = {
+	.name = 	"pit",
 	.init =		init_pit, 
 	.mark_offset =	mark_offset_pit, 
 	.get_offset =	get_offset_pit,
--- diff/arch/i386/kernel/timers/timer_tsc.c	2003-11-25 15:24:57.000000000 +0000
+++ source/arch/i386/kernel/timers/timer_tsc.c	2003-12-29 09:30:38.000000000 +0000
@@ -30,7 +30,6 @@
 int tsc_disable __initdata = 0;
 
 extern spinlock_t i8253_lock;
-extern volatile unsigned long jiffies;
 
 static int use_tsc;
 /* Number of usecs that the last interrupt was delayed */
@@ -141,7 +140,7 @@
 #ifndef CONFIG_NUMA
 	if (!use_tsc)
 #endif
-		return (unsigned long long)jiffies * (1000000000 / HZ);
+		return (unsigned long long)get_jiffies_64() * (1000000000 / HZ);
 
 	/* Read the Time Stamp Counter */
 	rdtscll(this_offset);
@@ -184,6 +183,18 @@
 
 	count = inb_p(PIT_CH0);    /* read the latched count */
 	count |= inb(PIT_CH0) << 8;
+
+	/*
+	 * VIA686a test code... reset the latch if count > max + 1
+	 * from timer_pit.c - cjb
+	 */
+	if (count > LATCH) {
+		outb_p(0x34, PIT_MODE);
+		outb_p(LATCH & 0xff, PIT_CH0);
+		outb(LATCH >> 8, PIT_CH0);
+		count = LATCH - 1;
+	}
+
 	spin_unlock(&i8253_lock);
 
 	if (pit_latch_buggy) {
@@ -215,7 +226,7 @@
 	lost = delta/(1000000/HZ);
 	delay = delta%(1000000/HZ);
 	if (lost >= 2) {
-		jiffies += lost-1;
+		jiffies_64 += lost-1;
 
 		/* sanity check to ensure we're not always losing ticks */
 		if (lost_count++ > 100) {
@@ -241,7 +252,7 @@
 	 * usec delta is > 90% # of usecs/tick)
 	 */
 	if (lost && abs(delay - delay_at_last_interrupt) > (900000/HZ))
-		jiffies++;
+		jiffies_64++;
 }
 
 static void delay_tsc(unsigned long loops)
@@ -283,7 +294,7 @@
 	offset = hpet_readl(HPET_T0_CMP) - hpet_tick;
 	if (unlikely(((offset - hpet_last) > hpet_tick) && (hpet_last != 0))) {
 		int lost_ticks = (offset - hpet_last) / hpet_tick;
-		jiffies += lost_ticks;
+		jiffies_64 += lost_ticks;
 	}
 	hpet_last = hpet_current;
 
@@ -472,6 +483,7 @@
 
 /* tsc timer_opts struct */
 struct timer_opts timer_tsc = {
+	.name = 	"tsc",
 	.init =		init_tsc,
 	.mark_offset =	mark_offset_tsc, 
 	.get_offset =	get_offset_tsc,
--- diff/arch/i386/kernel/traps.c	2003-10-27 09:20:36.000000000 +0000
+++ source/arch/i386/kernel/traps.c	2003-12-29 09:30:38.000000000 +0000
@@ -54,12 +54,8 @@
 
 #include "mach_traps.h"
 
-asmlinkage int system_call(void);
-asmlinkage void lcall7(void);
-asmlinkage void lcall27(void);
-
-struct desc_struct default_ldt[] = { { 0, 0 }, { 0, 0 }, { 0, 0 },
-		{ 0, 0 }, { 0, 0 } };
+struct desc_struct default_ldt[] __attribute__((__section__(".data.default_ldt"))) = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } };
+struct page *default_ldt_page;
 
 /* Do we ignore FPU interrupts ? */
 char ignore_fpu_irq = 0;
@@ -91,6 +87,43 @@
 asmlinkage void spurious_interrupt_bug(void);
 asmlinkage void machine_check(void);
 
+#ifdef CONFIG_KGDB
+extern void sysenter_entry(void);
+#include <asm/kgdb.h>
+#include <linux/init.h>
+extern void int3(void);
+extern void debug(void);
+void set_intr_gate(unsigned int n, void *addr);
+static void set_intr_usr_gate(unsigned int n, void *addr);
+/*
+ * Should be able to call this breakpoint() very early in
+ * bring up.  Just hard code the call where needed.
+ * The breakpoint() code is here because set_?_gate() functions
+ * are local (static) to trap.c.  They need be done only once,
+ * but it does not hurt to do them over.
+ */
+void breakpoint(void)
+{
+	init_entry_mappings();
+        set_intr_usr_gate(3,&int3); /* disable ints on trap */
+	set_intr_gate(1,&debug);
+	set_intr_gate(14,&page_fault);
+
+        BREAKPOINT;
+}
+#define	CHK_REMOTE_DEBUG(trapnr,signr,error_code,regs,after)		\
+    {									\
+	if (!user_mode(regs)  ) \
+	{								\
+		kgdb_handle_exception(trapnr, signr, error_code, regs);	\
+		after;							\
+	} else if ((trapnr == 3) && (regs->eflags &0x200)) local_irq_enable(); \
+    }
+#else
+#define	CHK_REMOTE_DEBUG(trapnr,signr,error_code,regs,after)
+#endif
+
+
 static int kstack_depth_to_print = 24;
 
 void show_trace(struct task_struct *task, unsigned long * stack)
@@ -175,8 +208,9 @@
 		ss = regs->xss & 0xffff;
 	}
 	print_modules();
-	printk("CPU:    %d\nEIP:    %04x:[<%08lx>]    %s\nEFLAGS: %08lx\n",
-		smp_processor_id(), 0xffff & regs->xcs, regs->eip, print_tainted(), regs->eflags);
+	printk("CPU:    %d\nEIP:    %04x:[<%08lx>]    %s VLI\nEFLAGS: %08lx\n",
+		smp_processor_id(), 0xffff & regs->xcs,
+		regs->eip, print_tainted(), regs->eflags);
 
 	print_symbol("EIP is at %s\n", regs->eip);
 	printk("eax: %08lx   ebx: %08lx   ecx: %08lx   edx: %08lx\n",
@@ -192,23 +226,27 @@
 	 * time of the fault..
 	 */
 	if (in_kernel) {
+		u8 *eip;
 
 		printk("\nStack: ");
 		show_stack(NULL, (unsigned long*)esp);
 
 		printk("Code: ");
-		if(regs->eip < PAGE_OFFSET)
-			goto bad;
 
-		for(i=0;i<20;i++)
-		{
-			unsigned char c;
-			if(__get_user(c, &((unsigned char*)regs->eip)[i])) {
-bad:
+		eip = (u8 *)regs->eip - 43;
+		for (i = 0; i < 64; i++, eip++) {
+			unsigned char c = 0xff;
+
+			if ((user_mode(regs) && get_user(c, eip)) ||
+			    (!user_mode(regs) && __direct_get_user(c, eip))) {
+
 				printk(" Bad EIP value.");
 				break;
 			}
-			printk("%02x ", c);
+			if (eip == (u8 *)regs->eip)
+				printk("<%02x> ", c);
+			else
+				printk("%02x ", c);
 		}
 	}
 	printk("\n");
@@ -255,12 +293,36 @@
 void die(const char * str, struct pt_regs * regs, long err)
 {
 	static int die_counter;
+	int nl = 0;
 
 	console_verbose();
 	spin_lock_irq(&die_lock);
 	bust_spinlocks(1);
 	handle_BUG(regs);
 	printk("%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter);
+#ifdef CONFIG_PREEMPT
+	printk("PREEMPT ");
+	nl = 1;
+#endif
+#ifdef CONFIG_SMP
+	printk("SMP ");
+	nl = 1;
+#endif
+#ifdef CONFIG_DEBUG_PAGEALLOC
+	printk("DEBUG_PAGEALLOC");
+	nl = 1;
+#endif
+	if (nl)
+		printk("\n");
+#ifdef CONFIG_KGDB
+	/* This is about the only place we want to go to kgdb even if in
+	 * user mode.  But we must go in via a trap so within kgdb we will
+	 * always be in kernel mode.
+	 */
+	if (user_mode(regs))
+		BREAKPOINT;
+#endif
+ 	CHK_REMOTE_DEBUG(0,SIGTRAP,err,regs,)
 	show_registers(regs);
 	bust_spinlocks(0);
 	spin_unlock_irq(&die_lock);
@@ -330,6 +392,7 @@
 #define DO_ERROR(trapnr, signr, str, name) \
 asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
 { \
+	CHK_REMOTE_DEBUG(trapnr,signr,error_code,regs,)\
 	do_trap(trapnr, signr, str, 0, regs, error_code, NULL); \
 }
 
@@ -347,7 +410,9 @@
 #define DO_VM86_ERROR(trapnr, signr, str, name) \
 asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
 { \
+	CHK_REMOTE_DEBUG(trapnr, signr, error_code,regs, return)\
 	do_trap(trapnr, signr, str, 1, regs, error_code, NULL); \
+	return; \
 }
 
 #define DO_VM86_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \
@@ -394,8 +459,10 @@
 	return;
 
 gp_in_kernel:
-	if (!fixup_exception(regs))
+	if (!fixup_exception(regs)){
+ 		CHK_REMOTE_DEBUG(13,SIGSEGV,error_code,regs,)
 		die("general protection fault", regs, error_code);
+	}
 }
 
 static void mem_parity_error(unsigned char reason, struct pt_regs * regs)
@@ -534,10 +601,18 @@
 	if (regs->eflags & X86_EFLAGS_IF)
 		local_irq_enable();
 
-	/* Mask out spurious debug traps due to lazy DR7 setting */
+	/*
+	 * Mask out spurious debug traps due to lazy DR7 setting or
+	 * due to 4G/4G kernel mode:
+	 */
 	if (condition & (DR_TRAP0|DR_TRAP1|DR_TRAP2|DR_TRAP3)) {
 		if (!tsk->thread.debugreg[7])
 			goto clear_dr7;
+		if (!user_mode(regs)) {
+			// restore upon return-to-userspace:
+			set_thread_flag(TIF_DB7);
+			goto clear_dr7;
+		}
 	}
 
 	if (regs->eflags & VM_MASK)
@@ -557,8 +632,18 @@
 		 * allowing programs to debug themselves without the ptrace()
 		 * interface.
 		 */
+#ifdef CONFIG_KGDB
+		/*
+		 * I think this is the only "real" case of a TF in the kernel
+		 * that really belongs to user space.  Others are
+		 * "Ours all ours!"
+		 */
+		if (((regs->xcs & 3) == 0) && ((void *)regs->eip == sysenter_entry))
+			goto clear_TF_reenable;
+#else
 		if ((regs->xcs & 3) == 0)
 			goto clear_TF_reenable;
+#endif
 		if ((tsk->ptrace & (PT_DTRACE|PT_PTRACED)) == PT_DTRACE)
 			goto clear_TF;
 	}
@@ -570,6 +655,17 @@
 	info.si_errno = 0;
 	info.si_code = TRAP_BRKPT;
 	
+#ifdef CONFIG_KGDB
+        /*
+	 * If this is a kernel mode trap, we need to reset db7 to allow us
+	 * to continue sanely ALSO skip the signal delivery
+         */
+	if ((regs->xcs & 3) == 0)
+		goto clear_dr7;
+
+        /* if not kernel, allow ints but only if they were on */
+       if ( regs->eflags & 0x200) local_irq_enable();
+#endif
 	/* If this is a kernel mode trap, save the user PC on entry to 
 	 * the kernel, that's what the debugger can make sense of.
 	 */
@@ -584,6 +680,7 @@
 	__asm__("movl %0,%%db7"
 		: /* no output */
 		: "r" (0));
+	CHK_REMOTE_DEBUG(1,SIGTRAP,error_code,regs,)
 	return;
 
 debug_vm86:
@@ -779,19 +876,53 @@
 
 #endif /* CONFIG_MATH_EMULATION */
 
-#ifdef CONFIG_X86_F00F_BUG
-void __init trap_init_f00f_bug(void)
+void __init trap_init_virtual_IDT(void)
 {
-	__set_fixmap(FIX_F00F_IDT, __pa(&idt_table), PAGE_KERNEL_RO);
-
 	/*
-	 * Update the IDT descriptor and reload the IDT so that
-	 * it uses the read-only mapped virtual address.
+	 * "idt" is magic - it overlaps the idt_descr
+	 * variable so that updating idt will automatically
+	 * update the idt descriptor..
 	 */
-	idt_descr.address = fix_to_virt(FIX_F00F_IDT);
+	__set_fixmap(FIX_IDT, __pa(&idt_table), PAGE_KERNEL_RO);
+	idt_descr.address = __fix_to_virt(FIX_IDT);
+
 	__asm__ __volatile__("lidt %0" : : "m" (idt_descr));
 }
+
+void __init trap_init_virtual_GDT(void)
+{
+	int cpu = smp_processor_id();
+	struct Xgt_desc_struct *gdt_desc = cpu_gdt_descr + cpu;
+	struct Xgt_desc_struct tmp_desc = {0, 0};
+	struct tss_struct * t;
+
+	__asm__ __volatile__("sgdt %0": "=m" (tmp_desc): :"memory");
+
+#ifdef CONFIG_X86_HIGH_ENTRY
+	if (!cpu) {
+		__set_fixmap(FIX_GDT_0, __pa(cpu_gdt_table), PAGE_KERNEL);
+		__set_fixmap(FIX_GDT_1, __pa(cpu_gdt_table) + PAGE_SIZE, PAGE_KERNEL);
+		__set_fixmap(FIX_TSS_0, __pa(init_tss), PAGE_KERNEL);
+		__set_fixmap(FIX_TSS_1, __pa(init_tss) + 1*PAGE_SIZE, PAGE_KERNEL);
+		__set_fixmap(FIX_TSS_2, __pa(init_tss) + 2*PAGE_SIZE, PAGE_KERNEL);
+		__set_fixmap(FIX_TSS_3, __pa(init_tss) + 3*PAGE_SIZE, PAGE_KERNEL);
+	}
+
+	gdt_desc->address = __fix_to_virt(FIX_GDT_0) + sizeof(cpu_gdt_table[0]) * cpu;
+#else
+	gdt_desc->address = (unsigned long)cpu_gdt_table[cpu];
+#endif
+	__asm__ __volatile__("lgdt %0": "=m" (*gdt_desc));
+
+#ifdef CONFIG_X86_HIGH_ENTRY
+	t = (struct tss_struct *) __fix_to_virt(FIX_TSS_0) + cpu;
+#else
+	t = init_tss + cpu;
 #endif
+	set_tss_desc(cpu, t);
+	cpu_gdt_table[cpu][GDT_ENTRY_TSS].b &= 0xfffffdff;
+	load_TR_desc();
+}
 
 #define _set_gate(gate_addr,type,dpl,addr,seg) \
 do { \
@@ -818,20 +949,26 @@
 	_set_gate(idt_table+n,14,0,addr,__KERNEL_CS);
 }
 
-static void __init set_trap_gate(unsigned int n, void *addr)
+void __init set_trap_gate(unsigned int n, void *addr)
 {
 	_set_gate(idt_table+n,15,0,addr,__KERNEL_CS);
 }
 
-static void __init set_system_gate(unsigned int n, void *addr)
+void __init set_system_gate(unsigned int n, void *addr)
 {
 	_set_gate(idt_table+n,15,3,addr,__KERNEL_CS);
 }
 
-static void __init set_call_gate(void *a, void *addr)
+void __init set_call_gate(void *a, void *addr)
 {
 	_set_gate(a,12,3,addr,__KERNEL_CS);
 }
+#ifdef CONFIG_KGDB
+void set_intr_usr_gate(unsigned int n, void *addr)
+{
+	_set_gate(idt_table+n,14,3,addr,__KERNEL_CS);
+}
+#endif
 
 static void __init set_task_gate(unsigned int n, unsigned int gdt_entry)
 {
@@ -850,11 +987,16 @@
 #ifdef CONFIG_X86_LOCAL_APIC
 	init_apic_mappings();
 #endif
+	init_entry_mappings();
 
 	set_trap_gate(0,&divide_error);
 	set_intr_gate(1,&debug);
 	set_intr_gate(2,&nmi);
+#ifndef CONFIG_KGDB
 	set_system_gate(3,&int3);	/* int3-5 can be called from all */
+#else
+	set_intr_usr_gate(3,&int3);	/* int3-5 can be called from all */
+#endif
 	set_system_gate(4,&overflow);
 	set_system_gate(5,&bounds);
 	set_trap_gate(6,&invalid_op);
--- diff/arch/i386/kernel/vm86.c	2003-11-25 15:24:57.000000000 +0000
+++ source/arch/i386/kernel/vm86.c	2003-12-29 09:30:38.000000000 +0000
@@ -124,7 +124,8 @@
 
 	tss = init_tss + get_cpu();
 	current->thread.esp0 = current->thread.saved_esp0;
-	load_esp0(tss, current->thread.esp0);
+	current->thread.sysenter_cs = __KERNEL_CS;
+	load_virtual_esp0(tss, current);
 	current->thread.saved_esp0 = 0;
 	put_cpu();
 
@@ -301,8 +302,10 @@
 	asm volatile("movl %%gs,%0":"=m" (tsk->thread.saved_gs));
 
 	tss = init_tss + get_cpu();
-	tss->esp0 = tsk->thread.esp0 = (unsigned long) &info->VM86_TSS_ESP0;
-	disable_sysenter(tss);
+	tsk->thread.esp0 = (unsigned long) &info->VM86_TSS_ESP0;
+	if (cpu_has_sep)
+		tsk->thread.sysenter_cs = 0;
+	load_virtual_esp0(tss, tsk);
 	put_cpu();
 
 	tsk->thread.screen_bitmap = info->screen_bitmap;
--- diff/arch/i386/kernel/vmlinux.lds.S	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/kernel/vmlinux.lds.S	2003-12-29 09:30:38.000000000 +0000
@@ -3,6 +3,9 @@
  */
 
 #include <asm-generic/vmlinux.lds.h>
+#include <linux/config.h>
+#include <asm/page.h>
+#include <asm/asm_offsets.h>
 	
 OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
 OUTPUT_ARCH(i386)
@@ -10,7 +13,7 @@
 jiffies = jiffies_64;
 SECTIONS
 {
-  . = 0xC0000000 + 0x100000;
+  . = __PAGE_OFFSET + 0x100000;
   /* read-only */
   _text = .;			/* Text and read-only data */
   .text : {
@@ -19,6 +22,19 @@
 	*(.gnu.warning)
 	} = 0x9090
 
+#ifdef CONFIG_X86_4G
+  . = ALIGN(PAGE_SIZE_asm);
+  __entry_tramp_start = .;
+  . = FIX_ENTRY_TRAMPOLINE_0_addr;
+  __start___entry_text = .;
+  .entry.text : AT (__entry_tramp_start) { *(.entry.text) }
+  __entry_tramp_end = __entry_tramp_start + SIZEOF(.entry.text);
+  . = __entry_tramp_end;
+  . = ALIGN(PAGE_SIZE_asm);
+#else
+  .entry.text : { *(.entry.text) }
+#endif
+
   _etext = .;			/* End of text section */
 
   . = ALIGN(16);		/* Exception table */
@@ -34,15 +50,12 @@
 	CONSTRUCTORS
 	}
 
-  . = ALIGN(4096);
+  . = ALIGN(PAGE_SIZE_asm);
   __nosave_begin = .;
   .data_nosave : { *(.data.nosave) }
-  . = ALIGN(4096);
+  . = ALIGN(PAGE_SIZE_asm);
   __nosave_end = .;
 
-  . = ALIGN(4096);
-  .data.page_aligned : { *(.data.idt) }
-
   . = ALIGN(32);
   .data.cacheline_aligned : { *(.data.cacheline_aligned) }
 
@@ -52,7 +65,7 @@
   .data.init_task : { *(.data.init_task) }
 
   /* will be freed after init */
-  . = ALIGN(4096);		/* Init code and data */
+  . = ALIGN(PAGE_SIZE_asm);		/* Init code and data */
   __init_begin = .;
   .init.text : { 
 	_sinittext = .;
@@ -91,7 +104,7 @@
      from .altinstructions and .eh_frame */
   .exit.text : { *(.exit.text) }
   .exit.data : { *(.exit.data) }
-  . = ALIGN(4096);
+  . = ALIGN(PAGE_SIZE_asm);
   __initramfs_start = .;
   .init.ramfs : { *(.init.ramfs) }
   __initramfs_end = .;
@@ -99,10 +112,22 @@
   __per_cpu_start = .;
   .data.percpu  : { *(.data.percpu) }
   __per_cpu_end = .;
-  . = ALIGN(4096);
+  . = ALIGN(PAGE_SIZE_asm);
   __init_end = .;
   /* freed after init ends here */
-	
+
+  . = ALIGN(PAGE_SIZE_asm);
+  .data.page_aligned_tss : { *(.data.tss) }
+
+  . = ALIGN(PAGE_SIZE_asm);
+  .data.page_aligned_default_ldt : { *(.data.default_ldt) }
+
+  . = ALIGN(PAGE_SIZE_asm);
+  .data.page_aligned_idt : { *(.data.idt) }
+
+  . = ALIGN(PAGE_SIZE_asm);
+  .data.page_aligned_gdt : { *(.data.gdt) }
+
   __bss_start = .;		/* BSS */
   .bss : { *(.bss) }
   __bss_stop = .; 
@@ -122,4 +147,6 @@
   .stab.index 0 : { *(.stab.index) }
   .stab.indexstr 0 : { *(.stab.indexstr) }
   .comment 0 : { *(.comment) }
+
+
 }
--- diff/arch/i386/kernel/vsyscall-sysenter.S	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/kernel/vsyscall-sysenter.S	2003-12-29 09:30:38.000000000 +0000
@@ -7,6 +7,11 @@
 	.type __kernel_vsyscall,@function
 __kernel_vsyscall:
 .LSTART_vsyscall:
+	cmpl $192, %eax
+	jne 1f
+	int $0x80
+	ret
+1:
 	push %ecx
 .Lpush_ecx:
 	push %edx
--- diff/arch/i386/kernel/vsyscall.lds	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/kernel/vsyscall.lds	2003-12-29 09:30:38.000000000 +0000
@@ -5,7 +5,7 @@
  */
 
 /* This must match <asm/fixmap.h>.  */
-VSYSCALL_BASE = 0xffffe000;
+VSYSCALL_BASE = 0xffffd000;
 
 SECTIONS
 {
--- diff/arch/i386/lib/Makefile	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/lib/Makefile	2003-12-29 09:30:38.000000000 +0000
@@ -9,4 +9,5 @@
 
 lib-$(CONFIG_X86_USE_3DNOW) += mmx.o
 lib-$(CONFIG_HAVE_DEC_LOCK) += dec_and_lock.o
+lib-$(CONFIG_KGDB) += kgdb_serial.o
 lib-$(CONFIG_DEBUG_IOVIRT)  += iodebug.o
--- diff/arch/i386/lib/checksum.S	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/lib/checksum.S	2003-12-29 09:30:38.000000000 +0000
@@ -280,14 +280,14 @@
 	.previous
 
 .align 4
-.globl csum_partial_copy_generic
+.globl direct_csum_partial_copy_generic
 				
 #ifndef CONFIG_X86_USE_PPRO_CHECKSUM
 
 #define ARGBASE 16		
 #define FP		12
 		
-csum_partial_copy_generic:
+direct_csum_partial_copy_generic:
 	subl  $4,%esp	
 	pushl %edi
 	pushl %esi
@@ -422,7 +422,7 @@
 
 #define ARGBASE 12
 		
-csum_partial_copy_generic:
+direct_csum_partial_copy_generic:
 	pushl %ebx
 	pushl %edi
 	pushl %esi
--- diff/arch/i386/lib/dec_and_lock.c	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/lib/dec_and_lock.c	2003-12-29 09:30:38.000000000 +0000
@@ -10,6 +10,7 @@
 #include <linux/spinlock.h>
 #include <asm/atomic.h>
 
+#ifndef ATOMIC_DEC_AND_LOCK
 int atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
 {
 	int counter;
@@ -38,3 +39,5 @@
 	spin_unlock(lock);
 	return 0;
 }
+#endif
+
--- diff/arch/i386/lib/getuser.S	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/lib/getuser.S	2003-12-29 09:30:38.000000000 +0000
@@ -9,6 +9,7 @@
  * return value.
  */
 #include <asm/thread_info.h>
+#include <asm/asm_offsets.h>
 
 
 /*
@@ -28,7 +29,7 @@
 .globl __get_user_1
 __get_user_1:
 	GET_THREAD_INFO(%edx)
-	cmpl TI_ADDR_LIMIT(%edx),%eax
+	cmpl TI_addr_limit(%edx),%eax
 	jae bad_get_user
 1:	movzbl (%eax),%edx
 	xorl %eax,%eax
@@ -40,7 +41,7 @@
 	addl $1,%eax
 	jc bad_get_user
 	GET_THREAD_INFO(%edx)
-	cmpl TI_ADDR_LIMIT(%edx),%eax
+	cmpl TI_addr_limit(%edx),%eax
 	jae bad_get_user
 2:	movzwl -1(%eax),%edx
 	xorl %eax,%eax
@@ -52,7 +53,7 @@
 	addl $3,%eax
 	jc bad_get_user
 	GET_THREAD_INFO(%edx)
-	cmpl TI_ADDR_LIMIT(%edx),%eax
+	cmpl TI_addr_limit(%edx),%eax
 	jae bad_get_user
 3:	movl -3(%eax),%edx
 	xorl %eax,%eax
--- diff/arch/i386/lib/usercopy.c	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/lib/usercopy.c	2003-12-29 09:30:38.000000000 +0000
@@ -76,7 +76,7 @@
  * and returns @count.
  */
 long
-__strncpy_from_user(char *dst, const char __user *src, long count)
+__direct_strncpy_from_user(char *dst, const char __user *src, long count)
 {
 	long res;
 	__do_strncpy_from_user(dst, src, count, res);
@@ -102,7 +102,7 @@
  * and returns @count.
  */
 long
-strncpy_from_user(char *dst, const char __user *src, long count)
+direct_strncpy_from_user(char *dst, const char __user *src, long count)
 {
 	long res = -EFAULT;
 	if (access_ok(VERIFY_READ, src, 1))
@@ -147,7 +147,7 @@
  * On success, this will be zero.
  */
 unsigned long
-clear_user(void __user *to, unsigned long n)
+direct_clear_user(void __user *to, unsigned long n)
 {
 	might_sleep();
 	if (access_ok(VERIFY_WRITE, to, n))
@@ -167,7 +167,7 @@
  * On success, this will be zero.
  */
 unsigned long
-__clear_user(void __user *to, unsigned long n)
+__direct_clear_user(void __user *to, unsigned long n)
 {
 	__do_clear_user(to, n);
 	return n;
@@ -184,7 +184,7 @@
  * On exception, returns 0.
  * If the string is too long, returns a value greater than @n.
  */
-long strnlen_user(const char __user *s, long n)
+long direct_strnlen_user(const char __user *s, long n)
 {
 	unsigned long mask = -__addr_ok(s);
 	unsigned long res, tmp;
@@ -541,8 +541,10 @@
 				goto survive;
 			}
 
-			if (retval != 1)
+			if (retval != 1) {
+				up_read(&current->mm->mmap_sem);
 		       		break;
+			}
 
 			maddr = kmap_atomic(pg, KM_USER0);
 			memcpy(maddr + offset, from, len);
@@ -573,3 +575,4 @@
 		n = __copy_user_zeroing_intel(to, (const void *) from, n);
 	return n;
 }
+
--- diff/arch/i386/mach-es7000/es7000.c	2003-06-30 10:07:28.000000000 +0100
+++ source/arch/i386/mach-es7000/es7000.c	2003-12-29 09:30:38.000000000 +0000
@@ -51,8 +51,6 @@
 int 			mip_port;
 unsigned long		mip_addr, host_addr;
 
-static int		es7000_plat;
-
 /*
  * Parse the OEM Table
  */
--- diff/arch/i386/math-emu/fpu_system.h	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/math-emu/fpu_system.h	2003-12-29 09:30:38.000000000 +0000
@@ -15,6 +15,7 @@
 #include <linux/sched.h>
 #include <linux/kernel.h>
 #include <linux/mm.h>
+#include <asm/atomic_kmap.h>
 
 /* This sets the pointer FPU_info to point to the argument part
    of the stack frame of math_emulate() */
@@ -22,7 +23,7 @@
 
 /* s is always from a cpu register, and the cpu does bounds checking
  * during register load --> no further bounds checks needed */
-#define LDT_DESCRIPTOR(s)	(((struct desc_struct *)current->mm->context.ldt)[(s) >> 3])
+#define LDT_DESCRIPTOR(s)	(((struct desc_struct *)__kmap_atomic_vaddr(KM_LDT_PAGE0))[(s) >> 3])
 #define SEG_D_SIZE(x)		((x).b & (3 << 21))
 #define SEG_G_BIT(x)		((x).b & (1 << 23))
 #define SEG_GRANULARITY(x)	(((x).b & (1 << 23)) ? 4096 : 1)
--- diff/arch/i386/mm/extable.c	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/mm/extable.c	2003-12-29 09:30:38.000000000 +0000
@@ -6,6 +6,52 @@
 #include <linux/module.h>
 #include <linux/spinlock.h>
 #include <asm/uaccess.h>
+#include <asm/pgtable.h>
+
+extern struct exception_table_entry __start___ex_table[];
+extern struct exception_table_entry __stop___ex_table[];
+
+/*
+ * The exception table needs to be sorted because we use the macros
+ * which put things into the exception table in a variety of sections
+ * as well as the init section and the main kernel text section.
+ */
+static inline void
+sort_ex_table(struct exception_table_entry *start,
+	      struct exception_table_entry *finish)
+{
+	struct exception_table_entry el, *p, *q;
+
+	/* insertion sort */
+	for (p = start + 1; p < finish; ++p) {
+		/* start .. p-1 is sorted */
+		if (p[0].insn < p[-1].insn) {
+			/* move element p down to its right place */
+			el = *p;
+			q = p;
+			do {
+				/* el comes before q[-1], move q[-1] up one */
+				q[0] = q[-1];
+				--q;
+			} while (q > start && el.insn < q[-1].insn);
+			*q = el;
+		}
+	}
+}
+
+void fixup_sort_exception_table(void)
+{
+	struct exception_table_entry *p;
+
+	/*
+	 * Fix up the trampoline exception addresses:
+	 */
+	for (p = __start___ex_table; p < __stop___ex_table; p++) {
+		p->insn = (unsigned long)(void *)p->insn;
+		p->fixup = (unsigned long)(void *)p->fixup;
+	}
+	sort_ex_table(__start___ex_table, __stop___ex_table);
+}
 
 /* Simple binary search */
 const struct exception_table_entry *
@@ -15,13 +61,15 @@
 {
         while (first <= last) {
 		const struct exception_table_entry *mid;
-		long diff;
 
 		mid = (last - first) / 2 + first;
-		diff = mid->insn - value;
-                if (diff == 0)
+		/*
+		 * careful, the distance between entries can be
+		 * larger than 2GB:
+		 */
+                if (mid->insn == value)
                         return mid;
-                else if (diff < 0)
+                else if (mid->insn < value)
                         first = mid+1;
                 else
                         last = mid-1;
--- diff/arch/i386/mm/fault.c	2003-12-19 09:51:11.000000000 +0000
+++ source/arch/i386/mm/fault.c	2003-12-29 09:30:38.000000000 +0000
@@ -27,6 +27,7 @@
 #include <asm/pgalloc.h>
 #include <asm/hardirq.h>
 #include <asm/desc.h>
+#include <asm/tlbflush.h>
 
 extern void die(const char *,struct pt_regs *,long);
 
@@ -104,8 +105,17 @@
 	if (seg & (1<<2)) {
 		/* Must lock the LDT while reading it. */
 		down(&current->mm->context.sem);
+#if 1
+		/* horrible hack for 4/4 disabled kernels.
+		   I'm not quite sure what the TLB flush is good for,
+		   it's mindlessly copied from the read_ldt code */
+		__flush_tlb_global();
+		desc = kmap(current->mm->context.ldt_pages[(seg&~7)/PAGE_SIZE]);
+		desc = (void *)desc + ((seg & ~7) % PAGE_SIZE);
+#else
 		desc = current->mm->context.ldt;
 		desc = (void *)desc + (seg & ~7);
+#endif
 	} else {
 		/* Must disable preemption while reading the GDT. */
 		desc = (u32 *)&cpu_gdt_table[get_cpu()];
@@ -118,6 +128,9 @@
 		 (desc[1] & 0xff000000);
 
 	if (seg & (1<<2)) { 
+#if 1
+		kunmap((void *)((unsigned long)desc & PAGE_MASK));
+#endif
 		up(&current->mm->context.sem);
 	} else
 		put_cpu();
@@ -243,6 +256,19 @@
 	 * (error_code & 4) == 0, and that the fault was not a
 	 * protection error (error_code & 1) == 0.
 	 */
+#ifdef CONFIG_X86_4G
+	/*
+	 * On 4/4 all kernels faults are either bugs, vmalloc or prefetch
+	 */
+	if (unlikely((regs->xcs & 3) == 0)) {
+		if (error_code & 3)
+			goto bad_area_nosemaphore;
+
+		/* If it's vm86 fall through */
+		if (!(regs->eflags & VM_MASK))
+			goto vmalloc_fault;
+	}
+#else
 	if (unlikely(address >= TASK_SIZE)) { 
 		if (!(error_code & 5))
 			goto vmalloc_fault;
@@ -252,6 +278,7 @@
 		 */
 		goto bad_area_nosemaphore;
 	} 
+#endif
 
 	mm = tsk->mm;
 
@@ -403,6 +430,12 @@
  * Oops. The kernel tried to access some bad page. We'll have to
  * terminate things with extreme prejudice.
  */
+#ifdef CONFIG_KGDB
+        if (!user_mode(regs)){
+                kgdb_handle_exception(14,SIGBUS, error_code, regs);
+                return;
+        }
+#endif
 
 	bust_spinlocks(1);
 
--- diff/arch/i386/mm/highmem.c	2003-06-09 14:18:17.000000000 +0100
+++ source/arch/i386/mm/highmem.c	2003-12-29 09:30:38.000000000 +0000
@@ -30,6 +30,7 @@
 	enum fixed_addresses idx;
 	unsigned long vaddr;
 
+	/* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
 	inc_preempt_count();
 	if (page < highmem_start_page)
 		return page_address(page);
@@ -54,6 +55,7 @@
 
 	if (vaddr < FIXADDR_START) { // FIXME
 		dec_preempt_count();
+		preempt_check_resched();
 		return;
 	}
 
@@ -69,6 +71,7 @@
 #endif
 
 	dec_preempt_count();
+	preempt_check_resched();
 }
 
 struct page *kmap_atomic_to_page(void *ptr)
--- diff/arch/i386/mm/hugetlbpage.c	2003-11-25 15:24:57.000000000 +0000
+++ source/arch/i386/mm/hugetlbpage.c	2003-12-29 09:30:38.000000000 +0000
@@ -534,7 +534,7 @@
  * this far.
  */
 static struct page *hugetlb_nopage(struct vm_area_struct *vma,
-				unsigned long address, int unused)
+				unsigned long address, int *unused)
 {
 	BUG();
 	return NULL;
--- diff/arch/i386/mm/init.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/i386/mm/init.c	2003-12-29 09:30:38.000000000 +0000
@@ -26,6 +26,7 @@
 #include <linux/bootmem.h>
 #include <linux/slab.h>
 #include <linux/proc_fs.h>
+#include <linux/efi.h>
 
 #include <asm/processor.h>
 #include <asm/system.h>
@@ -39,125 +40,13 @@
 #include <asm/tlb.h>
 #include <asm/tlbflush.h>
 #include <asm/sections.h>
+#include <asm/desc.h>
 
 DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
 unsigned long highstart_pfn, highend_pfn;
 
 static int do_test_wp_bit(void);
 
-/*
- * Creates a middle page table and puts a pointer to it in the
- * given global directory entry. This only returns the gd entry
- * in non-PAE compilation mode, since the middle layer is folded.
- */
-static pmd_t * __init one_md_table_init(pgd_t *pgd)
-{
-	pmd_t *pmd_table;
-		
-#ifdef CONFIG_X86_PAE
-	pmd_table = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE);
-	set_pgd(pgd, __pgd(__pa(pmd_table) | _PAGE_PRESENT));
-	if (pmd_table != pmd_offset(pgd, 0)) 
-		BUG();
-#else
-	pmd_table = pmd_offset(pgd, 0);
-#endif
-
-	return pmd_table;
-}
-
-/*
- * Create a page table and place a pointer to it in a middle page
- * directory entry.
- */
-static pte_t * __init one_page_table_init(pmd_t *pmd)
-{
-	if (pmd_none(*pmd)) {
-		pte_t *page_table = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
-		set_pmd(pmd, __pmd(__pa(page_table) | _PAGE_TABLE));
-		if (page_table != pte_offset_kernel(pmd, 0))
-			BUG();	
-
-		return page_table;
-	}
-	
-	return pte_offset_kernel(pmd, 0);
-}
-
-/*
- * This function initializes a certain range of kernel virtual memory 
- * with new bootmem page tables, everywhere page tables are missing in
- * the given range.
- */
-
-/*
- * NOTE: The pagetables are allocated contiguous on the physical space 
- * so we can cache the place of the first one and move around without 
- * checking the pgd every time.
- */
-static void __init page_table_range_init (unsigned long start, unsigned long end, pgd_t *pgd_base)
-{
-	pgd_t *pgd;
-	pmd_t *pmd;
-	int pgd_idx, pmd_idx;
-	unsigned long vaddr;
-
-	vaddr = start;
-	pgd_idx = pgd_index(vaddr);
-	pmd_idx = pmd_index(vaddr);
-	pgd = pgd_base + pgd_idx;
-
-	for ( ; (pgd_idx < PTRS_PER_PGD) && (vaddr != end); pgd++, pgd_idx++) {
-		if (pgd_none(*pgd)) 
-			one_md_table_init(pgd);
-
-		pmd = pmd_offset(pgd, vaddr);
-		for (; (pmd_idx < PTRS_PER_PMD) && (vaddr != end); pmd++, pmd_idx++) {
-			if (pmd_none(*pmd)) 
-				one_page_table_init(pmd);
-
-			vaddr += PMD_SIZE;
-		}
-		pmd_idx = 0;
-	}
-}
-
-/*
- * This maps the physical memory to kernel virtual address space, a total 
- * of max_low_pfn pages, by creating page tables starting from address 
- * PAGE_OFFSET.
- */
-static void __init kernel_physical_mapping_init(pgd_t *pgd_base)
-{
-	unsigned long pfn;
-	pgd_t *pgd;
-	pmd_t *pmd;
-	pte_t *pte;
-	int pgd_idx, pmd_idx, pte_ofs;
-
-	pgd_idx = pgd_index(PAGE_OFFSET);
-	pgd = pgd_base + pgd_idx;
-	pfn = 0;
-
-	for (; pgd_idx < PTRS_PER_PGD; pgd++, pgd_idx++) {
-		pmd = one_md_table_init(pgd);
-		if (pfn >= max_low_pfn)
-			continue;
-		for (pmd_idx = 0; pmd_idx < PTRS_PER_PMD && pfn < max_low_pfn; pmd++, pmd_idx++) {
-			/* Map with big pages if possible, otherwise create normal page tables. */
-			if (cpu_has_pse) {
-				set_pmd(pmd, pfn_pmd(pfn, PAGE_KERNEL_LARGE));
-				pfn += PTRS_PER_PTE;
-			} else {
-				pte = one_page_table_init(pmd);
-
-				for (pte_ofs = 0; pte_ofs < PTRS_PER_PTE && pfn < max_low_pfn; pte++, pfn++, pte_ofs++)
-					set_pte(pte, pfn_pte(pfn, PAGE_KERNEL));
-			}
-		}
-	}	
-}
-
 static inline int page_kills_ppro(unsigned long pagenr)
 {
 	if (pagenr >= 0x70000 && pagenr <= 0x7003F)
@@ -165,12 +54,30 @@
 	return 0;
 }
 
+extern int is_available_memory(efi_memory_desc_t *);
+
 static inline int page_is_ram(unsigned long pagenr)
 {
 	int i;
+	unsigned long addr, end;
+
+	if (efi_enabled) {
+		efi_memory_desc_t *md;
+
+		for (i = 0; i < memmap.nr_map; i++) {
+			md = &memmap.map[i];
+			if (!is_available_memory(md))
+				continue;
+			addr = (md->phys_addr+PAGE_SIZE-1) >> PAGE_SHIFT;
+			end = (md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT)) >> PAGE_SHIFT;
+
+			if ((pagenr >= addr) && (pagenr < end))
+				return 1;
+		}
+		return 0;
+	}
 
 	for (i = 0; i < e820.nr_map; i++) {
-		unsigned long addr, end;
 
 		if (e820.map[i].type != E820_RAM)	/* not usable memory */
 			continue;
@@ -187,11 +94,8 @@
 	return 0;
 }
 
-#ifdef CONFIG_HIGHMEM
 pte_t *kmap_pte;
-pgprot_t kmap_prot;
 
-EXPORT_SYMBOL(kmap_prot);
 EXPORT_SYMBOL(kmap_pte);
 
 #define kmap_get_fixmap_pte(vaddr)					\
@@ -199,29 +103,7 @@
 
 void __init kmap_init(void)
 {
-	unsigned long kmap_vstart;
-
-	/* cache the first kmap pte */
-	kmap_vstart = __fix_to_virt(FIX_KMAP_BEGIN);
-	kmap_pte = kmap_get_fixmap_pte(kmap_vstart);
-
-	kmap_prot = PAGE_KERNEL;
-}
-
-void __init permanent_kmaps_init(pgd_t *pgd_base)
-{
-	pgd_t *pgd;
-	pmd_t *pmd;
-	pte_t *pte;
-	unsigned long vaddr;
-
-	vaddr = PKMAP_BASE;
-	page_table_range_init(vaddr, vaddr + PAGE_SIZE*LAST_PKMAP, pgd_base);
-
-	pgd = swapper_pg_dir + pgd_index(vaddr);
-	pmd = pmd_offset(pgd, vaddr);
-	pte = pte_offset_kernel(pmd, vaddr);
-	pkmap_page_table = pte;	
+	kmap_pte = kmap_get_fixmap_pte(__fix_to_virt(FIX_KMAP_BEGIN));
 }
 
 void __init one_highpage_init(struct page *page, int pfn, int bad_ppro)
@@ -236,6 +118,8 @@
 		SetPageReserved(page);
 }
 
+#ifdef CONFIG_HIGHMEM
+
 #ifndef CONFIG_DISCONTIGMEM
 void __init set_highmem_pages_init(int bad_ppro) 
 {
@@ -247,12 +131,9 @@
 #else
 extern void set_highmem_pages_init(int);
 #endif /* !CONFIG_DISCONTIGMEM */
-
 #else
-#define kmap_init() do { } while (0)
-#define permanent_kmaps_init(pgd_base) do { } while (0)
-#define set_highmem_pages_init(bad_ppro) do { } while (0)
-#endif /* CONFIG_HIGHMEM */
+# define set_highmem_pages_init(bad_ppro) do { } while (0)
+#endif
 
 unsigned long __PAGE_KERNEL = _PAGE_KERNEL;
 
@@ -262,30 +143,125 @@
 extern void __init remap_numa_kva(void);
 #endif
 
-static void __init pagetable_init (void)
+static __init void prepare_pagetables(pgd_t *pgd_base, unsigned long address)
+{
+	pgd_t *pgd;
+	pmd_t *pmd;
+	pte_t *pte;
+
+	pgd = pgd_base + pgd_index(address);
+	pmd = pmd_offset(pgd, address);
+	if (!pmd_present(*pmd)) {
+		pte = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
+		set_pmd(pmd, __pmd(_PAGE_TABLE + __pa(pte)));
+	}
+}
+
+static void __init fixrange_init (unsigned long start, unsigned long end, pgd_t *pgd_base)
+{
+	unsigned long vaddr;
+
+	for (vaddr = start; vaddr != end; vaddr += PAGE_SIZE)
+		prepare_pagetables(pgd_base, vaddr);
+}
+
+void setup_identity_mappings(pgd_t *pgd_base, unsigned long start, unsigned long end)
 {
 	unsigned long vaddr;
-	pgd_t *pgd_base = swapper_pg_dir;
+	pgd_t *pgd;
+	int i, j, k;
+	pmd_t *pmd;
+	pte_t *pte, *pte_base;
+
+	pgd = pgd_base;
+
+	for (i = 0; i < PTRS_PER_PGD; pgd++, i++) {
+		vaddr = i*PGDIR_SIZE;
+		if (end && (vaddr >= end))
+			break;
+		pmd = pmd_offset(pgd, 0);
+		for (j = 0; j < PTRS_PER_PMD; pmd++, j++) {
+			vaddr = i*PGDIR_SIZE + j*PMD_SIZE;
+			if (end && (vaddr >= end))
+				break;
+			if (vaddr < start)
+				continue;
+			if (cpu_has_pse) {
+				unsigned long __pe;
+
+				set_in_cr4(X86_CR4_PSE);
+				boot_cpu_data.wp_works_ok = 1;
+				__pe = _KERNPG_TABLE + _PAGE_PSE + vaddr - start;
+				/* Make it "global" too if supported */
+				if (cpu_has_pge) {
+					set_in_cr4(X86_CR4_PGE);
+#if !defined(CONFIG_X86_SWITCH_PAGETABLES)
+					__pe += _PAGE_GLOBAL;
+					__PAGE_KERNEL |= _PAGE_GLOBAL;
+#endif
+				}
+				set_pmd(pmd, __pmd(__pe));
+				continue;
+			}
+			if (!pmd_present(*pmd))
+				pte_base = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
+			else
+				pte_base = (pte_t *) page_address(pmd_page(*pmd));
+			pte = pte_base;
+			for (k = 0; k < PTRS_PER_PTE; pte++, k++) {
+				vaddr = i*PGDIR_SIZE + j*PMD_SIZE + k*PAGE_SIZE;
+				if (end && (vaddr >= end))
+					break;
+				if (vaddr < start)
+					continue;
+				*pte = mk_pte_phys(vaddr-start, PAGE_KERNEL);
+			}
+			set_pmd(pmd, __pmd(_KERNPG_TABLE + __pa(pte_base)));
+		}
+	}
+}
 
+static void __init pagetable_init (void)
+{
+	unsigned long vaddr, end;
+	pgd_t *pgd_base;
 #ifdef CONFIG_X86_PAE
 	int i;
-	/* Init entries of the first-level page table to the zero page */
-	for (i = 0; i < PTRS_PER_PGD; i++)
-		set_pgd(pgd_base + i, __pgd(__pa(empty_zero_page) | _PAGE_PRESENT));
 #endif
 
-	/* Enable PSE if available */
-	if (cpu_has_pse) {
-		set_in_cr4(X86_CR4_PSE);
-	}
+	/*
+	 * This can be zero as well - no problem, in that case we exit
+	 * the loops anyway due to the PTRS_PER_* conditions.
+	 */
+	end = (unsigned long)__va(max_low_pfn*PAGE_SIZE);
 
-	/* Enable PGE if available */
-	if (cpu_has_pge) {
-		set_in_cr4(X86_CR4_PGE);
-		__PAGE_KERNEL |= _PAGE_GLOBAL;
+	pgd_base = swapper_pg_dir;
+#ifdef CONFIG_X86_PAE
+	/*
+	 * It causes too many problems if there's no proper pmd set up
+	 * for all 4 entries of the PGD - so we allocate all of them.
+	 * PAE systems will not miss this extra 4-8K anyway ...
+	 */
+	for (i = 0; i < PTRS_PER_PGD; i++) {
+		pmd_t *pmd = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE);
+		set_pgd(pgd_base + i, __pgd(__pa(pmd) + 0x1));
 	}
+#endif
+	/*
+	 * Set up lowmem-sized identity mappings at PAGE_OFFSET:
+	 */
+	setup_identity_mappings(pgd_base, PAGE_OFFSET, end);
 
-	kernel_physical_mapping_init(pgd_base);
+	/*
+	 * Add flat-mode identity-mappings - SMP needs it when
+	 * starting up on an AP from real-mode. (In the non-PAE
+	 * case we already have these mappings through head.S.)
+	 * All user-space mappings are explicitly cleared after
+	 * SMP startup.
+	 */
+#if CONFIG_SMP && CONFIG_X86_PAE
+	setup_identity_mappings(pgd_base, 0, 16*1024*1024);
+#endif
 	remap_numa_kva();
 
 	/*
@@ -293,38 +269,64 @@
 	 * created - mappings will be set by set_fixmap():
 	 */
 	vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK;
-	page_table_range_init(vaddr, 0, pgd_base);
+	fixrange_init(vaddr, 0, pgd_base);
 
-	permanent_kmaps_init(pgd_base);
+#if CONFIG_HIGHMEM
+	{
+		pgd_t *pgd;
+		pmd_t *pmd;
+		pte_t *pte;
 
-#ifdef CONFIG_X86_PAE
-	/*
-	 * Add low memory identity-mappings - SMP needs it when
-	 * starting up on an AP from real-mode. In the non-PAE
-	 * case we already have these mappings through head.S.
-	 * All user-space mappings are explicitly cleared after
-	 * SMP startup.
-	 */
-	pgd_base[0] = pgd_base[USER_PTRS_PER_PGD];
+		/*
+		 * Permanent kmaps:
+		 */
+		vaddr = PKMAP_BASE;
+		fixrange_init(vaddr, vaddr + PAGE_SIZE*LAST_PKMAP, pgd_base);
+
+		pgd = swapper_pg_dir + pgd_index(vaddr);
+		pmd = pmd_offset(pgd, vaddr);
+		pte = pte_offset_kernel(pmd, vaddr);
+		pkmap_page_table = pte;
+	}
 #endif
 }
 
-void zap_low_mappings (void)
+/*
+ * Clear kernel pagetables in a PMD_SIZE-aligned range.
+ */
+static void clear_mappings(pgd_t *pgd_base, unsigned long start, unsigned long end)
 {
-	int i;
+	unsigned long vaddr;
+	pgd_t *pgd;
+	pmd_t *pmd;
+	int i, j;
+
+	pgd = pgd_base;
+
+	for (i = 0; i < PTRS_PER_PGD; pgd++, i++) {
+		vaddr = i*PGDIR_SIZE;
+		if (end && (vaddr >= end))
+			break;
+		pmd = pmd_offset(pgd, 0);
+		for (j = 0; j < PTRS_PER_PMD; pmd++, j++) {
+			vaddr = i*PGDIR_SIZE + j*PMD_SIZE;
+			if (end && (vaddr >= end))
+				break;
+			if (vaddr < start)
+				continue;
+			pmd_clear(pmd);
+		}
+	}
+	flush_tlb_all();
+}
+
+void __init zap_low_mappings(void)
+{
+	printk("zapping low mappings.\n");
 	/*
 	 * Zap initial low-memory mappings.
-	 *
-	 * Note that "pgd_clear()" doesn't do it for
-	 * us, because pgd_clear() is a no-op on i386.
 	 */
-	for (i = 0; i < USER_PTRS_PER_PGD; i++)
-#ifdef CONFIG_X86_PAE
-		set_pgd(swapper_pg_dir+i, __pgd(1 + __pa(empty_zero_page)));
-#else
-		set_pgd(swapper_pg_dir+i, __pgd(0));
-#endif
-	flush_tlb_all();
+	clear_mappings(swapper_pg_dir, 0, 16*1024*1024);
 }
 
 #ifndef CONFIG_DISCONTIGMEM
@@ -388,12 +390,6 @@
 
 void __init test_wp_bit(void)
 {
-	if (cpu_has_pse) {
-		/* Ok, all PSE-capable CPUs are definitely handling the WP bit right. */
-		boot_cpu_data.wp_works_ok = 1;
-		return;
-	}
-
 	printk("Checking if this processor honours the WP bit even in supervisor mode... ");
 
 	/* Any page-aligned address will do, the test is non-destructive */
@@ -428,6 +424,7 @@
 #endif /* !CONFIG_DISCONTIGMEM */
 
 static struct kcore_list kcore_mem, kcore_vmalloc; 
+extern void fixup_sort_exception_table(void);
 
 void __init mem_init(void)
 {
@@ -436,6 +433,8 @@
 	int tmp;
 	int bad_ppro;
 
+	fixup_sort_exception_table();
+
 #ifndef CONFIG_DISCONTIGMEM
 	if (!mem_map)
 		BUG();
@@ -511,13 +510,18 @@
 #ifndef CONFIG_SMP
 	zap_low_mappings();
 #endif
+	entry_trampoline_setup();
+	default_ldt_page = virt_to_page(default_ldt);
+	load_LDT(&init_mm.context);
 }
 
-kmem_cache_t *pgd_cache;
-kmem_cache_t *pmd_cache;
+kmem_cache_t *pgd_cache, *pmd_cache, *kpmd_cache;
 
 void __init pgtable_cache_init(void)
 {
+	void (*ctor)(void *, kmem_cache_t *, unsigned long);
+	void (*dtor)(void *, kmem_cache_t *, unsigned long);
+
 	if (PTRS_PER_PMD > 1) {
 		pmd_cache = kmem_cache_create("pmd",
 					PTRS_PER_PMD*sizeof(pmd_t),
@@ -527,13 +531,36 @@
 					NULL);
 		if (!pmd_cache)
 			panic("pgtable_cache_init(): cannot create pmd cache");
+
+		if (TASK_SIZE > PAGE_OFFSET) {
+			kpmd_cache = kmem_cache_create("kpmd",
+					PTRS_PER_PMD*sizeof(pmd_t),
+					0,
+					SLAB_HWCACHE_ALIGN | SLAB_MUST_HWCACHE_ALIGN,
+					kpmd_ctor,
+					NULL);
+			if (!kpmd_cache)
+				panic("pgtable_cache_init(): "
+						"cannot create kpmd cache");
+		}
 	}
+
+	if (PTRS_PER_PMD == 1 || TASK_SIZE <= PAGE_OFFSET)
+		ctor = pgd_ctor;
+	else
+		ctor = NULL;
+
+	if (PTRS_PER_PMD == 1 && TASK_SIZE <= PAGE_OFFSET)
+		dtor = pgd_dtor;
+	else
+		dtor = NULL;
+
 	pgd_cache = kmem_cache_create("pgd",
 				PTRS_PER_PGD*sizeof(pgd_t),
 				0,
 				SLAB_HWCACHE_ALIGN | SLAB_MUST_HWCACHE_ALIGN,
-				pgd_ctor,
-				PTRS_PER_PMD == 1 ? pgd_dtor : NULL);
+				ctor,
+				dtor);
 	if (!pgd_cache)
 		panic("pgtable_cache_init(): Cannot create pgd cache");
 }
--- diff/arch/i386/mm/pgtable.c	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/mm/pgtable.c	2003-12-29 09:30:38.000000000 +0000
@@ -21,6 +21,7 @@
 #include <asm/e820.h>
 #include <asm/tlb.h>
 #include <asm/tlbflush.h>
+#include <asm/atomic_kmap.h>
 
 void show_mem(void)
 {
@@ -157,11 +158,20 @@
 	memset(pmd, 0, PTRS_PER_PMD*sizeof(pmd_t));
 }
 
+void kpmd_ctor(void *__pmd, kmem_cache_t *cache, unsigned long flags)
+{
+	pmd_t *kpmd, *pmd;
+	kpmd = pmd_offset(&swapper_pg_dir[PTRS_PER_PGD-1],
+				(PTRS_PER_PMD - NR_SHARED_PMDS)*PMD_SIZE);
+	pmd = (pmd_t *)__pmd + (PTRS_PER_PMD - NR_SHARED_PMDS);
+
+	memset(__pmd, 0, (PTRS_PER_PMD - NR_SHARED_PMDS)*sizeof(pmd_t));
+	memcpy(pmd, kpmd, NR_SHARED_PMDS*sizeof(pmd_t));
+}
+
 /*
- * List of all pgd's needed for non-PAE so it can invalidate entries
- * in both cached and uncached pgd's; not needed for PAE since the
- * kernel pmd is shared. If PAE were not to share the pmd a similar
- * tactic would be needed. This is essentially codepath-based locking
+ * List of all pgd's needed so it can invalidate entries in both cached
+ * and uncached pgd's. This is essentially codepath-based locking
  * against pageattr.c; it is the unique case in which a valid change
  * of kernel pagetables can't be lazily synchronized by vmalloc faults.
  * vmalloc faults work because attached pagetables are never freed.
@@ -170,30 +180,60 @@
  * could be used. The locking scheme was chosen on the basis of
  * manfred's recommendations and having no core impact whatsoever.
  * -- wli
+ *
+ * The entire issue goes away when XKVA is configured.
  */
 spinlock_t pgd_lock = SPIN_LOCK_UNLOCKED;
 LIST_HEAD(pgd_list);
 
-void pgd_ctor(void *pgd, kmem_cache_t *cache, unsigned long unused)
+/*
+ * This is not that hard to figure out.
+ * (a) PTRS_PER_PMD == 1 means non-PAE.
+ * (b) PTRS_PER_PMD > 1 means PAE.
+ * (c) TASK_SIZE > PAGE_OFFSET means XKVA.
+ * (d) TASK_SIZE <= PAGE_OFFSET means non-XKVA.
+ *
+ * Do *NOT* back out the preconstruction like the patch I'm cleaning
+ * up after this very instant did, or at all, for that matter.
+ * This is never called when PTRS_PER_PMD > 1 && TASK_SIZE > PAGE_OFFSET.
+ * -- wli
+ */
+void pgd_ctor(void *__pgd, kmem_cache_t *cache, unsigned long unused)
 {
+	pgd_t *pgd = (pgd_t *)__pgd;
 	unsigned long flags;
 
-	if (PTRS_PER_PMD == 1)
-		spin_lock_irqsave(&pgd_lock, flags);
+	if (PTRS_PER_PMD == 1) {
+		if (TASK_SIZE <= PAGE_OFFSET)
+			spin_lock_irqsave(&pgd_lock, flags);
+		else
+ 			memcpy(&pgd[PTRS_PER_PGD - NR_SHARED_PMDS],
+ 				&swapper_pg_dir[PTRS_PER_PGD - NR_SHARED_PMDS],
+ 				NR_SHARED_PMDS * sizeof(pgd_t));
+	}
 
-	memcpy((pgd_t *)pgd + USER_PTRS_PER_PGD,
-			swapper_pg_dir + USER_PTRS_PER_PGD,
-			(PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
+	if (TASK_SIZE <= PAGE_OFFSET)
+ 		memcpy(pgd + USER_PTRS_PER_PGD,
+ 			swapper_pg_dir + USER_PTRS_PER_PGD,
+ 			(PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
 
 	if (PTRS_PER_PMD > 1)
 		return;
 
-	list_add(&virt_to_page(pgd)->lru, &pgd_list);
-	spin_unlock_irqrestore(&pgd_lock, flags);
-	memset(pgd, 0, USER_PTRS_PER_PGD*sizeof(pgd_t));
+	if (TASK_SIZE > PAGE_OFFSET)
+		memset(pgd, 0, (PTRS_PER_PGD - NR_SHARED_PMDS)*sizeof(pgd_t));
+	else {
+		list_add(&virt_to_page(pgd)->lru, &pgd_list);
+		spin_unlock_irqrestore(&pgd_lock, flags);
+		memset(pgd, 0, USER_PTRS_PER_PGD*sizeof(pgd_t));
+	}
 }
 
-/* never called when PTRS_PER_PMD > 1 */
+/*
+ * Never called when PTRS_PER_PMD > 1 || TASK_SIZE > PAGE_OFFSET
+ * for with PAE we would list_del() multiple times, and for non-PAE
+ * with XKVA all the AGP pgd shootdown code is unnecessary.
+ */
 void pgd_dtor(void *pgd, kmem_cache_t *cache, unsigned long unused)
 {
 	unsigned long flags; /* can be called from interrupt context */
@@ -203,6 +243,12 @@
 	spin_unlock_irqrestore(&pgd_lock, flags);
 }
 
+/*
+ * See the comments above pgd_ctor() wrt. preconstruction.
+ * Do *NOT* memcpy() here. If you do, you back out important
+ * anti- cache pollution code.
+ *
+ */
 pgd_t *pgd_alloc(struct mm_struct *mm)
 {
 	int i;
@@ -211,15 +257,33 @@
 	if (PTRS_PER_PMD == 1 || !pgd)
 		return pgd;
 
+	/*
+	 * In the 4G userspace case alias the top 16 MB virtual
+	 * memory range into the user mappings as well (these
+	 * include the trampoline and CPU data structures).
+	 */
 	for (i = 0; i < USER_PTRS_PER_PGD; ++i) {
-		pmd_t *pmd = kmem_cache_alloc(pmd_cache, GFP_KERNEL);
+		kmem_cache_t *cache;
+		pmd_t *pmd;
+
+		if (TASK_SIZE > PAGE_OFFSET && i == USER_PTRS_PER_PGD - 1)
+			cache = kpmd_cache;
+		else
+			cache = pmd_cache;
+
+		pmd = kmem_cache_alloc(cache, GFP_KERNEL);
 		if (!pmd)
 			goto out_oom;
 		set_pgd(&pgd[i], __pgd(1 + __pa((u64)((u32)pmd))));
 	}
-	return pgd;
 
+	return pgd;
 out_oom:
+	/*
+	 * we don't have to handle the kpmd_cache here, since it's the
+	 * last allocation, and has either nothing to free or when it
+	 * succeeds the whole operation succeeds.
+	 */
 	for (i--; i >= 0; i--)
 		kmem_cache_free(pmd_cache, (void *)__va(pgd_val(pgd[i])-1));
 	kmem_cache_free(pgd_cache, pgd);
@@ -230,10 +294,29 @@
 {
 	int i;
 
-	/* in the PAE case user pgd entries are overwritten before usage */
-	if (PTRS_PER_PMD > 1)
-		for (i = 0; i < USER_PTRS_PER_PGD; ++i)
-			kmem_cache_free(pmd_cache, (void *)__va(pgd_val(pgd[i])-1));
 	/* in the non-PAE case, clear_page_tables() clears user pgd entries */
+	if (PTRS_PER_PMD == 1)
+		goto out_free;
+
+	/* in the PAE case user pgd entries are overwritten before usage */
+	for (i = 0; i < USER_PTRS_PER_PGD; ++i) {
+		kmem_cache_t *cache;
+		pmd_t *pmd = __va(pgd_val(pgd[i]) - 1);
+
+		/*
+		 * only userspace pmd's are cleared for us
+		 * by mm/memory.c; it's a slab cache invariant
+		 * that we must separate the kernel pmd slab
+		 * all times, else we'll have bad pmd's.
+		 */
+		if (TASK_SIZE > PAGE_OFFSET && i == USER_PTRS_PER_PGD - 1)
+			cache = kpmd_cache;
+		else
+			cache = pmd_cache;
+
+		kmem_cache_free(cache, pmd);
+	}
+out_free:
 	kmem_cache_free(pgd_cache, pgd);
 }
+
--- diff/arch/i386/pci/acpi.c	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/pci/acpi.c	2003-12-29 09:30:38.000000000 +0000
@@ -18,7 +18,7 @@
 	if (pcibios_scanned)
 		return 0;
 
-	if (!(pci_probe & PCI_NO_ACPI_ROUTING)) {
+	if (!acpi_noirq) {
 		if (!acpi_pci_irq_init()) {
 			printk(KERN_INFO "PCI: Using ACPI for IRQ routing\n");
 			printk(KERN_INFO "PCI: if you experience problems, try using option 'pci=noacpi' or even 'acpi=off'\n");
@@ -31,15 +31,4 @@
 
 	return 0;
 }
-
-/*
- * pci_disable_acpi()
- * act like pci=noacpi seen on command line
- * called by DMI blacklist code
- */
-__init void pci_disable_acpi(void)
-{
-        pci_probe |= PCI_NO_ACPI_ROUTING;
-}
-
 subsys_initcall(pci_acpi_init);
--- diff/arch/i386/pci/common.c	2003-09-17 12:28:01.000000000 +0100
+++ source/arch/i386/pci/common.c	2003-12-29 09:30:38.000000000 +0000
@@ -9,6 +9,7 @@
 #include <linux/ioport.h>
 #include <linux/init.h>
 
+#include <asm/acpi.h>
 #include <asm/segment.h>
 #include <asm/io.h>
 #include <asm/smp.h>
@@ -197,12 +198,10 @@
 		return NULL;
 	}
 #endif
-#ifdef CONFIG_ACPI_PCI
 	else if (!strcmp(str, "noacpi")) {
-		pci_probe |= PCI_NO_ACPI_ROUTING;
+		acpi_noirq_set();
 		return NULL;
 	}
-#endif
 #ifndef CONFIG_X86_VISWS
 	else if (!strcmp(str, "usepirqmask")) {
 		pci_probe |= PCI_USE_PIRQ_MASK;
--- diff/arch/i386/pci/fixup.c	2003-08-20 14:16:24.000000000 +0100
+++ source/arch/i386/pci/fixup.c	2003-12-29 09:30:38.000000000 +0000
@@ -6,27 +6,52 @@
 #include <linux/init.h>
 #include "pci.h"
 
+static void __devinit i450nx_scan_bus(struct pci_bus *parent, u8 busnr)
+{
+	struct list_head *tmp;
+
+	pci_scan_bus(busnr, &pci_root_ops, NULL);
+
+	list_for_each(tmp, &parent->children) {
+		u8 childnr;
+		struct pci_dev *dev = pci_dev_b(tmp);
+
+		if (dev->hdr_type != PCI_HEADER_TYPE_BRIDGE)
+			continue;
+		pci_read_config_byte(dev, PCI_PRIMARY_BUS, &childnr);
+		if (childnr != busnr)
+			continue;
+
+		printk(KERN_WARNING "PCI: Removing fake PCI bridge %s\n",
+				pci_name(dev));
+		pci_remove_bus_device(dev);
+		break;
+	}
+}
 
 static void __devinit pci_fixup_i450nx(struct pci_dev *d)
 {
 	/*
 	 * i450NX -- Find and scan all secondary buses on all PXB's.
+	 * Some manufacturers added fake PCI-PCI bridges that also point
+	 * to the peer busses.  Look for them and delete them.
 	 */
 	int pxb, reg;
 	u8 busno, suba, subb;
 
-	printk(KERN_WARNING "PCI: Searching for i450NX host bridges on %s\n", pci_name(d));
+	printk(KERN_NOTICE "PCI: Searching for i450NX host bridges on %s\n", pci_name(d));
 	reg = 0xd0;
-	for(pxb=0; pxb<2; pxb++) {
+	for (pxb = 0; pxb < 2; pxb++) {
 		pci_read_config_byte(d, reg++, &busno);
 		pci_read_config_byte(d, reg++, &suba);
 		pci_read_config_byte(d, reg++, &subb);
 		DBG("i450NX PXB %d: %02x/%02x/%02x\n", pxb, busno, suba, subb);
 		if (busno)
-			pci_scan_bus(busno, &pci_root_ops, NULL);	/* Bus A */
+			i450nx_scan_bus(d->bus, busno);		/* Bus A */
 		if (suba < subb)
-			pci_scan_bus(suba+1, &pci_root_ops, NULL);	/* Bus B */
+			i450nx_scan_bus(d->bus, suba+1);	/* Bus B */
 	}
+
 	pcibios_last_bus = -1;
 }
 
@@ -187,6 +212,22 @@
 		dev->transparent = 1;
 }
 
+/*
+ * Halt Disconnect and Stop Grant Disconnect (bit 4 at offset 0x6F)
+ * must be disabled when APIC is used (or lockups will happen).
+ */
+static void __devinit pci_fixup_nforce2_disconnect(struct pci_dev *d)
+{
+	u8 t;
+
+	pci_read_config_byte(d, 0x6F, &t);
+	if (t & 0x10) {
+		printk(KERN_INFO "PCI: disabling nForce2 Halt Disconnect"
+				 " and Stop Grant Disconnect\n");
+		pci_write_config_byte(d, 0x6F, (t & 0xef));
+	}
+}
+
 struct pci_fixup pcibios_fixups[] = {
 	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82451NX,	pci_fixup_i450nx },
 	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82454GX,	pci_fixup_i450gx },
@@ -205,5 +246,6 @@
 	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8367_0,	pci_fixup_via_northbridge_bug },
 	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_NCR,	PCI_DEVICE_ID_NCR_53C810,	pci_fixup_ncr53c810 },
 	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_INTEL,	PCI_ANY_ID,			pci_fixup_transparent_bridge },
+	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_NVIDIA,	PCI_DEVICE_ID_NVIDIA_NFORCE2,	pci_fixup_nforce2_disconnect },
 	{ 0 }
 };
--- diff/arch/i386/pci/irq.c	2003-11-25 15:24:57.000000000 +0000
+++ source/arch/i386/pci/irq.c	2003-12-29 09:30:38.000000000 +0000
@@ -455,7 +455,10 @@
 #if 0 /* Let's see what chip this is supposed to be ... */
 	/* We must not touch 440GX even if we have tables. 440GX has
 	   different IRQ routing weirdness */
-	if (pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82440GX, NULL))
+	if (	pci_find_device(PCI_VENDOR_ID_INTEL,
+				PCI_DEVICE_ID_INTEL_82443GX_0, NULL) ||
+		pci_find_device(PCI_VENDOR_ID_INTEL,
+				PCI_DEVICE_ID_INTEL_82443GX_2, NULL))
 		return 0;
 #endif
 
@@ -695,9 +698,10 @@
 	return NULL;
 }
 
-static irqreturn_t pcibios_test_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t
+pcibios_test_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
 {
-	return IRQ_NONE;
+	return IRQ_HANDLED;
 }
 
 static int pcibios_lookup_irq(struct pci_dev *dev, int assign)
@@ -813,8 +817,10 @@
 		    	if ( dev2->irq && dev2->irq != irq && \
 			(!(pci_probe & PCI_USE_PIRQ_MASK) || \
 			((1 << dev2->irq) & mask)) ) {
+#ifndef CONFIG_PCI_USE_VECTOR
 		    		printk(KERN_INFO "IRQ routing conflict for %s, have irq %d, want irq %d\n",
 				       pci_name(dev2), dev2->irq, irq);
+#endif
 		    		continue;
 		    	}
 			dev2->irq = irq;
@@ -878,6 +884,10 @@
 							bridge->bus->number, PCI_SLOT(bridge->devfn), pin, irq);
 				}
 				if (irq >= 0) {
+					if (use_pci_vector() &&
+						!platform_legacy_irq(irq))
+						irq = IO_APIC_VECTOR(irq);
+
 					printk(KERN_INFO "PCI->APIC IRQ transform: (B%d,I%d,P%d) -> %d\n",
 						dev->bus->number, PCI_SLOT(dev->devfn), pin, irq);
 					dev->irq = irq;
--- diff/arch/i386/pci/pci.h	2003-06-30 10:07:32.000000000 +0100
+++ source/arch/i386/pci/pci.h	2003-12-29 09:30:38.000000000 +0000
@@ -22,7 +22,6 @@
 #define PCI_ASSIGN_ROMS		0x1000
 #define PCI_BIOS_IRQ_SCAN	0x2000
 #define PCI_ASSIGN_ALL_BUSSES	0x4000
-#define PCI_NO_ACPI_ROUTING	0x8000
 
 extern unsigned int pci_probe;
 
--- diff/arch/ia64/Kconfig	2003-10-27 09:20:36.000000000 +0000
+++ source/arch/ia64/Kconfig	2003-12-29 09:30:38.000000000 +0000
@@ -164,11 +164,6 @@
 	  The ACPI Sourceforge project may also be of interest:
 	  <http://sf.net/projects/acpi/>
 
-config ACPI_EFI
-	bool
-	depends on !IA64_HP_SIM
-	default y
-
 config ACPI_INTERPRETER
 	bool
 	depends on !IA64_HP_SIM
@@ -404,6 +399,11 @@
 	  To use this option, you have to ensure that the "/proc file system
 	  support" (CONFIG_PROC_FS) is enabled, too.
 
+config EFI
+	bool
+	depends on !IA64_HP_SIM
+	default y
+
 config EFI_VARS
 	tristate "/proc/efi/vars support"
 	help
@@ -670,6 +670,13 @@
 	  Say Y here only if you plan to use gdb to debug the kernel.
 	  If you don't debug the kernel, you can say N.
 	  
+config LOCKMETER
+       bool "Kernel lock metering"
+       depends on SMP
+       help
+         Say Y to enable kernel lock metering, which adds overhead to SMP locks,
+         but allows you to see various statistics using the lockstat command.
+
 endmenu
 
 source "security/Kconfig"
--- diff/arch/ia64/defconfig	2003-07-08 09:55:17.000000000 +0100
+++ source/arch/ia64/defconfig	2003-12-29 09:30:38.000000000 +0000
@@ -48,7 +48,6 @@
 CONFIG_IA64_PAGE_SIZE_16KB=y
 # CONFIG_IA64_PAGE_SIZE_64KB is not set
 CONFIG_ACPI=y
-CONFIG_ACPI_EFI=y
 CONFIG_ACPI_INTERPRETER=y
 CONFIG_ACPI_KERNEL_CONFIG=y
 CONFIG_IA64_L1_CACHE_SHIFT=7
@@ -76,6 +75,7 @@
 CONFIG_COMPAT=y
 CONFIG_PERFMON=y
 CONFIG_IA64_PALINFO=y
+CONFIG_EFI=y
 CONFIG_EFI_VARS=y
 CONFIG_NR_CPUS=16
 CONFIG_BINFMT_ELF=y
--- diff/arch/ia64/ia32/binfmt_elf32.c	2003-10-27 09:20:43.000000000 +0000
+++ source/arch/ia64/ia32/binfmt_elf32.c	2003-12-29 09:30:38.000000000 +0000
@@ -60,10 +60,12 @@
 extern unsigned long *ia32_gdt;
 
 struct page *
-ia32_install_shared_page (struct vm_area_struct *vma, unsigned long address, int no_share)
+ia32_install_shared_page (struct vm_area_struct *vma, unsigned long address, int *type)
 {
 	struct page *pg = ia32_shared_page[smp_processor_id()];
 	get_page(pg);
+	if (type)
+		*type = VM_FAULT_MINOR;
 	return pg;
 }
 
--- diff/arch/ia64/kernel/irq.c	2003-11-25 15:24:57.000000000 +0000
+++ source/arch/ia64/kernel/irq.c	2003-12-29 09:30:38.000000000 +0000
@@ -160,18 +160,20 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i, j;
+	int j, i = *(loff_t *) v;
 	struct irqaction * action;
 	irq_desc_t *idesc;
 	unsigned long flags;
 
-	seq_puts(p, "           ");
-	for (j=0; j<NR_CPUS; j++)
-		if (cpu_online(j))
-			seq_printf(p, "CPU%d       ",j);
-	seq_putc(p, '\n');
+	if (i == 0) {
+		seq_puts(p, "           ");
+		for (j=0; j<NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "CPU%d       ",j);
+		seq_putc(p, '\n');
+	}
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		idesc = irq_descp(i);
 		spin_lock_irqsave(&idesc->lock, flags);
 		action = idesc->action;
@@ -194,25 +196,26 @@
 		seq_putc(p, '\n');
 skip:
 		spin_unlock_irqrestore(&idesc->lock, flags);
-	}
-	seq_puts(p, "NMI: ");
-	for (j = 0; j < NR_CPUS; j++)
-		if (cpu_online(j))
-			seq_printf(p, "%10u ", nmi_count(j));
-	seq_putc(p, '\n');
+	} else if (i == NR_IRQS) {
+		seq_puts(p, "NMI: ");
+		for (j = 0; j < NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "%10u ", nmi_count(j));
+		seq_putc(p, '\n');
 #ifdef CONFIG_X86_LOCAL_APIC
-	seq_puts(p, "LOC: ");
-	for (j = 0; j < NR_CPUS; j++)
-		if (cpu_online(j))
-			seq_printf(p, "%10u ", irq_stat[j].apic_timer_irqs);
-	seq_putc(p, '\n');
+		seq_puts(p, "LOC: ");
+		for (j = 0; j < NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "%10u ", irq_stat[j].apic_timer_irqs);
+		seq_putc(p, '\n');
 #endif
-	seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
+		seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
 #ifdef CONFIG_X86_IO_APIC
 #ifdef APIC_MISMATCH_DEBUG
-	seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
+		seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
 #endif
 #endif
+	}
 	return 0;
 }
 
@@ -910,47 +913,6 @@
 static struct proc_dir_entry * root_irq_dir;
 static struct proc_dir_entry * irq_dir [NR_IRQS];
 
-#define HEX_DIGITS (2*sizeof(cpumask_t))
-
-static unsigned int parse_hex_value(const char *buffer,
-		unsigned long count, cpumask_t *ret)
-{
-	unsigned char hexnum[HEX_DIGITS];
-	cpumask_t value = CPU_MASK_NONE;
-	unsigned long i;
-
-	if (!count)
-		return -EINVAL;
-	if (count > HEX_DIGITS)
-		count = HEX_DIGITS;
-	if (copy_from_user(hexnum, buffer, count))
-		return -EFAULT;
-
-	/*
-	 * Parse the first 8 characters as a hex string, any non-hex char
-	 * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
-	 */
-	for (i = 0; i < count; i++) {
-		unsigned int c = hexnum[i];
-		int k;
-
-		switch (c) {
-			case '0' ... '9': c -= '0'; break;
-			case 'a' ... 'f': c -= 'a'-10; break;
-			case 'A' ... 'F': c -= 'A'-10; break;
-		default:
-			goto out;
-		}
-		cpus_shift_left(value, value, 4);
-		for (k = 0; k < 4; ++k)
-			if (test_bit(k, (unsigned long *)&c))
-				cpu_set(k, value);
-	}
-out:
-	*ret = value;
-	return 0;
-}
-
 #ifdef CONFIG_SMP
 
 static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
@@ -974,20 +936,10 @@
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int k, len;
-	cpumask_t tmp = irq_affinity[(long)data];
-
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
+	if (count - len < 2)
 		return -EINVAL;
-
-	len = 0;
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-	len += sprintf(page, "\n");
+	len += sprintf(page + len, "\n");
 	return len;
 }
 
@@ -1011,7 +963,7 @@
 	} else
 		redir = 0;
 
-	err = parse_hex_value(buf, count, &new_value);
+	err = cpumask_parse(buf, count - (buf-buffer), new_value);
 	if (err)
 		return err;
 
@@ -1033,19 +985,10 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	cpumask_t *mask = (cpumask_t *)data;
-	int k, len = 0;
-
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
+	if (count - len < 2)
 		return -EINVAL;
-
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(*mask));
-		len += j;
-		page += j;
-		cpus_shift_right(*mask, *mask, 16);
-	}
-	len += sprintf(page, "\n");
+	len += sprintf(page + len, "\n");
 	return len;
 }
 
@@ -1056,7 +999,7 @@
 	unsigned long full_count = count, err;
 	cpumask_t new_value;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 	if (err)
 		return err;
 
--- diff/arch/ia64/kernel/perfmon.c	2003-11-25 15:24:57.000000000 +0000
+++ source/arch/ia64/kernel/perfmon.c	2003-12-29 09:30:39.000000000 +0000
@@ -2157,6 +2157,7 @@
 
 	d_add(file->f_dentry, inode);
 	file->f_vfsmnt = mntget(pfmfs_mnt);
+	file->f_mapping = inode->i_mapping;
 
 	file->f_op    = &pfm_file_ops;
 	file->f_mode  = FMODE_READ;
--- diff/arch/ia64/kernel/setup.c	2003-10-27 09:20:43.000000000 +0000
+++ source/arch/ia64/kernel/setup.c	2003-12-29 09:30:39.000000000 +0000
@@ -54,6 +54,10 @@
 # error "struct cpuinfo_ia64 too big!"
 #endif
 
+#ifdef CONFIG_EFI
+int efi_enabled = 1;
+#endif
+
 #ifdef CONFIG_SMP
 unsigned long __per_cpu_offset[NR_CPUS];
 #endif
--- diff/arch/ia64/mm/hugetlbpage.c	2003-10-27 09:20:36.000000000 +0000
+++ source/arch/ia64/mm/hugetlbpage.c	2003-12-29 09:30:39.000000000 +0000
@@ -518,7 +518,7 @@
 	return 1;
 }
 
-static struct page *hugetlb_nopage(struct vm_area_struct * area, unsigned long address, int unused)
+static struct page *hugetlb_nopage(struct vm_area_struct * area, unsigned long address, int *unused)
 {
 	BUG();
 	return NULL;
--- diff/arch/m68k/kernel/ints.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/m68k/kernel/ints.c	2003-12-29 09:30:39.000000000 +0000
@@ -253,19 +253,18 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 
 	/* autovector interrupts */
 	if (mach_default_handler) {
-		for (i = 0; i < SYS_IRQS; i++) {
+		if (i < SYS_IRQS) {
 			seq_printf(p, "auto %2d: %10u ", i,
 			               i ? kstat_cpu(0).irqs[i] : num_spurious);
 			seq_puts(p, "  ");
 			seq_printf(p, "%s\n", irq_list[i].devname);
 		}
-	}
-
-	mach_get_irq_list(p, v);
+	} else if (i == SYS_IRQS)
+		mach_get_irq_list(p, v);
 	return 0;
 }
 
--- diff/arch/m68knommu/platform/5307/ints.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/m68knommu/platform/5307/ints.c	2003-12-29 09:30:39.000000000 +0000
@@ -254,9 +254,9 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 
-	for (i = 0; i < NR_IRQS; i++) {
+	if (i < NR_IRQS) {
 		if (irq_list[i].flags & IRQ_FLG_STD)
 			continue;
 
@@ -269,7 +269,7 @@
 		seq_printf(p, "%s\n", irq_list[i].devname);
 	}
 
-	if (mach_get_irq_list)
+	if (i == NR_IRQS && mach_get_irq_list)
 		mach_get_irq_list(p, v);
 	return(0);
 }
--- diff/arch/m68knommu/platform/68328/ints.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/m68knommu/platform/68328/ints.c	2003-12-29 09:30:39.000000000 +0000
@@ -198,9 +198,9 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 
-	for (i = 0; i < NR_IRQS; i++) {
+	if (i < NR_IRQS) {
 		if (int_irq_list[i].flags & IRQ_FLG_STD)
 			continue;
 
@@ -211,7 +211,8 @@
 			seq_printf(p, "  ");
 		seq_printf(p, "%s\n", int_irq_list[i].devname);
 	}
-	seq_printf(p, "   : %10u   spurious\n", num_spurious);
+	if (i == NR_IRQS)
+		seq_printf(p, "   : %10u   spurious\n", num_spurious);
 
 	return 0;
 }
--- diff/arch/m68knommu/platform/68360/ints.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/m68knommu/platform/68360/ints.c	2003-12-29 09:30:39.000000000 +0000
@@ -278,9 +278,9 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 
-	for (i = 0; i < NR_IRQS; i++) {
+	if (i < NR_IRQS) {
 		if (int_irq_list[i].flags & IRQ_FLG_STD)
 			continue;
 
@@ -291,7 +291,8 @@
 			seq_printf(p, "  ");
 		seq_printf(p, "%s\n", int_irq_list[i].devname);
 	}
-	seq_printf(p, "   : %10u   spurious\n", num_spurious);
+	if (i == NR_IRQS)
+		seq_printf(p, "   : %10u   spurious\n", num_spurious);
 
 	return 0;
 }
--- diff/arch/mips/kernel/irq.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/mips/kernel/irq.c	2003-12-29 09:30:39.000000000 +0000
@@ -85,17 +85,19 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i, j;
+	int i = *(loff_t *) v, j;
 	struct irqaction * action;
 	unsigned long flags;
 
-	seq_printf(p, "           ");
-	for (j=0; j<NR_CPUS; j++)
-		if (cpu_online(j))
-			seq_printf(p, "CPU%d       ",j);
-	seq_putc(p, '\n');
+	if (i == 0) {
+		seq_printf(p, "           ");
+		for (j=0; j<NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "CPU%d       ",j);
+		seq_putc(p, '\n');
+	}
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		spin_lock_irqsave(&irq_desc[i].lock, flags);
 		action = irq_desc[i].action;
 		if (!action) 
@@ -117,10 +119,10 @@
 		seq_putc(p, '\n');
 skip:
 		spin_unlock_irqrestore(&irq_desc[i].lock, flags);
+	} else if (i == NR_IRQS) {
+		seq_putc(p, '\n');
+		seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
 	}
-	seq_putc(p, '\n');
-	seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
-
 	return 0;
 }
 
@@ -825,45 +827,6 @@
 static struct proc_dir_entry * root_irq_dir;
 static struct proc_dir_entry * irq_dir [NR_IRQS];
 
-#define HEX_DIGITS 8
-
-static unsigned int parse_hex_value (const char *buffer,
-		unsigned long count, unsigned long *ret)
-{
-	unsigned char hexnum [HEX_DIGITS];
-	unsigned long value;
-	int i;
-
-	if (!count)
-		return -EINVAL;
-	if (count > HEX_DIGITS)
-		count = HEX_DIGITS;
-	if (copy_from_user(hexnum, buffer, count))
-		return -EFAULT;
-
-	/*
-	 * Parse the first 8 characters as a hex string, any non-hex char
-	 * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
-	 */
-	value = 0;
-
-	for (i = 0; i < count; i++) {
-		unsigned int c = hexnum[i];
-
-		switch (c) {
-			case '0' ... '9': c -= '0'; break;
-			case 'a' ... 'f': c -= 'a'-10; break;
-			case 'A' ... 'F': c -= 'A'-10; break;
-		default:
-			goto out;
-		}
-		value = (value << 4) | c;
-	}
-out:
-	*ret = value;
-	return 0;
-}
-
 #ifdef CONFIG_SMP
 
 static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
@@ -872,18 +835,10 @@
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int len, k;
-	cpumask_t tmp = irq_affinity[(long)data];
-
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
+	if (count - len < 2)
 		return -EINVAL;
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-	len += sprintf(page, "\n");
+	len += sprintf(page + len, "\n");
 	return len;
 }
 
@@ -896,7 +851,7 @@
 	if (!irq_desc[irq].handler->set_affinity)
 		return -EIO;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 
 	/*
 	 * Do not allow disabling IRQs completely - it's a too easy
@@ -918,20 +873,10 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int len, k;
-	cpumask_t *mask = (cpumask_t *)data, tmp;
-
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
+	if (count - len < 2)
 		return -EINVAL;
-	tmp = *mask;
-
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-	len += sprintf(page, "\n");
+	len += sprintf(page + len, "\n");
 	return len;
 }
 
@@ -941,7 +886,7 @@
 	cpumask_t *mask = (cpumask_t *)data, new_value;
 	unsigned long full_count = count, err;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 	if (err)
 		return err;
 
--- diff/arch/mips/mm/highmem.c	2003-07-08 09:55:17.000000000 +0100
+++ source/arch/mips/mm/highmem.c	2003-12-29 09:30:39.000000000 +0000
@@ -40,6 +40,7 @@
 	enum fixed_addresses idx;
 	unsigned long vaddr;
 
+	/* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
 	inc_preempt_count();
 	if (page < highmem_start_page)
 		return page_address(page);
@@ -64,6 +65,7 @@
 
 	if (vaddr < FIXADDR_START) { // FIXME
 		dec_preempt_count();
+		preempt_check_resched();
 		return;
 	}
 
@@ -79,6 +81,7 @@
 #endif
 
 	dec_preempt_count();
+	preempt_check_resched();
 }
 
 struct page *kmap_atomic_to_page(void *ptr)
--- diff/arch/parisc/kernel/irq.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/parisc/kernel/irq.c	2003-12-29 09:30:39.000000000 +0000
@@ -215,29 +215,30 @@
 int show_interrupts(struct seq_file *p, void *v)
 {
 #ifdef CONFIG_PROC_FS
-	unsigned int regnr = 0;
+	unsigned int regnr = *(loff_t *) v, i;
 
-	seq_puts(p, "     ");
+	if (regnr == 0) {
+		seq_puts(p, "     ");
 #ifdef CONFIG_SMP
-	for (regnr = 0; regnr < NR_CPUS; regnr++)
+		for (i = 0; i < NR_CPUS; i++)
 #endif
-		seq_printf(p, "      CPU%02d ", regnr);
+			seq_printf(p, "      CPU%02d ", i);
 
 #ifdef PARISC_IRQ_CR16_COUNTS
-	seq_printf(p, "[min/avg/max] (CPU cycle counts)");
+		seq_printf(p, "[min/avg/max] (CPU cycle counts)");
 #endif
-	seq_putc(p, '\n');
+		seq_putc(p, '\n');
+	}
 
 	/* We don't need *irqsave lock variants since this is
 	** only allowed to change while in the base context.
 	*/
 	spin_lock(&irq_lock);
-	for (regnr = 0; regnr < NR_IRQ_REGS; regnr++) {
-	    unsigned int i;
+	if (regnr < NR_IRQ_REGS) {
 	    struct irq_region *region = irq_region[regnr];
 
             if (!region || !region->action)
-		continue;
+		    goto skip;
 
 	    for (i = 0; i <= MAX_CPU_IRQ; i++) {
 		struct irqaction *action = &region->action[i];
@@ -286,9 +287,9 @@
 		seq_putc(p, '\n');
 	    }
 	}
+  skip:
 	spin_unlock(&irq_lock);
 
-	seq_putc(p, '\n');
 #endif	/* CONFIG_PROC_FS */
 	return 0;
 }
--- diff/arch/parisc/kernel/sys_parisc.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/parisc/kernel/sys_parisc.c	2003-12-29 09:30:39.000000000 +0000
@@ -93,17 +93,13 @@
 unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,
 		unsigned long len, unsigned long pgoff, unsigned long flags)
 {
-	struct inode *inode;
-
 	if (len > TASK_SIZE)
 		return -ENOMEM;
 	if (!addr)
 		addr = TASK_UNMAPPED_BASE;
 
-	inode = filp ? filp->f_dentry->d_inode : NULL;
-
-	if (inode && (flags & MAP_SHARED)) {
-		addr = get_shared_area(inode->i_mapping, addr, len, pgoff);
+	if (filp && (flags & MAP_SHARED)) {
+		addr = get_shared_area(filp->f_mapping, addr, len, pgoff);
 	} else {
 		addr = get_unshared_area(addr, len);
 	}
--- diff/arch/ppc/boot/ld.script	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/ppc/boot/ld.script	2003-12-29 09:30:39.000000000 +0000
@@ -82,6 +82,7 @@
     *(__ksymtab)
     *(__ksymtab_strings)
     *(__bug_table)
+    *(__kcrctab)
   }
 
 }
--- diff/arch/ppc/boot/simple/Makefile	2003-09-30 15:46:12.000000000 +0100
+++ source/arch/ppc/boot/simple/Makefile	2003-12-29 09:30:39.000000000 +0000
@@ -73,9 +73,8 @@
    cacheflag-$(CONFIG_K2)		:= -include $(clear_L2_L3)
 
 # kconfig 'feature', only one of these will ever be 'y' at a time.
-# The rest will be unset.
-motorola := $(CONFIG_MCPN765)$(CONFIG_MVME5100)$(CONFIG_PRPMC750) \
-$(CONFIG_PRPMC800)$(CONFIG_LOPEC)$(CONFIG_PPLUS)
+# The rest will be unset.  Each of these must be on one line.
+motorola := $(CONFIG_MCPN765)$(CONFIG_MVME5100)$(CONFIG_PRPMC750)$(CONFIG_PRPMC800)$(CONFIG_LOPEC)$(CONFIG_PPLUS)
 pcore := $(CONFIG_PCORE)$(CONFIG_POWERPMC250)
 
       zimage-$(motorola)		:= zImage-PPLUS
--- diff/arch/ppc/kernel/irq.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/ppc/kernel/irq.c	2003-12-29 09:30:39.000000000 +0000
@@ -346,17 +346,19 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i, j;
+	int i = *(loff_t *) v, j;
 	struct irqaction * action;
 	unsigned long flags;
 
-	seq_puts(p, "           ");
-	for (j=0; j<NR_CPUS; j++)
-		if (cpu_online(j))
-			seq_printf(p, "CPU%d       ", j);
-	seq_putc(p, '\n');
+	if (i == 0) {
+		seq_puts(p, "           ");
+		for (j=0; j<NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "CPU%d       ", j);
+		seq_putc(p, '\n');
+	}
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		spin_lock_irqsave(&irq_desc[i].lock, flags);
 		action = irq_desc[i].action;
 		if ( !action || !action->handler )
@@ -381,22 +383,23 @@
 		seq_putc(p, '\n');
 skip:
 		spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-	}
+	} else if (i == NR_IRQS) {
 #ifdef CONFIG_TAU_INT
-	if (tau_initialized){
-		seq_puts(p, "TAU: ");
-		for (j = 0; j < NR_CPUS; j++)
-			if (cpu_online(j))
-				seq_printf(p, "%10u ", tau_interrupts(j));
-		seq_puts(p, "  PowerPC             Thermal Assist (cpu temp)\n");
-	}
+		if (tau_initialized){
+			seq_puts(p, "TAU: ");
+			for (j = 0; j < NR_CPUS; j++)
+				if (cpu_online(j))
+					seq_printf(p, "%10u ", tau_interrupts(j));
+			seq_puts(p, "  PowerPC             Thermal Assist (cpu temp)\n");
+		}
 #endif
 #ifdef CONFIG_SMP
-	/* should this be per processor send/receive? */
-	seq_printf(p, "IPI (recv/sent): %10u/%u\n",
-		   atomic_read(&ipi_recv), atomic_read(&ipi_sent));
+		/* should this be per processor send/receive? */
+		seq_printf(p, "IPI (recv/sent): %10u/%u\n",
+				atomic_read(&ipi_recv), atomic_read(&ipi_sent));
 #endif
-	seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts);
+		seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts);
+	}
 	return 0;
 }
 
@@ -569,67 +572,16 @@
 
 cpumask_t irq_affinity [NR_IRQS];
 
-#define HEX_DIGITS (2*sizeof(cpumask_t))
-
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	cpumask_t tmp = irq_affinity[(long)data];
-	int k, len = 0;
-
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
+	if (count - len < 2)
 		return -EINVAL;
-
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-
-	len += sprintf(page, "\n");
+	len += sprintf(page + len, "\n");
 	return len;
 }
 
-static unsigned int parse_hex_value (const char __user *buffer,
-		unsigned long count, cpumask_t *ret)
-{
-	unsigned char hexnum [HEX_DIGITS];
-	cpumask_t value = CPU_MASK_NONE;
-	int i;
-
-	if (!count)
-		return -EINVAL;
-	if (count > HEX_DIGITS)
-		count = HEX_DIGITS;
-	if (copy_from_user(hexnum, buffer, count))
-		return -EFAULT;
-
-	/*
-	 * Parse the first 8 characters as a hex string, any non-hex char
-	 * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
-	 */
-	for (i = 0; i < count; i++) {
-		unsigned int c = hexnum[i];
-		int k;
-
-		switch (c) {
-			case '0' ... '9': c -= '0'; break;
-			case 'a' ... 'f': c -= 'a'-10; break;
-			case 'A' ... 'F': c -= 'A'-10; break;
-		default:
-			goto out;
-		}
-		cpus_shift_left(value, value, 4);
-		for (k = 0; k < 4; ++k)
-			if (c & (1 << k))
-				cpu_set(k, value);
-	}
-out:
-	*ret = value;
-	return 0;
-}
-
 static int irq_affinity_write_proc (struct file *file, const char __user *buffer,
 					unsigned long count, void *data)
 {
@@ -639,7 +591,7 @@
 	if (!irq_desc[irq].handler->set_affinity)
 		return -EIO;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 
 	/*
 	 * Do not allow disabling IRQs completely - it's a too easy
@@ -664,19 +616,10 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	cpumask_t mask = *(cpumask_t *)data;
-	int k, len = 0;
-
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
+	if (count - len < 2)
 		return -EINVAL;
-
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(mask));
-		len += j;
-		page += j;
-		cpus_shift_right(mask, mask, 16);
-	}
-	len += sprintf(page, "\n");
+	len += sprintf(page + len, "\n");
 	return len;
 }
 
@@ -686,7 +629,7 @@
 	cpumask_t *mask = (cpumask_t *)data, full_count = count, err;
 	cpumask_t new_value;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 	if (err)
 		return err;
 
--- diff/arch/ppc64/kernel/irq.c	2003-10-27 09:20:37.000000000 +0000
+++ source/arch/ppc64/kernel/irq.c	2003-12-29 09:30:39.000000000 +0000
@@ -300,7 +300,7 @@
 	spin_lock_irqsave(&desc->lock, flags);
 	switch (desc->depth) {
 	case 1: {
-		unsigned int status = desc->status & ~(IRQ_DISABLED | IRQ_INPROGRESS);
+		unsigned int status = desc->status & ~IRQ_DISABLED;
 		desc->status = status;
 		if ((status & (IRQ_PENDING | IRQ_REPLAY)) == IRQ_PENDING) {
 			desc->status = status | IRQ_REPLAY;
@@ -323,18 +323,20 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i, j;
+	int i = *(loff_t *) v, j;
 	struct irqaction * action;
 	unsigned long flags;
 
-	seq_printf(p, "           ");
-	for (j=0; j<NR_CPUS; j++) {
-		if (cpu_online(j))
-			seq_printf(p, "CPU%d       ",j);
+	if (i == 0) {
+		seq_printf(p, "           ");
+		for (j=0; j<NR_CPUS; j++) {
+			if (cpu_online(j))
+				seq_printf(p, "CPU%d       ",j);
+		}
+		seq_putc(p, '\n');
 	}
-	seq_putc(p, '\n');
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		spin_lock_irqsave(&irq_desc[i].lock, flags);
 		action = irq_desc[i].action;
 		if (!action || !action->handler)
@@ -359,8 +361,8 @@
 		seq_putc(p, '\n');
 skip:
 		spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-	}
-	seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts);
+	} else if (i == NR_IRQS)
+		seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts);
 	return 0;
 }
 
@@ -652,67 +654,16 @@
 cpumask_t irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_NONE };
 #endif /* CONFIG_IRQ_ALL_CPUS */
 
-#define HEX_DIGITS (2*sizeof(cpumask_t))
-
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int k, len;
-	cpumask_t tmp = irq_affinity[(long)data];
-
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
+	if (count - len < 2)
 		return -EINVAL;
-
-	for (k = 0; k < sizeof(cpumask_t) / sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-	len += sprintf(page, "\n");
+	len += sprintf(page + len, "\n");
 	return len;
 }
 
-static unsigned int parse_hex_value (const char *buffer,
-		unsigned long count, cpumask_t *ret)
-{
-	unsigned char hexnum[HEX_DIGITS];
-	cpumask_t value = CPU_MASK_NONE;
-	int i;
-
-	if (!count)
-		return -EINVAL;
-	if (count > HEX_DIGITS)
-		count = HEX_DIGITS;
-	if (copy_from_user(hexnum, buffer, count))
-		return -EFAULT;
-
-	/*
-	 * Parse the first HEX_DIGITS characters as a hex string, any non-hex char
-	 * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
-	 */
-
-	for (i = 0; i < count; i++) {
-		unsigned int c = hexnum[i];
-		int k;
-
-		switch (c) {
-			case '0' ... '9': c -= '0'; break;
-			case 'a' ... 'f': c -= 'a'-10; break;
-			case 'A' ... 'F': c -= 'A'-10; break;
-		default:
-			goto out;
-		}
-		cpus_shift_left(value, value, 4);
-		for (k = 0; k < 4; ++k)
-			if (test_bit(k, (unsigned long *)&c))
-				cpu_set(k, value);
-	}
-out:
-	*ret = value;
-	return 0;
-}
-
 static int irq_affinity_write_proc (struct file *file, const char *buffer,
 					unsigned long count, void *data)
 {
@@ -722,7 +673,7 @@
 	if (!irq_desc[irq].handler->set_affinity)
 		return -EIO;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 	if (err)
 		return err;
 
@@ -744,10 +695,11 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	unsigned long *mask = (unsigned long *) data;
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
+	if (count - len < 2)
 		return -EINVAL;
-	return sprintf (page, "%08lx\n", *mask);
+	len += sprintf(page + len, "\n");
+	return len;
 }
 
 static int prof_cpu_mask_write_proc (struct file *file, const char __user *buffer,
@@ -757,7 +709,7 @@
 	unsigned long full_count = count, err;
 	cpumask_t new_value;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 	if (err)
 		return err;
 
--- diff/arch/ppc64/kernel/misc.S	2003-10-27 09:20:37.000000000 +0000
+++ source/arch/ppc64/kernel/misc.S	2003-12-29 09:30:39.000000000 +0000
@@ -843,15 +843,15 @@
 	.llong .sys_ni_syscall
 	.llong .sys_ni_syscall
 	.llong .sys_ni_syscall
-	.llong .sys_ni_syscall		/* 245 */
-	.llong .sys_ni_syscall
-	.llong .sys_ni_syscall
-	.llong .sys_ni_syscall
-	.llong .sys_ni_syscall
+	.llong .compat_clock_settime	/* 245 */
+	.llong .compat_clock_gettime
+	.llong .compat_clock_getres
+	.llong .compat_clock_nanosleep
+	.llong .sys_ni_syscall		/* 249 swapcontext */
 	.llong .sys32_tgkill		/* 250 */
 	.llong .sys32_utimes
-	.llong .sys_statfs64
-	.llong .sys_fstatfs64
+	.llong .compat_statfs64
+	.llong .compat_fstatfs64
 
 	.balign 8
 _GLOBAL(sys_call_table)
--- diff/arch/ppc64/kernel/time.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/ppc64/kernel/time.c	2003-12-29 09:30:39.000000000 +0000
@@ -91,6 +91,9 @@
 unsigned long processor_freq;
 spinlock_t rtc_lock = SPIN_LOCK_UNLOCKED;
 
+unsigned long tb_to_ns_scale;
+unsigned long tb_to_ns_shift;
+
 struct gettimeofday_struct do_gtod;
 
 extern unsigned long wall_jiffies;
@@ -313,11 +316,13 @@
 /*
  * Scheduler clock - returns current time in nanosec units.
  *
- * This is wrong, but my CPUs run at 1GHz, so nyer nyer.
+ * Note: mulhdu(a, b) (multiply high double unsigned) returns
+ * the high 64 bits of a * b, i.e. (a * b) >> 64, where a and b
+ * are 64-bit unsigned numbers.
  */
 unsigned long long sched_clock(void)
 {
-	return get_tb();
+	return mulhdu(get_tb(), tb_to_ns_scale) << tb_to_ns_shift;
 }
 
 /*
@@ -473,9 +478,30 @@
 	/* This function is only called on the boot processor */
 	unsigned long flags;
 	struct rtc_time tm;
+	struct div_result res;
+	unsigned long scale, shift;
 
 	ppc_md.calibrate_decr();
 
+	/*
+	 * Compute scale factor for sched_clock.
+	 * The calibrate_decr() function has set tb_ticks_per_sec,
+	 * which is the timebase frequency.
+	 * We compute 1e9 * 2^64 / tb_ticks_per_sec and interpret
+	 * the 128-bit result as a 64.64 fixed-point number.
+	 * We then shift that number right until it is less than 1.0,
+	 * giving us the scale factor and shift count to use in
+	 * sched_clock().
+	 */
+	div128_by_32(1000000000, 0, tb_ticks_per_sec, &res);
+	scale = res.result_low;
+	for (shift = 0; res.result_high != 0; ++shift) {
+		scale = (scale >> 1) | (res.result_high << 63);
+		res.result_high >>= 1;
+	}
+	tb_to_ns_scale = scale;
+	tb_to_ns_shift = shift;
+
 #ifdef CONFIG_PPC_ISERIES
 	if (!piranha_simulator)
 #endif
--- diff/arch/ppc64/mm/hugetlbpage.c	2003-10-27 09:20:37.000000000 +0000
+++ source/arch/ppc64/mm/hugetlbpage.c	2003-12-29 09:30:39.000000000 +0000
@@ -921,7 +921,7 @@
  * this far.
  */
 static struct page *hugetlb_nopage(struct vm_area_struct *vma,
-				unsigned long address, int unused)
+				unsigned long address, int *unused)
 {
 	BUG();
 	return NULL;
--- diff/arch/ppc64/mm/numa.c	2003-10-27 09:20:37.000000000 +0000
+++ source/arch/ppc64/mm/numa.c	2003-12-29 09:30:39.000000000 +0000
@@ -108,7 +108,7 @@
 
 	for (memory = find_type_devices("memory"); memory;
 	     memory = memory->next) {
-		int *tmp1, *tmp2;
+		unsigned int *tmp1, *tmp2;
 		unsigned long i;
 		unsigned long start = 0;
 		unsigned long size = 0;
--- diff/arch/s390/kernel/compat_wrapper.S	2003-06-09 14:18:18.000000000 +0100
+++ source/arch/s390/kernel/compat_wrapper.S	2003-12-29 09:30:39.000000000 +0000
@@ -5,6 +5,7 @@
 *  S390 version
 *    Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
 *    Author(s): Gerhard Tonn (ton@de.ibm.com),
+*               Thomas Spatzier (tspat@de.ibm.com)
 */ 
 
 	.globl  sys32_exit_wrapper 
@@ -1230,3 +1231,37 @@
 	lgfr	%r4,%r4			# int
 	lgfr	%r5,%r5			# int
 	jg	sys_epoll_wait		# branch to system call
+
+	.globl	sys32_io_setup_wrapper
+sys32_io_setup_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	llgtr	%r3,%r3			# u32 *
+	jg	compat_sys_io_setup
+
+	.globl	sys32_io_destroy_wrapper
+sys32_io_destroy_wrapper:
+	llgfr	%r2,%r2			# (aio_context_t) u32
+	jg	sys_io_destroy
+
+	.globl	sys32_io_getevents_wrapper
+sys32_io_getevents_wrapper:
+	llgfr	%r2,%r2			# (aio_context_t) u32
+	lgfr	%r3,%r3			# long
+	lgfr	%r4,%r4			# long
+	llgtr	%r5,%r5			# struct io_event *
+	llgtr	%r6,%r6			# struct compat_timespec *
+	jg	compat_sys_io_getevents
+
+	.globl	sys32_io_submit_wrapper
+sys32_io_submit_wrapper:
+	llgfr	%r2,%r2			# (aio_context_t) u32
+	lgfr	%r3,%r3			# long
+	llgtr	%r4,%r4			# struct iocb **
+	jg	compat_sys_io_submit
+
+	.globl	sys32_io_cancel_wrapper
+sys32_io_cancel_wrapper:
+	llgfr	%r2,%r2			# (aio_context_t) u32
+	llgtr	%r3,%r3			# struct iocb *
+	llgtr	%r4,%r4			# struct io_event *
+	jg	sys_io_cancel
--- diff/arch/s390/kernel/setup.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/s390/kernel/setup.c	2003-12-29 09:30:39.000000000 +0000
@@ -617,17 +617,17 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-        int i, j;
+        int i = *(loff_t *) v, j;
 	
-        seq_puts(p, "           ");
-	
-        for (j=0; j<NR_CPUS; j++)
-                if (cpu_online(j))
-                        seq_printf(p, "CPU%d       ",j);
-	
-        seq_putc(p, '\n');
+	if (i == 0) {
+		seq_puts(p, "           ");
+		for (j=0; j<NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "CPU%d       ",j);
+		seq_putc(p, '\n');
+	}
 	
-        for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		seq_printf(p, "%s: ", intrclass_names[i]);
 #ifndef CONFIG_SMP
 		seq_printf(p, "%10u ", kstat_irqs(i));
--- diff/arch/s390/kernel/syscalls.S	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/s390/kernel/syscalls.S	2003-12-29 09:30:39.000000000 +0000
@@ -251,11 +251,11 @@
 SYSCALL(sys_sched_getaffinity,sys_sched_getaffinity,sys32_sched_getaffinity_wrapper)	/* 240 */
 SYSCALL(sys_tgkill,sys_tgkill,sys_tgkill)
 NI_SYSCALL							/* reserved for TUX */
-SYSCALL(sys_io_setup,sys_io_setup,sys_ni_syscall)
-SYSCALL(sys_io_destroy,sys_io_destroy,sys_ni_syscall)
-SYSCALL(sys_io_getevents,sys_io_getevents,sys_ni_syscall)	/* 245 */
-SYSCALL(sys_io_submit,sys_io_submit,sys_ni_syscall)
-SYSCALL(sys_io_cancel,sys_io_cancel,sys_ni_syscall)
+SYSCALL(sys_io_setup,sys_io_setup,sys32_io_setup_wrapper)
+SYSCALL(sys_io_destroy,sys_io_destroy,sys32_io_destroy_wrapper)
+SYSCALL(sys_io_getevents,sys_io_getevents,sys32_io_getevents_wrapper)	/* 245 */
+SYSCALL(sys_io_submit,sys_io_submit,sys32_io_submit_wrapper)
+SYSCALL(sys_io_cancel,sys_io_cancel,sys32_io_cancel_wrapper)
 SYSCALL(sys_exit_group,sys_exit_group,sys32_exit_group_wrapper)
 SYSCALL(sys_epoll_create,sys_epoll_create,sys_epoll_create_wrapper)
 SYSCALL(sys_epoll_ctl,sys_epoll_ctl,sys_epoll_ctl_wrapper)	/* 250 */
--- diff/arch/sh/kernel/irq.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/sh/kernel/irq.c	2003-12-29 09:30:39.000000000 +0000
@@ -93,17 +93,19 @@
 #if defined(CONFIG_PROC_FS)
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i, j;
+	int i = *(loff_t *) v, j;
 	struct irqaction * action;
 	unsigned long flags;
 
-	seq_puts(p, "           ");
-	for (j=0; j<NR_CPUS; j++)
-		if (cpu_online(j))
-			seq_printf(p, "CPU%d       ",j);
-	seq_putc(p, '\n');
+	if (i == 0) {
+		seq_puts(p, "           ");
+		for (j=0; j<NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "CPU%d       ",j);
+		seq_putc(p, '\n');
+	}
 
-	for (i = 0 ; i < ACTUAL_NR_IRQS ; i++) {
+	if (i < ACTUAL_NR_IRQS) {
 		spin_lock_irqsave(&irq_desc[i].lock, flags);
 		action = irq_desc[i].action;
 		if (!action)
--- diff/arch/sparc/kernel/irq.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/sparc/kernel/irq.c	2003-12-29 09:30:39.000000000 +0000
@@ -102,7 +102,7 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 	struct irqaction * action;
 	unsigned long flags;
 #ifdef CONFIG_SMP
@@ -114,7 +114,7 @@
 		
 		return show_sun4d_interrupts(p, v);
 	}
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		local_irq_save(flags);
 	        action = *(i + irq_action);
 		if (!action) 
--- diff/arch/sparc/kernel/sun4d_irq.c	2003-05-21 11:50:14.000000000 +0100
+++ source/arch/sparc/kernel/sun4d_irq.c	2003-12-29 09:30:39.000000000 +0000
@@ -75,13 +75,13 @@
 
 int show_sun4d_interrupts(struct seq_file *p, void *v)
 {
-	int i, j = 0, k = 0, sbusl;
+	int i = *(loff_t *) v, j = 0, k = 0, sbusl;
 	struct irqaction * action;
 #ifdef CONFIG_SMP
 	int x;
 #endif
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		sbusl = pil_to_sbus[i];
 		if (!sbusl) {
 	 		action = *(i + irq_action);
--- diff/arch/sparc/mm/highmem.c	2002-12-11 11:50:24.000000000 +0000
+++ source/arch/sparc/mm/highmem.c	2003-12-29 09:30:39.000000000 +0000
@@ -33,6 +33,7 @@
 	unsigned long idx;
 	unsigned long vaddr;
 
+	/* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
 	inc_preempt_count();
 	if (page < highmem_start_page)
 		return page_address(page);
@@ -69,6 +70,7 @@
 
 	if (vaddr < fix_kmap_begin) { // FIXME
 		dec_preempt_count();
+		preempt_check_resched();
 		return;
 	}
 
@@ -96,4 +98,5 @@
 #endif
 #endif
 	dec_preempt_count();
+	preempt_check_resched();
 }
--- diff/arch/sparc64/Kconfig	2003-11-25 15:24:57.000000000 +0000
+++ source/arch/sparc64/Kconfig	2003-12-29 09:30:39.000000000 +0000
@@ -808,12 +808,19 @@
 	  best used in conjunction with the NMI watchdog so that spinlock
 	  deadlocks are also debuggable.
 
+config LOCKMETER
+	bool "Kernel lock metering"
+	depends on SMP && !PREEMPT
+	help
+	  Say Y to enable kernel lock metering, which adds overhead to SMP locks,
+	  but allows you to see various statistics using the lockstat command.
+
 # We have a custom atomic_dec_and_lock() implementation but it's not
 # compatible with spinlock debugging so we need to fall back on
 # the generic version in that case.
 config HAVE_DEC_LOCK
 	bool
-	depends on SMP && !DEBUG_SPINLOCK
+	depends on SMP && !DEBUG_SPINLOCK && !LOCKMETER
 	default y
 
 config DEBUG_SPINLOCK_SLEEP
--- diff/arch/sparc64/kernel/irq.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/sparc64/kernel/irq.c	2003-12-29 09:30:39.000000000 +0000
@@ -128,14 +128,14 @@
 int show_interrupts(struct seq_file *p, void *v)
 {
 	unsigned long flags;
-	int i;
+	int i = *(loff_t *) v;
 	struct irqaction *action;
 #ifdef CONFIG_SMP
 	int j;
 #endif
 
 	spin_lock_irqsave(&irq_action_lock, flags);
-	for (i = 0; i < (NR_IRQS + 1); i++) {
+	if (i <= NR_IRQS) {
 		if (!(action = *(i + irq_action)))
 			continue;
 		seq_printf(p, "%3d: ", i);
@@ -1204,11 +1204,17 @@
 {
 	struct ino_bucket *bp = ivector_table + (long)data;
 	struct irqaction *ap = bp->irq_info;
-	unsigned long mask = get_smpaff_in_irqaction(ap);
+	cpumask_t mask = get_smpaff_in_irqaction(ap);
+	int len;
+
+	if (cpus_empty(mask))
+		mask = cpu_online_map;
 
-	if (count < HEX_DIGITS+1)
+	len = cpumask_snprintf(page, count, mask);
+	if (count - len < 2)
 		return -EINVAL;
-	return sprintf (page, "%016lx\n", mask == 0 ? ~0UL : mask);
+	len += sprintf(page + len, "\n");
+	return len;
 }
 
 static inline void set_intr_affinity(int irq, unsigned long hw_aff)
--- diff/arch/sparc64/kernel/systbls.S	2003-11-25 15:24:57.000000000 +0000
+++ source/arch/sparc64/kernel/systbls.S	2003-12-29 09:30:39.000000000 +0000
@@ -72,8 +72,8 @@
 /*250*/	.word sys32_mremap, sys32_sysctl, sys_getsid, sys_fdatasync, sys32_nfsservctl
 	.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, sys_ni_syscall, sys_ni_syscall
-/*270*/	.word sys_ni_syscall, sys_ni_syscall, sys_ni_syscall, sys_ni_syscall
+	.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
 
 	/* Now the 64-bit native Linux syscall table. */
 
--- diff/arch/sparc64/lib/rwlock.S	2003-11-25 15:24:57.000000000 +0000
+++ source/arch/sparc64/lib/rwlock.S	2003-12-29 09:30:39.000000000 +0000
@@ -85,5 +85,20 @@
 __write_trylock_fail:
 	retl
 	 mov		0, %o0
+
+	.globl	__read_trylock
+__read_trylock: /* %o0 = lock_ptr */
+	ldsw		[%o0], %g5
+	brlz,pn		%g5, 100f
+	add		%g5, 1, %g7
+	cas		[%o0], %g5, %g7
+	cmp		%g5, %g7
+	bne,pn		%icc, __read_trylock
+	 membar		#StoreLoad | #StoreStore
+	retl
+	mov		1, %o0
+100:	retl
+	mov		0, %o0
+
 rwlock_impl_end:
 
--- diff/arch/sparc64/mm/hugetlbpage.c	2003-10-27 09:20:43.000000000 +0000
+++ source/arch/sparc64/mm/hugetlbpage.c	2003-12-29 09:30:39.000000000 +0000
@@ -504,7 +504,7 @@
  * this far.
  */
 static struct page *hugetlb_nopage(struct vm_area_struct *vma,
-				   unsigned long address, int unused)
+				   unsigned long address, int *unused)
 {
 	BUG();
 	return NULL;
--- diff/arch/um/drivers/ubd_kern.c	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/um/drivers/ubd_kern.c	2003-12-29 09:30:39.000000000 +0000
@@ -49,9 +49,9 @@
 
 static void (*do_ubd)(void);
 
-static int ubd_open(struct inode * inode, struct file * filp);
-static int ubd_release(struct inode * inode, struct file * file);
-static int ubd_ioctl(struct inode * inode, struct file * file,
+static int ubd_open(struct block_device *bdev, struct file * filp);
+static int ubd_release(struct gendisk *disk);
+static int ubd_ioctl(struct block_device *bdev, struct file * file,
 		     unsigned int cmd, unsigned long arg);
 
 #define MAX_DEV (8)
@@ -710,9 +710,9 @@
 
 device_initcall(ubd_driver_init);
 
-static int ubd_open(struct inode *inode, struct file *filp)
+static int ubd_open(struct block_device *bdev, struct file *filp)
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
+	struct gendisk *disk = bdev->bd_disk;
 	struct ubd *dev = disk->private_data;
 	int err = -EISDIR;
 
@@ -739,9 +739,8 @@
 	return(err);
 }
 
-static int ubd_release(struct inode * inode, struct file * file)
+static int ubd_release(struct gendisk *disk)
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
 	struct ubd *dev = disk->private_data;
 
 	if(--dev->count == 0)
@@ -865,11 +864,11 @@
 	}
 }
 
-static int ubd_ioctl(struct inode * inode, struct file * file,
+static int ubd_ioctl(struct block_device *bdev, struct file * file,
 		     unsigned int cmd, unsigned long arg)
 {
 	struct hd_geometry *loc = (struct hd_geometry *) arg;
-	struct ubd *dev = inode->i_bdev->bd_disk->private_data;
+	struct ubd *dev = bdev->bd_disk->private_data;
 	int err;
 	struct hd_driveid ubd_id = {
 		.cyls		= 0,
@@ -890,7 +889,7 @@
 
 	case HDIO_SET_UNMASKINTR:
 		if(!capable(CAP_SYS_ADMIN)) return(-EACCES);
-		if((arg > 1) || (inode->i_bdev->bd_contains != inode->i_bdev))
+		if((arg > 1) || (bdev->bd_contains != bdev))
 			return(-EINVAL);
 		return(0);
 
@@ -910,7 +909,7 @@
 
 	case HDIO_SET_MULTCOUNT:
 		if(!capable(CAP_SYS_ADMIN)) return(-EACCES);
-		if(inode->i_bdev->bd_contains != inode->i_bdev)
+		if(bdev->bd_contains != bdev)
 			return(-EINVAL);
 		return(0);
 
--- diff/arch/um/kernel/irq.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/um/kernel/irq.c	2003-12-29 09:30:39.000000000 +0000
@@ -572,53 +572,14 @@
  */
 static cpumask_t irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_ALL };
 
-#define HEX_DIGITS (2*sizeof(cpumask_t))
-
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	if (count < HEX_DIGITS+1)
-		return -EINVAL;
-	return sprintf (page, "%08lx\n", irq_affinity[(long)data]);
-}
-
-static unsigned int parse_hex_value (const char *buffer,
-		unsigned long count, cpumask_t *ret)
-{
-	unsigned char hexnum [HEX_DIGITS];
-	cpumask_t value = CPU_MASK_NONE;
-	int i;
-
-	if (!count)
+	int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
+	if (count - len < 2)
 		return -EINVAL;
-	if (count > HEX_DIGITS)
-		count = HEX_DIGITS;
-	if (copy_from_user(hexnum, buffer, count))
-		return -EFAULT;
-
-	/*
-	 * Parse the first 8 characters as a hex string, any non-hex char
-	 * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
-	 */
-
-	for (i = 0; i < count; i++) {
-		unsigned int k, c = hexnum[i];
-
-		switch (c) {
-			case '0' ... '9': c -= '0'; break;
-			case 'a' ... 'f': c -= 'a'-10; break;
-			case 'A' ... 'F': c -= 'A'-10; break;
-		default:
-			goto out;
-		}
-		cpus_shift_left(value, value, 16);
-		for (k = 0; k < 4; ++k)
-			if (c & (1 << k))
-				cpu_set(k, value);
-	}
-out:
-	*ret = value;
-	return 0;
+	len += sprintf(page + len, "\n");
+	return len;
 }
 
 static int irq_affinity_write_proc (struct file *file, const char *buffer,
@@ -630,7 +591,7 @@
 	if (!irq_desc[irq].handler->set_affinity)
 		return -EIO;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 
 #ifdef CONFIG_SMP
 	/*
@@ -652,19 +613,10 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	cpumask_t tmp, *mask = (cpumask_t *) data;
-	int k, len = 0;
-
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
+	if (count - len < 2)
 		return -EINVAL;
-	tmp = *mask;
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-	len += sprintf(page, "\n");
+	len += sprintf(page + len, "\n");
 	return len;
 }
 
@@ -674,7 +626,7 @@
 	cpumask_t *mask = (cpumask_t *)data, new_value;
 	unsigned long full_count = count, err;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 	if (err)
 		return err;
 
--- diff/arch/v850/kernel/irq.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/v850/kernel/irq.c	2003-12-29 09:30:39.000000000 +0000
@@ -81,16 +81,18 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 	struct irqaction * action;
 	unsigned long flags;
 
-	seq_puts(p, "           ");
-	for (i=0; i < 1 /*smp_num_cpus*/; i++)
-		seq_printf(p, "CPU%d       ", i);
-	seq_putc(p, '\n');
+	if (i == 0) {
+		seq_puts(p, "           ");
+		for (i=0; i < 1 /*smp_num_cpus*/; i++)
+			seq_printf(p, "CPU%d       ", i);
+		seq_putc(p, '\n');
+	}
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		int j, count, num;
 		const char *type_name = irq_desc[i].handler->typename;
 		spin_lock_irqsave(&irq_desc[j].lock, flags);
@@ -121,8 +123,8 @@
 		seq_putc(p, '\n');
 skip:
 		spin_unlock_irqrestore(&irq_desc[j].lock, flags);
-	}
-	seq_printf(p, "ERR: %10lu\n", irq_err_count);
+	} else if (i == NR_IRQS)
+		seq_printf(p, "ERR: %10lu\n", irq_err_count);
 	return 0;
 }
 
--- diff/arch/x86_64/Kconfig	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/x86_64/Kconfig	2003-12-29 09:30:39.000000000 +0000
@@ -371,6 +371,12 @@
 	  turn this on, unless you're 100% sure that you don't have any 32-bit programs
 	  left.
 
+config IA32_AOUT
+       bool "IA32 a.out support"
+       depends on IA32_EMULATION
+       help
+         Support old a.out binaries in the 32bit emulation.
+
 config COMPAT
 	bool
 	depends on IA32_EMULATION
--- diff/arch/x86_64/boot/compressed/head.S	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/x86_64/boot/compressed/head.S	2003-12-29 09:30:39.000000000 +0000
@@ -26,6 +26,7 @@
 .code32
 .text
 
+#define IN_BOOTLOADER
 #include <linux/linkage.h>
 #include <asm/segment.h>
 
--- diff/arch/x86_64/boot/compressed/misc.c	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/x86_64/boot/compressed/misc.c	2003-12-29 09:30:39.000000000 +0000
@@ -9,6 +9,7 @@
  * High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996
  */
 
+#define IN_BOOTLOADER
 #include "miscsetup.h"
 #include <asm/io.h>
 
--- diff/arch/x86_64/ia32/Makefile	2003-09-30 15:46:12.000000000 +0100
+++ source/arch/x86_64/ia32/Makefile	2003-12-29 09:30:39.000000000 +0000
@@ -6,6 +6,8 @@
 	ia32_signal.o tls32.o \
 	ia32_binfmt.o fpu32.o ptrace32.o ipc32.o syscall32.o
 
+obj-$(CONFIG_IA32_AOUT) += ia32_aout.o
+
 $(obj)/syscall32.o: $(src)/syscall32.c $(obj)/vsyscall.so
 
 # Teach kbuild about targets
--- diff/arch/x86_64/ia32/ia32entry.S	2003-09-17 12:28:03.000000000 +0100
+++ source/arch/x86_64/ia32/ia32entry.S	2003-12-29 09:30:39.000000000 +0000
@@ -221,7 +221,7 @@
 	.quad sys_chmod		/* 15 */
 	.quad sys_lchown16
 	.quad ni_syscall			/* old break syscall holder */
-	.quad ni_syscall	/* (old)stat */ 
+	.quad sys_stat
 	.quad sys32_lseek
 	.quad sys_getpid		/* 20 */
 	.quad sys_mount	/* mount  */
@@ -231,7 +231,7 @@
 	.quad sys_stime		/* stime */		/* 25 */
 	.quad sys32_ptrace	/* ptrace */
 	.quad sys_alarm		/* XXX sign extension??? */ 
-	.quad ni_syscall	/* (old)fstat */
+	.quad sys_fstat	/* (old)fstat */
 	.quad sys_pause
 	.quad compat_sys_utime	/* 30 */
 	.quad ni_syscall	/* old stty syscall holder */
@@ -287,7 +287,7 @@
 	.quad sys_setgroups16
 	.quad sys32_old_select
 	.quad sys_symlink
-	.quad ni_syscall	/* (old)lstat */
+	.quad sys_lstat
 	.quad sys_readlink		/* 85 */
 	.quad sys_uselib
 	.quad sys_swapon
--- diff/arch/x86_64/kernel/acpi/boot.c	2003-11-25 15:24:57.000000000 +0000
+++ source/arch/x86_64/kernel/acpi/boot.c	2003-12-29 09:30:39.000000000 +0000
@@ -46,11 +46,13 @@
 #include <asm/proto.h>
 #include <asm/tlbflush.h>
 
-int acpi_lapic = 0;
-int acpi_ioapic = 0;
-
 #define PREFIX			"ACPI: "
 
+int acpi_noirq __initdata = 0;	/* skip ACPI IRQ initialization */
+int acpi_ht __initdata = 1;	/* enable HT */
+
+int acpi_lapic = 0;
+int acpi_ioapic = 0;
 
 /* --------------------------------------------------------------------------
                               Boot-time Configuration
@@ -253,29 +255,66 @@
 
 #ifdef CONFIG_ACPI_BUS
 /*
- * Set specified PIC IRQ to level triggered mode.
+ * "acpi_pic_sci=level" (current default)
+ * programs the PIC-mode SCI to Level Trigger.
+ * (NO-OP if the BIOS set Level Trigger already)
+ *
+ * If a PIC-mode SCI is not recogznied or gives spurious IRQ7's
+ * it may require Edge Trigger -- use "acpi_pic_sci=edge"
+ * (NO-OP if the BIOS set Edge Trigger already)
  *
  * Port 0x4d0-4d1 are ECLR1 and ECLR2, the Edge/Level Control Registers
  * for the 8259 PIC.  bit[n] = 1 means irq[n] is Level, otherwise Edge.
  * ECLR1 is IRQ's 0-7 (IRQ 0, 1, 2 must be 0)
  * ECLR2 is IRQ's 8-15 (IRQ 8, 13 must be 0)
- *
- * As the BIOS should have done this for us,
- * print a warning if the IRQ wasn't already set to level.
  */
 
-void acpi_pic_set_level_irq(unsigned int irq)
+static int __initdata	acpi_pic_sci_trigger;	/* 0: level, 1: edge */
+
+void __init
+acpi_pic_sci_set_trigger(unsigned int irq)
 {
 	unsigned char mask = 1 << (irq & 7);
 	unsigned int port = 0x4d0 + (irq >> 3);
 	unsigned char val = inb(port);
 
+	
+	printk(PREFIX "IRQ%d SCI:", irq);
 	if (!(val & mask)) {
-		printk(KERN_WARNING PREFIX "IRQ %d was Edge Triggered, "
-			"setting to Level Triggerd\n", irq);
-		outb(val | mask, port);
+		printk(" Edge");
+
+		if (!acpi_pic_sci_trigger) {
+			printk(" set to Level");
+			outb(val | mask, port);
+		}
+	} else {
+		printk(" Level");
+
+		if (acpi_pic_sci_trigger) {
+			printk(" set to Edge");
+			outb(val | mask, port);
+		}
 	}
+	printk(" Trigger.\n");
 }
+
+int __init
+acpi_pic_sci_setup(char *str)
+{
+	while (str && *str) {
+		if (strncmp(str, "level", 5) == 0)
+			acpi_pic_sci_trigger = 0;	/* force level trigger */
+		if (strncmp(str, "edge", 4) == 0)
+			acpi_pic_sci_trigger = 1;	/* force edge trigger */
+		str = strchr(str, ',');
+		if (str)
+			str += strspn(str, ", \t");
+	}
+	return 1;
+}
+
+__setup("acpi_pic_sci=", acpi_pic_sci_setup);
+
 #endif /* CONFIG_ACPI_BUS */
 
 static unsigned long __init
@@ -354,8 +393,10 @@
 	 * Initialize the ACPI boot-time table parser.
 	 */
 	result = acpi_table_init();
-	if (result)
+	if (result) {
+		acpi_disabled = 1;
 		return result;
+	}
 
 	result = acpi_blacklisted();
 	if (result) {
@@ -442,7 +483,7 @@
         * If MPS is present, it will handle them,
         * otherwise the system will stay in PIC mode
         */
-        if (acpi_disabled) {
+        if (acpi_disabled || acpi_noirq) {
                return 1;
 	}
 
@@ -484,6 +525,8 @@
 
 	acpi_irq_model = ACPI_IRQ_MODEL_IOAPIC;
 
+	acpi_irq_balance_set(NULL);
+
 	acpi_ioapic = 1;
 
 #endif /*CONFIG_X86_IO_APIC*/
--- diff/arch/x86_64/kernel/io_apic.c	2003-11-25 15:24:57.000000000 +0000
+++ source/arch/x86_64/kernel/io_apic.c	2003-12-29 09:30:39.000000000 +0000
@@ -1087,8 +1087,6 @@
 	unsigned char old_id;
 	unsigned long flags;
 
-	if (acpi_ioapic) return; /* ACPI does that already */
-
 	/*
 	 * Set the IOAPIC ID to the value stored in the MPC table.
 	 */
@@ -1673,12 +1671,14 @@
 	/*
 	 * Set up the IO-APIC IRQ routing table.
 	 */
-	setup_ioapic_ids_from_mpc();
+	if (!acpi_ioapic)
+		setup_ioapic_ids_from_mpc();
 	sync_Arb_IDs();
 	setup_IO_APIC_irqs();
 	init_IO_APIC_traps();
 	check_timer();
-	print_IO_APIC();
+	if (!acpi_ioapic)
+		print_IO_APIC();
 }
 
 /* Ensure the ACPI SCI interrupt level is active low, edge-triggered */
--- diff/arch/x86_64/kernel/irq.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/x86_64/kernel/irq.c	2003-12-29 09:30:39.000000000 +0000
@@ -138,17 +138,19 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i, j;
+	int i = *(loff_t *) v, j;
 	struct irqaction * action;
 	unsigned long flags;
 
-	seq_printf(p, "           ");
-	for (j=0; j<NR_CPUS; j++)
-		if (cpu_online(j))
-		seq_printf(p, "CPU%d       ",j);
-	seq_putc(p, '\n');
+	if (i == 0) {
+		seq_printf(p, "           ");
+		for (j=0; j<NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "CPU%d       ",j);
+		seq_putc(p, '\n');
+	}
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		spin_lock_irqsave(&irq_desc[i].lock, flags);
 		action = irq_desc[i].action;
 		if (!action) 
@@ -170,25 +172,26 @@
 		seq_putc(p, '\n');
 skip:
 		spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-	}
-	seq_printf(p, "NMI: ");
-	for (j = 0; j < NR_CPUS; j++)
-		if (cpu_online(j))
-		seq_printf(p, "%10u ", cpu_pda[j].__nmi_count);
-	seq_putc(p, '\n');
+	} else if (i == NR_IRQS) {
+		seq_printf(p, "NMI: ");
+		for (j = 0; j < NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "%10u ", cpu_pda[j].__nmi_count);
+		seq_putc(p, '\n');
 #ifdef CONFIG_X86_LOCAL_APIC
-	seq_printf(p, "LOC: ");
-	for (j = 0; j < NR_CPUS; j++)
-		if (cpu_online(j))
-		seq_printf(p, "%10u ", cpu_pda[j].apic_timer_irqs);
-	seq_putc(p, '\n');
+		seq_printf(p, "LOC: ");
+		for (j = 0; j < NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "%10u ", cpu_pda[j].apic_timer_irqs);
+		seq_putc(p, '\n');
 #endif
-	seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
+		seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
 #ifdef CONFIG_X86_IO_APIC
 #ifdef APIC_MISMATCH_DEBUG
-	seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
+		seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
 #endif
 #endif
+	}
 	return 0;
 }
 
@@ -801,47 +804,6 @@
 static struct proc_dir_entry * root_irq_dir;
 static struct proc_dir_entry * irq_dir [NR_IRQS];
 
-#define HEX_DIGITS (2*sizeof(cpumask_t))
-
-static unsigned int parse_hex_value (const char *buffer,
-		unsigned long count, cpumask_t *ret)
-{
-	unsigned char hexnum [HEX_DIGITS];
-	cpumask_t value = CPU_MASK_NONE;
-	unsigned i;
-
-	if (!count)
-		return -EINVAL;
-	if (count > HEX_DIGITS)
-		count = HEX_DIGITS;
-	if (copy_from_user(hexnum, buffer, count))
-		return -EFAULT;
-
-	/*
-	 * Parse the first 8 characters as a hex string, any non-hex char
-	 * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
-	 */
-
-	for (i = 0; i < count; i++) {
-		unsigned int k, c = hexnum[i];
-
-		switch (c) {
-			case '0' ... '9': c -= '0'; break;
-			case 'a' ... 'f': c -= 'a'-10; break;
-			case 'A' ... 'F': c -= 'A'-10; break;
-		default:
-			goto out;
-		}
-		cpus_shift_left(value, value, 4);
-		for (k = 0; k < 4; ++k)
-			if (c & (1 << k))
-				cpu_set(k, value);
-	}
-out:
-	*ret = value;
-	return 0;
-}
-
 #ifdef CONFIG_SMP
 
 static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
@@ -850,19 +812,10 @@
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int k, len;
-	cpumask_t tmp = irq_affinity[(long)data];
-
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
+	if (count - len < 2)
 		return -EINVAL;
-
-	for (k = len = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-	len += sprintf(page, "\n");
+	len += sprintf(page + len, "\n");
 	return len;
 }
 
@@ -875,7 +828,7 @@
 	if (!irq_desc[irq].handler->set_affinity)
 		return -EIO;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 
 	/*
 	 * Do not allow disabling IRQs completely - it's a too easy
@@ -897,20 +850,10 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	cpumask_t tmp, *mask = (cpumask_t *) data;
-	int k, len;
-
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
+	if (count - len < 2)
 		return -EINVAL;
-
-	tmp = *mask;
-	for (k = len = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-	len += sprintf(page, "\n");
+	len += sprintf(page + len, "\n");
 	return len;
 }
 
@@ -920,7 +863,7 @@
 	unsigned long full_count = count, err;
 	cpumask_t new_value, *mask = (cpumask_t *)data;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 	if (err)
 		return err;
 
--- diff/arch/x86_64/kernel/mpparse.c	2003-09-30 15:46:12.000000000 +0100
+++ source/arch/x86_64/kernel/mpparse.c	2003-12-29 09:30:39.000000000 +0000
@@ -950,6 +950,8 @@
 			entry->irq);
 	}
 	
+	print_IO_APIC();
+
 	return;
 }
 
--- diff/arch/x86_64/kernel/setup.c	2003-10-27 09:20:37.000000000 +0000
+++ source/arch/x86_64/kernel/setup.c	2003-12-29 09:30:39.000000000 +0000
@@ -65,7 +65,11 @@
 EXPORT_SYMBOL_GPL(mmu_cr4_features);
 
 int acpi_disabled = 0;
-int acpi_ht = 0;
+
+#ifdef	CONFIG_ACPI_BOOT
+extern int __initdata acpi_ht;
+/* int __initdata acpi_force = 0; */
+#endif
 
 /* For PCI or other memory-mapped resources */
 unsigned long pci_mem_start = 0x10000000;
@@ -195,6 +199,7 @@
 		if (c != ' ') 
 			goto next_char; 
  
+#ifdef CONFIG_ACPI_BOOT
 		/* "acpi=off" disables both ACPI table parsing and interpreter init */
 		if (!memcmp(from, "acpi=off", 8))
 			acpi_disabled = 1;
@@ -210,6 +215,7 @@
 		if (!memcmp(from, "acpi=ht", 7)) { 
 			acpi_ht = 1; 
 		}
+#endif
 
 		if (!memcmp(from, "nolapic", 7) ||
 		    !memcmp(from, "disableapic", 11))
--- diff/arch/x86_64/kernel/traps.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/x86_64/kernel/traps.c	2003-12-29 09:30:39.000000000 +0000
@@ -218,8 +218,12 @@
 	// debugging aid: "show_stack(NULL, NULL);" prints the
 	// back trace for this cpu.
 
-	if(rsp==NULL)
-		rsp=(unsigned long*)&rsp;
+	if (rsp == NULL) {
+		if (tsk)
+			rsp = (unsigned long *)tsk->thread.rsp;
+		else
+			rsp = (unsigned long *)&rsp;
+	}
 
 	stack = rsp;
 	for(i=0; i < kstack_depth_to_print; i++) {
--- diff/crypto/tcrypt.c	2003-09-17 12:28:03.000000000 +0100
+++ source/crypto/tcrypt.c	2003-12-29 09:30:39.000000000 +0000
@@ -6,2384 +6,409 @@
  *
  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
  * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.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/init.h>
-#include <linux/module.h>
-#include <linux/mm.h>
-#include <linux/slab.h>
-#include <asm/scatterlist.h>
-#include <linux/string.h>
-#include <linux/crypto.h>
-#include <linux/highmem.h>
-#include "tcrypt.h"
-
-/*
- * Need to kmalloc() memory for testing kmap().
- */
-#define TVMEMSIZE	4096
-#define XBUFSIZE	32768
-
-/*
- * Indexes into the xbuf to simulate cross-page access.
- */
-#define IDX1		37
-#define IDX2		32400
-#define IDX3		1
-#define IDX4		8193
-#define IDX5		22222
-#define IDX6		17101
-#define IDX7		27333
-#define IDX8		3000
-
-static int mode;
-static char *xbuf;
-static char *tvmem;
-
-static char *check[] = {
-	"des", "md5", "des3_ede", "rot13", "sha1", "sha256", "blowfish",
-	"twofish", "serpent", "sha384", "sha512", "md4", "aes", "cast6", 
-	"deflate", NULL
-};
-
-static void
-hexdump(unsigned char *buf, unsigned int len)
-{
-	while (len--)
-		printk("%02x", *buf++);
-
-	printk("\n");
-}
-
-static void
-test_md5(void)
-{
-	char *p;
-	unsigned int i;
-	struct scatterlist sg[2];
-	char result[128];
-	struct crypto_tfm *tfm;
-	struct md5_testvec *md5_tv;
-	unsigned int tsize;
-
-	printk("\ntesting md5\n");
-
-	tsize = sizeof (md5_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, md5_tv_template, tsize);
-	md5_tv = (void *) tvmem;
-
-	tfm = crypto_alloc_tfm("md5", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for md5\n");
-		return;
-	}
-
-	for (i = 0; i < MD5_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-		memset(result, 0, sizeof (result));
-
-		p = md5_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = strlen(md5_tv[i].plaintext);
-
-		crypto_digest_init(tfm);
-		crypto_digest_update(tfm, sg, 1);
-		crypto_digest_final(tfm, result);
-
-		hexdump(result, crypto_tfm_alg_digestsize(tfm));
-		printk("%s\n",
-		       memcmp(result, md5_tv[i].digest,
-			      crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-		       "pass");
-	}
-
-	printk("\ntesting md5 across pages\n");
-
-	/* setup the dummy buffer first */
-	memset(xbuf, 0, XBUFSIZE);
-	memcpy(&xbuf[IDX1], "abcdefghijklm", 13);
-	memcpy(&xbuf[IDX2], "nopqrstuvwxyz", 13);
-
-	p = &xbuf[IDX1];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 13;
-
-	p = &xbuf[IDX2];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 13;
-
-	memset(result, 0, sizeof (result));
-	crypto_digest_digest(tfm, sg, 2, result);
-	hexdump(result, crypto_tfm_alg_digestsize(tfm));
-
-	printk("%s\n",
-	       memcmp(result, md5_tv[4].digest,
-		      crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
-	crypto_free_tfm(tfm);
-}
-
-#ifdef CONFIG_CRYPTO_HMAC
-static void
-test_hmac_md5(void)
-{
-	char *p;
-	unsigned int i, klen;
-	struct scatterlist sg[2];
-	char result[128];
-	struct crypto_tfm *tfm;
-	struct hmac_md5_testvec *hmac_md5_tv;
-	unsigned int tsize;
-
-	tfm = crypto_alloc_tfm("md5", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for md5\n");
-		return;
-	}
-
-	printk("\ntesting hmac_md5\n");
-	
-	tsize = sizeof (hmac_md5_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		goto out;
-	}
-
-	memcpy(tvmem, hmac_md5_tv_template, tsize);
-	hmac_md5_tv = (void *) tvmem;
-
-	for (i = 0; i < HMAC_MD5_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-		memset(result, 0, sizeof (result));
-
-		p = hmac_md5_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = strlen(hmac_md5_tv[i].plaintext);
-
-		klen = strlen(hmac_md5_tv[i].key);
-		crypto_hmac(tfm, hmac_md5_tv[i].key, &klen, sg, 1, result);
-
-		hexdump(result, crypto_tfm_alg_digestsize(tfm));
-		printk("%s\n",
-		       memcmp(result, hmac_md5_tv[i].digest,
-			      crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-		       "pass");
-	}
-
-	printk("\ntesting hmac_md5 across pages\n");
-
-	memset(xbuf, 0, XBUFSIZE);
-
-	memcpy(&xbuf[IDX1], "what do ya want ", 16);
-	memcpy(&xbuf[IDX2], "for nothing?", 12);
-
-	p = &xbuf[IDX1];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 16;
-
-	p = &xbuf[IDX2];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 12;
-
-	memset(result, 0, sizeof (result));
-	klen = strlen(hmac_md5_tv[7].key);
-	crypto_hmac(tfm, hmac_md5_tv[7].key, &klen, sg, 2, result);
-	hexdump(result, crypto_tfm_alg_digestsize(tfm));
-
-	printk("%s\n",
-	       memcmp(result, hmac_md5_tv[7].digest,
-		      crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
-out:
-	crypto_free_tfm(tfm);
-}
-
-static void
-test_hmac_sha1(void)
-{
-	char *p;
-	unsigned int i, klen;
-	struct crypto_tfm *tfm;
-	struct hmac_sha1_testvec *hmac_sha1_tv;
-	struct scatterlist sg[2];
-	unsigned int tsize;
-	char result[SHA1_DIGEST_SIZE];
-
-	tfm = crypto_alloc_tfm("sha1", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for sha1\n");
-		return;
-	}
-
-	printk("\ntesting hmac_sha1\n");
-
-	tsize = sizeof (hmac_sha1_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		goto out;
-	}
-
-	memcpy(tvmem, hmac_sha1_tv_template, tsize);
-	hmac_sha1_tv = (void *) tvmem;
-
-	for (i = 0; i < HMAC_SHA1_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-		memset(result, 0, sizeof (result));
-
-		p = hmac_sha1_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = strlen(hmac_sha1_tv[i].plaintext);
-
-		klen = strlen(hmac_sha1_tv[i].key);
-		
-		crypto_hmac(tfm, hmac_sha1_tv[i].key, &klen, sg, 1, result);
-
-		hexdump(result, sizeof (result));
-		printk("%s\n",
-		       memcmp(result, hmac_sha1_tv[i].digest,
-			      crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-		       "pass");
-	}
-
-	printk("\ntesting hmac_sha1 across pages\n");
-
-	/* setup the dummy buffer first */
-	memset(xbuf, 0, XBUFSIZE);
-
-	memcpy(&xbuf[IDX1], "what do ya want ", 16);
-	memcpy(&xbuf[IDX2], "for nothing?", 12);
-
-	p = &xbuf[IDX1];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 16;
-
-	p = &xbuf[IDX2];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 12;
-
-	memset(result, 0, sizeof (result));
-	klen = strlen(hmac_sha1_tv[7].key);
-	crypto_hmac(tfm, hmac_sha1_tv[7].key, &klen, sg, 2, result);
-	hexdump(result, crypto_tfm_alg_digestsize(tfm));
-
-	printk("%s\n",
-	       memcmp(result, hmac_sha1_tv[7].digest,
-		      crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
-out:
-	crypto_free_tfm(tfm);
-}
-
-static void
-test_hmac_sha256(void)
-{
-	char *p;
-	unsigned int i, klen;
-	struct crypto_tfm *tfm;
-	struct hmac_sha256_testvec *hmac_sha256_tv;
-	struct scatterlist sg[2];
-	unsigned int tsize;
-	char result[SHA256_DIGEST_SIZE];
-
-	tfm = crypto_alloc_tfm("sha256", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for sha256\n");
-		return;
-	}
-
-	printk("\ntesting hmac_sha256\n");
-
-	tsize = sizeof (hmac_sha256_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		goto out;
-	}
-
-	memcpy(tvmem, hmac_sha256_tv_template, tsize);
-	hmac_sha256_tv = (void *) tvmem;
-
-	for (i = 0; i < HMAC_SHA256_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-		memset(result, 0, sizeof (result));
-
-		p = hmac_sha256_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = strlen(hmac_sha256_tv[i].plaintext);
-
-		klen = strlen(hmac_sha256_tv[i].key);
-	
-		hexdump(hmac_sha256_tv[i].key, strlen(hmac_sha256_tv[i].key));
-		crypto_hmac(tfm, hmac_sha256_tv[i].key, &klen, sg, 1, result);
-		hexdump(result, crypto_tfm_alg_digestsize(tfm));
-		printk("%s\n",
-		       memcmp(result, hmac_sha256_tv[i].digest,
-		       crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
-	}
-
-out:
-	crypto_free_tfm(tfm);
-}
-
-#endif	/* CONFIG_CRYPTO_HMAC */
-
-static void
-test_md4(void)
-{
-	char *p;
-	unsigned int i;
-	struct scatterlist sg[1];
-	char result[128];
-	struct crypto_tfm *tfm;
-	struct md4_testvec *md4_tv;
-	unsigned int tsize;
-
-	printk("\ntesting md4\n");
-
-	tsize = sizeof (md4_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, md4_tv_template, tsize);
-	md4_tv = (void *) tvmem;
-
-	tfm = crypto_alloc_tfm("md4", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for md4\n");
-		return;
-	}
-
-	for (i = 0; i < MD4_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-		memset(result, 0, sizeof (result));
-
-		p = md4_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = strlen(md4_tv[i].plaintext);
-
-		crypto_digest_digest(tfm, sg, 1, result);
-
-		hexdump(result, crypto_tfm_alg_digestsize(tfm));
-		printk("%s\n",
-		       memcmp(result, md4_tv[i].digest,
-			      crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-		       "pass");
-	}
-
-	crypto_free_tfm(tfm);
-}
-
-static void
-test_sha1(void)
-{
-	char *p;
-	unsigned int i;
-	struct crypto_tfm *tfm;
-	struct sha1_testvec *sha1_tv;
-	struct scatterlist sg[2];
-	unsigned int tsize;
-	char result[SHA1_DIGEST_SIZE];
-
-	printk("\ntesting sha1\n");
-
-	tsize = sizeof (sha1_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, sha1_tv_template, tsize);
-	sha1_tv = (void *) tvmem;
-
-	tfm = crypto_alloc_tfm("sha1", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for sha1\n");
-		return;
-	}
-
-	for (i = 0; i < SHA1_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-		memset(result, 0, sizeof (result));
-
-		p = sha1_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = strlen(sha1_tv[i].plaintext);
-
-		crypto_digest_init(tfm);
-		crypto_digest_update(tfm, sg, 1);
-		crypto_digest_final(tfm, result);
-
-		hexdump(result, crypto_tfm_alg_digestsize(tfm));
-		printk("%s\n",
-		       memcmp(result, sha1_tv[i].digest,
-			      crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-		       "pass");
-	}
-
-	printk("\ntesting sha1 across pages\n");
-
-	/* setup the dummy buffer first */
-	memset(xbuf, 0, XBUFSIZE);
-	memcpy(&xbuf[IDX1], "abcdbcdecdefdefgefghfghighij", 28);
-	memcpy(&xbuf[IDX2], "hijkijkljklmklmnlmnomnopnopq", 28);
-
-	p = &xbuf[IDX1];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 28;
-
-	p = &xbuf[IDX2];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 28;
-
-	memset(result, 0, sizeof (result));
-	crypto_digest_digest(tfm, sg, 2, result);
-	hexdump(result, crypto_tfm_alg_digestsize(tfm));
-	printk("%s\n",
-	       memcmp(result, sha1_tv[1].digest,
-		      crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
-	crypto_free_tfm(tfm);
-}
-
-static void
-test_sha256(void)
-{
-	char *p;
-	unsigned int i;
-	struct crypto_tfm *tfm;
-	struct sha256_testvec *sha256_tv;
-	struct scatterlist sg[2];
-	unsigned int tsize;
-	char result[SHA256_DIGEST_SIZE];
-
-	printk("\ntesting sha256\n");
-
-	tsize = sizeof (sha256_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, sha256_tv_template, tsize);
-	sha256_tv = (void *) tvmem;
-
-	tfm = crypto_alloc_tfm("sha256", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for sha256\n");
-		return;
-	}
-
-	for (i = 0; i < SHA256_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-		memset(result, 0, sizeof (result));
-
-		p = sha256_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = strlen(sha256_tv[i].plaintext);
-
-		crypto_digest_init(tfm);
-		crypto_digest_update(tfm, sg, 1);
-		crypto_digest_final(tfm, result);
-
-		hexdump(result, crypto_tfm_alg_digestsize(tfm));
-		printk("%s\n",
-		       memcmp(result, sha256_tv[i].digest,
-			      crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-		       "pass");
-	}
-
-	printk("\ntesting sha256 across pages\n");
-
-	/* setup the dummy buffer first */
-	memset(xbuf, 0, XBUFSIZE);
-	memcpy(&xbuf[IDX1], "abcdbcdecdefdefgefghfghighij", 28);
-	memcpy(&xbuf[IDX2], "hijkijkljklmklmnlmnomnopnopq", 28);
-
-	p = &xbuf[IDX1];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 28;
-
-	p = &xbuf[IDX2];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 28;
-
-	memset(result, 0, sizeof (result));
-	crypto_digest_digest(tfm, sg, 2, result);
-	hexdump(result, crypto_tfm_alg_digestsize(tfm));
-	printk("%s\n",
-	       memcmp(result, sha256_tv[1].digest,
-		      crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
-		     
-	crypto_free_tfm(tfm);
-}
-
-static void
-test_sha384(void)
-{
-	char *p;
-	unsigned int i;
-	struct crypto_tfm *tfm;
-	struct sha384_testvec *sha384_tv;
-	struct scatterlist sg[2];
-	unsigned int tsize;
-	char result[SHA384_DIGEST_SIZE];
-
-	printk("\ntesting sha384\n");
-
-	tsize = sizeof (sha384_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, sha384_tv_template, tsize);
-	sha384_tv = (void *) tvmem;
-
-	tfm = crypto_alloc_tfm("sha384", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for sha384\n");
-		return;
-	}
-
-	for (i = 0; i < SHA384_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-		memset(result, 0, sizeof (result));
-
-		p = sha384_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = strlen(sha384_tv[i].plaintext);
-
-		crypto_digest_init(tfm);
-		crypto_digest_update(tfm, sg, 1);
-		crypto_digest_final(tfm, result);
-
-		hexdump(result, crypto_tfm_alg_digestsize(tfm));
-		printk("%s\n",
-		       memcmp(result, sha384_tv[i].digest,
-			      crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-		       "pass");
-	}
-
-	crypto_free_tfm(tfm);
-}
-
-static void
-test_sha512(void)
-{
-	char *p;
-	unsigned int i;
-	struct crypto_tfm *tfm;
-	struct sha512_testvec *sha512_tv;
-	struct scatterlist sg[2];
-	unsigned int tsize;
-	char result[SHA512_DIGEST_SIZE];
-
-	printk("\ntesting sha512\n");
-
-	tsize = sizeof (sha512_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, sha512_tv_template, tsize);
-	sha512_tv = (void *) tvmem;
-
-	tfm = crypto_alloc_tfm("sha512", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for sha512\n");
-		return;
-	}
-
-	for (i = 0; i < SHA512_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-		memset(result, 0, sizeof (result));
-
-		p = sha512_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = strlen(sha512_tv[i].plaintext);
-
-		crypto_digest_init(tfm);
-		crypto_digest_update(tfm, sg, 1);
-		crypto_digest_final(tfm, result);
-
-		hexdump(result, crypto_tfm_alg_digestsize(tfm));
-		printk("%s\n",
-		       memcmp(result, sha512_tv[i].digest,
-			      crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-		       "pass");
-	}
-
-	crypto_free_tfm(tfm);
-}
-
-void
-test_des(void)
-{
-	unsigned int ret, i, len;
-	unsigned int tsize;
-	char *p, *q;
-	struct crypto_tfm *tfm;
-	char *key;
-	char res[8];
-	struct des_tv *des_tv;
-	struct scatterlist sg[8];
-
-	printk("\ntesting des encryption\n");
-
-	tsize = sizeof (des_enc_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, des_enc_tv_template, tsize);
-	des_tv = (void *) tvmem;
-
-	tfm = crypto_alloc_tfm("des", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for des (default ecb)\n");
-		return;
-	}
-
-	for (i = 0; i < DES_ENC_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-
-		key = des_tv[i].key;
-		tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY;
-
-		ret = crypto_cipher_setkey(tfm, key, 8);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!des_tv[i].fail)
-				goto out;
-		}
-
-		len = des_tv[i].len;
-
-		p = des_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = len;
-		ret = crypto_cipher_encrypt(tfm, sg, sg, len);
-		if (ret) {
-			printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, len);
-
-		printk("%s\n",
-		       memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
-
-	}
-
-	printk("\ntesting des ecb encryption across pages\n");
-
-	i = 5;
-	key = des_tv[i].key;
-	tfm->crt_flags = 0;
-
-	hexdump(key, 8);
-
-	ret = crypto_cipher_setkey(tfm, key, 8);
-	if (ret) {
-		printk("setkey() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	/* setup the dummy buffer first */
-	memset(xbuf, 0, sizeof (xbuf));
-	memcpy(&xbuf[IDX1], des_tv[i].plaintext, 8);
-	memcpy(&xbuf[IDX2], des_tv[i].plaintext + 8, 8);
-
-	p = &xbuf[IDX1];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 8;
-
-	p = &xbuf[IDX2];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 8;
-
-	ret = crypto_cipher_encrypt(tfm, sg, sg, 16);
-	if (ret) {
-		printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	printk("page 1\n");
-	q = kmap(sg[0].page) + sg[0].offset;
-	hexdump(q, 8);
-	printk("%s\n", memcmp(q, des_tv[i].result, 8) ? "fail" : "pass");
-
-	printk("page 2\n");
-	q = kmap(sg[1].page) + sg[1].offset;
-	hexdump(q, 8);
-	printk("%s\n", memcmp(q, des_tv[i].result + 8, 8) ? "fail" : "pass");
-
-	printk("\ntesting des ecb encryption chunking scenario A\n");
-
-	/*
-	 * Scenario A:
-	 * 
-	 *  F1       F2      F3
-	 *  [8 + 6]  [2 + 8] [8]
-	 *       ^^^^^^   ^
-	 *       a    b   c
-	 *
-	 * Chunking should begin at a, then end with b, and
-	 * continue encrypting at an offset of 2 until c.
-	 *
-	 */
-	i = 7;
-
-	key = des_tv[i].key;
-	tfm->crt_flags = 0;
-
-	ret = crypto_cipher_setkey(tfm, key, 8);
-	if (ret) {
-		printk("setkey() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	/* setup the dummy buffer first */
-	memset(xbuf, 0, sizeof (xbuf));
-
-	/* Frag 1: 8 + 6 */
-	memcpy(&xbuf[IDX3], des_tv[i].plaintext, 14);
-
-	/* Frag 2: 2 + 8 */
-	memcpy(&xbuf[IDX4], des_tv[i].plaintext + 14, 10);
-
-	/* Frag 3: 8 */
-	memcpy(&xbuf[IDX5], des_tv[i].plaintext + 24, 8);
-
-	p = &xbuf[IDX3];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 14;
-
-	p = &xbuf[IDX4];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 10;
-
-	p = &xbuf[IDX5];
-	sg[2].page = virt_to_page(p);
-	sg[2].offset = offset_in_page(p);
-	sg[2].length = 8;
-
-	ret = crypto_cipher_encrypt(tfm, sg, sg, 32);
-
-	if (ret) {
-		printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	printk("page 1\n");
-	q = kmap(sg[0].page) + sg[0].offset;
-	hexdump(q, 14);
-	printk("%s\n", memcmp(q, des_tv[i].result, 14) ? "fail" : "pass");
-
-	printk("page 2\n");
-	q = kmap(sg[1].page) + sg[1].offset;
-	hexdump(q, 10);
-	printk("%s\n", memcmp(q, des_tv[i].result + 14, 10) ? "fail" : "pass");
-
-	printk("page 3\n");
-	q = kmap(sg[2].page) + sg[2].offset;
-	hexdump(q, 8);
-	printk("%s\n", memcmp(q, des_tv[i].result + 24, 8) ? "fail" : "pass");
-
-	printk("\ntesting des ecb encryption chunking scenario B\n");
-
-	/*
-	 * Scenario B:
-	 * 
-	 *  F1  F2  F3  F4
-	 *  [2] [1] [3] [2 + 8 + 8]
-	 */
-	i = 7;
-
-	key = des_tv[i].key;
-	tfm->crt_flags = 0;
-
-	ret = crypto_cipher_setkey(tfm, key, 8);
-	if (ret) {
-		printk("setkey() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	/* setup the dummy buffer first */
-	memset(xbuf, 0, sizeof (xbuf));
-
-	/* Frag 1: 2 */
-	memcpy(&xbuf[IDX3], des_tv[i].plaintext, 2);
-
-	/* Frag 2: 1 */
-	memcpy(&xbuf[IDX4], des_tv[i].plaintext + 2, 1);
-
-	/* Frag 3: 3 */
-	memcpy(&xbuf[IDX5], des_tv[i].plaintext + 3, 3);
-
-	/* Frag 4: 2 + 8 + 8 */
-	memcpy(&xbuf[IDX6], des_tv[i].plaintext + 6, 18);
-
-	p = &xbuf[IDX3];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 2;
-
-	p = &xbuf[IDX4];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 1;
-
-	p = &xbuf[IDX5];
-	sg[2].page = virt_to_page(p);
-	sg[2].offset = offset_in_page(p);
-	sg[2].length = 3;
-
-	p = &xbuf[IDX6];
-	sg[3].page = virt_to_page(p);
-	sg[3].offset = offset_in_page(p);
-	sg[3].length = 18;
-
-	ret = crypto_cipher_encrypt(tfm, sg, sg, 24);
-
-	if (ret) {
-		printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	printk("page 1\n");
-	q = kmap(sg[0].page) + sg[0].offset;
-	hexdump(q, 2);
-	printk("%s\n", memcmp(q, des_tv[i].result, 2) ? "fail" : "pass");
-
-	printk("page 2\n");
-	q = kmap(sg[1].page) + sg[1].offset;
-	hexdump(q, 1);
-	printk("%s\n", memcmp(q, des_tv[i].result + 2, 1) ? "fail" : "pass");
-
-	printk("page 3\n");
-	q = kmap(sg[2].page) + sg[2].offset;
-	hexdump(q, 3);
-	printk("%s\n", memcmp(q, des_tv[i].result + 3, 3) ? "fail" : "pass");
-
-	printk("page 4\n");
-	q = kmap(sg[3].page) + sg[3].offset;
-	hexdump(q, 18);
-	printk("%s\n", memcmp(q, des_tv[i].result + 6, 18) ? "fail" : "pass");
-
-	printk("\ntesting des ecb encryption chunking scenario C\n");
-
-	/*
-	 * Scenario B:
-	 * 
-	 *  F1  F2  F3  F4  F5
-	 *  [2] [2] [2] [2] [8]
-	 */
-	i = 7;
-
-	key = des_tv[i].key;
-	tfm->crt_flags = 0;
-
-	ret = crypto_cipher_setkey(tfm, key, 8);
-	if (ret) {
-		printk("setkey() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	/* setup the dummy buffer first */
-	memset(xbuf, 0, sizeof (xbuf));
-
-	/* Frag 1: 2 */
-	memcpy(&xbuf[IDX3], des_tv[i].plaintext, 2);
-
-	/* Frag 2: 2 */
-	memcpy(&xbuf[IDX4], des_tv[i].plaintext + 2, 2);
-
-	/* Frag 3: 2 */
-	memcpy(&xbuf[IDX5], des_tv[i].plaintext + 4, 2);
-
-	/* Frag 4: 2 */
-	memcpy(&xbuf[IDX6], des_tv[i].plaintext + 6, 2);
-
-	/* Frag 5: 8 */
-	memcpy(&xbuf[IDX7], des_tv[i].plaintext + 8, 8);
-
-	p = &xbuf[IDX3];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 2;
-
-	p = &xbuf[IDX4];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 2;
-
-	p = &xbuf[IDX5];
-	sg[2].page = virt_to_page(p);
-	sg[2].offset = offset_in_page(p);
-	sg[2].length = 2;
-
-	p = &xbuf[IDX6];
-	sg[3].page = virt_to_page(p);
-	sg[3].offset = offset_in_page(p);
-	sg[3].length = 2;
-
-	p = &xbuf[IDX7];
-	sg[4].page = virt_to_page(p);
-	sg[4].offset = offset_in_page(p);
-	sg[4].length = 8;
-
-	ret = crypto_cipher_encrypt(tfm, sg, sg, 16);
-
-	if (ret) {
-		printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	printk("page 1\n");
-	q = kmap(sg[0].page) + sg[0].offset;
-	hexdump(q, 2);
-	printk("%s\n", memcmp(q, des_tv[i].result, 2) ? "fail" : "pass");
-
-	printk("page 2\n");
-	q = kmap(sg[1].page) + sg[1].offset;
-	hexdump(q, 2);
-	printk("%s\n", memcmp(q, des_tv[i].result + 2, 2) ? "fail" : "pass");
-
-	printk("page 3\n");
-	q = kmap(sg[2].page) + sg[2].offset;
-	hexdump(q, 2);
-	printk("%s\n", memcmp(q, des_tv[i].result + 4, 2) ? "fail" : "pass");
-
-	printk("page 4\n");
-	q = kmap(sg[3].page) + sg[3].offset;
-	hexdump(q, 2);
-	printk("%s\n", memcmp(q, des_tv[i].result + 6, 2) ? "fail" : "pass");
-
-	printk("page 5\n");
-	q = kmap(sg[4].page) + sg[4].offset;
-	hexdump(q, 8);
-	printk("%s\n", memcmp(q, des_tv[i].result + 8, 8) ? "fail" : "pass");
-
-	printk("\ntesting des ecb encryption chunking scenario D\n");
-
-	/*
-	 * Scenario D, torture test, one byte per frag.
-	 */
-	i = 7;
-	key = des_tv[i].key;
-	tfm->crt_flags = 0;
-
-	ret = crypto_cipher_setkey(tfm, key, 8);
-	if (ret) {
-		printk("setkey() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	/* setup the dummy buffer first */
-	memset(xbuf, 0, XBUFSIZE);
-
-	xbuf[IDX1] = des_tv[i].plaintext[0];
-	xbuf[IDX2] = des_tv[i].plaintext[1];
-	xbuf[IDX3] = des_tv[i].plaintext[2];
-	xbuf[IDX4] = des_tv[i].plaintext[3];
-	xbuf[IDX5] = des_tv[i].plaintext[4];
-	xbuf[IDX6] = des_tv[i].plaintext[5];
-	xbuf[IDX7] = des_tv[i].plaintext[6];
-	xbuf[IDX8] = des_tv[i].plaintext[7];
-
-	p = &xbuf[IDX1];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 1;
-
-	p = &xbuf[IDX2];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 1;
-
-	p = &xbuf[IDX3];
-	sg[2].page = virt_to_page(p);
-	sg[2].offset = offset_in_page(p);
-	sg[2].length = 1;
-
-	p = &xbuf[IDX4];
-	sg[3].page = virt_to_page(p);
-	sg[3].offset = offset_in_page(p);
-	sg[3].length = 1;
-
-	p = &xbuf[IDX5];
-	sg[4].page = virt_to_page(p);
-	sg[4].offset = offset_in_page(p);
-	sg[4].length = 1;
-
-	p = &xbuf[IDX6];
-	sg[5].page = virt_to_page(p);
-	sg[5].offset = offset_in_page(p);
-	sg[5].length = 1;
-
-	p = &xbuf[IDX7];
-	sg[6].page = virt_to_page(p);
-	sg[6].offset = offset_in_page(p);
-	sg[6].length = 1;
-
-	p = &xbuf[IDX8];
-	sg[7].page = virt_to_page(p);
-	sg[7].offset = offset_in_page(p);
-	sg[7].length = 1;
-
-	ret = crypto_cipher_encrypt(tfm, sg, sg, 8);
-	if (ret) {
-		printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	for (i = 0; i < 8; i++)
-		res[i] = *(char *) (kmap(sg[i].page) + sg[i].offset);
-
-	hexdump(res, 8);
-	printk("%s\n", memcmp(res, des_tv[7].result, 8) ? "fail" : "pass");
-
-	printk("\ntesting des decryption\n");
-
-	tsize = sizeof (des_dec_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-	memcpy(tvmem, des_dec_tv_template, tsize);
-	des_tv = (void *) tvmem;
-
-	for (i = 0; i < DES_DEC_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-
-		key = des_tv[i].key;
-
-		tfm->crt_flags = 0;
-		ret = crypto_cipher_setkey(tfm, key, 8);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		len = des_tv[i].len;
-
-		p = des_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = len;
-
-		ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("des_decrypt() failed flags=%x\n",
-			       tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, len);
-
-		printk("%s\n",
-		       memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
-
-	}
-
-	printk("\ntesting des ecb decryption across pages\n");
-
-	i = 6;
-
-	key = des_tv[i].key;
-	tfm->crt_flags = 0;
-
-	ret = crypto_cipher_setkey(tfm, key, 8);
-	if (ret) {
-		printk("setkey() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	/* setup the dummy buffer first */
-	memset(xbuf, 0, sizeof (xbuf));
-	memcpy(&xbuf[IDX1], des_tv[i].plaintext, 8);
-	memcpy(&xbuf[IDX2], des_tv[i].plaintext + 8, 8);
-
-	p = &xbuf[IDX1];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 8;
-
-	p = &xbuf[IDX2];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 8;
-
-	ret = crypto_cipher_decrypt(tfm, sg, sg, 16);
-	if (ret) {
-		printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	printk("page 1\n");
-	q = kmap(sg[0].page) + sg[0].offset;
-	hexdump(q, 8);
-	printk("%s\n", memcmp(q, des_tv[i].result, 8) ? "fail" : "pass");
-
-	printk("page 2\n");
-	q = kmap(sg[1].page) + sg[1].offset;
-	hexdump(q, 8);
-	printk("%s\n", memcmp(q, des_tv[i].result + 8, 8) ? "fail" : "pass");
-
-	/*
-	 * Scenario E:
-	 * 
-	 *  F1   F2      F3
-	 *  [3]  [5 + 7] [1]
-	 *
-	 */
-	printk("\ntesting des ecb decryption chunking scenario E\n");
-	i = 2;
-
-	key = des_tv[i].key;
-	tfm->crt_flags = 0;
-
-	ret = crypto_cipher_setkey(tfm, key, 8);
-	if (ret) {
-		printk("setkey() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	/* setup the dummy buffer first */
-	memset(xbuf, 0, sizeof (xbuf));
-
-	memcpy(&xbuf[IDX1], des_tv[i].plaintext, 3);
-	memcpy(&xbuf[IDX2], des_tv[i].plaintext + 3, 12);
-	memcpy(&xbuf[IDX3], des_tv[i].plaintext + 15, 1);
-
-	p = &xbuf[IDX1];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 3;
-
-	p = &xbuf[IDX2];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 12;
-
-	p = &xbuf[IDX3];
-	sg[2].page = virt_to_page(p);
-	sg[2].offset = offset_in_page(p);
-	sg[2].length = 1;
-
-	ret = crypto_cipher_decrypt(tfm, sg, sg, 16);
-
-	if (ret) {
-		printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	printk("page 1\n");
-	q = kmap(sg[0].page) + sg[0].offset;
-	hexdump(q, 3);
-	printk("%s\n", memcmp(q, des_tv[i].result, 3) ? "fail" : "pass");
-
-	printk("page 2\n");
-	q = kmap(sg[1].page) + sg[1].offset;
-	hexdump(q, 12);
-	printk("%s\n", memcmp(q, des_tv[i].result + 3, 12) ? "fail" : "pass");
-
-	printk("page 3\n");
-	q = kmap(sg[2].page) + sg[2].offset;
-	hexdump(q, 1);
-	printk("%s\n", memcmp(q, des_tv[i].result + 15, 1) ? "fail" : "pass");
-
-	crypto_free_tfm(tfm);
-
-	tfm = crypto_alloc_tfm("des", CRYPTO_TFM_MODE_CBC);
-	if (tfm == NULL) {
-		printk("failed to load transform for des cbc\n");
-		return;
-	}
-
-	printk("\ntesting des cbc encryption\n");
-
-	tsize = sizeof (des_cbc_enc_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-	memcpy(tvmem, des_cbc_enc_tv_template, tsize);
-	des_tv = (void *) tvmem;
-
-	crypto_cipher_set_iv(tfm, des_tv[i].iv, crypto_tfm_alg_ivsize(tfm));
-	crypto_cipher_get_iv(tfm, res, crypto_tfm_alg_ivsize(tfm));
-	
-	if (memcmp(res, des_tv[i].iv, sizeof(res))) {
-		printk("crypto_cipher_[set|get]_iv() failed\n");
-		goto out;
-	}
-	
-	for (i = 0; i < DES_CBC_ENC_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-
-		key = des_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, 8);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		len = des_tv[i].len;
-		p = des_tv[i].plaintext;
-
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = len;
-
-		crypto_cipher_set_iv(tfm, des_tv[i].iv,
-				     crypto_tfm_alg_ivsize(tfm));
-
-		ret = crypto_cipher_encrypt(tfm, sg, sg, len);
-		if (ret) {
-			printk("des_cbc_encrypt() failed flags=%x\n",
-			       tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, len);
-
-		printk("%s\n",
-		       memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
-	}
-
-	crypto_free_tfm(tfm);
-
-	/*
-	 * Scenario F:
-	 * 
-	 *  F1       F2      
-	 *  [8 + 5]  [3 + 8]
-	 *
-	 */
-	printk("\ntesting des cbc encryption chunking scenario F\n");
-	i = 4;
-
-	tfm = crypto_alloc_tfm("des", CRYPTO_TFM_MODE_CBC);
-	if (tfm == NULL) {
-		printk("failed to load transform for CRYPTO_ALG_DES_CCB\n");
-		return;
-	}
-
-	tfm->crt_flags = 0;
-	key = des_tv[i].key;
-
-	ret = crypto_cipher_setkey(tfm, key, 8);
-	if (ret) {
-		printk("setkey() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	/* setup the dummy buffer first */
-	memset(xbuf, 0, sizeof (xbuf));
-
-	memcpy(&xbuf[IDX1], des_tv[i].plaintext, 13);
-	memcpy(&xbuf[IDX2], des_tv[i].plaintext + 13, 11);
-
-	p = &xbuf[IDX1];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 13;
-
-	p = &xbuf[IDX2];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 11;
-
-	crypto_cipher_set_iv(tfm, des_tv[i].iv, crypto_tfm_alg_ivsize(tfm));
-
-	ret = crypto_cipher_encrypt(tfm, sg, sg, 24);
-	if (ret) {
-		printk("des_cbc_decrypt() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	printk("page 1\n");
-	q = kmap(sg[0].page) + sg[0].offset;
-	hexdump(q, 13);
-	printk("%s\n", memcmp(q, des_tv[i].result, 13) ? "fail" : "pass");
-
-	printk("page 2\n");
-	q = kmap(sg[1].page) + sg[1].offset;
-	hexdump(q, 11);
-	printk("%s\n", memcmp(q, des_tv[i].result + 13, 11) ? "fail" : "pass");
-
-	tsize = sizeof (des_cbc_dec_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-	memcpy(tvmem, des_cbc_dec_tv_template, tsize);
-	des_tv = (void *) tvmem;
-
-	printk("\ntesting des cbc decryption\n");
-
-	for (i = 0; i < DES_CBC_DEC_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-
-		tfm->crt_flags = 0;
-		key = des_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, 8);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		len = des_tv[i].len;
-		p = des_tv[i].plaintext;
-
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = len;
-
-		crypto_cipher_set_iv(tfm, des_tv[i].iv,
-				      crypto_tfm_alg_blocksize(tfm));
-
-		ret = crypto_cipher_decrypt(tfm, sg, sg, len);
-		if (ret) {
-			printk("des_cbc_decrypt() failed flags=%x\n",
-			       tfm->crt_flags);
-			goto out;
-		}
-
-		hexdump(tfm->crt_cipher.cit_iv, 8);
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, len);
-
-		printk("%s\n",
-		       memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
-	}
-
-	/*
-	 * Scenario G:
-	 * 
-	 *  F1   F2      
-	 *  [4]  [4]
-	 *
-	 */
-	printk("\ntesting des cbc decryption chunking scenario G\n");
-	i = 3;
-
-	tfm->crt_flags = 0;
-	key = des_tv[i].key;
-
-	ret = crypto_cipher_setkey(tfm, key, 8);
-	if (ret) {
-		printk("setkey() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	/* setup the dummy buffer first */
-	memset(xbuf, 0, sizeof (xbuf));
-	memcpy(&xbuf[IDX1], des_tv[i].plaintext, 4);
-	memcpy(&xbuf[IDX2], des_tv[i].plaintext + 4, 4);
-
-	p = &xbuf[IDX1];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 4;
-
-	p = &xbuf[IDX2];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 4;
-
-	crypto_cipher_set_iv(tfm, des_tv[i].iv, crypto_tfm_alg_ivsize(tfm));
-
-	ret = crypto_cipher_decrypt(tfm, sg, sg, 8);
-	if (ret) {
-		printk("des_cbc_decrypt() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	printk("page 1\n");
-	q = kmap(sg[0].page) + sg[0].offset;
-	hexdump(q, 4);
-	printk("%s\n", memcmp(q, des_tv[i].result, 4) ? "fail" : "pass");
-
-	printk("page 2\n");
-	q = kmap(sg[1].page) + sg[1].offset;
-	hexdump(q, 4);
-	printk("%s\n", memcmp(q, des_tv[i].result + 4, 4) ? "fail" : "pass");
-
-      out:
-	crypto_free_tfm(tfm);
-}
-
-void
-test_des3_ede(void)
-{
-	unsigned int ret, i, len;
-	unsigned int tsize;
-	char *p, *q;
-	struct crypto_tfm *tfm;
-	char *key;
-	/*char res[8]; */
-	struct des_tv *des_tv;
-	struct scatterlist sg[8];
-
-	printk("\ntesting des3 ede encryption\n");
-
-	tsize = sizeof (des3_ede_enc_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, des3_ede_enc_tv_template, tsize);
-	des_tv = (void *) tvmem;
-
-	tfm = crypto_alloc_tfm("des3_ede", CRYPTO_TFM_MODE_ECB);
-	if (tfm == NULL) {
-		printk("failed to load transform for 3des ecb\n");
-		return;
-	}
-
-	for (i = 0; i < DES3_EDE_ENC_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-
-		key = des_tv[i].key;
-		ret = crypto_cipher_setkey(tfm, key, 24);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!des_tv[i].fail)
-				goto out;
-		}
-
-		len = des_tv[i].len;
-
-		p = des_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = len;
-		ret = crypto_cipher_encrypt(tfm, sg, sg, len);
-		if (ret) {
-			printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, len);
-
-		printk("%s\n",
-		       memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
-	}
-
-	printk("\ntesting des3 ede decryption\n");
-
-	tsize = sizeof (des3_ede_dec_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, des3_ede_dec_tv_template, tsize);
-	des_tv = (void *) tvmem;
-
-	for (i = 0; i < DES3_EDE_DEC_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-
-		key = des_tv[i].key;
-		ret = crypto_cipher_setkey(tfm, key, 24);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!des_tv[i].fail)
-				goto out;
-		}
-
-		len = des_tv[i].len;
-
-		p = des_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = len;
-		ret = crypto_cipher_decrypt(tfm, sg, sg, len);
-		if (ret) {
-			printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, len);
-
-		printk("%s\n",
-		       memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
-	}
-
-      out:
-	crypto_free_tfm(tfm);
-}
-
-void
-test_blowfish(void)
-{
-	unsigned int ret, i;
-	unsigned int tsize;
-	char *p, *q;
-	struct crypto_tfm *tfm;
-	char *key;
-	struct bf_tv *bf_tv;
-	struct scatterlist sg[1];
-
-	printk("\ntesting blowfish encryption\n");
-
-	tsize = sizeof (bf_enc_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, bf_enc_tv_template, tsize);
-	bf_tv = (void *) tvmem;
-
-	tfm = crypto_alloc_tfm("blowfish", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for blowfish (default ecb)\n");
-		return;
-	}
-
-	for (i = 0; i < BF_ENC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n",
-			i + 1, bf_tv[i].keylen * 8);
-		key = bf_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, bf_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!bf_tv[i].fail)
-				goto out;
-		}
-
-		p = bf_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = bf_tv[i].plen;
-		ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, bf_tv[i].rlen);
-
-		printk("%s\n", memcmp(q, bf_tv[i].result, bf_tv[i].rlen) ?
-			"fail" : "pass");
-	}
-
-	printk("\ntesting blowfish decryption\n");
-
-	tsize = sizeof (bf_dec_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, bf_dec_tv_template, tsize);
-	bf_tv = (void *) tvmem;
-
-	for (i = 0; i < BF_DEC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n",
-			i + 1, bf_tv[i].keylen * 8);
-		key = bf_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, bf_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!bf_tv[i].fail)
-				goto out;
-		}
-
-		p = bf_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = bf_tv[i].plen;
-		ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, bf_tv[i].rlen);
-
-		printk("%s\n", memcmp(q, bf_tv[i].result, bf_tv[i].rlen) ?
-			"fail" : "pass");
-	}
-	
-	crypto_free_tfm(tfm);
-	
-	tfm = crypto_alloc_tfm("blowfish", CRYPTO_TFM_MODE_CBC);
-	if (tfm == NULL) {
-		printk("failed to load transform for blowfish cbc\n");
-		return;
-	}
-
-	printk("\ntesting blowfish cbc encryption\n");
-
-	tsize = sizeof (bf_cbc_enc_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		goto out;
-	}
-	memcpy(tvmem, bf_cbc_enc_tv_template, tsize);
-	bf_tv = (void *) tvmem;
-
-	for (i = 0; i < BF_CBC_ENC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n",
-			i + 1, bf_tv[i].keylen * 8);
-
-		key = bf_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, bf_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		p = bf_tv[i].plaintext;
-
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length =  bf_tv[i].plen;
-
-		crypto_cipher_set_iv(tfm, bf_tv[i].iv,
-				     crypto_tfm_alg_ivsize(tfm));
-
-		ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("blowfish_cbc_encrypt() failed flags=%x\n",
-			       tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, bf_tv[i].rlen);
-
-		printk("%s\n", memcmp(q, bf_tv[i].result, bf_tv[i].rlen)
-			? "fail" : "pass");
-	}
-
-	printk("\ntesting blowfish cbc decryption\n");
-
-	tsize = sizeof (bf_cbc_dec_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		goto out;
-	}
-	memcpy(tvmem, bf_cbc_dec_tv_template, tsize);
-	bf_tv = (void *) tvmem;
-
-	for (i = 0; i < BF_CBC_ENC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n",
-			i + 1, bf_tv[i].keylen * 8);
-		key = bf_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, bf_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		p = bf_tv[i].plaintext;
-
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length =  bf_tv[i].plen;
-
-		crypto_cipher_set_iv(tfm, bf_tv[i].iv,
-				     crypto_tfm_alg_ivsize(tfm));
-
-		ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("blowfish_cbc_decrypt() failed flags=%x\n",
-			       tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, bf_tv[i].rlen);
-
-		printk("%s\n", memcmp(q, bf_tv[i].result, bf_tv[i].rlen)
-			? "fail" : "pass");
-	}
-
-out:
-	crypto_free_tfm(tfm);
-}
-
-
-void
-test_twofish(void)
-{
-	unsigned int ret, i;
-	unsigned int tsize;
-	char *p, *q;
-	struct crypto_tfm *tfm;
-	char *key;
-	struct tf_tv *tf_tv;
-	struct scatterlist sg[1];
-
-	printk("\ntesting twofish encryption\n");
-
-	tsize = sizeof (tf_enc_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, tf_enc_tv_template, tsize);
-	tf_tv = (void *) tvmem;
-
-	tfm = crypto_alloc_tfm("twofish", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for blowfish (default ecb)\n");
-		return;
-	}
-
-	for (i = 0; i < TF_ENC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n",
-			i + 1, tf_tv[i].keylen * 8);
-		key = tf_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, tf_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!tf_tv[i].fail)
-				goto out;
-		}
-
-		p = tf_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = tf_tv[i].plen;
-		ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, tf_tv[i].rlen);
-
-		printk("%s\n", memcmp(q, tf_tv[i].result, tf_tv[i].rlen) ?
-			"fail" : "pass");
-	}
-
-	printk("\ntesting twofish decryption\n");
-
-	tsize = sizeof (tf_dec_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, tf_dec_tv_template, tsize);
-	tf_tv = (void *) tvmem;
-
-	for (i = 0; i < TF_DEC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n",
-			i + 1, tf_tv[i].keylen * 8);
-		key = tf_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, tf_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!tf_tv[i].fail)
-				goto out;
-		}
-
-		p = tf_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = tf_tv[i].plen;
-		ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, tf_tv[i].rlen);
-
-		printk("%s\n", memcmp(q, tf_tv[i].result, tf_tv[i].rlen) ?
-			"fail" : "pass");
-	}
-
-	crypto_free_tfm(tfm);
-	
-	tfm = crypto_alloc_tfm("twofish", CRYPTO_TFM_MODE_CBC);
-	if (tfm == NULL) {
-		printk("failed to load transform for twofish cbc\n");
-		return;
-	}
-
-	printk("\ntesting twofish cbc encryption\n");
-
-	tsize = sizeof (tf_cbc_enc_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		goto out;
-	}
-	memcpy(tvmem, tf_cbc_enc_tv_template, tsize);
-	tf_tv = (void *) tvmem;
-
-	for (i = 0; i < TF_CBC_ENC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n",
-			i + 1, tf_tv[i].keylen * 8);
-
-		key = tf_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, tf_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		p = tf_tv[i].plaintext;
-
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length =  tf_tv[i].plen;
-
-		crypto_cipher_set_iv(tfm, tf_tv[i].iv,
-				     crypto_tfm_alg_ivsize(tfm));
-
-		ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("blowfish_cbc_encrypt() failed flags=%x\n",
-			       tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, tf_tv[i].rlen);
-
-		printk("%s\n", memcmp(q, tf_tv[i].result, tf_tv[i].rlen)
-			? "fail" : "pass");
-	}
-
-	printk("\ntesting twofish cbc decryption\n");
-
-	tsize = sizeof (tf_cbc_dec_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		goto out;
-	}
-	memcpy(tvmem, tf_cbc_dec_tv_template, tsize);
-	tf_tv = (void *) tvmem;
-
-	for (i = 0; i < TF_CBC_DEC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n",
-			i + 1, tf_tv[i].keylen * 8);
+ *
+ * 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.
+ *
+ * 14 - 09 - 2003 
+ *	Rewritten by Kartikey Mahendra Bhatt
+ */
 
-		key = tf_tv[i].key;
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/mm.h>
+#include <linux/slab.h>
+#include <asm/scatterlist.h>
+#include <linux/string.h>
+#include <linux/crypto.h>
+#include <linux/highmem.h>
+#include "tcrypt.h"
 
-		ret = crypto_cipher_setkey(tfm, key, tf_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
+/*
+ * Need to kmalloc() memory for testing kmap().
+ */
+#define TVMEMSIZE	4096
+#define XBUFSIZE	32768
 
-		p = tf_tv[i].plaintext;
+/*
+ * Indexes into the xbuf to simulate cross-page access.
+ */
+#define IDX1		37
+#define IDX2		32400
+#define IDX3		1
+#define IDX4		8193
+#define IDX5		22222
+#define IDX6		17101
+#define IDX7		27333
+#define IDX8		3000
 
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length =  tf_tv[i].plen;
+/*
+* Used by test_cipher()
+*/
+#define ENCRYPT 1
+#define DECRYPT 0
+#define MODE_ECB 1
+#define MODE_CBC 0
 
-		crypto_cipher_set_iv(tfm, tf_tv[i].iv,
-				     crypto_tfm_alg_ivsize(tfm));
+static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
 
-		ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("blowfish_cbc_decrypt() failed flags=%x\n",
-			       tfm->crt_flags);
-			goto out;
-		}
+static int mode;
+static char *xbuf;
+static char *tvmem;
 
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, tf_tv[i].rlen);
+static char *check[] = {
+	"des", "md5", "des3_ede", "rot13", "sha1", "sha256", "blowfish",
+	"twofish", "serpent", "sha384", "sha512", "md4", "aes", "cast6", 
+	"deflate", NULL
+};
 
-		printk("%s\n", memcmp(q, tf_tv[i].result, tf_tv[i].rlen)
-			? "fail" : "pass");
-	}
+static void
+hexdump(unsigned char *buf, unsigned int len)
+{
+	while (len--)
+		printk("%02x", *buf++);
 
-out:	
-	crypto_free_tfm(tfm);
+	printk("\n");
 }
 
-void
-test_serpent(void)
+static void 
+test_hash (char * algo, struct hash_testvec * template, unsigned int tcount)
 {
-	unsigned int ret, i, tsize;
-	u8 *p, *q, *key;
-	struct crypto_tfm *tfm;
-	struct serpent_tv *serp_tv;
-	struct scatterlist sg[1];
-
-	printk("\ntesting serpent encryption\n");
+	char *p; 
+        unsigned int i, j, k, temp;
+        struct scatterlist sg[8];
+        char result[64];
+        struct crypto_tfm *tfm;
+        struct hash_testvec *hash_tv;
+        unsigned int tsize;
+	 
+        printk("\ntesting %s\n", algo);
 
-	tfm = crypto_alloc_tfm("serpent", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for serpent (default ecb)\n");
+	tsize = sizeof (struct hash_testvec);
+	tsize *= tcount;
+	
+	if (tsize > TVMEMSIZE) {
+		printk("template (%u) too big for tvmem (%u)\n", tsize, TVMEMSIZE);
 		return;
 	}
 
-	tsize = sizeof (serpent_enc_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
+	memcpy(tvmem, template, tsize);
+	hash_tv = (void *) tvmem;
+	tfm = crypto_alloc_tfm(algo, 0);
+	if (tfm == NULL) {
+		printk("failed to load transform for %s\n", algo);
 		return;
 	}
 
-	memcpy(tvmem, serpent_enc_tv_template, tsize);
-	serp_tv = (void *) tvmem;
-	for (i = 0; i < SERPENT_ENC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n", i + 1, serp_tv[i].keylen * 8);
-		key = serp_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, serp_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!serp_tv[i].fail)
-				goto out;
-		}
+	for (i = 0; i < tcount; i++) {
+		printk ("test %u:\n", i + 1);
+		memset (result, 0, 64);
 
-		p = serp_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = sizeof(serp_tv[i].plaintext);
-		ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
+		p = hash_tv[i].plaintext;
+		sg[0].page = virt_to_page (p);
+		sg[0].offset = offset_in_page (p);
+		sg[0].length = hash_tv[i].psize;
 
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, sizeof(serp_tv[i].result));
+		crypto_digest_init (tfm);
+		crypto_digest_update (tfm, sg, 1);
+		crypto_digest_final (tfm, result);
 
-		printk("%s\n", memcmp(q, serp_tv[i].result,
-			sizeof(serp_tv[i].result)) ? "fail" : "pass");
+		hexdump (result, crypto_tfm_alg_digestsize (tfm));
+		printk("%s\n",
+			memcmp(result, hash_tv[i].digest,
+				crypto_tfm_alg_digestsize(tfm)) ? "fail" :
+			"pass");
 	}
 
-	printk("\ntesting serpent decryption\n");
-
-	tsize = sizeof (serpent_dec_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
+	printk ("testing %s across pages\n", algo);
 
-	memcpy(tvmem, serpent_dec_tv_template, tsize);
-	serp_tv = (void *) tvmem;
-	for (i = 0; i < SERPENT_DEC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n", i + 1, serp_tv[i].keylen * 8);
-		key = serp_tv[i].key;
+	/* setup the dummy buffer first */
+        memset(xbuf, 0, XBUFSIZE);
 
-		ret = crypto_cipher_setkey(tfm, key, serp_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
+	j = 0;
+	for (i = 0; i < tcount; i++) {
+		if (hash_tv[i].np) {
+			j++;
+			printk ("test %u:\n", j);
+			memset (result, 0, 64);
 
-			if (!serp_tv[i].fail)
-				goto out;
-		}
+			temp = 0;
+			for (k = 0; k < hash_tv[i].np; k++) {
+				memcpy (&xbuf[IDX[k]], hash_tv[i].plaintext + temp, 
+						hash_tv[i].tap[k]);	
+				temp += hash_tv[i].tap[k];
+				p = &xbuf[IDX[k]];
+				sg[k].page = virt_to_page (p);
+				sg[k].offset = offset_in_page (p);
+				sg[k].length = hash_tv[i].tap[k];
+			}
 
-		p = serp_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = sizeof(serp_tv[i].plaintext);
-		ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
+			crypto_digest_digest (tfm, sg, hash_tv[i].np, result);
+			
+			hexdump (result, crypto_tfm_alg_digestsize (tfm));
+			printk("%s\n",
+				memcmp(result, hash_tv[i].digest,
+					crypto_tfm_alg_digestsize(tfm)) ? "fail" :
+				"pass");
 		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, sizeof(serp_tv[i].result));
-
-		printk("%s\n", memcmp(q, serp_tv[i].result,
-			sizeof(serp_tv[i].result)) ? "fail" : "pass");
 	}
-
-out:
-	crypto_free_tfm(tfm);
+	
+	crypto_free_tfm (tfm);
 }
 
+
+#ifdef CONFIG_CRYPTO_HMAC
+
 static void
-test_cast6(void)
+test_hmac(char *algo, struct hmac_testvec * template, unsigned int tcount)
 {
-	unsigned int ret, i, tsize;
-	u8 *p, *q, *key;
+	char *p;
+	unsigned int i, j, k, temp;
+	struct scatterlist sg[8];
+	char result[64];
 	struct crypto_tfm *tfm;
-	struct cast6_tv *cast_tv;
-	struct scatterlist sg[1];
+	struct hmac_testvec *hmac_tv;
+	unsigned int tsize, klen;
 
-	printk("\ntesting cast6 encryption\n");
-
-	tfm = crypto_alloc_tfm("cast6", 0);
+	tfm = crypto_alloc_tfm(algo, 0);
 	if (tfm == NULL) {
-		printk("failed to load transform for cast6 (default ecb)\n");
+		printk("failed to load transform for %s\n", algo);
 		return;
 	}
 
-	tsize = sizeof (cast6_enc_tv_template);
+	printk("\ntesting hmac_%s\n", algo);
+	
+	tsize = sizeof (struct hmac_testvec);
+	tsize *= tcount;
 	if (tsize > TVMEMSIZE) {
 		printk("template (%u) too big for tvmem (%u)\n", tsize,
 		       TVMEMSIZE);
-		return;
+		goto out;
 	}
 
-	memcpy(tvmem, cast6_enc_tv_template, tsize);
-	cast_tv = (void *) tvmem;
-	for (i = 0; i < CAST6_ENC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n", i + 1, cast_tv[i].keylen * 8);
-		key = cast_tv[i].key;
+	memcpy(tvmem, template, tsize);
+	hmac_tv = (void *) tvmem;
 
-		ret = crypto_cipher_setkey(tfm, key, cast_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!cast_tv[i].fail)
-				goto out;
-		}
+	for (i = 0; i < tcount; i++) {
+		printk("test %u:\n", i + 1);
+		memset(result, 0, sizeof (result));
 
-		p = cast_tv[i].plaintext;
+		p = hmac_tv[i].plaintext;
+		klen = hmac_tv[i].ksize;
 		sg[0].page = virt_to_page(p);
-		sg[0].offset = ((long) p & ~PAGE_MASK);
-		sg[0].length = sizeof(cast_tv[i].plaintext);
-		ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, sizeof(cast_tv[i].result));
-
-		printk("%s\n", memcmp(q, cast_tv[i].result,
-			sizeof(cast_tv[i].result)) ? "fail" : "pass");
-	}
+		sg[0].offset = offset_in_page(p);
+		sg[0].length = hmac_tv[i].psize;
 
-	printk("\ntesting cast6 decryption\n");
+		crypto_hmac(tfm, hmac_tv[i].key, &klen, sg, 1, result);
 
-	tsize = sizeof (cast6_dec_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
+		hexdump(result, crypto_tfm_alg_digestsize(tfm));
+		printk("%s\n",
+		       memcmp(result, hmac_tv[i].digest,
+			      crypto_tfm_alg_digestsize(tfm)) ? "fail" :
+		       "pass");
 	}
 
-	memcpy(tvmem, cast6_dec_tv_template, tsize);
-	cast_tv = (void *) tvmem;
-	for (i = 0; i < CAST6_DEC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n", i + 1, cast_tv[i].keylen * 8);
-		key = cast_tv[i].key;
+	printk("\ntesting hmac_%s across pages\n", algo);
 
-		ret = crypto_cipher_setkey(tfm, key, cast_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!cast_tv[i].fail)
-				goto out;
-		}
-
-		p = cast_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = ((long) p & ~PAGE_MASK);
-		sg[0].length = sizeof(cast_tv[i].plaintext);
-		ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
+	memset(xbuf, 0, XBUFSIZE);
+	
+	j = 0;
+	for (i = 0; i < tcount; i++) {
+		if (hmac_tv[i].np) {
+			j++;
+			printk ("test %u:\n",j);
+			memset (result, 0, 64);
+
+			temp = 0;
+			klen = hmac_tv[i].ksize;
+			for (k = 0; k < hmac_tv[i].np; k++) {
+				memcpy (&xbuf[IDX[k]], hmac_tv[i].plaintext + temp, 
+						hmac_tv[i].tap[k]);	
+				temp += hmac_tv[i].tap[k];
+				p = &xbuf[IDX[k]];
+				sg[k].page = virt_to_page (p);
+				sg[k].offset = offset_in_page (p);
+				sg[k].length = hmac_tv[i].tap[k];
+			}
+
+			crypto_hmac(tfm, hmac_tv[i].key, &klen, sg, hmac_tv[i].np, 
+					result);
+			hexdump(result, crypto_tfm_alg_digestsize(tfm));
+			
+			printk("%s\n",
+				memcmp(result, hmac_tv[i].digest,
+					crypto_tfm_alg_digestsize(tfm)) ? "fail" : 
+				"pass");
 		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, sizeof(cast_tv[i].result));
-
-		printk("%s\n", memcmp(q, cast_tv[i].result,
-			sizeof(cast_tv[i].result)) ? "fail" : "pass");
 	}
-
 out:
 	crypto_free_tfm(tfm);
 }
 
+#endif	/* CONFIG_CRYPTO_HMAC */
+
 void
-test_aes(void)
+test_cipher(char * algo, int mode, int enc, struct cipher_testvec * template, unsigned int tcount)
 {
-	unsigned int ret, i;
+	unsigned int ret, i, j, k, temp;
 	unsigned int tsize;
 	char *p, *q;
 	struct crypto_tfm *tfm;
 	char *key;
-	struct aes_tv *aes_tv;
-	struct scatterlist sg[1];
-
-	printk("\ntesting aes encryption\n");
-
-	tsize = sizeof (aes_enc_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, aes_enc_tv_template, tsize);
-	aes_tv = (void *) tvmem;
-
-	tfm = crypto_alloc_tfm("aes", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for aes (default ecb)\n");
-		return;
-	}
-
-	for (i = 0; i < AES_ENC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n",
-			i + 1, aes_tv[i].keylen * 8);
-		key = aes_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, aes_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!aes_tv[i].fail)
-				goto out;
-		}
+	struct cipher_testvec *cipher_tv;
+	struct scatterlist sg[8];
+	char e[11], m[4];
 
-		p = aes_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = aes_tv[i].plen;
-		ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
+	if (enc == ENCRYPT)
+	        strncpy(e, "encryption", 11);
+	else
+        	strncpy(e, "decryption", 11);
+	if (mode == MODE_ECB)
+        	strncpy(m, "ECB", 4);
+	else
+        	strncpy(m, "CBC", 4);
 
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, aes_tv[i].rlen);
+	printk("\ntesting %s %s %s \n", algo, m, e);
 
-		printk("%s\n", memcmp(q, aes_tv[i].result, aes_tv[i].rlen) ?
-			"fail" : "pass");
-	}
+	tsize = sizeof (struct cipher_testvec);	
+	tsize *= tcount;
 	
-	printk("\ntesting aes decryption\n");
-
-	tsize = sizeof (aes_dec_tv_template);
 	if (tsize > TVMEMSIZE) {
 		printk("template (%u) too big for tvmem (%u)\n", tsize,
 		       TVMEMSIZE);
 		return;
 	}
 
-	memcpy(tvmem, aes_dec_tv_template, tsize);
-	aes_tv = (void *) tvmem;
-
-	for (i = 0; i < AES_DEC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n",
-			i + 1, aes_tv[i].keylen * 8);
-		key = aes_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, aes_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!aes_tv[i].fail)
-				goto out;
-		}
-
-		p = aes_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = aes_tv[i].plen;
-		ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, aes_tv[i].rlen);
-
-		printk("%s\n", memcmp(q, aes_tv[i].result, aes_tv[i].rlen) ?
-			"fail" : "pass");
-	}
-
-out:
-	crypto_free_tfm(tfm);
-}
-
-void
-test_cast5(void)
-{
-	unsigned int ret, i, tsize;
-	u8 *p, *q, *key;
-	struct crypto_tfm *tfm;
-	struct cast5_tv *c5_tv;
-	struct scatterlist sg[1];
-
-	printk("\ntesting cast5 encryption\n");
+	memcpy(tvmem, template, tsize);
+	cipher_tv = (void *) tvmem;
 
-	tfm = crypto_alloc_tfm("cast5", 0);
+	if (mode) 
+		tfm = crypto_alloc_tfm (algo, 0);
+	else 
+		tfm = crypto_alloc_tfm (algo, CRYPTO_TFM_MODE_CBC);
+	
 	if (tfm == NULL) {
-		printk("failed to load transform for cast5 (default ecb)\n");
-		return;
-	}
-
-	tsize = sizeof (cast5_enc_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
+		printk("failed to load transform for %s %s\n", algo, m);
 		return;
 	}
+	
+	j = 0;
+	for (i = 0; i < tcount; i++) {
+		if (!(cipher_tv[i].np)) {
+			j++;	
+			printk("test %u (%d bit key):\n",
+			j, cipher_tv[i].klen * 8);
 
-	memcpy(tvmem, cast5_enc_tv_template, tsize);
-	c5_tv = (void *) tvmem;
-	for (i = 0; i < CAST5_ENC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n", i + 1, c5_tv[i].keylen * 8);
-		key = c5_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, c5_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
+			tfm->crt_flags = 0;
+			if (cipher_tv[i].wk) 
+				tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY;
+			key = cipher_tv[i].key;
+	
+			ret = crypto_cipher_setkey(tfm, key, cipher_tv[i].klen);
+			if (ret) {
+				printk("setkey() failed flags=%x\n", tfm->crt_flags);
+	
+				if (!cipher_tv[i].fail)
+					goto out;
+			}	
 
-			if (!c5_tv[i].fail)
+			p = cipher_tv[i].input;
+			sg[0].page = virt_to_page(p);
+			sg[0].offset = offset_in_page(p);
+			sg[0].length = cipher_tv[i].ilen;
+	
+			if (!mode) {
+				crypto_cipher_set_iv(tfm, cipher_tv[i].iv,
+					crypto_tfm_alg_ivsize (tfm));
+			}
+		
+			if (enc)
+				ret = crypto_cipher_encrypt(tfm, sg, sg, cipher_tv[i].ilen);
+			else
+				ret = crypto_cipher_decrypt(tfm, sg, sg, cipher_tv[i].ilen);
+			
+				
+			if (ret) {
+				printk("%s () failed flags=%x\n", e, tfm->crt_flags);
 				goto out;
+			}	
+	
+			q = kmap(sg[0].page) + sg[0].offset;
+			hexdump(q, cipher_tv[i].rlen);
+	
+			printk("%s\n", 
+				memcmp(q, cipher_tv[i].result, cipher_tv[i].rlen) ? "fail" : 
+			"pass");
 		}
-
-		p = c5_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = ((long) p & ~PAGE_MASK);
-		sg[0].length = sizeof(c5_tv[i].plaintext);
-		ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, sizeof(c5_tv[i].ciphertext));
-
-		printk("%s\n", memcmp(q, c5_tv[i].ciphertext,
-			sizeof(c5_tv[i].ciphertext)) ? "fail" : "pass");
 	}
 	
-	tsize = sizeof (cast5_dec_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, cast5_dec_tv_template, tsize);
-	c5_tv = (void *) tvmem;
-	for (i = 0; i < CAST5_DEC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n", i + 1, c5_tv[i].keylen * 8);
-		key = c5_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, c5_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!c5_tv[i].fail)
-				goto out;
-		}
-
-		p = c5_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = ((long) p & ~PAGE_MASK);
-		sg[0].length = sizeof(c5_tv[i].plaintext);
-		ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
+	printk("\ntesting %s %s %s across pages (chunking) \n", algo, m, e);
+	memset(xbuf, 0, XBUFSIZE);
+	
+	j = 0;
+	for (i = 0; i < tcount; i++) {
+		if (cipher_tv[i].np) {
+			j++;				
+			printk("test %u (%d bit key):\n",
+			j, cipher_tv[i].klen * 8);
+
+			tfm->crt_flags = 0;			
+			if (cipher_tv[i].wk) 
+				tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY;
+			key = cipher_tv[i].key;
+			
+			ret = crypto_cipher_setkey(tfm, key, cipher_tv[i].klen);		
+			if (ret) {
+				printk("setkey() failed flags=%x\n", tfm->crt_flags);
+				
+				if (!cipher_tv[i].fail)
+					goto out;
+			}
+
+			temp = 0;
+			for (k = 0; k < cipher_tv[i].np; k++) {
+				memcpy (&xbuf[IDX[k]], cipher_tv[i].input + temp, 
+						cipher_tv[i].tap[k]);	
+				temp += cipher_tv[i].tap[k];
+				p = &xbuf[IDX[k]];
+				sg[k].page = virt_to_page (p);
+				sg[k].offset = offset_in_page (p);
+				sg[k].length = cipher_tv[i].tap[k];
+			}
+			
+			if (!mode) {
+				crypto_cipher_set_iv(tfm, cipher_tv[i].iv,
+						crypto_tfm_alg_ivsize (tfm));
+			}
+			
+			if (enc)
+				ret = crypto_cipher_encrypt(tfm, sg, sg, cipher_tv[i].ilen);
+			else
+				ret = crypto_cipher_decrypt(tfm, sg, sg, cipher_tv[i].ilen);
+			
+			if (ret) {
+				printk("%s () failed flags=%x\n", e, tfm->crt_flags);
+				goto out;
+			}
+
+			temp = 0;
+			for (k = 0; k < cipher_tv[i].np; k++) {
+				printk("page %u\n", k);
+				q = kmap(sg[k].page) + sg[k].offset;
+				hexdump(q, cipher_tv[i].tap[k]);
+				printk("%s\n", 
+					memcmp(q, cipher_tv[i].result + temp, 
+						cipher_tv[i].tap[k]) ? "fail" : 
+					"pass");
+				temp += cipher_tv[i].tap[k];
+			}
 		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, sizeof(c5_tv[i].ciphertext));
-
-		printk("%s\n", memcmp(q, c5_tv[i].ciphertext,
-			sizeof(c5_tv[i].ciphertext)) ? "fail" : "pass");
 	}
+
 out:
-	crypto_free_tfm (tfm);
+	crypto_free_tfm(tfm);
 }
 
 static void
@@ -2485,75 +510,118 @@
 	switch (mode) {
 
 	case 0:
-		test_md5();
-		test_sha1();
-		test_des();
-		test_des3_ede();
-		test_md4();
-		test_sha256();
-		test_blowfish();
-		test_twofish();
-		test_serpent();
-		test_cast6();
-		test_aes();
-		test_sha384();
-		test_sha512();
-		test_deflate();
-		test_cast5();
-		test_cast6();
+		test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
+		
+		test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
+		
+		//DES
+		test_cipher ("des", MODE_ECB, ENCRYPT, des_enc_tv_template, DES_ENC_TEST_VECTORS);
+                test_cipher ("des", MODE_ECB, DECRYPT, des_dec_tv_template, DES_DEC_TEST_VECTORS);
+                test_cipher ("des", MODE_CBC, ENCRYPT, des_cbc_enc_tv_template, DES_CBC_ENC_TEST_VECTORS);
+                test_cipher ("des", MODE_CBC, DECRYPT, des_cbc_dec_tv_template, DES_CBC_DEC_TEST_VECTORS);
+	
+		//DES3_EDE
+		test_cipher ("des3_ede", MODE_ECB, ENCRYPT, des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS);
+                test_cipher ("des3_ede", MODE_ECB, DECRYPT, des3_ede_dec_tv_template, DES3_EDE_DEC_TEST_VECTORS);
+		
+		test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
+		
+		test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
+		
+		//BLOWFISH
+		test_cipher ("blowfish", MODE_ECB, ENCRYPT, bf_enc_tv_template, BF_ENC_TEST_VECTORS);
+		test_cipher ("blowfish", MODE_ECB, DECRYPT, bf_dec_tv_template, BF_DEC_TEST_VECTORS);
+		test_cipher ("blowfish", MODE_CBC, ENCRYPT, bf_cbc_enc_tv_template, BF_CBC_ENC_TEST_VECTORS);
+		test_cipher ("blowfish", MODE_CBC, DECRYPT, bf_cbc_dec_tv_template, BF_CBC_DEC_TEST_VECTORS);
+		
+		//TWOFISH
+		test_cipher ("twofish", MODE_ECB, ENCRYPT, tf_enc_tv_template, TF_ENC_TEST_VECTORS);
+		test_cipher ("twofish", MODE_ECB, DECRYPT, tf_dec_tv_template, TF_DEC_TEST_VECTORS);
+		test_cipher ("twofish", MODE_CBC, ENCRYPT, tf_cbc_enc_tv_template, TF_CBC_ENC_TEST_VECTORS);
+		test_cipher ("twofish", MODE_CBC, DECRYPT, tf_cbc_dec_tv_template, TF_CBC_DEC_TEST_VECTORS);
+		
+		//SERPENT
+		test_cipher ("serpent", MODE_ECB, ENCRYPT, serpent_enc_tv_template, SERPENT_ENC_TEST_VECTORS);
+		test_cipher ("serpent", MODE_ECB, DECRYPT, serpent_dec_tv_template, SERPENT_DEC_TEST_VECTORS);
+		
+		//AES
+		test_cipher ("aes", MODE_ECB, ENCRYPT, aes_enc_tv_template, AES_ENC_TEST_VECTORS);
+		test_cipher ("aes", MODE_ECB, DECRYPT, aes_dec_tv_template, AES_DEC_TEST_VECTORS);
+
+		//CAST5
+		test_cipher ("cast5", MODE_ECB, ENCRYPT, cast5_enc_tv_template, CAST5_ENC_TEST_VECTORS);
+		test_cipher ("cast5", MODE_ECB, DECRYPT, cast5_dec_tv_template, CAST5_DEC_TEST_VECTORS);
+		
+		//CAST6
+		test_cipher ("cast6", MODE_ECB, ENCRYPT, cast6_enc_tv_template, CAST6_ENC_TEST_VECTORS);
+		test_cipher ("cast6", MODE_ECB, DECRYPT, cast6_dec_tv_template, CAST6_DEC_TEST_VECTORS);
+
+		test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
+		test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
+		test_deflate();		
 #ifdef CONFIG_CRYPTO_HMAC
-		test_hmac_md5();
-		test_hmac_sha1();
-		test_hmac_sha256();
+		test_hmac("md5", hmac_md5_tv_template, HMAC_MD5_TEST_VECTORS);
+		test_hmac("sha1", hmac_sha1_tv_template, HMAC_SHA1_TEST_VECTORS);		
+		test_hmac("sha256", hmac_sha256_tv_template, HMAC_SHA256_TEST_VECTORS);
 #endif		
 		break;
 
 	case 1:
-		test_md5();
+		test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
 		break;
 
 	case 2:
-		test_sha1();
+		test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
 		break;
 
 	case 3:
-		test_des();
+		test_cipher ("des", MODE_ECB, ENCRYPT, des_enc_tv_template, DES_ENC_TEST_VECTORS);
+		test_cipher ("des", MODE_ECB, DECRYPT, des_dec_tv_template, DES_DEC_TEST_VECTORS);
+		test_cipher ("des", MODE_CBC, ENCRYPT, des_cbc_enc_tv_template, DES_CBC_ENC_TEST_VECTORS);
+		test_cipher ("des", MODE_CBC, DECRYPT, des_cbc_dec_tv_template, DES_CBC_DEC_TEST_VECTORS);
 		break;
 
 	case 4:
-		test_des3_ede();
+		test_cipher ("des3_ede", MODE_ECB, ENCRYPT, des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS);
+                test_cipher ("des3_ede", MODE_ECB, DECRYPT, des3_ede_dec_tv_template, DES3_EDE_DEC_TEST_VECTORS);
 		break;
 
 	case 5:
-		test_md4();
+		test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
 		break;
 		
 	case 6:
-		test_sha256();
+		test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
 		break;
 	
 	case 7:
-		test_blowfish();
+		test_cipher ("blowfish", MODE_ECB, ENCRYPT, bf_enc_tv_template, BF_ENC_TEST_VECTORS);
+		test_cipher ("blowfish", MODE_ECB, DECRYPT, bf_dec_tv_template, BF_DEC_TEST_VECTORS);
+		test_cipher ("blowfish", MODE_CBC, ENCRYPT, bf_cbc_enc_tv_template, BF_CBC_ENC_TEST_VECTORS);
+		test_cipher ("blowfish", MODE_CBC, DECRYPT, bf_cbc_dec_tv_template, BF_CBC_DEC_TEST_VECTORS);
 		break;
 
 	case 8:
-		test_twofish();
+		test_cipher ("twofish", MODE_ECB, ENCRYPT, tf_enc_tv_template, TF_ENC_TEST_VECTORS);
+		test_cipher ("twofish", MODE_ECB, DECRYPT, tf_dec_tv_template, TF_DEC_TEST_VECTORS);
+		test_cipher ("twofish", MODE_CBC, ENCRYPT, tf_cbc_enc_tv_template, TF_CBC_ENC_TEST_VECTORS);
+		test_cipher ("twofish", MODE_CBC, DECRYPT, tf_cbc_dec_tv_template, TF_CBC_DEC_TEST_VECTORS);
 		break;
-
+		
 	case 9:
-		test_serpent();
 		break;
 
 	case 10:
-		test_aes();
+		test_cipher ("aes", MODE_ECB, ENCRYPT, aes_enc_tv_template, AES_ENC_TEST_VECTORS);
+		test_cipher ("aes", MODE_ECB, DECRYPT, aes_dec_tv_template, AES_DEC_TEST_VECTORS);	
 		break;
 
 	case 11:
-		test_sha384();
+		test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
 		break;
 		
 	case 12:
-		test_sha512();
+		test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
 		break;
 
 	case 13:
@@ -2561,24 +629,26 @@
 		break;
 
 	case 14:
-		test_cast5();
+		test_cipher ("cast5", MODE_ECB, ENCRYPT, cast5_enc_tv_template, CAST5_ENC_TEST_VECTORS);
+		test_cipher ("cast5", MODE_ECB, DECRYPT, cast5_dec_tv_template, CAST5_DEC_TEST_VECTORS);
 		break;
 
 	case 15:
-		test_cast6();
+		test_cipher ("cast6", MODE_ECB, ENCRYPT, cast6_enc_tv_template, CAST6_ENC_TEST_VECTORS);
+		test_cipher ("cast6", MODE_ECB, DECRYPT, cast6_dec_tv_template, CAST6_DEC_TEST_VECTORS);
 		break;
 
 #ifdef CONFIG_CRYPTO_HMAC
 	case 100:
-		test_hmac_md5();
+		test_hmac("md5", hmac_md5_tv_template, HMAC_MD5_TEST_VECTORS);
 		break;
 		
 	case 101:
-		test_hmac_sha1();
+		test_hmac("sha1", hmac_sha1_tv_template, HMAC_SHA1_TEST_VECTORS);		
 		break;
 	
 	case 102:
-		test_hmac_sha256();
+		test_hmac("sha256", hmac_sha256_tv_template, HMAC_SHA256_TEST_VECTORS);
 		break;
 
 #endif
@@ -2614,7 +684,14 @@
 	return 0;
 }
 
+/*
+ * If an init function is provided, an exit function must also be provided
+ * to allow module unload.
+ */
+static void __exit fini(void) { }
+
 module_init(init);
+module_exit(fini);
 
 MODULE_PARM(mode, "i");
 
--- diff/crypto/tcrypt.h	2003-08-26 10:00:52.000000000 +0100
+++ source/crypto/tcrypt.h	2003-12-29 09:30:39.000000000 +0000
@@ -1,4 +1,4 @@
-/* 
+/*
  * Quick & dirty crypto testing module.
  *
  * This will only exist until we have a better testing mechanism
@@ -6,565 +6,165 @@
  *
  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
  * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.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.
  *
+ * 14 - 09 - 2003 Changes by Kartikey Mahendra Bhatt
+ *
  */
 #ifndef _CRYPTO_TCRYPT_H
 #define _CRYPTO_TCRYPT_H
 
-#define MD5_DIGEST_SIZE		16
-#define MD4_DIGEST_SIZE		16
-#define SHA1_DIGEST_SIZE	20
-#define SHA256_DIGEST_SIZE	32
-#define SHA384_DIGEST_SIZE	48
-#define SHA512_DIGEST_SIZE	64
-
-/*
- * MD4 test vectors from RFC1320
- */
-#define MD4_TEST_VECTORS	7
-
-struct md4_testvec {
-	char plaintext[128];
-	char digest[MD4_DIGEST_SIZE];
-} md4_tv_template[] = {
-	{ "",
-		{ 0x31, 0xd6, 0xcf, 0xe0, 0xd1, 0x6a, 0xe9, 0x31,
-		  0xb7, 0x3c, 0x59, 0xd7, 0xe0, 0xc0, 0x89, 0xc0 }
-	},
-	
-	{ "a",
-		{ 0xbd, 0xe5, 0x2c, 0xb3, 0x1d, 0xe3, 0x3e, 0x46,
-		  0x24, 0x5e, 0x05, 0xfb, 0xdb, 0xd6, 0xfb, 0x24 }
-	},
-
-	{ "abc",
-		{ 0xa4, 0x48, 0x01, 0x7a, 0xaf, 0x21, 0xd8, 0x52,
-		  0x5f, 0xc1, 0x0a, 0xe8, 0x7a, 0xa6, 0x72, 0x9d }
-	},
-	
-	{ "message digest",
-		{ 0xd9, 0x13, 0x0a, 0x81, 0x64, 0x54, 0x9f, 0xe8,
-		  0x18, 0x87, 0x48, 0x06, 0xe1, 0xc7, 0x01, 0x4b }
-	},
-	
-	{ "abcdefghijklmnopqrstuvwxyz",
-		{ 0xd7, 0x9e, 0x1c, 0x30, 0x8a, 0xa5, 0xbb, 0xcd,
-		  0xee, 0xa8, 0xed, 0x63, 0xdf, 0x41, 0x2d, 0xa9 }
-	},
-		
-	{ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
-		{ 0x04, 0x3f, 0x85, 0x82, 0xf2, 0x41, 0xdb, 0x35,
-		  0x1c, 0xe6, 0x27, 0xe1, 0x53, 0xe7, 0xf0, 0xe4 }
-	},
-	
-	{ "123456789012345678901234567890123456789012345678901234567890123"
-	  "45678901234567890",
-		{ 0xe3, 0x3b, 0x4d, 0xdc, 0x9c, 0x38, 0xf2, 0x19,
-		  0x9c, 0x3e, 0x7b, 0x16, 0x4f, 0xcc, 0x05, 0x36 }
-	},
-};
+#define MAX_DIGEST_SIZE		64
+#define MAX_TAP			8
 
-/*
- * MD5 test vectors from RFC1321
- */
-#define MD5_TEST_VECTORS	7
+#define MAX_KEYLEN		56
+#define MAX_IVLEN		32
 
-struct md5_testvec {
+struct hash_testvec {
 	char plaintext[128];
-	char digest[MD5_DIGEST_SIZE];
-} md5_tv_template[] = {
-	{ "",
-		{ 0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04,
-		  0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e } },
-	        	
-	{ "a",
-		{ 0x0c, 0xc1, 0x75, 0xb9, 0xc0, 0xf1, 0xb6, 0xa8,
-		  0x31, 0xc3, 0x99, 0xe2, 0x69, 0x77, 0x26, 0x61 } },
-		  
-	{ "abc",
-		{ 0x90, 0x01, 0x50, 0x98, 0x3c, 0xd2, 0x4f, 0xb0,
-		  0xd6, 0x96, 0x3f, 0x7d, 0x28, 0xe1, 0x7f, 0x72 } }, 
-		  
-	{ "message digest",
-		{ 0xf9, 0x6b, 0x69, 0x7d, 0x7c, 0xb7, 0x93, 0x8d,
-		  0x52, 0x5a, 0x2f, 0x31, 0xaa, 0xf1, 0x61, 0xd0 } },
-		  
-	{ "abcdefghijklmnopqrstuvwxyz",
-		{ 0xc3, 0xfc, 0xd3, 0xd7, 0x61, 0x92, 0xe4, 0x00,
-		  0x7d, 0xfb, 0x49, 0x6c, 0xca, 0x67, 0xe1, 0x3b } },
-		  
-	{ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
-		{ 0xd1, 0x74, 0xab, 0x98, 0xd2, 0x77, 0xd9, 0xf5,
-		  0xa5, 0x61, 0x1c, 0x2c, 0x9f, 0x41, 0x9d, 0x9f } },
-		  
-	{ "12345678901234567890123456789012345678901234567890123456789012"
-	  "345678901234567890",
-		{ 0x57, 0xed, 0xf4, 0xa2, 0x2b, 0xe3, 0xc9, 0x55,
-		  0xac, 0x49, 0xda, 0x2e, 0x21, 0x07, 0xb6, 0x7a } }
+	unsigned char psize;
+	char digest[MAX_DIGEST_SIZE];
+	unsigned char np;
+	unsigned char tap[MAX_TAP];		
 };
 
-#ifdef CONFIG_CRYPTO_HMAC
-/*
- * HMAC-MD5 test vectors from RFC2202
- * (These need to be fixed to not use strlen).
- */
-#define HMAC_MD5_TEST_VECTORS	7
-
-struct hmac_md5_testvec {
+struct hmac_testvec {	
 	char key[128];
+	unsigned char ksize;
 	char plaintext[128];
-	char digest[MD5_DIGEST_SIZE];
+	unsigned char psize;
+	char digest[MAX_DIGEST_SIZE];
+	unsigned char np;
+	unsigned char tap[MAX_TAP];		
 };
 
-struct hmac_md5_testvec hmac_md5_tv_template[] =
-{
-	
-	{
-		{ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-		  0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x00},
-		  
-		"Hi There",
-		
-		{ 0x92, 0x94, 0x72, 0x7a, 0x36, 0x38, 0xbb, 0x1c,
-		  0x13, 0xf4, 0x8e, 0xf8, 0x15, 0x8b, 0xfc, 0x9d }
-	},
-	    
-	{
-		{ 'J', 'e', 'f', 'e', 0 },
-		
-		"what do ya want for nothing?",
-		
-		{ 0x75, 0x0c, 0x78, 0x3e, 0x6a, 0xb0, 0xb5, 0x03,
-		  0xea, 0xa8, 0x6e, 0x31, 0x0a, 0x5d, 0xb7, 0x38 }
-	},
-	
-	{
-		{ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00 },
-		  
-		{ 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0x00 },
-		  
-		{ 0x56, 0xbe, 0x34, 0x52, 0x1d, 0x14, 0x4c, 0x88,
-		  0xdb, 0xb8, 0xc7, 0x33, 0xf0, 0xe8, 0xb3, 0xf6 }
-	},
-	
-	{
-		{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-		  0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 
-		  0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00 },
-		  
-		{ 
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0x00 },
-		  
-		{ 0x69, 0x7e, 0xaf, 0x0a, 0xca, 0x3a, 0x3a, 0xea,
-		  0x3a, 0x75, 0x16, 0x47, 0x46, 0xff, 0xaa, 0x79 }
-	},
-	
-	{
-		{ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
-		  0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x00 },
-		  
-		"Test With Truncation",
-		
-		{ 0x56, 0x46, 0x1e, 0xf2, 0x34, 0x2e, 0xdc, 0x00,
-		  0xf9, 0xba, 0xb9, 0x95, 0x69, 0x0e, 0xfd, 0x4c }
-	},
-	
-	{
-		{ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0x00 },
-		  
-		"Test Using Larger Than Block-Size Key - Hash Key First",
-		
-		{ 0x6b, 0x1a, 0xb7, 0xfe, 0x4b, 0xd7, 0xbf, 0x8f,
-		  0x0b, 0x62, 0xe6, 0xce, 0x61, 0xb9, 0xd0, 0xcd }
-	},
-	
-	{
-		{ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0x00 },
-		
-		"Test Using Larger Than Block-Size Key and Larger Than One "
-		"Block-Size Data",
-		
-		{ 0x6f, 0x63, 0x0f, 0xad, 0x67, 0xcd, 0xa0, 0xee,
-		  0x1f, 0xb1, 0xf5, 0x62, 0xdb, 0x3a, 0xa5, 0x3e }
-	},
-	
-	/* cross page test, need to retain key */
-	
-	{
-		{ 'J', 'e', 'f', 'e', 0 },
-		
-		"what do ya want for nothing?",
-		
-		{ 0x75, 0x0c, 0x78, 0x3e, 0x6a, 0xb0, 0xb5, 0x03,
-		  0xea, 0xa8, 0x6e, 0x31, 0x0a, 0x5d, 0xb7, 0x38 }
-	},
-	
+struct cipher_testvec {
+	unsigned char fail;
+	unsigned char wk; /* weak key flag */
+	char key[MAX_KEYLEN];
+	unsigned char klen;
+	char iv[MAX_IVLEN];
+	char input[48];
+	unsigned char ilen;
+	char result[48];
+	unsigned char rlen;
+	int np;
+	unsigned char tap[MAX_TAP];	
 };
 
-	
 /*
- * HMAC-SHA1 test vectors from RFC2202
+ * MD4 test vectors from RFC1320
  */
+#define MD4_TEST_VECTORS	7
 
-#define HMAC_SHA1_TEST_VECTORS	7
-
-struct hmac_sha1_testvec {
-	char key[128];
-	char plaintext[128];
-	char digest[SHA1_DIGEST_SIZE];
-} hmac_sha1_tv_template[] = {
-	
-	{
-		{ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-		  0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-		  0x00},
-		  
-		"Hi There",
-
-		{ 0xb6, 0x17, 0x31, 0x86, 0x55, 0x05, 0x72, 0x64,
-                  0xe2, 0x8b, 0xc0, 0xb6, 0xfb ,0x37, 0x8c, 0x8e, 0xf1,
-                  0x46, 0xbe, 0x00 }
-	},
-	    
-	{
-		{ 'J', 'e', 'f', 'e', 0 },
-		
-		"what do ya want for nothing?",
-
-		{ 0xef, 0xfc, 0xdf, 0x6a, 0xe5, 0xeb, 0x2f, 0xa2, 0xd2, 0x74, 
-		  0x16, 0xd5, 0xf1, 0x84, 0xdf, 0x9c, 0x25, 0x9a, 0x7c, 0x79 }
-
-	},
-	
-	{
-		{ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0x00},
-
-		  
-		{ 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0x00 },
-		  
-		{ 0x12, 0x5d, 0x73, 0x42, 0xb9, 0xac, 0x11, 0xcd, 0x91, 0xa3, 
-		  0x9a, 0xf4, 0x8a, 0xa1, 0x7b, 0x4f, 0x63, 0xf1, 0x75, 0xd3 }
-
-	},
-	
-	{
-		{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-		  0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 
-		  0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00 },
-		  
-		{ 
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0x00 },
-		  
-		{ 0x4c, 0x90, 0x07, 0xf4, 0x02, 0x62, 0x50, 0xc6, 0xbc, 0x84, 
-		  0x14, 0xf9, 0xbf, 0x50, 0xc8, 0x6c, 0x2d, 0x72, 0x35, 0xda }
-
-	},
-	
-	{
-		{ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
-		  0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
-		  0x00 },
-		  
-		"Test With Truncation",
-		
-		{ 0x4c, 0x1a, 0x03, 0x42, 0x4b, 0x55, 0xe0, 0x7f, 0xe7, 0xf2, 
-  		  0x7b, 0xe1, 0xd5, 0x8b, 0xb9, 0x32, 0x4a, 0x9a, 0x5a, 0x04 }
-
-	},
-	
-	{
-		{ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0x00 },
-		  
-		"Test Using Larger Than Block-Size Key - Hash Key First",
-		
-		{ 0xaa, 0x4a, 0xe5, 0xe1, 0x52, 0x72, 0xd0, 0x0e, 0x95, 0x70, 
-  		  0x56, 0x37, 0xce, 0x8a, 0x3b, 0x55, 0xed, 0x40, 0x21, 0x12 }
-
-	},
-	
+struct hash_testvec md4_tv_template [] = {
 	{
-		{ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0x00 },
-		
-		"Test Using Larger Than Block-Size Key and Larger Than One "
-		"Block-Size Data",
-		
-		{ 0xe8, 0xe9, 0x9d, 0x0f, 0x45, 0x23, 0x7d, 0x78, 0x6d, 0x6b, 
-		  0xba, 0xa7, 0x96, 0x5c, 0x78, 0x08, 0xbb, 0xff, 0x1a, 0x91 }
+		.plaintext = "",
+		.digest	= { 0x31, 0xd6, 0xcf, 0xe0, 0xd1, 0x6a, 0xe9, 0x31,
+			    0xb7, 0x3c, 0x59, 0xd7, 0xe0, 0xc0, 0x89, 0xc0 },
+	}, {
+		.plaintext = "a",
+		.psize	= 1,
+		.digest	= { 0xbd, 0xe5, 0x2c, 0xb3, 0x1d, 0xe3, 0x3e, 0x46,
+			    0x24, 0x5e, 0x05, 0xfb, 0xdb, 0xd6, 0xfb, 0x24 },
+	}, {
+		.plaintext = "abc",
+		.psize	= 3,
+		.digest	= { 0xa4, 0x48, 0x01, 0x7a, 0xaf, 0x21, 0xd8, 0x52,
+			    0x5f, 0xc1, 0x0a, 0xe8, 0x7a, 0xa6, 0x72, 0x9d },
+	}, {
+		.plaintext = "message digest",
+		.psize	= 14,
+		.digest	= { 0xd9, 0x13, 0x0a, 0x81, 0x64, 0x54, 0x9f, 0xe8,
+			    0x18, 0x87, 0x48, 0x06, 0xe1, 0xc7, 0x01, 0x4b },
+	}, {
+		.plaintext = "abcdefghijklmnopqrstuvwxyz",
+		.psize	= 26,
+		.digest	= { 0xd7, 0x9e, 0x1c, 0x30, 0x8a, 0xa5, 0xbb, 0xcd,
+			    0xee, 0xa8, 0xed, 0x63, 0xdf, 0x41, 0x2d, 0xa9 },
+		.np	= 2,
+		.tap	= { 13, 13 },
+	}, {
+		.plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
+		.psize	= 62,
+		.digest	= { 0x04, 0x3f, 0x85, 0x82, 0xf2, 0x41, 0xdb, 0x35,
+			    0x1c, 0xe6, 0x27, 0xe1, 0x53, 0xe7, 0xf0, 0xe4 },
+	}, {
+		.plaintext = "123456789012345678901234567890123456789012345678901234567890123"
+			     "45678901234567890",
+		.psize	= 80,
+		.digest	= { 0xe3, 0x3b, 0x4d, 0xdc, 0x9c, 0x38, 0xf2, 0x19,
+			    0x9c, 0x3e, 0x7b, 0x16, 0x4f, 0xcc, 0x05, 0x36 },
 	},
-	
-	/* cross page test */
-	{
-		{ 'J', 'e', 'f', 'e', 0 },
-		
-		"what do ya want for nothing?",
-
-		{ 0xef, 0xfc, 0xdf, 0x6a, 0xe5, 0xeb, 0x2f, 0xa2, 0xd2, 0x74, 
-		  0x16, 0xd5, 0xf1, 0x84, 0xdf, 0x9c, 0x25, 0x9a, 0x7c, 0x79 }
-
-	},
-
 };
 
 /*
- * HMAC-SHA256 test vectors from
- * draft-ietf-ipsec-ciph-sha-256-01.txt
+ * MD5 test vectors from RFC1321
  */
-#define HMAC_SHA256_TEST_VECTORS	10
-
-struct hmac_sha256_testvec {
-	char key[128];
-	char plaintext[128];
-	char digest[SHA256_DIGEST_SIZE];
-} hmac_sha256_tv_template[] = {
-
-	{
-		{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-		  0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
-		  0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
-		  0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x00 },
-		  
-	
-		{ "abc" },
-		
-		{ 0xa2, 0x1b, 0x1f, 0x5d, 0x4c, 0xf4, 0xf7, 0x3a,
-		  0x4d, 0xd9, 0x39, 0x75, 0x0f, 0x7a, 0x06, 0x6a,
-		  0x7f, 0x98, 0xcc, 0x13, 0x1c, 0xb1, 0x6a, 0x66,
-		  0x92, 0x75, 0x90, 0x21, 0xcf, 0xab, 0x81, 0x81 },
-
-	},
-	
-	{
-		{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-		  0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
-		  0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
-		   0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x00 },
-		
-		{ "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
-		
-		{ 0x10, 0x4f, 0xdc, 0x12, 0x57, 0x32, 0x8f, 0x08,
-		  0x18, 0x4b, 0xa7, 0x31, 0x31, 0xc5, 0x3c, 0xae,
-		  0xe6, 0x98, 0xe3, 0x61, 0x19, 0x42, 0x11, 0x49,
-		  0xea, 0x8c, 0x71, 0x24, 0x56, 0x69, 0x7d, 0x30 }
-	},
-
-	{
-		{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-		  0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
-		  0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
-		  0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x00 },
-		
-		{ "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
-		  "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
-		
-		{ 0x47, 0x03, 0x05, 0xfc, 0x7e, 0x40, 0xfe, 0x34,
-		  0xd3, 0xee, 0xb3, 0xe7, 0x73, 0xd9, 0x5a, 0xab,
-		  0x73, 0xac, 0xf0, 0xfd, 0x06, 0x04, 0x47, 0xa5,
-		  0xeb, 0x45, 0x95, 0xbf, 0x33, 0xa9, 0xd1, 0xa3 }
-	},
-
-	{
-		{ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-		  0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-		  0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-		  0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x00 },
-		
-		{ "Hi There" },
-		
-		{ 0x19, 0x8a, 0x60, 0x7e, 0xb4, 0x4b, 0xfb, 0xc6,
-		  0x99, 0x03, 0xa0, 0xf1, 0xcf, 0x2b, 0xbd, 0xc5,
-		  0xba, 0x0a, 0xa3, 0xf3, 0xd9, 0xae, 0x3c, 0x1c,
-		  0x7a, 0x3b, 0x16, 0x96, 0xa0, 0xb6, 0x8c, 0xf7 }
-	},
-
-	{
-		{ "Jefe" },
-		
-		{ "what do ya want for nothing?" },
-		
-		{ 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e,
-		  0x6a, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xc7,
-		  0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83,
-		  0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43 }
-	},
-
-	{
-		{ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00 },
-		
-		{ 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0x00 },
-		
-		{ 0xcd, 0xcb, 0x12, 0x20, 0xd1, 0xec, 0xcc, 0xea,
-		  0x91, 0xe5, 0x3a, 0xba, 0x30, 0x92, 0xf9, 0x62,
-		  0xe5, 0x49, 0xfe, 0x6c, 0xe9, 0xed, 0x7f, 0xdc,
-		  0x43, 0x19, 0x1f, 0xbd, 0xe4, 0x5c, 0x30, 0xb0 }
-	},
-
-	{
-		{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-		  0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
-		  0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
-		  0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
-		  0x21, 0x22, 0x23, 0x24, 0x25, 0x00 },
-		
-		{ 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0x00 },
-		
-		{ 0xd4, 0x63, 0x3c, 0x17, 0xf6, 0xfb, 0x8d, 0x74,
-		  0x4c, 0x66, 0xde, 0xe0, 0xf8, 0xf0, 0x74, 0x55,
-		  0x6e, 0xc4, 0xaf, 0x55, 0xef, 0x07, 0x99, 0x85,
-		  0x41, 0x46, 0x8e, 0xb4, 0x9b, 0xd2, 0xe9, 0x17 }
-	},
-
-	{
-		{ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
-		  0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
-		  0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
-		  0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x00 },
-		
-		{ "Test With Truncation" },
-		
-		{ 0x75, 0x46, 0xaf, 0x01, 0x84, 0x1f, 0xc0, 0x9b,
-		  0x1a, 0xb9, 0xc3, 0x74, 0x9a, 0x5f, 0x1c, 0x17,
-		  0xd4, 0xf5, 0x89, 0x66, 0x8a, 0x58, 0x7b, 0x27,
-		  0x00, 0xa9, 0xc9, 0x7c, 0x11, 0x93, 0xcf, 0x42 }
-	},
-	
-	{
-		{ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00 },
-		
-		{ "Test Using Larger Than Block-Size Key - Hash Key First" },
-		
-		{ 0x69, 0x53, 0x02, 0x5e, 0xd9, 0x6f, 0x0c, 0x09,
-		  0xf8, 0x0a, 0x96, 0xf7, 0x8e, 0x65, 0x38, 0xdb,
-		  0xe2, 0xe7, 0xb8, 0x20, 0xe3, 0xdd, 0x97, 0x0e,
-		  0x7d, 0xdd, 0x39, 0x09, 0x1b, 0x32, 0x35, 0x2f }
-	},
+#define MD5_TEST_VECTORS	7
 
+struct hash_testvec md5_tv_template[] = {
 	{
-		{ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00 },
-		
-		{ "Test Using Larger Than Block-Size Key and Larger Than "
-		  "One Block-Size Data" },
-		
-		{ 0x63, 0x55, 0xac, 0x22, 0xe8, 0x90, 0xd0, 0xa3,
-		  0xc8, 0x48, 0x1a, 0x5c, 0xa4, 0x82, 0x5b, 0xc8,
-		  0x84, 0xd3, 0xe7, 0xa1, 0xff, 0x98, 0xa2, 0xfc,
-		  0x2a, 0xc7, 0xd8, 0xe0, 0x64, 0xc3, 0xb2, 0xe6 }
-	},
+		.digest	= { 0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04,
+			    0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e },
+	}, {
+		.plaintext = "a",
+		.psize	= 1,
+		.digest	= { 0x0c, 0xc1, 0x75, 0xb9, 0xc0, 0xf1, 0xb6, 0xa8,
+			    0x31, 0xc3, 0x99, 0xe2, 0x69, 0x77, 0x26, 0x61 },
+	}, {
+		.plaintext = "abc",
+		.psize	= 3,
+		.digest	= { 0x90, 0x01, 0x50, 0x98, 0x3c, 0xd2, 0x4f, 0xb0,
+			    0xd6, 0x96, 0x3f, 0x7d, 0x28, 0xe1, 0x7f, 0x72 },
+	}, {
+		.plaintext = "message digest",
+		.psize	= 14,
+		.digest	= { 0xf9, 0x6b, 0x69, 0x7d, 0x7c, 0xb7, 0x93, 0x8d,
+			    0x52, 0x5a, 0x2f, 0x31, 0xaa, 0xf1, 0x61, 0xd0 },
+	}, {
+		.plaintext = "abcdefghijklmnopqrstuvwxyz",
+		.psize	= 26,
+		.digest	= { 0xc3, 0xfc, 0xd3, 0xd7, 0x61, 0x92, 0xe4, 0x00,
+			    0x7d, 0xfb, 0x49, 0x6c, 0xca, 0x67, 0xe1, 0x3b },
+		.np	= 2,
+		.tap	= {13, 13}
+	}, {
+		.plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
+		.psize	= 62,
+		.digest	= { 0xd1, 0x74, 0xab, 0x98, 0xd2, 0x77, 0xd9, 0xf5,
+			    0xa5, 0x61, 0x1c, 0x2c, 0x9f, 0x41, 0x9d, 0x9f },
+	}, {
+		.plaintext = "12345678901234567890123456789012345678901234567890123456789012"
+			     "345678901234567890",
+		.psize	= 80,
+		.digest	= { 0x57, 0xed, 0xf4, 0xa2, 0x2b, 0xe3, 0xc9, 0x55,
+			    0xac, 0x49, 0xda, 0x2e, 0x21, 0x07, 0xb6, 0x7a },
+	}
 };
 
-
-#endif	/* CONFIG_CRYPTO_HMAC */
-
 /*
  * SHA1 test vectors  from from FIPS PUB 180-1
  */
 #define SHA1_TEST_VECTORS	2
 
-struct sha1_testvec {
-	char plaintext[128];
-	char digest[SHA1_DIGEST_SIZE];
-} sha1_tv_template[] = {
-	{ "abc",
-	  { 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, 0xBA, 0x3E, 
-	    0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C ,0x9C, 0xD0, 0xD8, 0x9D }
-	},
-	        	
-	{ "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
-
-	  { 0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E ,0xBA, 0xAE,
-	    0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5, 0xE5, 0x46, 0x70, 0xF1 }
+struct hash_testvec sha1_tv_template[] = {
+	{ 
+		.plaintext = "abc",
+		.psize	= 3,
+		.digest	= { 0xa9, 0x99, 0x3e, 0x36, 0x47, 0x06, 0x81, 0x6a, 0xba, 0x3e,
+			    0x25, 0x71, 0x78, 0x50, 0xc2, 0x6c, 0x9c, 0xd0, 0xd8, 0x9d },
+	}, {
+		.plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+		.psize	= 56,
+		.digest	= { 0x84, 0x98, 0x3e, 0x44, 0x1c, 0x3b, 0xd2, 0x6e, 0xba, 0xae,
+			    0x4a, 0xa1, 0xf9, 0x51, 0x29, 0xe5, 0xe5, 0x46, 0x70, 0xf1 },
+		.np	= 2,
+		.tap	= { 28, 28 }
 	}
 };
 
@@ -573,22 +173,23 @@
  */
 #define SHA256_TEST_VECTORS	2
 
-struct sha256_testvec {
-	char plaintext[128];
-	char digest[SHA256_DIGEST_SIZE];
-} sha256_tv_template[] = {
-	{ "abc",
-	  { 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
-	    0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
-	    0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
-	    0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad }
-	},
-	        	
-	{ "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
-	  { 0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8,
-	    0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39,
-	    0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67,
-	    0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1 }
+struct hash_testvec sha256_tv_template[] = {	
+	{ 
+		.plaintext = "abc",
+		.psize	= 3,
+		.digest	= { 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
+			    0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
+			    0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
+			    0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad },
+	}, {
+		.plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+		.psize	= 56,
+		.digest	= { 0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8,
+			    0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39,
+			    0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67,
+			    0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1 },
+		.np	= 2,
+		.tap	= { 28, 28 }
 	},
 };
 
@@ -597,47 +198,47 @@
  */
 #define SHA384_TEST_VECTORS	4
 
-struct sha384_testvec {
-	char plaintext[128];
-	char digest[SHA384_DIGEST_SIZE];
-} sha384_tv_template[] = {
-
-	{ "abc",
-	  { 0xcb, 0x00, 0x75, 0x3f, 0x45, 0xa3, 0x5e, 0x8b,
-	    0xb5, 0xa0, 0x3d, 0x69, 0x9a, 0xc6, 0x50, 0x07,
-	    0x27, 0x2c, 0x32, 0xab, 0x0e, 0xde, 0xd1, 0x63,
-	    0x1a, 0x8b, 0x60, 0x5a, 0x43, 0xff, 0x5b, 0xed,
-	    0x80, 0x86, 0x07, 0x2b, 0xa1, 0xe7, 0xcc, 0x23,
-	    0x58, 0xba, 0xec, 0xa1, 0x34, 0xc8, 0x25, 0xa7 }
-	},
-	
-	{ "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
-	  { 0x33, 0x91, 0xfd, 0xdd, 0xfc, 0x8d, 0xc7, 0x39,
-	    0x37, 0x07, 0xa6, 0x5b, 0x1b, 0x47, 0x09, 0x39,
-	    0x7c, 0xf8, 0xb1, 0xd1, 0x62, 0xaf, 0x05, 0xab,
-	    0xfe, 0x8f, 0x45, 0x0d, 0xe5, 0xf3, 0x6b, 0xc6,
-	    0xb0, 0x45, 0x5a, 0x85, 0x20, 0xbc, 0x4e, 0x6f,
-	    0x5f, 0xe9, 0x5b, 0x1f, 0xe3, 0xc8, 0x45, 0x2b  }
-	},
-	
-	{ "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
-	  "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
-	  { 0x09, 0x33, 0x0c, 0x33, 0xf7, 0x11, 0x47, 0xe8,
-	    0x3d, 0x19, 0x2f, 0xc7, 0x82, 0xcd, 0x1b, 0x47,
-	    0x53, 0x11, 0x1b, 0x17, 0x3b, 0x3b, 0x05, 0xd2,
-	    0x2f, 0xa0, 0x80, 0x86, 0xe3, 0xb0, 0xf7, 0x12,
-	    0xfc, 0xc7, 0xc7, 0x1a, 0x55, 0x7e, 0x2d, 0xb9,
-	    0x66, 0xc3, 0xe9, 0xfa, 0x91, 0x74, 0x60, 0x39  }
-	},
-	
-	{ "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"
-	  "efghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
-	  { 0x3d, 0x20, 0x89, 0x73, 0xab, 0x35, 0x08, 0xdb,
-	    0xbd, 0x7e, 0x2c, 0x28, 0x62, 0xba, 0x29, 0x0a,
-	    0xd3, 0x01, 0x0e, 0x49, 0x78, 0xc1, 0x98, 0xdc,
-	    0x4d, 0x8f, 0xd0, 0x14, 0xe5, 0x82, 0x82, 0x3a,
-	    0x89, 0xe1, 0x6f, 0x9b, 0x2a, 0x7b, 0xbc, 0x1a,
-	    0xc9, 0x38, 0xe2, 0xd1, 0x99, 0xe8, 0xbe, 0xa4 }
+struct hash_testvec sha384_tv_template[] = {
+	{ 
+		.plaintext= "abc",
+		.psize	= 3,
+		.digest	= { 0xcb, 0x00, 0x75, 0x3f, 0x45, 0xa3, 0x5e, 0x8b,
+			    0xb5, 0xa0, 0x3d, 0x69, 0x9a, 0xc6, 0x50, 0x07,
+			    0x27, 0x2c, 0x32, 0xab, 0x0e, 0xde, 0xd1, 0x63,
+			    0x1a, 0x8b, 0x60, 0x5a, 0x43, 0xff, 0x5b, 0xed,
+			    0x80, 0x86, 0x07, 0x2b, 0xa1, 0xe7, 0xcc, 0x23,
+			    0x58, 0xba, 0xec, 0xa1, 0x34, 0xc8, 0x25, 0xa7 },
+	}, {
+		.plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+		.psize	= 56,
+		.digest	= { 0x33, 0x91, 0xfd, 0xdd, 0xfc, 0x8d, 0xc7, 0x39,
+			    0x37, 0x07, 0xa6, 0x5b, 0x1b, 0x47, 0x09, 0x39,
+			    0x7c, 0xf8, 0xb1, 0xd1, 0x62, 0xaf, 0x05, 0xab,
+			    0xfe, 0x8f, 0x45, 0x0d, 0xe5, 0xf3, 0x6b, 0xc6,
+			    0xb0, 0x45, 0x5a, 0x85, 0x20, 0xbc, 0x4e, 0x6f,
+			    0x5f, 0xe9, 0x5b, 0x1f, 0xe3, 0xc8, 0x45, 0x2b},
+	}, {
+		.plaintext = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
+ 			     "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
+		.psize	= 112,
+		.digest	= { 0x09, 0x33, 0x0c, 0x33, 0xf7, 0x11, 0x47, 0xe8,
+			    0x3d, 0x19, 0x2f, 0xc7, 0x82, 0xcd, 0x1b, 0x47,
+			    0x53, 0x11, 0x1b, 0x17, 0x3b, 0x3b, 0x05, 0xd2,
+			    0x2f, 0xa0, 0x80, 0x86, 0xe3, 0xb0, 0xf7, 0x12,
+			    0xfc, 0xc7, 0xc7, 0x1a, 0x55, 0x7e, 0x2d, 0xb9,
+			    0x66, 0xc3, 0xe9, 0xfa, 0x91, 0x74, 0x60, 0x39  },
+	}, {
+		.plaintext = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"
+			     "efghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
+		.psize	= 104,
+		.digest	= { 0x3d, 0x20, 0x89, 0x73, 0xab, 0x35, 0x08, 0xdb,
+			    0xbd, 0x7e, 0x2c, 0x28, 0x62, 0xba, 0x29, 0x0a,
+			    0xd3, 0x01, 0x0e, 0x49, 0x78, 0xc1, 0x98, 0xdc,
+			    0x4d, 0x8f, 0xd0, 0x14, 0xe5, 0x82, 0x82, 0x3a,
+			    0x89, 0xe1, 0x6f, 0x9b, 0x2a, 0x7b, 0xbc, 0x1a,
+			    0xc9, 0x38, 0xe2, 0xd1, 0x99, 0xe8, 0xbe, 0xa4 },
+		.np	= 4,
+		.tap	= { 26, 26, 26, 26 }
 	},
 };
 
@@ -646,439 +247,616 @@
  */
 #define SHA512_TEST_VECTORS	4
 
-struct sha512_testvec {
-	char plaintext[128];
-	char digest[SHA512_DIGEST_SIZE];
-} sha512_tv_template[] = {
-
-	{ "abc",
-	  { 0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba,
-	    0xcc, 0x41, 0x73, 0x49, 0xae, 0x20, 0x41, 0x31,
-	    0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2,
-	    0x0a, 0x9e, 0xee, 0xe6, 0x4b, 0x55, 0xd3, 0x9a,
-	    0x21, 0x92, 0x99, 0x2a, 0x27, 0x4f, 0xc1, 0xa8,
-	    0x36, 0xba, 0x3c, 0x23, 0xa3, 0xfe, 0xeb, 0xbd,
-	    0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c, 0xe8, 0x0e,
-	    0x2a, 0x9a, 0xc9, 0x4f, 0xa5, 0x4c, 0xa4, 0x9f }
-	},
-	
-	{ "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
-	  { 0x20, 0x4a, 0x8f, 0xc6, 0xdd, 0xa8, 0x2f, 0x0a,
-	    0x0c, 0xed, 0x7b, 0xeb, 0x8e, 0x08, 0xa4, 0x16,
-	    0x57, 0xc1, 0x6e, 0xf4, 0x68, 0xb2, 0x28, 0xa8,
-	    0x27, 0x9b, 0xe3, 0x31, 0xa7, 0x03, 0xc3, 0x35,
-	    0x96, 0xfd, 0x15, 0xc1, 0x3b, 0x1b, 0x07, 0xf9,
-	    0xaa, 0x1d, 0x3b, 0xea, 0x57, 0x78, 0x9c, 0xa0,
-	    0x31, 0xad, 0x85, 0xc7, 0xa7, 0x1d, 0xd7, 0x03,
-	    0x54, 0xec, 0x63, 0x12, 0x38, 0xca, 0x34, 0x45 }
-	},
-	
-	{ "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
-	  "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
-	  { 0x8e, 0x95, 0x9b, 0x75, 0xda, 0xe3, 0x13, 0xda,
-	    0x8c, 0xf4, 0xf7, 0x28, 0x14, 0xfc, 0x14, 0x3f,
-	    0x8f, 0x77, 0x79, 0xc6, 0xeb, 0x9f, 0x7f, 0xa1,
-	    0x72, 0x99, 0xae, 0xad, 0xb6, 0x88, 0x90, 0x18,
-	    0x50, 0x1d, 0x28, 0x9e, 0x49, 0x00, 0xf7, 0xe4,
-	    0x33, 0x1b, 0x99, 0xde, 0xc4, 0xb5, 0x43, 0x3a,
-	    0xc7, 0xd3, 0x29, 0xee, 0xb6, 0xdd, 0x26, 0x54,
-	    0x5e, 0x96, 0xe5, 0x5b, 0x87, 0x4b, 0xe9, 0x09 }
-	},
-	
-	{ "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"
-	  "efghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
-	  { 0x93, 0x0d, 0x0c, 0xef, 0xcb, 0x30, 0xff, 0x11,
-	    0x33, 0xb6, 0x89, 0x81, 0x21, 0xf1, 0xcf, 0x3d,
-	    0x27, 0x57, 0x8a, 0xfc, 0xaf, 0xe8, 0x67, 0x7c,
-	    0x52, 0x57, 0xcf, 0x06, 0x99, 0x11, 0xf7, 0x5d,
-	    0x8f, 0x58, 0x31, 0xb5, 0x6e, 0xbf, 0xda, 0x67,
-	    0xb2, 0x78, 0xe6, 0x6d, 0xff, 0x8b, 0x84, 0xfe,
-	    0x2b, 0x28, 0x70, 0xf7, 0x42, 0xa5, 0x80, 0xd8,
-	    0xed, 0xb4, 0x19, 0x87, 0x23, 0x28, 0x50, 0xc9
-	  }
+struct hash_testvec sha512_tv_template[] = {
+	{ 
+		.plaintext = "abc",
+		.psize	= 3,
+		.digest	= { 0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba,
+			    0xcc, 0x41, 0x73, 0x49, 0xae, 0x20, 0x41, 0x31,
+			    0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2,
+			    0x0a, 0x9e, 0xee, 0xe6, 0x4b, 0x55, 0xd3, 0x9a,
+			    0x21, 0x92, 0x99, 0x2a, 0x27, 0x4f, 0xc1, 0xa8,
+			    0x36, 0xba, 0x3c, 0x23, 0xa3, 0xfe, 0xeb, 0xbd,
+			    0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c, 0xe8, 0x0e,
+			    0x2a, 0x9a, 0xc9, 0x4f, 0xa5, 0x4c, 0xa4, 0x9f },
+	}, {
+		.plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+		.psize	= 56,
+		.digest	= { 0x20, 0x4a, 0x8f, 0xc6, 0xdd, 0xa8, 0x2f, 0x0a,
+			    0x0c, 0xed, 0x7b, 0xeb, 0x8e, 0x08, 0xa4, 0x16,
+			    0x57, 0xc1, 0x6e, 0xf4, 0x68, 0xb2, 0x28, 0xa8,
+			    0x27, 0x9b, 0xe3, 0x31, 0xa7, 0x03, 0xc3, 0x35,
+			    0x96, 0xfd, 0x15, 0xc1, 0x3b, 0x1b, 0x07, 0xf9,
+			    0xaa, 0x1d, 0x3b, 0xea, 0x57, 0x78, 0x9c, 0xa0,
+			    0x31, 0xad, 0x85, 0xc7, 0xa7, 0x1d, 0xd7, 0x03,
+			    0x54, 0xec, 0x63, 0x12, 0x38, 0xca, 0x34, 0x45 },
+	}, {
+		.plaintext = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
+			     "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
+		.psize	= 112,
+		.digest	= { 0x8e, 0x95, 0x9b, 0x75, 0xda, 0xe3, 0x13, 0xda,
+			    0x8c, 0xf4, 0xf7, 0x28, 0x14, 0xfc, 0x14, 0x3f,
+			    0x8f, 0x77, 0x79, 0xc6, 0xeb, 0x9f, 0x7f, 0xa1,
+			    0x72, 0x99, 0xae, 0xad, 0xb6, 0x88, 0x90, 0x18,
+			    0x50, 0x1d, 0x28, 0x9e, 0x49, 0x00, 0xf7, 0xe4,
+			    0x33, 0x1b, 0x99, 0xde, 0xc4, 0xb5, 0x43, 0x3a,
+			    0xc7, 0xd3, 0x29, 0xee, 0xb6, 0xdd, 0x26, 0x54,
+			    0x5e, 0x96, 0xe5, 0x5b, 0x87, 0x4b, 0xe9, 0x09 },
+	}, {
+		.plaintext = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"
+			     "efghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
+		.psize	= 104,
+		.digest	= { 0x93, 0x0d, 0x0c, 0xef, 0xcb, 0x30, 0xff, 0x11,
+			    0x33, 0xb6, 0x89, 0x81, 0x21, 0xf1, 0xcf, 0x3d,
+			    0x27, 0x57, 0x8a, 0xfc, 0xaf, 0xe8, 0x67, 0x7c,
+			    0x52, 0x57, 0xcf, 0x06, 0x99, 0x11, 0xf7, 0x5d,
+			    0x8f, 0x58, 0x31, 0xb5, 0x6e, 0xbf, 0xda, 0x67,
+			    0xb2, 0x78, 0xe6, 0x6d, 0xff, 0x8b, 0x84, 0xfe,
+			    0x2b, 0x28, 0x70, 0xf7, 0x42, 0xa5, 0x80, 0xd8,
+			    0xed, 0xb4, 0x19, 0x87, 0x23, 0x28, 0x50, 0xc9 },
+		.np	= 4,
+		.tap	= { 26, 26, 26, 26 }
 	},
 };
 
+#ifdef CONFIG_CRYPTO_HMAC
 /*
- * DES test vectors.
+ * HMAC-MD5 test vectors from RFC2202
+ * (These need to be fixed to not use strlen).
  */
-#define DES_ENC_TEST_VECTORS		5
-#define DES_DEC_TEST_VECTORS		2
-#define DES_CBC_ENC_TEST_VECTORS	4
-#define DES_CBC_DEC_TEST_VECTORS	3
-#define DES3_EDE_ENC_TEST_VECTORS	3
-#define DES3_EDE_DEC_TEST_VECTORS	3
-
-struct des_tv {
-	unsigned int len;
-	int fail;
-	char key[24];
-	char iv[8];
-	char plaintext[128];
-	char result[128];
-};
-
-struct des_tv des_enc_tv_template[] = {
-
-	/* From Applied Cryptography */
-	{
-		8, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0 },
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7 },
-		{ 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d }
-	},
-	
-	/* Same key, different plaintext block */
-	{
-		8, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0 },
-		{ 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 },
-		{ 0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b }
-	},
-	
-	/* Sbox test from NBS */
-	{
-		8, 0,
-		
-		{ 0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57 },
-		{ 0 },
-		{ 0x01, 0xA1, 0xD6, 0xD0, 0x39, 0x77, 0x67, 0x42 },
-		{ 0x69, 0x0F, 0x5B, 0x0D, 0x9A, 0x26, 0x93, 0x9B }
-	},
-	
-	/* Three blocks */
-	{
-		24, 0,
-		
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		
-		{ 0 },
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
-		  0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
-		  0xca, 0xfe, 0xba, 0xbe, 0xfe, 0xed, 0xbe, 0xef },
-
-		{ 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
-		  0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b,
-		  0xb4, 0x99, 0x26, 0xf7, 0x1f, 0xe1, 0xd4, 0x90 },		  
-	},
-	
-	/* Weak key */
-	{
-		8, 1,
-		
-		{ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
-		{ 0 },
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7 },
-		{ 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d }
-	},
-	
-	/* Two blocks -- for testing encryption across pages */
-	{
-		16, 0,
-		
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		
-		{ 0 },
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
-		  0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 },
-
-		{ 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
-		  0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b }
-	},
+#define HMAC_MD5_TEST_VECTORS	7
 
-	/* Two blocks -- for testing decryption across pages */
-	{
-		16, 0,
-		
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		
-		{ 0 },
-		
-		{ 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
-		  0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b },
-		  
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
-		  0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 },
-	},
-	
-	/* Four blocks -- for testing encryption with chunking */
+struct hmac_testvec hmac_md5_tv_template[] =
+{	
 	{
-		24, 0,
-		
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		
-		{ 0 },
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
-		  0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
-		  0xca, 0xfe, 0xba, 0xbe, 0xfe, 0xed, 0xbe, 0xef,
-		  0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 },
-
-		{ 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
-		  0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b,
-		  0xb4, 0x99, 0x26, 0xf7, 0x1f, 0xe1, 0xd4, 0x90,
-		  0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b },
+		.key	= { [0 ... 15] =  0x0b },
+		.ksize	= 16,
+		.plaintext = "Hi There",
+		.psize	= 8,
+		.digest	= { 0x92, 0x94, 0x72, 0x7a, 0x36, 0x38, 0xbb, 0x1c,
+			    0x13, 0xf4, 0x8e, 0xf8, 0x15, 0x8b, 0xfc, 0x9d },
+	}, {
+		.key	= { 'J', 'e', 'f', 'e' },
+		.ksize	= 4,
+		.plaintext = "what do ya want for nothing?",
+		.psize	= 28,
+		.digest	= { 0x75, 0x0c, 0x78, 0x3e, 0x6a, 0xb0, 0xb5, 0x03,
+			    0xea, 0xa8, 0x6e, 0x31, 0x0a, 0x5d, 0xb7, 0x38 },
+		.np	= 2,
+		.tap	= {14, 14}
+	}, {
+		.key	= { [0 ... 15] = 0xaa },
+		.ksize	= 16,
+		.plaintext = { [0 ... 49] =  0xdd },
+		.psize	= 50,
+		.digest	= { 0x56, 0xbe, 0x34, 0x52, 0x1d, 0x14, 0x4c, 0x88,
+			    0xdb, 0xb8, 0xc7, 0x33, 0xf0, 0xe8, 0xb3, 0xf6 },
+	}, {
+		.key	= { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
+			    0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
+			    0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, },
+		.ksize	= 25,
+		.plaintext = { [0 ... 49] =  0xcd },
+		.psize	= 50,
+		.digest	= { 0x69, 0x7e, 0xaf, 0x0a, 0xca, 0x3a, 0x3a, 0xea,
+			    0x3a, 0x75, 0x16, 0x47, 0x46, 0xff, 0xaa, 0x79 },
+	}, {
+		.key	= { [0 ... 15] = 0x0c },
+		.ksize	= 16,
+		.plaintext = "Test With Truncation",
+		.psize	= 20,
+		.digest	= { 0x56, 0x46, 0x1e, 0xf2, 0x34, 0x2e, 0xdc, 0x00,
+			    0xf9, 0xba, 0xb9, 0x95, 0x69, 0x0e, 0xfd, 0x4c },
+	}, {
+		.key	= { [0 ... 79] =  0xaa },
+		.ksize	= 80,
+		.plaintext = "Test Using Larger Than Block-Size Key - Hash Key First",
+		.psize	= 54,
+		.digest	= { 0x6b, 0x1a, 0xb7, 0xfe, 0x4b, 0xd7, 0xbf, 0x8f,
+			    0x0b, 0x62, 0xe6, 0xce, 0x61, 0xb9, 0xd0, 0xcd },
+	}, {
+		.key	= { [0 ... 79] =  0xaa },
+		.ksize	= 80,
+		.plaintext = "Test Using Larger Than Block-Size Key and Larger Than One "
+			     "Block-Size Data",
+		.psize	= 73,
+		.digest	= { 0x6f, 0x63, 0x0f, 0xad, 0x67, 0xcd, 0xa0, 0xee,
+			    0x1f, 0xb1, 0xf5, 0x62, 0xdb, 0x3a, 0xa5, 0x3e },
 	},
-	
 };
 
-struct des_tv des_dec_tv_template[] = {
-
-	/* From Applied Cryptography */
-	{
-		8, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0 },
-		{ 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d },
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7 },
-	},
-	
-	/* Sbox test from NBS */
-	{
-		8, 0,
+/*
+ * HMAC-SHA1 test vectors from RFC2202
+ */
+#define HMAC_SHA1_TEST_VECTORS	7
 
-		{ 0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57 },
-		{ 0 },
-		{ 0x69, 0x0F, 0x5B, 0x0D, 0x9A, 0x26, 0x93, 0x9B },
-		{ 0x01, 0xA1, 0xD6, 0xD0, 0x39, 0x77, 0x67, 0x42 }
-	},
-	
-	/* Two blocks, for chunking test */
+struct hmac_testvec hmac_sha1_tv_template[] = {	
 	{
-		16, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0 },
-		
-		{ 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
-		  0x69, 0x0F, 0x5B, 0x0D, 0x9A, 0x26, 0x93, 0x9B },
-		  
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
-		  0xa3, 0x99, 0x7b, 0xca, 0xaf, 0x69, 0xa0, 0xf5 }
+		.key	= { [0 ... 19] = 0x0b },
+		.ksize	= 20,
+		.plaintext = "Hi There",
+		.psize	= 8,
+		.digest	= { 0xb6, 0x17, 0x31, 0x86, 0x55, 0x05, 0x72, 0x64,
+			    0xe2, 0x8b, 0xc0, 0xb6, 0xfb, 0x37, 0x8c, 0x8e, 0xf1,
+			    0x46, 0xbe },
+	}, {
+		.key	= { 'J', 'e', 'f', 'e' },		
+		.ksize	= 4,
+		.plaintext = "what do ya want for nothing?",
+		.psize	= 28,
+		.digest	= { 0xef, 0xfc, 0xdf, 0x6a, 0xe5, 0xeb, 0x2f, 0xa2, 0xd2, 0x74, 
+			    0x16, 0xd5, 0xf1, 0x84, 0xdf, 0x9c, 0x25, 0x9a, 0x7c, 0x79 },
+		.np	= 2,
+		.tap	= { 14, 14 }
+	}, {
+		.key	= { [0 ... 19] = 0xaa },
+		.ksize	= 20,
+		.plaintext = { [0 ... 49] = 0xdd },
+		.psize	= 50,
+		.digest	= { 0x12, 0x5d, 0x73, 0x42, 0xb9, 0xac, 0x11, 0xcd, 0x91, 0xa3, 
+			    0x9a, 0xf4, 0x8a, 0xa1, 0x7b, 0x4f, 0x63, 0xf1, 0x75, 0xd3 },
+	}, {
+		.key	= { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
+			    0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 
+			    0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19 },
+		.ksize	= 25,
+		.plaintext = { [0 ... 49] = 0xcd },
+		.psize	= 50,
+		.digest	= { 0x4c, 0x90, 0x07, 0xf4, 0x02, 0x62, 0x50, 0xc6, 0xbc, 0x84, 
+			    0x14, 0xf9, 0xbf, 0x50, 0xc8, 0x6c, 0x2d, 0x72, 0x35, 0xda },
+	}, {
+		.key	= { [0 ... 19] = 0x0c },
+		.ksize	= 20,
+		.plaintext = "Test With Truncation",
+		.psize	= 20,
+		.digest	= { 0x4c, 0x1a, 0x03, 0x42, 0x4b, 0x55, 0xe0, 0x7f, 0xe7, 0xf2, 
+			    0x7b, 0xe1, 0xd5, 0x8b, 0xb9, 0x32, 0x4a, 0x9a, 0x5a, 0x04 },
+	}, {
+		.key	= { [0 ... 79] = 0xaa },
+		.ksize	= 80,
+		.plaintext = "Test Using Larger Than Block-Size Key - Hash Key First",
+		.psize	= 54,
+		.digest	= { 0xaa, 0x4a, 0xe5, 0xe1, 0x52, 0x72, 0xd0, 0x0e, 0x95, 0x70, 
+			    0x56, 0x37, 0xce, 0x8a, 0x3b, 0x55, 0xed, 0x40, 0x21, 0x12 },
+	}, {
+		.key	= { [0 ... 79] = 0xaa },
+		.ksize	= 80,
+		.plaintext = "Test Using Larger Than Block-Size Key and Larger Than One "
+			     "Block-Size Data",
+		.psize	= 73,
+		.digest	= { 0xe8, 0xe9, 0x9d, 0x0f, 0x45, 0x23, 0x7d, 0x78, 0x6d, 0x6b, 
+			    0xba, 0xa7, 0x96, 0x5c, 0x78, 0x08, 0xbb, 0xff, 0x1a, 0x91 },
 	},
-
 };
 
-struct des_tv des_cbc_enc_tv_template[] = {
-	/* From OpenSSL */
-	{
-		24, 0,
-		
-		{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
-		{0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
-		
-		{ 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20, 
-		  0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74, 
-		  0x68, 0x65, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20, 
-		  0x66, 0x6F, 0x72, 0x20, 0x00, 0x31, 0x00, 0x00 },
-		  
-		{ 0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4, 
-		  0xac, 0xd8, 0xae, 0xfd, 0xdf, 0xd8, 0xa1, 0xeb, 
-		  0x46, 0x8e, 0x91, 0x15, 0x78, 0x88, 0xba, 0x68, 
-		  0x1d, 0x26, 0x93, 0x97, 0xf7, 0xfe, 0x62, 0xb4 }
-	},
+/*
+ * HMAC-SHA256 test vectors from
+ * draft-ietf-ipsec-ciph-sha-256-01.txt
+ */
+#define HMAC_SHA256_TEST_VECTORS	10
 
-	/* FIPS Pub 81 */
-	{
-		8, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef },
-		{ 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74 },
-		{ 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },
-		
-	},
-	
+struct hmac_testvec hmac_sha256_tv_template[] = {
 	{
-		8, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },
-		{ 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 },
-		{ 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
-	},
-	
-	{	
-		8, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
-		{ 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20 },
-		{ 0x68, 0x37, 0x88, 0x49, 0x9a, 0x7c, 0x05, 0xf6 },
-	},
-	
-	/* Copy of openssl vector for chunk testing */
-	
-	/* From OpenSSL */
-	{
-		24, 0,
-		
-		{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
-		{0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
-		
-		{ 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20, 
-		  0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74, 
-		  0x68, 0x65, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20, 
-		  0x66, 0x6F, 0x72, 0x20, 0x00, 0x31, 0x00, 0x00 },
-		  
-		{ 0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4, 
-		  0xac, 0xd8, 0xae, 0xfd, 0xdf, 0xd8, 0xa1, 0xeb, 
-		  0x46, 0x8e, 0x91, 0x15, 0x78, 0x88, 0xba, 0x68, 
-		  0x1d, 0x26, 0x93, 0x97, 0xf7, 0xfe, 0x62, 0xb4 }
+		.key	= { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
+			    0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
+			    0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
+			    0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20},
+		.ksize	= 32,
+		.plaintext = "abc",
+		.psize	= 3,
+		.digest	= { 0xa2, 0x1b, 0x1f, 0x5d, 0x4c, 0xf4, 0xf7, 0x3a,
+			    0x4d, 0xd9, 0x39, 0x75, 0x0f, 0x7a, 0x06, 0x6a,
+			    0x7f, 0x98, 0xcc, 0x13, 0x1c, 0xb1, 0x6a, 0x66,
+			    0x92, 0x75, 0x90, 0x21, 0xcf, 0xab, 0x81, 0x81 },
+	}, {
+		.key	= { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
+			    0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
+			    0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
+			    0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20 },
+		.ksize	= 32,
+		.plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+		.psize	= 56,
+		.digest	= { 0x10, 0x4f, 0xdc, 0x12, 0x57, 0x32, 0x8f, 0x08,
+			    0x18, 0x4b, 0xa7, 0x31, 0x31, 0xc5, 0x3c, 0xae,
+			    0xe6, 0x98, 0xe3, 0x61, 0x19, 0x42, 0x11, 0x49,
+			    0xea, 0x8c, 0x71, 0x24, 0x56, 0x69, 0x7d, 0x30 },
+	}, {
+		.key	= { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
+			    0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
+			    0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
+			    0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20 },
+		.ksize	= 32,
+		.plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
+			     "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+		.psize	= 112,
+		.digest	= { 0x47, 0x03, 0x05, 0xfc, 0x7e, 0x40, 0xfe, 0x34,
+			    0xd3, 0xee, 0xb3, 0xe7, 0x73, 0xd9, 0x5a, 0xab,
+			    0x73, 0xac, 0xf0, 0xfd, 0x06, 0x04, 0x47, 0xa5,
+			    0xeb, 0x45, 0x95, 0xbf, 0x33, 0xa9, 0xd1, 0xa3 },
+	}, {
+		.key	= { [0 ... 31] = 0x0b },
+		.ksize	= 32,
+		.plaintext = "Hi There",
+		.psize	= 8,
+		.digest	= { 0x19, 0x8a, 0x60, 0x7e, 0xb4, 0x4b, 0xfb, 0xc6,
+			    0x99, 0x03, 0xa0, 0xf1, 0xcf, 0x2b, 0xbd, 0xc5,
+			    0xba, 0x0a, 0xa3, 0xf3, 0xd9, 0xae, 0x3c, 0x1c,
+			    0x7a, 0x3b, 0x16, 0x96, 0xa0, 0xb6, 0x8c, 0xf7 },
+	}, {
+		.key	= "Jefe",
+		.ksize	= 4,
+		.plaintext = "what do ya want for nothing?",
+		.psize	= 28,
+		.digest	= { 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e,
+			    0x6a, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xc7,
+			    0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83,
+			    0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43 },
+		.np	= 2,
+		.tap	= { 14, 14 }
+	}, {
+		.key	= { [0 ... 31] = 0xaa },
+		.ksize	= 32,
+		.plaintext = { [0 ... 49] = 0xdd },
+		.psize	= 50,
+		.digest	= { 0xcd, 0xcb, 0x12, 0x20, 0xd1, 0xec, 0xcc, 0xea,
+			    0x91, 0xe5, 0x3a, 0xba, 0x30, 0x92, 0xf9, 0x62,
+			    0xe5, 0x49, 0xfe, 0x6c, 0xe9, 0xed, 0x7f, 0xdc,
+			    0x43, 0x19, 0x1f, 0xbd, 0xe4, 0x5c, 0x30, 0xb0 },
+	}, {
+		.key	= { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
+			    0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
+			    0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
+			    0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
+			    0x21, 0x22, 0x23, 0x24, 0x25 },
+		.ksize	= 37,
+		.plaintext = { [0 ... 49] = 0xcd },
+		.psize	= 50,
+		.digest	= { 0xd4, 0x63, 0x3c, 0x17, 0xf6, 0xfb, 0x8d, 0x74,
+			    0x4c, 0x66, 0xde, 0xe0, 0xf8, 0xf0, 0x74, 0x55,
+			    0x6e, 0xc4, 0xaf, 0x55, 0xef, 0x07, 0x99, 0x85,
+			    0x41, 0x46, 0x8e, 0xb4, 0x9b, 0xd2, 0xe9, 0x17 },
+	}, {
+		.key	= { [0 ... 31] = 0x0c },
+		.ksize	= 32,
+		.plaintext = "Test With Truncation",
+		.psize	= 20,
+		.digest	= { 0x75, 0x46, 0xaf, 0x01, 0x84, 0x1f, 0xc0, 0x9b,
+			    0x1a, 0xb9, 0xc3, 0x74, 0x9a, 0x5f, 0x1c, 0x17,
+			    0xd4, 0xf5, 0x89, 0x66, 0x8a, 0x58, 0x7b, 0x27,
+			    0x00, 0xa9, 0xc9, 0x7c, 0x11, 0x93, 0xcf, 0x42 },
+	}, {
+		.key	= { [0 ... 79] = 0xaa },
+		.ksize	= 80,
+		.plaintext = "Test Using Larger Than Block-Size Key - Hash Key First",
+		.psize	= 54,
+		.digest	= { 0x69, 0x53, 0x02, 0x5e, 0xd9, 0x6f, 0x0c, 0x09,
+			    0xf8, 0x0a, 0x96, 0xf7, 0x8e, 0x65, 0x38, 0xdb,
+			    0xe2, 0xe7, 0xb8, 0x20, 0xe3, 0xdd, 0x97, 0x0e,
+			    0x7d, 0xdd, 0x39, 0x09, 0x1b, 0x32, 0x35, 0x2f },
+	}, {
+		.key	= { [0 ... 79] = 0xaa },
+		.ksize	= 80,
+		.plaintext = "Test Using Larger Than Block-Size Key and Larger Than "
+			     "One Block-Size Data",
+		.psize	= 73,
+		.digest	= { 0x63, 0x55, 0xac, 0x22, 0xe8, 0x90, 0xd0, 0xa3,
+			    0xc8, 0x48, 0x1a, 0x5c, 0xa4, 0x82, 0x5b, 0xc8,
+			    0x84, 0xd3, 0xe7, 0xa1, 0xff, 0x98, 0xa2, 0xfc,
+			    0x2a, 0xc7, 0xd8, 0xe0, 0x64, 0xc3, 0xb2, 0xe6 },
 	},
-
-	
 };
 
-struct des_tv des_cbc_dec_tv_template[] = {
+#endif	/* CONFIG_CRYPTO_HMAC */
 
-	/* FIPS Pub 81 */
-	{
-		8, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef },
-		{ 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },
-		{ 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74 },
-	},
-	
-	{
-		8, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },
-		{ 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
-		{ 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 }, 
-	},
-	
-	{
-		8, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
-		{ 0x68, 0x37, 0x88, 0x49, 0x9a, 0x7c, 0x05, 0xf6 }, 
-		{ 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20 },
-	},
-	
-	/* Copy of above, for chunk testing */
-	
-	{
-		8, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
-		{ 0x68, 0x37, 0x88, 0x49, 0x9a, 0x7c, 0x05, 0xf6 }, 
-		{ 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20 },
+/*
+ * DES test vectors.
+ */
+#define DES_ENC_TEST_VECTORS		10
+#define DES_DEC_TEST_VECTORS		4
+#define DES_CBC_ENC_TEST_VECTORS	5
+#define DES_CBC_DEC_TEST_VECTORS	4
+#define DES3_EDE_ENC_TEST_VECTORS	3
+#define DES3_EDE_DEC_TEST_VECTORS	3
+
+struct cipher_testvec des_enc_tv_template[] = {
+	{ /* From Applied Cryptography */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.input	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7 },
+		.ilen	= 8,
+		.result	= { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d },
+		.rlen	= 8,
+	}, { /* Same key, different plaintext block */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.input	= { 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 },
+		.ilen	= 8,
+		.result	= { 0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b },
+		.rlen	= 8,
+	}, { /* Sbox test from NBS */
+		.key	= { 0x7c, 0xa1, 0x10, 0x45, 0x4a, 0x1a, 0x6e, 0x57 },
+		.klen	= 8,
+		.input	= { 0x01, 0xa1, 0xd6, 0xd0, 0x39, 0x77, 0x67, 0x42 },
+		.ilen	= 8,
+		.result	= { 0x69, 0x0f, 0x5b, 0x0d, 0x9a, 0x26, 0x93, 0x9b },
+		.rlen	= 8,
+	}, { /* Three blocks */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.input	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
+			    0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
+			    0xca, 0xfe, 0xba, 0xbe, 0xfe, 0xed, 0xbe, 0xef },
+		.ilen	= 24,
+		.result	= { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
+			    0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b,
+			    0xb4, 0x99, 0x26, 0xf7, 0x1f, 0xe1, 0xd4, 0x90 },
+		.rlen	= 24,
+	}, { /* Weak key */
+		.fail	= 1,
+		.wk	= 1,
+		.key	= { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
+		.klen	= 8,
+		.input	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7 },
+		.ilen	= 8,
+		.result	= { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d },
+		.rlen	= 8,
+	}, { /* Two blocks -- for testing encryption across pages */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.input	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
+			    0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 },
+		.ilen	= 16,
+		.result	= { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
+			    0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b },
+		.rlen	= 16,
+		.np	= 2,
+		.tap	= { 8, 8 }
+	}, { /* Four blocks -- for testing encryption with chunking */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.input	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
+			    0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
+			    0xca, 0xfe, 0xba, 0xbe, 0xfe, 0xed, 0xbe, 0xef,
+			    0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 },
+		.ilen	= 32,
+		.result	= { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
+			    0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b,
+			    0xb4, 0x99, 0x26, 0xf7, 0x1f, 0xe1, 0xd4, 0x90,
+			    0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b },
+		.rlen	= 32,
+		.np	= 3,
+		.tap	= { 14, 10, 8 } 
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.input	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
+			    0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
+			    0xca, 0xfe, 0xba, 0xbe, 0xfe, 0xed, 0xbe, 0xef },
+		.ilen	= 24,
+		.result	= { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
+			    0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b,
+			    0xb4, 0x99, 0x26, 0xf7, 0x1f, 0xe1, 0xd4, 0x90 },
+		.rlen	= 24,
+		.np	= 4,
+		.tap	= { 2, 1, 3, 18 } 
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.input	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
+			    0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 },
+		.ilen	= 16,
+		.result	= { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
+			    0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b },
+		.rlen	= 16,
+		.np	= 5,
+		.tap	= { 2, 2, 2, 2, 8 } 
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.input	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7 },
+		.ilen	= 8,
+		.result	= { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d },
+		.rlen	= 8,
+		.np	= 8,
+		.tap	= { 1, 1, 1, 1, 1, 1, 1, 1 } 
+	},
+};
+
+struct cipher_testvec des_dec_tv_template[] = {
+	{ /* From Applied Cryptography */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.input	= { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d },
+		.ilen	= 8,
+		.result	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7 },
+		.rlen	= 8,
+	}, { /* Sbox test from NBS */
+		.key	= { 0x7c, 0xa1, 0x10, 0x45, 0x4a, 0x1a, 0x6e, 0x57 },		
+		.klen	= 8,
+		.input	= { 0x69, 0x0f, 0x5b, 0x0d, 0x9a, 0x26, 0x93, 0x9b },
+		.ilen	= 8,
+		.result	= { 0x01, 0xa1, 0xd6, 0xd0, 0x39, 0x77, 0x67, 0x42 },
+		.rlen	= 8,
+	}, { /* Two blocks, for chunking test */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.input	= { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
+			    0x69, 0x0f, 0x5b, 0x0d, 0x9a, 0x26, 0x93, 0x9b },
+		.ilen	= 16,
+		.result	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
+			    0xa3, 0x99, 0x7b, 0xca, 0xaf, 0x69, 0xa0, 0xf5 },
+		.rlen	= 16,
+		.np	= 2,
+		.tap	= { 8, 8 }
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.input	= { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
+			    0x69, 0x0f, 0x5b, 0x0d, 0x9a, 0x26, 0x93, 0x9b },
+		.ilen	= 16,
+		.result	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
+			    0xa3, 0x99, 0x7b, 0xca, 0xaf, 0x69, 0xa0, 0xf5 },
+		.rlen	= 16,
+		.np	= 3,
+		.tap	= { 3, 12, 1 }
+	},
+};
+
+struct cipher_testvec des_cbc_enc_tv_template[] = {
+	{ /* From OpenSSL */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
+		.klen	= 8,
+		.iv	= { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},		
+		.input	= { 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20, 
+			    0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74, 
+			    0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 }, 
+		.ilen	= 24,
+		.result	= { 0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4, 
+			    0xac, 0xd8, 0xae, 0xfd, 0xdf, 0xd8, 0xa1, 0xeb, 
+			    0x46, 0x8e, 0x91, 0x15, 0x78, 0x88, 0xba, 0x68 }, 
+		.rlen	= 24,
+	}, { /* FIPS Pub 81 */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.iv	= { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef },		
+		.input	= { 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74 },
+		.ilen	= 8,
+		.result	= { 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },
+		.rlen	= 8,
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.iv	= { 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },
+		.input	= { 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 },
+		.ilen	= 8,
+		.result	= { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
+		.rlen	= 8,
+	}, {	
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.iv	= { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
+		.input	= { 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20 },
+		.ilen	= 8,
+		.result	= { 0x68, 0x37, 0x88, 0x49, 0x9a, 0x7c, 0x05, 0xf6 },
+		.rlen	= 8,
+	}, { /* Copy of openssl vector for chunk testing */	
+	     /* From OpenSSL */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
+		.klen	= 8,
+		.iv	= { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},		
+		.input	= { 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20, 
+			    0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74, 
+			    0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 }, 
+		.ilen	= 24,
+		.result	= { 0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4, 
+			    0xac, 0xd8, 0xae, 0xfd, 0xdf, 0xd8, 0xa1, 0xeb, 
+			    0x46, 0x8e, 0x91, 0x15, 0x78, 0x88, 0xba, 0x68 }, 
+		.rlen	= 24,
+		.np	= 2,
+		.tap	= { 13, 11 }
+	},
+};
+
+struct cipher_testvec des_cbc_dec_tv_template[] = {
+	{ /* FIPS Pub 81 */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.iv	= { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef },
+		.input	= { 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },
+		.ilen	= 8,
+		.result	= { 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74 },
+		.rlen	= 8,
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.iv	= { 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },		
+		.input	= { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
+		.ilen	= 8,
+		.result	= { 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 }, 
+		.rlen	= 8,
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.iv	= { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
+		.input	= { 0x68, 0x37, 0x88, 0x49, 0x9a, 0x7c, 0x05, 0xf6 }, 
+		.ilen	= 8,
+		.result	= { 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20 },
+		.rlen	= 8,
+	}, { /* Copy of above, for chunk testing */	
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.iv	= { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
+		.input	= { 0x68, 0x37, 0x88, 0x49, 0x9a, 0x7c, 0x05, 0xf6 }, 
+		.ilen	= 8,
+		.result	= { 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20 },
+		.rlen	= 8,
+		.np	= 2,
+		.tap	= { 4, 4 }
 	},
 };
 
 /*
  * We really need some more test vectors, especially for DES3 CBC.
  */
-struct des_tv des3_ede_enc_tv_template[] = {
-
-	/* These are from openssl */
-	{
-		8, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
-		  0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-		  0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10},
-		  
-		{ 0 },
-		
-		{ 0x73, 0x6F, 0x6D, 0x65, 0x64, 0x61, 0x74, 0x61  },
-		
-		{ 0x18, 0xd7, 0x48, 0xe5, 0x63, 0x62, 0x05, 0x72 },
-	},
-	
-	{
-		8, 0,
-		
-		{ 0x03,0x52,0x02,0x07,0x67,0x20,0x82,0x17,
-		  0x86,0x02,0x87,0x66,0x59,0x08,0x21,0x98,
-		  0x64,0x05,0x6A,0xBD,0xFE,0xA9,0x34,0x57  },
-		 
-		{ 0 },
-		
-		{ 0x73,0x71,0x75,0x69,0x67,0x67,0x6C,0x65  },
-		
-		{ 0xc0,0x7d,0x2a,0x0f,0xa5,0x66,0xfa,0x30  }
-	},
-	
-
-	{
-		8, 0,
-		
-		{ 0x10,0x46,0x10,0x34,0x89,0x98,0x80,0x20,
-		  0x91,0x07,0xD0,0x15,0x89,0x19,0x01,0x01,
-		  0x19,0x07,0x92,0x10,0x98,0x1A,0x01,0x01  },
-		  
-		{ 0 },
-			  
-		{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00  },
-		
-		{ 0xe1,0xef,0x62,0xc3,0x32,0xfe,0x82,0x5b  }	
+struct cipher_testvec des3_ede_enc_tv_template[] = {
+	{ /* These are from openssl */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+			    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+			    0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
+		.klen	= 24,
+		.input	= { 0x73, 0x6f, 0x6d, 0x65, 0x64, 0x61, 0x74, 0x61 },
+		.ilen	= 8,
+		.result	= { 0x18, 0xd7, 0x48, 0xe5, 0x63, 0x62, 0x05, 0x72 },
+		.rlen	= 8,
+	}, {
+		.key	= { 0x03, 0x52, 0x02, 0x07, 0x67, 0x20, 0x82, 0x17,
+			    0x86, 0x02, 0x87, 0x66, 0x59, 0x08, 0x21, 0x98,
+			    0x64, 0x05, 0x6a, 0xbd, 0xfe, 0xa9, 0x34, 0x57 },
+		.klen	= 24,
+		.input	= { 0x73, 0x71, 0x75, 0x69, 0x67, 0x67, 0x6c, 0x65 },
+		.ilen	= 8,
+		.result	= { 0xc0, 0x7d, 0x2a, 0x0f, 0xa5, 0x66, 0xfa, 0x30 },
+		.rlen	= 8,
+	}, {
+		.key	= { 0x10, 0x46, 0x10, 0x34, 0x89, 0x98, 0x80, 0x20,
+			    0x91, 0x07, 0xd0, 0x15, 0x89, 0x19, 0x01, 0x01,
+			    0x19, 0x07, 0x92, 0x10, 0x98, 0x1a, 0x01, 0x01 },
+		.klen	= 24,
+		.input	= { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+		.ilen	= 8,
+		.result	= { 0xe1, 0xef, 0x62, 0xc3, 0x32, 0xfe, 0x82, 0x5b },
+		.rlen	= 8,
 	},
 };
 
-struct des_tv des3_ede_dec_tv_template[] = {
-
-	/* These are from openssl */
-	{
-		8, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
-		  0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-		  0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10},
-		  
-		{ 0 },
-		
-		
-		{ 0x18, 0xd7, 0x48, 0xe5, 0x63, 0x62, 0x05, 0x72 },
-		
-		{ 0x73, 0x6F, 0x6D, 0x65, 0x64, 0x61, 0x74, 0x61  },
-	},
-	
-	{
-		8, 0,
-		
-		{ 0x03,0x52,0x02,0x07,0x67,0x20,0x82,0x17,
-		  0x86,0x02,0x87,0x66,0x59,0x08,0x21,0x98,
-		  0x64,0x05,0x6A,0xBD,0xFE,0xA9,0x34,0x57  },
-		 
-		{ 0 },
-		
-		{ 0xc0,0x7d,0x2a,0x0f,0xa5,0x66,0xfa,0x30  },
-		
-		{ 0x73,0x71,0x75,0x69,0x67,0x67,0x6C,0x65  },
-		
-	},
-	
-
-	{
-		8, 0,
-		
-		{ 0x10,0x46,0x10,0x34,0x89,0x98,0x80,0x20,
-		  0x91,0x07,0xD0,0x15,0x89,0x19,0x01,0x01,
-		  0x19,0x07,0x92,0x10,0x98,0x1A,0x01,0x01  },
-		  
-		{ 0 },
-			  
-		{ 0xe1,0xef,0x62,0xc3,0x32,0xfe,0x82,0x5b  },
-		
-		{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00  },
+struct cipher_testvec des3_ede_dec_tv_template[] = {
+	{ /* These are from openssl */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+			    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+			    0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
+		.klen	= 24,
+		.input	= { 0x18, 0xd7, 0x48, 0xe5, 0x63, 0x62, 0x05, 0x72 },
+		.ilen	= 8,
+		.result	= { 0x73, 0x6f, 0x6d, 0x65, 0x64, 0x61, 0x74, 0x61 },
+		.rlen	= 8,
+	}, {
+		.key	= { 0x03, 0x52, 0x02, 0x07, 0x67, 0x20, 0x82, 0x17,
+			    0x86, 0x02, 0x87, 0x66, 0x59, 0x08, 0x21, 0x98,
+			    0x64, 0x05, 0x6a, 0xbd, 0xfe, 0xa9, 0x34, 0x57 },
+		.klen	= 24,
+		.input	= { 0xc0, 0x7d, 0x2a, 0x0f, 0xa5, 0x66, 0xfa, 0x30 },
+		.ilen	= 8,
+		.result	= { 0x73, 0x71, 0x75, 0x69, 0x67, 0x67, 0x6c, 0x65 },
+		.rlen	= 8,
+	}, {
+		.key	= { 0x10, 0x46, 0x10, 0x34, 0x89, 0x98, 0x80, 0x20,
+			    0x91, 0x07, 0xd0, 0x15, 0x89, 0x19, 0x01, 0x01,
+			    0x19, 0x07, 0x92, 0x10, 0x98, 0x1a, 0x01, 0x01 },
+		.klen	= 24,
+		.input	= { 0xe1, 0xef, 0x62, 0xc3, 0x32, 0xfe, 0x82, 0x5b },
+		.ilen	= 8,
+		.result	= { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+		.rlen	= 8,
 	},
 };
 
@@ -1090,189 +868,151 @@
 #define BF_CBC_ENC_TEST_VECTORS	1
 #define BF_CBC_DEC_TEST_VECTORS	1
 
-struct bf_tv {
-	unsigned int keylen;
-	unsigned int plen;
-	unsigned int rlen;
-	int fail;
-	char key[56];
-	char iv[8];
-	char plaintext[32];
-	char result[32];
-};
-
-struct bf_tv bf_enc_tv_template[] = {
-
-	/* DES test vectors from OpenSSL */
-	{
-		8, 8, 8, 0,
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, },
-		{ 0 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x4E, 0xF9, 0x97, 0x45, 0x61, 0x98, 0xDD, 0x78 },
-	},
-	
-	{
-		8, 8, 8, 0,
-		{ 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E,  },
-		{ 0 },
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
-		{ 0xA7, 0x90, 0x79, 0x51, 0x08, 0xEA, 0x3C, 0xAE },
-	},
-	
-	{
-		8, 8, 8, 0,
-		{ 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87, },
-		{ 0 },
-		{ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 },
-		{ 0xE8, 0x7A, 0x24, 0x4E, 0x2C, 0xC8, 0x5E, 0x82 }
-	},
-	
-	/* Vary the keylength... */
-	
-	{
-		16, 8, 8, 0,
-		{ 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87,
-		  0x78, 0x69, 0x5A, 0x4B, 0x3C, 0x2D, 0x1E, 0x0F },
-		{ 0 },
-		{ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 },
-		{ 0x93, 0x14, 0x28, 0x87, 0xEE, 0x3B, 0xE1, 0x5C }
-	},
-	
-	{
-		21, 8, 8, 0,
-		{ 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87,
-		  0x78, 0x69, 0x5A, 0x4B, 0x3C, 0x2D, 0x1E, 0x0F,
-		  0x00, 0x11, 0x22, 0x33, 0x44 },
-		{ 0 },
-		{ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 },
-		{ 0xE6, 0xF5, 0x1E, 0xD7, 0x9B, 0x9D, 0xB2, 0x1F }
-	},
-	
-	/* Generated with bf488 */
-	{
-		56, 8, 8, 0,
-		{ 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87,
-		  0x78, 0x69, 0x5A, 0x4B, 0x3C, 0x2D, 0x1E, 0x0F,
-		  0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-		  0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F, 
-		  0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76, 
-		  0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E, 
-		  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
-		  { 0 },
-		  { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 },
-		  { 0xc0, 0x45, 0x04, 0x01, 0x2e, 0x4e, 0x1f, 0x53 }
-	}
-	
-};
-
-struct bf_tv bf_dec_tv_template[] = {
-
-	/* DES test vectors from OpenSSL */
-	{
-		8, 8, 8, 0,
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, },
-		{ 0 },
-		{ 0x4E, 0xF9, 0x97, 0x45, 0x61, 0x98, 0xDD, 0x78 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
-	},
-	
-	{
-		8, 8, 8, 0,
-		{ 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E,  },
-		{ 0 },
-		{ 0xA7, 0x90, 0x79, 0x51, 0x08, 0xEA, 0x3C, 0xAE },
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }
-	},
-	
-	{
-		8, 8, 8, 0,
-		{ 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87, },
-		{ 0 },
-		{ 0xE8, 0x7A, 0x24, 0x4E, 0x2C, 0xC8, 0x5E, 0x82 },
-		{ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }
-	},
-	
-	/* Vary the keylength... */
-	
-	{
-		16, 8, 8, 0,
-		{ 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87,
-		  0x78, 0x69, 0x5A, 0x4B, 0x3C, 0x2D, 0x1E, 0x0F },
-		{ 0 },
-		{ 0x93, 0x14, 0x28, 0x87, 0xEE, 0x3B, 0xE1, 0x5C },
-		{ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }
-	},
-	
-	{
-		21, 8, 8, 0,
-		{ 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87,
-		  0x78, 0x69, 0x5A, 0x4B, 0x3C, 0x2D, 0x1E, 0x0F,
-		  0x00, 0x11, 0x22, 0x33, 0x44 },
-		{ 0 },
-		{ 0xE6, 0xF5, 0x1E, 0xD7, 0x9B, 0x9D, 0xB2, 0x1F },
-		{ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }
-	},
-	
-	/* Generated with bf488, using OpenSSL, Libgcrypt and Nettle */
-	{
-		56, 8, 8, 0,
-		{ 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87,
-		  0x78, 0x69, 0x5A, 0x4B, 0x3C, 0x2D, 0x1E, 0x0F,
-		  0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-		  0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F, 
-		  0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76, 
-		  0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E, 
-		  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
-		{ 0 },
-		{ 0xc0, 0x45, 0x04, 0x01, 0x2e, 0x4e, 0x1f, 0x53 },
-		{ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }
-	}
-};
-
-struct bf_tv bf_cbc_enc_tv_template[] = {
-
-	/* From OpenSSL */
-	{
-		16, 32, 32, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
-		  0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87 },
-		  
-		{ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 },
-		
-		{ 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
-		  0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
-		  0x68, 0x65, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20,
-		  0x66, 0x6F, 0x72, 0x20, 0x00, 0x00, 0x00, 0x00 },
-		  
-		{ 0x6B, 0x77, 0xB4, 0xD6, 0x30, 0x06, 0xDE, 0xE6,
-		  0x05, 0xB1, 0x56, 0xE2, 0x74, 0x03, 0x97, 0x93,
-		  0x58, 0xDE, 0xB9, 0xE7, 0x15, 0x46, 0x16, 0xD9,
-		  0x59, 0xF1, 0x65, 0x2B, 0xD5, 0xFF, 0x92, 0xCC }
-	},
-};
-
-struct bf_tv bf_cbc_dec_tv_template[] = {
-
-	/* From OpenSSL */
-	{
-		16, 32, 32, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
-		  0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87 },
-		  
-		{ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 },
-		
-		{ 0x6B, 0x77, 0xB4, 0xD6, 0x30, 0x06, 0xDE, 0xE6,
-		  0x05, 0xB1, 0x56, 0xE2, 0x74, 0x03, 0x97, 0x93,
-		  0x58, 0xDE, 0xB9, 0xE7, 0x15, 0x46, 0x16, 0xD9,
-		  0x59, 0xF1, 0x65, 0x2B, 0xD5, 0xFF, 0x92, 0xCC },
-		  
-		{ 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
-		  0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
-		  0x68, 0x65, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20,
-		  0x66, 0x6F, 0x72, 0x20, 0x00, 0x00, 0x00, 0x00 }
+struct cipher_testvec bf_enc_tv_template[] = {
+	{ /* DES test vectors from OpenSSL */
+		.key	= { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, },
+		.klen	= 8,
+		.input	= { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+		.ilen	= 8,
+		.result	= { 0x4e, 0xf9, 0x97, 0x45, 0x61, 0x98, 0xdd, 0x78 },
+		.rlen	= 8,
+	}, {
+		.key	= { 0x1f, 0x1f, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, 0x0e },
+		.klen	= 8,
+		.input	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.ilen	= 8,
+		.result	= { 0xa7, 0x90, 0x79, 0x51, 0x08, 0xea, 0x3c, 0xae },
+		.rlen	= 8,
+	}, {
+		.key	= { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 },
+		.klen	= 8,
+		.input	= { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
+		.ilen	= 8,
+		.result	= { 0xe8, 0x7a, 0x24, 0x4e, 0x2c, 0xc8, 0x5e, 0x82 },
+		.rlen	= 8,
+	}, { /* Vary the keylength... */	
+		.key	= { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
+			    0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f },
+		.klen	= 16,
+		.input	= { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
+		.ilen	= 8,
+		.result	= { 0x93, 0x14, 0x28, 0x87, 0xee, 0x3b, 0xe1, 0x5c },
+		.rlen	= 8,
+	}, {
+		.key	= { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
+			    0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f,
+			    0x00, 0x11, 0x22, 0x33, 0x44 },
+		.klen	= 21,
+		.input	= { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
+		.ilen	= 8,
+		.result	= { 0xe6, 0xf5, 0x1e, 0xd7, 0x9b, 0x9d, 0xb2, 0x1f },
+		.rlen	= 8,
+	}, { /* Generated with bf488 */
+		.key	= { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
+			    0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f,
+			    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+			    0x04, 0x68, 0x91, 0x04, 0xc2, 0xfd, 0x3b, 0x2f, 
+			    0x58, 0x40, 0x23, 0x64, 0x1a, 0xba, 0x61, 0x76, 
+			    0x1f, 0x1f, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, 0x0e, 
+			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
+		.klen	= 56,
+		.input	= { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
+		.ilen	= 8,
+		.result	= { 0xc0, 0x45, 0x04, 0x01, 0x2e, 0x4e, 0x1f, 0x53 },
+		.rlen	= 8,
+	},
+};
+
+struct cipher_testvec bf_dec_tv_template[] = {
+	{ /* DES test vectors from OpenSSL */
+		.key	= { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+		.klen	= 8,
+		.input	= { 0x4e, 0xf9, 0x97, 0x45, 0x61, 0x98, 0xdd, 0x78 },
+		.ilen	= 8,
+		.result	= { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+		.rlen	= 8,
+	}, {
+		.key	= { 0x1f, 0x1f, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, 0x0e },
+		.klen	= 8,
+		.input	= { 0xa7, 0x90, 0x79, 0x51, 0x08, 0xea, 0x3c, 0xae },
+		.ilen	= 8,
+		.result	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.rlen	= 8,
+	}, {
+		.key	= { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 },
+		.klen	= 8,
+		.input	= { 0xe8, 0x7a, 0x24, 0x4e, 0x2c, 0xc8, 0x5e, 0x82 },
+		.ilen	= 8,
+		.result	= { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
+		.rlen	= 8,
+	}, { /* Vary the keylength... */	
+		.key	= { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
+			    0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f },
+		.klen	= 16,
+		.input	= { 0x93, 0x14, 0x28, 0x87, 0xee, 0x3b, 0xe1, 0x5c },
+		.ilen	= 8,
+		.result	= { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
+		.rlen	= 8,
+	}, {
+		.key	= { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
+			    0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f,
+			    0x00, 0x11, 0x22, 0x33, 0x44 },
+		.klen	= 21,
+		.input	= { 0xe6, 0xf5, 0x1e, 0xd7, 0x9b, 0x9d, 0xb2, 0x1f },
+		.ilen	= 8,
+		.result	= { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
+		.rlen	= 8,
+	}, { /* Generated with bf488, using OpenSSL, Libgcrypt and Nettle */
+		.key	= { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
+			    0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f,
+			    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+			    0x04, 0x68, 0x91, 0x04, 0xc2, 0xfd, 0x3b, 0x2f, 
+			    0x58, 0x40, 0x23, 0x64, 0x1a, 0xba, 0x61, 0x76, 
+			    0x1f, 0x1f, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, 0x0e, 
+			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
+		.klen	= 56,
+		.input	= { 0xc0, 0x45, 0x04, 0x01, 0x2e, 0x4e, 0x1f, 0x53 },
+		.ilen	= 8,
+		.result	= { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
+		.rlen	= 8,
+	},
+};
+
+struct cipher_testvec bf_cbc_enc_tv_template[] = {
+	{ /* From OpenSSL */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+			    0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 },
+		.klen	= 16,
+		.iv	= { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },		
+		.input	= { 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
+			    0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
+			    0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20,
+			    0x66, 0x6f, 0x72, 0x20, 0x00, 0x00, 0x00, 0x00 },
+		.ilen	= 32,
+		.result	= { 0x6b, 0x77, 0xb4, 0xd6, 0x30, 0x06, 0xde, 0xe6,
+			    0x05, 0xb1, 0x56, 0xe2, 0x74, 0x03, 0x97, 0x93,
+			    0x58, 0xde, 0xb9, 0xe7, 0x15, 0x46, 0x16, 0xd9,
+			    0x59, 0xf1, 0x65, 0x2b, 0xd5, 0xff, 0x92, 0xcc },
+		.rlen	= 32,
+	},
+};
+
+struct cipher_testvec bf_cbc_dec_tv_template[] = {
+	{ /* From OpenSSL */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+			    0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 },
+		.klen	= 16,
+		.iv	= { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },		
+		.input	= { 0x6b, 0x77, 0xb4, 0xd6, 0x30, 0x06, 0xde, 0xe6,
+			    0x05, 0xb1, 0x56, 0xe2, 0x74, 0x03, 0x97, 0x93,
+			    0x58, 0xde, 0xb9, 0xe7, 0x15, 0x46, 0x16, 0xd9,
+			    0x59, 0xf1, 0x65, 0x2b, 0xd5, 0xff, 0x92, 0xcc },
+		.ilen	= 32,
+		.result	= { 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
+			    0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
+			    0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20,
+			    0x66, 0x6f, 0x72, 0x20, 0x00, 0x00, 0x00, 0x00 },
+		.rlen	= 32,
 	},
 };
 
@@ -1284,212 +1024,161 @@
 #define TF_CBC_ENC_TEST_VECTORS		4
 #define TF_CBC_DEC_TEST_VECTORS		4
 
-struct tf_tv {
-	unsigned int keylen;
-	unsigned int plen;
-	unsigned int rlen;
-	int fail;
-	char key[32];
-	char iv[16];
-	char plaintext[48];
-	char result[48];
-};
-
-struct tf_tv tf_enc_tv_template[] = {
-	{
-		16, 16, 16, 0,
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x9F, 0x58, 0x9F, 0x5C, 0xF6, 0x12, 0x2C, 0x32,
-		  0xB6, 0xBF, 0xEC, 0x2F, 0x2A, 0xE8, 0xC3, 0x5A }
-	},
-	{
-		24, 16, 16, 0,
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
-		  0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-		  0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
-		{ 0 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0xCF, 0xD1, 0xD2, 0xE5, 0xA9, 0xBE, 0x9C, 0xDF,
-		  0x50, 0x1F, 0x13, 0xB8, 0x92, 0xBD, 0x22, 0x48 }
-	},
-	{	
-		32, 16, 16, 0,
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
-		  0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-		  0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-		  0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF },
-		{ 0 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x37, 0x52, 0x7B, 0xE0, 0x05, 0x23, 0x34, 0xB8,
-		  0x9F, 0x0C, 0xFC, 0xCA, 0xE8, 0x7C, 0xFA, 0x20 }
-	},
-};
-
-struct tf_tv tf_dec_tv_template[] = {
-	{
-		16, 16, 16, 0,
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0 },
-		{ 0x9F, 0x58, 0x9F, 0x5C, 0xF6, 0x12, 0x2C, 0x32,
-		  0xB6, 0xBF, 0xEC, 0x2F, 0x2A, 0xE8, 0xC3, 0x5A },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },  
-	},
-	{
-		24, 16, 16, 0,
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
-		  0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-		  0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
-		{ 0 },
-		{ 0xCF, 0xD1, 0xD2, 0xE5, 0xA9, 0xBE, 0x9C, 0xDF,
-		  0x50, 0x1F, 0x13, 0xB8, 0x92, 0xBD, 0x22, 0x48 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-	},
-	{	
-		32, 16, 16, 0,
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
-		  0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-		  0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-		  0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF },
-		{ 0 },
-		{ 0x37, 0x52, 0x7B, 0xE0, 0x05, 0x23, 0x34, 0xB8,
-		  0x9F, 0x0C, 0xFC, 0xCA, 0xE8, 0x7C, 0xFA, 0x20 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-	},
-};
-
-struct tf_tv tf_cbc_enc_tv_template[] = {
-	/* Generated with Nettle */
-	{
-		16, 16, 16, 0,
-		
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-		  0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
-	},
-	
-	{
-		16, 16, 16, 0,
-		
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-		  0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
-		  0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19 },
-	},
-	
-	{
-		16, 16, 16, 0,
-		
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
-		  0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x05, 0xef, 0x8c, 0x61, 0xa8, 0x11, 0x58, 0x26,
-		  0x34, 0xba, 0x5c, 0xb7, 0x10, 0x6a, 0xa6, 0x41 },
-	},
-	
-	{
-		16, 48, 48, 0,
-		
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-		  0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a,
-		  0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
-		  0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19,
-		  0x05, 0xef, 0x8c, 0x61, 0xa8, 0x11, 0x58, 0x26,
-		  0x34, 0xba, 0x5c, 0xb7, 0x10, 0x6a, 0xa6, 0x41 },
-	},
-};
-
-struct tf_tv tf_cbc_dec_tv_template[] = {
-	/* Reverse of the first four above */
-	{
-		16, 16, 16, 0,
-		
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-		  0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },		  
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-	},
-	
-	{
-		16, 16, 16, 0,
-		
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-		  0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
-		{ 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
-		  0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },  
-	},
-	
-	{
-		16, 16, 16, 0,
-		
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
-		  0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19 },
-		{ 0x05, 0xef, 0x8c, 0x61, 0xa8, 0x11, 0x58, 0x26,
-		  0x34, 0xba, 0x5c, 0xb7, 0x10, 0x6a, 0xa6, 0x41 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },  
-	},
-	
+struct cipher_testvec tf_enc_tv_template[] = {
 	{
-		16, 48, 48, 0,
-		
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-		  0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a,
-		  0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
-		  0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19,
-		  0x05, 0xef, 0x8c, 0x61, 0xa8, 0x11, 0x58, 0x26,
-		  0x34, 0xba, 0x5c, 0xb7, 0x10, 0x6a, 0xa6, 0x41 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+		.key	= { [0 ... 15] = 0x00 },
+		.klen	= 16,
+		.input	= { [0 ... 15] = 0x00 },
+		.ilen	= 16,
+		.result	= { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
+			    0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+			    0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
+			    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
+		.klen	= 24,
+		.input	= { [0 ... 15] = 0x00 },
+		.ilen	= 16,
+		.result	= { 0xcf, 0xd1, 0xd2, 0xe5, 0xa9, 0xbe, 0x9c, 0xdf,
+			    0x50, 0x1f, 0x13, 0xb8, 0x92, 0xbd, 0x22, 0x48 },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+			    0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
+			    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+			    0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
+		.klen	= 32,
+		.input	= { [0 ... 15] = 0x00 },
+		.ilen	= 16,
+		.result	= { 0x37, 0x52, 0x7b, 0xe0, 0x05, 0x23, 0x34, 0xb8,
+			    0x9f, 0x0c, 0xfc, 0xca, 0xe8, 0x7c, 0xfa, 0x20 },
+		.rlen	= 16,
+	},
+};
+
+struct cipher_testvec tf_dec_tv_template[] = {
+	{
+		.key	= { [0 ... 15] = 0x00 },
+		.klen	= 16,
+		.input	= { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
+			    0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
+		.ilen	= 16,
+		.result	= { [0 ... 15] = 0x00 },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+			    0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
+			    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
+		.klen	= 24,
+		.input	= { 0xcf, 0xd1, 0xd2, 0xe5, 0xa9, 0xbe, 0x9c, 0xdf,
+			    0x50, 0x1f, 0x13, 0xb8, 0x92, 0xbd, 0x22, 0x48 },
+		.ilen	= 16,
+		.result	= { [0 ... 15] = 0x00 },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+			    0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
+			    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+			    0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
+		.klen	= 32,
+		.input	= { 0x37, 0x52, 0x7b, 0xe0, 0x05, 0x23, 0x34, 0xb8,
+			    0x9f, 0x0c, 0xfc, 0xca, 0xe8, 0x7c, 0xfa, 0x20 },
+		.ilen	= 16,
+		.result	= { [0 ... 15] = 0x00 },
+		.rlen	= 16,
+	},
+};
+
+struct cipher_testvec tf_cbc_enc_tv_template[] = {
+	{ /* Generated with Nettle */
+		.key	= { [0 ... 15] = 0x00 },
+		.klen	= 16,
+		.iv	= { [0 ... 15] = 0x00 },
+		.input	= { [0 ... 15] = 0x00 },
+		.ilen	= 16,
+		.result	= { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
+			    0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
+		.rlen	= 16,
+	}, {
+		.key	= { [0 ... 15] = 0x00 },
+		.klen	= 16,
+		.iv	= { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
+			    0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },		
+		.input	= { [0 ... 15] = 0x00 },
+		.ilen	= 16,
+		.result	= { 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
+			    0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19 },
+		.rlen	= 16,
+	}, {
+		.key	= { [0 ... 15] = 0x00 },
+		.klen	= 16,
+		.iv	= { 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
+			    0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19 },
+		.input	= { [0 ... 15] = 0x00 },
+		.ilen	= 16,
+		.result	= { 0x05, 0xef, 0x8c, 0x61, 0xa8, 0x11, 0x58, 0x26,
+			    0x34, 0xba, 0x5c, 0xb7, 0x10, 0x6a, 0xa6, 0x41 },
+		.rlen	= 16,
+	}, {
+		.key	= { [0 ... 15] = 0x00 },
+		.klen	= 16,
+		.iv	= { [0 ... 15] = 0x00 },
+		.input	= { [0 ... 47] = 0x00 },
+		.ilen	= 48,
+		.result	= { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
+			    0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a,
+			    0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
+			    0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19,
+			    0x05, 0xef, 0x8c, 0x61, 0xa8, 0x11, 0x58, 0x26,
+			    0x34, 0xba, 0x5c, 0xb7, 0x10, 0x6a, 0xa6, 0x41 },
+		.rlen	= 48,
+	},
+};
+
+struct cipher_testvec tf_cbc_dec_tv_template[] = {
+	{ /* Reverse of the first four above */
+		.key	= { [0 ... 15] = 0x00 },
+		.klen	= 16,
+		.iv	= { [0 ... 15] = 0x00 },
+		.input	= { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
+			    0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },		  
+		.ilen	= 16,
+		.result	= { [0 ... 15] = 0x00 },
+		.rlen	= 16,
+	}, {
+		.key	= { [0 ... 15] = 0x00 },
+		.klen	= 16,
+		.iv	= { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
+			    0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
+		.input	= { 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
+			    0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19 },
+		.ilen	= 16,
+		.result	= { [0 ... 15] = 0x00 },
+		.rlen	= 16,
+	}, {
+		.key	= { [0 ... 15] = 0x00 },
+		.klen	= 16,
+		.iv	= { 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
+			    0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19 },
+		.input	= { 0x05, 0xef, 0x8c, 0x61, 0xa8, 0x11, 0x58, 0x26,
+			    0x34, 0xba, 0x5c, 0xb7, 0x10, 0x6a, 0xa6, 0x41 },
+		.ilen	= 16,
+		.result	= { [0 ... 15] = 0x00 },
+		.rlen	= 16,
+	}, {
+		.key	= { [0 ... 15] = 0x00 },
+		.klen	= 16,
+		.iv	= { [0 ... 15] = 0x00 },
+		.input	= { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
+			    0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a,
+			    0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
+			    0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19,
+			    0x05, 0xef, 0x8c, 0x61, 0xa8, 0x11, 0x58, 0x26,
+			    0x34, 0xba, 0x5c, 0xb7, 0x10, 0x6a, 0xa6, 0x41 },
+		.ilen	= 48,
+		.result	= { [0 ... 47] = 0x00 },
+		.rlen	= 48,
 	},
 };
 
@@ -1500,179 +1189,162 @@
 #define SERPENT_ENC_TEST_VECTORS	4
 #define SERPENT_DEC_TEST_VECTORS	4
 
-struct serpent_tv {
-	unsigned int keylen, fail;
-	u8 key[32], plaintext[16], result[16];
-};
-
-struct serpent_tv serpent_enc_tv_template[] = 
+struct cipher_testvec serpent_enc_tv_template[] = 
 {
 	{
-		0, 0,
-		{ 0 },
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-		{ 0x12, 0x07, 0xfc, 0xce, 0x9b, 0xd0, 0xd6, 0x47,
-		  0x6a, 0xe9, 0x8f, 0xbe, 0xd1, 0x43, 0xa0, 0xe2 }
+		.input	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
+		.ilen	= 16,
+		.result	= { 0x12, 0x07, 0xfc, 0xce, 0x9b, 0xd0, 0xd6, 0x47,
+			    0x6a, 0xe9, 0x8f, 0xbe, 0xd1, 0x43, 0xa0, 0xe2 },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
+		.klen	= 16,
+		.input	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
+		.ilen	= 16,
+		.result	= { 0x4c, 0x7d, 0x8a, 0x32, 0x80, 0x72, 0xa2, 0x2c,
+			    0x82, 0x3e, 0x4a, 0x1f, 0x3a, 0xcd, 0xa1, 0x6d },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+			    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+			    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
+		.klen	= 32,
+		.input	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
+		.ilen	= 16,
+		.result	= { 0xde, 0x26, 0x9f, 0xf8, 0x33, 0xe4, 0x32, 0xb8,
+			    0x5b, 0x2e, 0x88, 0xd2, 0x70, 0x1c, 0xe7, 0x5c },
+		.rlen	= 16,
+	}, {
+		.key	= { [15] = 0x80 },
+		.klen	= 16,
+		.input	= { [0 ... 15] = 0x00 },
+		.ilen	= 16,
+		.result	= { 0xdd, 0xd2, 0x6b, 0x98, 0xa5, 0xff, 0xd8, 0x2c,
+			    0x05, 0x34, 0x5a, 0x9d, 0xad, 0xbf, 0xaf, 0x49},
+		.rlen	= 16,
 	},
-	{
-		16, 0,
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-		{ 0x4c, 0x7d, 0x8a, 0x32, 0x80, 0x72, 0xa2, 0x2c,
-		  0x82, 0x3e, 0x4a, 0x1f, 0x3a, 0xcd, 0xa1, 0x6d }
-	},
-	{
-		32, 0,
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-		  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-		  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-		{ 0xde, 0x26, 0x9f, 0xf8, 0x33, 0xe4, 0x32, 0xb8,
-		  0x5b, 0x2e, 0x88, 0xd2, 0x70, 0x1c, 0xe7, 0x5c }
-	},
-	{
-		16, 0,
-		{ 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 },
-		{ 0xdd, 0xd2, 0x6b, 0x98, 0xa5, 0xff, 0xd8, 0x2c,
-		  0x05, 0x34, 0x5a, 0x9d, 0xad, 0xbf, 0xaf, 0x49}
-	}
 };
 
-struct serpent_tv serpent_dec_tv_template[] = 
+struct cipher_testvec serpent_dec_tv_template[] = 
 {
 	{
-		0, 0,
-		{ 0 },
-		{ 0x12, 0x07, 0xfc, 0xce, 0x9b, 0xd0, 0xd6, 0x47,
-		  0x6a, 0xe9, 0x8f, 0xbe, 0xd1, 0x43, 0xa0, 0xe2 },
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-
-	},
-	{
-		16, 0,
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-		{ 0x4c, 0x7d, 0x8a, 0x32, 0x80, 0x72, 0xa2, 0x2c,
-		  0x82, 0x3e, 0x4a, 0x1f, 0x3a, 0xcd, 0xa1, 0x6d },
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-	},
-	{
-		32, 0,
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-		  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-		  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
-
-		{ 0xde, 0x26, 0x9f, 0xf8, 0x33, 0xe4, 0x32, 0xb8,
-		  0x5b, 0x2e, 0x88, 0xd2, 0x70, 0x1c, 0xe7, 0x5c },
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
+		.input	= { 0x12, 0x07, 0xfc, 0xce, 0x9b, 0xd0, 0xd6, 0x47,
+			    0x6a, 0xe9, 0x8f, 0xbe, 0xd1, 0x43, 0xa0, 0xe2 },
+		.ilen	= 16,
+		.result	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
+		.klen	= 16,
+		.input	= { 0x4c, 0x7d, 0x8a, 0x32, 0x80, 0x72, 0xa2, 0x2c,
+			    0x82, 0x3e, 0x4a, 0x1f, 0x3a, 0xcd, 0xa1, 0x6d },
+		.ilen	= 16,
+		.result	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+			    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+			    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
+		.klen	= 32,
+		.input	= { 0xde, 0x26, 0x9f, 0xf8, 0x33, 0xe4, 0x32, 0xb8,
+			    0x5b, 0x2e, 0x88, 0xd2, 0x70, 0x1c, 0xe7, 0x5c },
+		.ilen	= 16,
+		.result	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
+		.rlen	= 16,
+	}, {
+		.key	= { [15] = 0x80 },
+		.klen	= 16,
+		.input	= { 0xdd, 0xd2, 0x6b, 0x98, 0xa5, 0xff, 0xd8, 0x2c,
+			    0x05, 0x34, 0x5a, 0x9d, 0xad, 0xbf, 0xaf, 0x49},
+		.ilen	= 16,
+		.result	= { [0 ... 15] = 0x00 },
+		.rlen	= 16,
 	},
-	{
-		16, 0,
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 },
-		{ 0xdd, 0xd2, 0x6b, 0x98, 0xa5, 0xff, 0xd8, 0x2c,
-		  0x05, 0x34, 0x5a, 0x9d, 0xad, 0xbf, 0xaf, 0x49},
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },  
-	}
 };
 
 /* Cast6 test vectors from RFC 2612 */
 #define CAST6_ENC_TEST_VECTORS	3
 #define CAST6_DEC_TEST_VECTORS  3
 
-struct cast6_tv {
-	unsigned keylen;
-	unsigned fail;
-	u8 key[32];
-	u8 plaintext[16];
-	u8 result[16];
-};
-
-struct cast6_tv cast6_enc_tv_template[] = 
+struct cipher_testvec cast6_enc_tv_template[] = 
 {
 	{
-		16, 
-		0,
-		{ 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c, 
-		  0x0a, 0xf7, 0x56, 0x47, 0xf2, 0x9f, 0x61, 0x5d },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0xc8, 0x42, 0xa0, 0x89, 0x72, 0xb4, 0x3d, 0x20, 
-		  0x83, 0x6c, 0x91, 0xd1, 0xb7, 0x53, 0x0f, 0x6b },
+		.key	= { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c, 
+			    0x0a, 0xf7, 0x56, 0x47, 0xf2, 0x9f, 0x61, 0x5d },
+		.klen	= 16,
+		.input	= { [0 ... 15] = 0x00 },
+		.ilen	= 16,
+		.result	= { 0xc8, 0x42, 0xa0, 0x89, 0x72, 0xb4, 0x3d, 0x20, 
+			    0x83, 0x6c, 0x91, 0xd1, 0xb7, 0x53, 0x0f, 0x6b },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c, 
+			    0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98, 
+			    0xba, 0xc7, 0x7a, 0x77, 0x17, 0x94, 0x28, 0x63 },
+		.klen	= 24,
+		.input	= { [0 ... 15] = 0x00 },
+		.ilen	= 16,
+		.result	= { 0x1b, 0x38, 0x6c, 0x02, 0x10, 0xdc, 0xad, 0xcb, 
+			    0xdd, 0x0e, 0x41, 0xaa, 0x08, 0xa7, 0xa7, 0xe8 },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
+			    0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98,
+			    0x8d, 0x7c, 0x47, 0xce, 0x26, 0x49, 0x08, 0x46,
+			    0x1c, 0xc1, 0xb5, 0x13, 0x7a, 0xe6, 0xb6, 0x04 },				  
+		.klen	= 32,
+		.input	= { [0 ... 15] = 0x00 },
+		.ilen	= 16,
+		.result	= { 0x4f, 0x6a, 0x20, 0x38, 0x28, 0x68, 0x97, 0xb9, 
+			    0xc9, 0x87, 0x01, 0x36, 0x55, 0x33, 0x17, 0xfa },
+		.rlen	= 16,
 	},
-	{
-		24, 
-		0,
-		{ 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c, 
-		  0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98, 
-		  0xba, 0xc7, 0x7a, 0x77, 0x17, 0x94, 0x28, 0x63 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x1b, 0x38, 0x6c, 0x02, 0x10, 0xdc, 0xad, 0xcb, 
-		  0xdd, 0x0e, 0x41, 0xaa, 0x08, 0xa7, 0xa7, 0xe8 },
-	},
-	{
-		32, 
-		0,
-		{ 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
-                  0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98,
-		  0x8d, 0x7c, 0x47, 0xce, 0x26, 0x49, 0x08, 0x46,
-		  0x1c, 0xc1, 0xb5, 0x13, 0x7a, 0xe6, 0xb6, 0x04 },				  
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x4f, 0x6a, 0x20, 0x38, 0x28, 0x68, 0x97, 0xb9, 
-		  0xc9, 0x87, 0x01, 0x36, 0x55, 0x33, 0x17, 0xfa },
-	}
 };
 
-struct cast6_tv cast6_dec_tv_template[] = 
+struct cipher_testvec cast6_dec_tv_template[] = 
 {
 	{
-		16, 
-		0,
-		{ 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c, 
-		  0x0a, 0xf7, 0x56, 0x47, 0xf2, 0x9f, 0x61, 0x5d },
-		{ 0xc8, 0x42, 0xa0, 0x89, 0x72, 0xb4, 0x3d, 0x20, 
-		  0x83, 0x6c, 0x91, 0xd1, 0xb7, 0x53, 0x0f, 0x6b },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-	},
-	{
-		24, 
-		0,
-		{ 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c, 
-		  0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98, 
-		  0xba, 0xc7, 0x7a, 0x77, 0x17, 0x94, 0x28, 0x63 },
-		{ 0x1b, 0x38, 0x6c, 0x02, 0x10, 0xdc, 0xad, 0xcb, 
-		  0xdd, 0x0e, 0x41, 0xaa, 0x08, 0xa7, 0xa7, 0xe8 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+		.key	= { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c, 
+			    0x0a, 0xf7, 0x56, 0x47, 0xf2, 0x9f, 0x61, 0x5d },
+		.klen	= 16,
+		.input	= { 0xc8, 0x42, 0xa0, 0x89, 0x72, 0xb4, 0x3d, 0x20, 
+			    0x83, 0x6c, 0x91, 0xd1, 0xb7, 0x53, 0x0f, 0x6b },
+		.ilen	= 16,
+		.result	= { [0 ... 15] = 0x00 },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c, 
+			    0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98, 
+			    0xba, 0xc7, 0x7a, 0x77, 0x17, 0x94, 0x28, 0x63 },
+		.klen	= 24,
+		.input	= { 0x1b, 0x38, 0x6c, 0x02, 0x10, 0xdc, 0xad, 0xcb, 
+			    0xdd, 0x0e, 0x41, 0xaa, 0x08, 0xa7, 0xa7, 0xe8 },
+		.ilen	= 16,
+		.result	= { [0 ... 15] = 0x00 },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
+			    0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98,
+			    0x8d, 0x7c, 0x47, 0xce, 0x26, 0x49, 0x08, 0x46,
+			    0x1c, 0xc1, 0xb5, 0x13, 0x7a, 0xe6, 0xb6, 0x04 },				  
+		.klen	= 32,
+		.input	= { 0x4f, 0x6a, 0x20, 0x38, 0x28, 0x68, 0x97, 0xb9, 
+			    0xc9, 0x87, 0x01, 0x36, 0x55, 0x33, 0x17, 0xfa },
+		.ilen	= 16,
+		.result	= { [0 ... 15] = 0x00 },
+		.rlen	= 16,
 	},
-	{
-		32, 
-		0,
-		{ 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
-                  0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98,
-		  0x8d, 0x7c, 0x47, 0xce, 0x26, 0x49, 0x08, 0x46,
-		  0x1c, 0xc1, 0xb5, 0x13, 0x7a, 0xe6, 0xb6, 0x04 },				  
-		{ 0x4f, 0x6a, 0x20, 0x38, 0x28, 0x68, 0x97, 0xb9, 
-		  0xc9, 0x87, 0x01, 0x36, 0x55, 0x33, 0x17, 0xfa },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-	}
 };
 
 
@@ -1682,90 +1354,77 @@
 #define AES_ENC_TEST_VECTORS 3
 #define AES_DEC_TEST_VECTORS 3
 
-struct aes_tv {
-	unsigned int keylen;
-	unsigned int plen;
-	unsigned int rlen;
-	int fail;
-	char key[32];
-	char iv[8];
-	char plaintext[16];
-	char result[16];
-};
-
-struct aes_tv aes_enc_tv_template[] = { 
-	/* From FIPS-197 */
-	{
-		16, 16, 16, 0,
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-		{ 0 },
-		{ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-		  0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
-		{ 0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30,
-		  0xd8, 0xcd, 0xb7, 0x80, 0x70, 0xb4, 0xc5, 0x5a },
-	},
-	{
-		24, 16, 16, 0,
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-		  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 },
-		{ 0 },
-		{ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 
-		  0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
-		{ 0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0,
-		  0x6e, 0xaf, 0x70, 0xa0, 0xec, 0x0d, 0x71, 0x91 },
-	},
-	{
-		32, 16, 16, 0,
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-		  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-		  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
-		{ 0 },
-		{ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 
-		  0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
-		{ 0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf,
-		  0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89 },
-	},
-};
-
-struct aes_tv aes_dec_tv_template[] = { 
-	/* From FIPS-197 */
-	{
-		16, 16, 16, 0,
-		
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-		{ 0 },
-		{ 0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30,
-		  0xd8, 0xcd, 0xb7, 0x80, 0x70, 0xb4, 0xc5, 0x5a },
-		{ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-		  0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
-	},
-	
-	{
-		24, 16, 16, 0,
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-		  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 },
-		{ 0 },
-		{ 0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0,
-		  0x6e, 0xaf, 0x70, 0xa0, 0xec, 0x0d, 0x71, 0x91 },
-		{ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 
-		  0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },  
-	},
-	{
-		32, 16, 16, 0,
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-		  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-		  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
-		{ 0 },
-		{ 0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf,
-		  0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89 },
-		{ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 
-		  0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
+struct cipher_testvec aes_enc_tv_template[] = { 
+	{ /* From FIPS-197 */
+		.key	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
+		.klen	= 16,
+		.input	= { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+			    0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
+		.ilen	= 16,
+		.result	= { 0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30,
+			    0xd8, 0xcd, 0xb7, 0x80, 0x70, 0xb4, 0xc5, 0x5a },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+			    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 },
+		.klen	= 24,
+		.input	= { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 
+			    0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
+		.ilen	= 16,
+		.result	= { 0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0,
+			    0x6e, 0xaf, 0x70, 0xa0, 0xec, 0x0d, 0x71, 0x91 },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+			    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+			    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
+		.klen	= 32,
+		.input	= { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 
+			    0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
+		.ilen	= 16,
+		.result	= { 0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf,
+			    0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89 },
+		.rlen	= 16,
+	},
+};
+
+struct cipher_testvec aes_dec_tv_template[] = { 
+	{ /* From FIPS-197 */
+		.key	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
+		.klen	= 16,
+		.input	= { 0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30,
+			    0xd8, 0xcd, 0xb7, 0x80, 0x70, 0xb4, 0xc5, 0x5a },
+		.ilen	= 16,
+		.result	= { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+			    0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+			    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 },
+		.klen	= 24,
+		.input	= { 0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0,
+			    0x6e, 0xaf, 0x70, 0xa0, 0xec, 0x0d, 0x71, 0x91 },
+		.ilen	= 16,
+		.result	= { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 
+			    0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },  
+		.rlen	= 16,
+	}, {
+		.key	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+			    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+			    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
+		.klen	= 32,
+		.input	= { 0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf,
+			    0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89 },
+		.ilen	= 16,
+		.result	= { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 
+			    0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
+		.rlen	= 16,
 	},
 };
 
@@ -1773,68 +1432,60 @@
 #define CAST5_ENC_TEST_VECTORS	3
 #define CAST5_DEC_TEST_VECTORS	3
 
-struct cast5_tv {
-	unsigned keylen;
-	unsigned fail;
-	u8 key[16];
-	u8 plaintext[8];
-	u8 ciphertext[8];
-};
-
-struct cast5_tv cast5_enc_tv_template[] =
+struct cipher_testvec cast5_enc_tv_template[] =
 {
 	{
-		16,
-		0,
-		{ 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
-		  0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9A },
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0x23, 0x8b, 0x4f, 0xe5, 0x84, 0x7e, 0x44, 0xb2 },
-
-	},
-	{
-		10,
-		0,
-		{ 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
-		  0x23, 0x45 },
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0xeb, 0x6a, 0x71, 0x1a, 0x2c, 0x02, 0x27, 0x1b },
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
+			    0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9a },
+		.klen	= 16,
+		.input	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.ilen	= 8,
+		.result	= { 0x23, 0x8b, 0x4f, 0xe5, 0x84, 0x7e, 0x44, 0xb2 },
+		.rlen	= 8,
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
+			    0x23, 0x45 },
+		.klen	= 10,
+		.input	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.ilen	= 8,
+		.result	= { 0xeb, 0x6a, 0x71, 0x1a, 0x2c, 0x02, 0x27, 0x1b },
+		.rlen	= 8,
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x12 },
+		.klen	= 5,
+		.input	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.ilen	= 8,
+		.result	= { 0x7a, 0xc8, 0x16, 0xd1, 0x6e, 0x9b, 0x30, 0x2e },
+		.rlen	= 8,
 	},
-	{
-		5,
-		0,
-		{ 0x01, 0x23, 0x45, 0x67, 0x12 },
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0x7a, 0xc8, 0x16, 0xd1, 0x6e, 0x9b, 0x30, 0x2e },
-	}
 };
 
-struct cast5_tv cast5_dec_tv_template[] =
+struct cipher_testvec cast5_dec_tv_template[] =
 {
 	{
-		16,
-		0,
-		{ 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
-		  0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9A },
-		{ 0x23, 0x8b, 0x4f, 0xe5, 0x84, 0x7e, 0x44, 0xb2 },
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-
-	},
-	{
-		10,
-		0,
-		{ 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
-		  0x23, 0x45 },
-		{ 0xeb, 0x6a, 0x71, 0x1a, 0x2c, 0x02, 0x27, 0x1b },
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
+			    0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9a },
+		.klen	= 16,
+		.input	= { 0x23, 0x8b, 0x4f, 0xe5, 0x84, 0x7e, 0x44, 0xb2 },
+		.ilen	= 8,
+		.result	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.rlen	= 8,
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
+			    0x23, 0x45 },
+		.klen	= 10,
+		.input	= { 0xeb, 0x6a, 0x71, 0x1a, 0x2c, 0x02, 0x27, 0x1b },
+		.ilen	= 8,
+		.result	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.rlen	= 8,
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x12 },
+		.klen	= 5,
+		.input	= { 0x7a, 0xc8, 0x16, 0xd1, 0x6e, 0x9b, 0x30, 0x2e },
+		.ilen	= 8,
+		.result	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.rlen	= 8,
 	},
-	{
-		5,
-		0,
-		{ 0x01, 0x23, 0x45, 0x67, 0x12 },
-		{ 0x7a, 0xc8, 0x16, 0xd1, 0x6e, 0x9b, 0x30, 0x2e },
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-	}
 };
 
 /*
@@ -1857,83 +1508,73 @@
 
 struct comp_testvec deflate_comp_tv_template[] = {
 	{
-	  70, 38,
-	  
-	  "Join us now and share the software "
-	  "Join us now and share the software ",
-
-          { 0xf3, 0xca, 0xcf, 0xcc, 0x53, 0x28, 0x2d, 0x56,
-            0xc8, 0xcb, 0x2f, 0x57, 0x48, 0xcc, 0x4b, 0x51,
-            0x28, 0xce, 0x48, 0x2c, 0x4a, 0x55, 0x28, 0xc9,
-            0x48, 0x55, 0x28, 0xce, 0x4f, 0x2b, 0x29, 0x07,
-            0x71, 0xbc, 0x08, 0x2b, 0x01, 0x00 
-          },
-	},
-	  
-	{
-	  191, 122,
-	  
-	  "This document describes a compression method based on the DEFLATE"
-	  "compression algorithm.  This document defines the application of "
-	  "the DEFLATE algorithm to the IP Payload Compression Protocol.",
-	  
-	  { 0x5d, 0x8d, 0x31, 0x0e, 0xc2, 0x30, 0x10, 0x04,
-	    0xbf, 0xb2, 0x2f, 0xc8, 0x1f, 0x10, 0x04, 0x09,
-	    0x89, 0xc2, 0x85, 0x3f, 0x70, 0xb1, 0x2f, 0xf8,
-	    0x24, 0xdb, 0x67, 0xd9, 0x47, 0xc1, 0xef, 0x49,
-	    0x68, 0x12, 0x51, 0xae, 0x76, 0x67, 0xd6, 0x27,
-	    0x19, 0x88, 0x1a, 0xde, 0x85, 0xab, 0x21, 0xf2,
-	    0x08, 0x5d, 0x16, 0x1e, 0x20, 0x04, 0x2d, 0xad,
-	    0xf3, 0x18, 0xa2, 0x15, 0x85, 0x2d, 0x69, 0xc4,
-	    0x42, 0x83, 0x23, 0xb6, 0x6c, 0x89, 0x71, 0x9b,
-	    0xef, 0xcf, 0x8b, 0x9f, 0xcf, 0x33, 0xca, 0x2f,
-	    0xed, 0x62, 0xa9, 0x4c, 0x80, 0xff, 0x13, 0xaf,
-	    0x52, 0x37, 0xed, 0x0e, 0x52, 0x6b, 0x59, 0x02,
-	    0xd9, 0x4e, 0xe8, 0x7a, 0x76, 0x1d, 0x02, 0x98,
-	    0xfe, 0x8a, 0x87, 0x83, 0xa3, 0x4f, 0x56, 0x8a,
-	    0xb8, 0x9e, 0x8e, 0x5c, 0x57, 0xd3, 0xa0, 0x79,
-	    0xfa, 0x02 },
+		.inlen	= 70,
+		.outlen	= 38,
+	  	.input	= "Join us now and share the software "
+			  "Join us now and share the software ",
+		.output	= { 0xf3, 0xca, 0xcf, 0xcc, 0x53, 0x28, 0x2d, 0x56,
+			    0xc8, 0xcb, 0x2f, 0x57, 0x48, 0xcc, 0x4b, 0x51,
+			    0x28, 0xce, 0x48, 0x2c, 0x4a, 0x55, 0x28, 0xc9,
+			    0x48, 0x55, 0x28, 0xce, 0x4f, 0x2b, 0x29, 0x07,
+			    0x71, 0xbc, 0x08, 0x2b, 0x01, 0x00 },
+	}, {
+		.inlen	= 191,
+		.outlen	= 122,
+		.input	= "This document describes a compression method based on the DEFLATE"
+			  "compression algorithm.  This document defines the application of "
+			  "the DEFLATE algorithm to the IP Payload Compression Protocol.",
+		.output	= { 0x5d, 0x8d, 0x31, 0x0e, 0xc2, 0x30, 0x10, 0x04,
+			    0xbf, 0xb2, 0x2f, 0xc8, 0x1f, 0x10, 0x04, 0x09,
+			    0x89, 0xc2, 0x85, 0x3f, 0x70, 0xb1, 0x2f, 0xf8,
+			    0x24, 0xdb, 0x67, 0xd9, 0x47, 0xc1, 0xef, 0x49,
+			    0x68, 0x12, 0x51, 0xae, 0x76, 0x67, 0xd6, 0x27,
+			    0x19, 0x88, 0x1a, 0xde, 0x85, 0xab, 0x21, 0xf2,
+			    0x08, 0x5d, 0x16, 0x1e, 0x20, 0x04, 0x2d, 0xad,
+			    0xf3, 0x18, 0xa2, 0x15, 0x85, 0x2d, 0x69, 0xc4,
+			    0x42, 0x83, 0x23, 0xb6, 0x6c, 0x89, 0x71, 0x9b,
+			    0xef, 0xcf, 0x8b, 0x9f, 0xcf, 0x33, 0xca, 0x2f,
+			    0xed, 0x62, 0xa9, 0x4c, 0x80, 0xff, 0x13, 0xaf,
+			    0x52, 0x37, 0xed, 0x0e, 0x52, 0x6b, 0x59, 0x02,
+			    0xd9, 0x4e, 0xe8, 0x7a, 0x76, 0x1d, 0x02, 0x98,
+			    0xfe, 0x8a, 0x87, 0x83, 0xa3, 0x4f, 0x56, 0x8a,
+			    0xb8, 0x9e, 0x8e, 0x5c, 0x57, 0xd3, 0xa0, 0x79,
+			    0xfa, 0x02 },
 	},
 };
 
 struct comp_testvec deflate_decomp_tv_template[] = {
 	{
-	  122, 191,
-	  
-	  { 0x5d, 0x8d, 0x31, 0x0e, 0xc2, 0x30, 0x10, 0x04,
-	    0xbf, 0xb2, 0x2f, 0xc8, 0x1f, 0x10, 0x04, 0x09,
-	    0x89, 0xc2, 0x85, 0x3f, 0x70, 0xb1, 0x2f, 0xf8,
-	    0x24, 0xdb, 0x67, 0xd9, 0x47, 0xc1, 0xef, 0x49,
-	    0x68, 0x12, 0x51, 0xae, 0x76, 0x67, 0xd6, 0x27,
-	    0x19, 0x88, 0x1a, 0xde, 0x85, 0xab, 0x21, 0xf2,
-	    0x08, 0x5d, 0x16, 0x1e, 0x20, 0x04, 0x2d, 0xad,
-	    0xf3, 0x18, 0xa2, 0x15, 0x85, 0x2d, 0x69, 0xc4,
-	    0x42, 0x83, 0x23, 0xb6, 0x6c, 0x89, 0x71, 0x9b,
-	    0xef, 0xcf, 0x8b, 0x9f, 0xcf, 0x33, 0xca, 0x2f,
-	    0xed, 0x62, 0xa9, 0x4c, 0x80, 0xff, 0x13, 0xaf,
-	    0x52, 0x37, 0xed, 0x0e, 0x52, 0x6b, 0x59, 0x02,
-	    0xd9, 0x4e, 0xe8, 0x7a, 0x76, 0x1d, 0x02, 0x98,
-	    0xfe, 0x8a, 0x87, 0x83, 0xa3, 0x4f, 0x56, 0x8a,
-	    0xb8, 0x9e, 0x8e, 0x5c, 0x57, 0xd3, 0xa0, 0x79,
-	    0xfa, 0x02 },
-	    
-	    "This document describes a compression method based on the DEFLATE"
-	    "compression algorithm.  This document defines the application of "
-	    "the DEFLATE algorithm to the IP Payload Compression Protocol.",
-	},
-	
-	{
-	  38, 70,
-	  
-          { 0xf3, 0xca, 0xcf, 0xcc, 0x53, 0x28, 0x2d, 0x56,
-            0xc8, 0xcb, 0x2f, 0x57, 0x48, 0xcc, 0x4b, 0x51,
-            0x28, 0xce, 0x48, 0x2c, 0x4a, 0x55, 0x28, 0xc9,
-            0x48, 0x55, 0x28, 0xce, 0x4f, 0x2b, 0x29, 0x07,
-            0x71, 0xbc, 0x08, 0x2b, 0x01, 0x00
-          },
-          
-          "Join us now and share the software "
-	  "Join us now and share the software ",
+		.inlen	= 122,
+		.outlen	= 191,
+		.input	= { 0x5d, 0x8d, 0x31, 0x0e, 0xc2, 0x30, 0x10, 0x04,
+			    0xbf, 0xb2, 0x2f, 0xc8, 0x1f, 0x10, 0x04, 0x09,
+			    0x89, 0xc2, 0x85, 0x3f, 0x70, 0xb1, 0x2f, 0xf8,
+			    0x24, 0xdb, 0x67, 0xd9, 0x47, 0xc1, 0xef, 0x49,
+			    0x68, 0x12, 0x51, 0xae, 0x76, 0x67, 0xd6, 0x27,
+			    0x19, 0x88, 0x1a, 0xde, 0x85, 0xab, 0x21, 0xf2,
+			    0x08, 0x5d, 0x16, 0x1e, 0x20, 0x04, 0x2d, 0xad,
+			    0xf3, 0x18, 0xa2, 0x15, 0x85, 0x2d, 0x69, 0xc4,
+			    0x42, 0x83, 0x23, 0xb6, 0x6c, 0x89, 0x71, 0x9b,
+			    0xef, 0xcf, 0x8b, 0x9f, 0xcf, 0x33, 0xca, 0x2f,
+			    0xed, 0x62, 0xa9, 0x4c, 0x80, 0xff, 0x13, 0xaf,
+			    0x52, 0x37, 0xed, 0x0e, 0x52, 0x6b, 0x59, 0x02,
+			    0xd9, 0x4e, 0xe8, 0x7a, 0x76, 0x1d, 0x02, 0x98,
+			    0xfe, 0x8a, 0x87, 0x83, 0xa3, 0x4f, 0x56, 0x8a,
+			    0xb8, 0x9e, 0x8e, 0x5c, 0x57, 0xd3, 0xa0, 0x79,
+			    0xfa, 0x02 },
+		.output	= "This document describes a compression method based on the DEFLATE"
+			  "compression algorithm.  This document defines the application of "
+			  "the DEFLATE algorithm to the IP Payload Compression Protocol.",
+	}, {
+		.inlen	= 38,
+		.outlen	= 70,
+		.input	= { 0xf3, 0xca, 0xcf, 0xcc, 0x53, 0x28, 0x2d, 0x56,
+			    0xc8, 0xcb, 0x2f, 0x57, 0x48, 0xcc, 0x4b, 0x51,
+			    0x28, 0xce, 0x48, 0x2c, 0x4a, 0x55, 0x28, 0xc9,
+			    0x48, 0x55, 0x28, 0xce, 0x4f, 0x2b, 0x29, 0x07,
+			    0x71, 0xbc, 0x08, 0x2b, 0x01, 0x00 },
+		.output	= "Join us now and share the software "
+			  "Join us now and share the software ",
 	},
 };
 
--- diff/drivers/acorn/block/fd1772.c	2003-09-17 12:28:03.000000000 +0100
+++ source/drivers/acorn/block/fd1772.c	2003-12-29 09:30:39.000000000 +0000
@@ -365,13 +365,12 @@
 static void floppy_off(unsigned int nr);
 static void setup_req_params(int drive);
 static void redo_fd_request(void);
-static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int
+static int fd_ioctl(struct block_device *bdev, struct file *filp, unsigned int
 		    cmd, unsigned long param);
 static void fd_probe(int drive);
 static int fd_test_drive_present(int drive);
 static void config_types(void);
-static int floppy_open(struct inode *inode, struct file *filp);
-static int floppy_release(struct inode *inode, struct file *filp);
+static int floppy_open(struct block_device *bdev, struct file *filp);
 static void do_fd_request(request_queue_t *);
 
 /************************* End of Prototypes **************************/
@@ -1309,11 +1308,9 @@
 	return 0;
 }
 
-static int fd_ioctl(struct inode *inode, struct file *filp,
+static int fd_ioctl(struct block_device *bdev, struct file *filp,
 		    unsigned int cmd, unsigned long param)
 {
-	struct block_device *bdev = inode->i_bdev;
-
 	switch (cmd) {
 	case FDFMTEND:
 	case FDFLUSH:
@@ -1453,10 +1450,11 @@
  * drive with different device numbers.
  */
 
-static int floppy_open(struct inode *inode, struct file *filp)
+static int floppy_open(struct block_device *bdev, struct file *filp)
 {
-	int drive = iminor(inode) & 3;
-	int type =  iminor(inode) >> 2;
+	struct archy_floppy_struct *p = bdev->bd_disk->private_data;
+	int drive = p - unit;
+	int type =  MINOR(bdev->bd_dev) >> 2;
 	int old_dev = fd_device[drive];
 
 	if (fd_ref[drive] && old_dev != type)
@@ -1476,10 +1474,13 @@
 		return 0;
 
 	if (filp->f_mode & 3) {
-		check_disk_change(inode->i_bdev);
+		check_disk_change(bdev);
 		if (filp->f_mode & 2) {
-			if (unit[drive].wpstat) {
-				floppy_release(inode, filp);
+			if (p->wpstat) {
+				if (fd_ref[drive] < 0)
+					fd_ref[drive] = 0;
+				else
+					fd_ref[drive]--;
 				return -EROFS;
 			}
 		}
@@ -1487,10 +1488,10 @@
 	return 0;
 }
 
-
-static int floppy_release(struct inode *inode, struct file *filp)
+static int floppy_release(struct gendisk *disk)
 {
-	int drive = iminor(inode) & 3;
+	struct archy_floppy_struct *p = disk->private_data;
+	int drive = p - unit;
 
 	if (fd_ref[drive] < 0)
 		fd_ref[drive] = 0;
--- diff/drivers/acorn/block/mfmhd.c	2003-08-20 14:16:26.000000000 +0100
+++ source/drivers/acorn/block/mfmhd.c	2003-12-29 09:30:39.000000000 +0000
@@ -1153,9 +1153,9 @@
  * The 'front' end of the mfm driver follows...
  */
 
-static int mfm_ioctl(struct inode *inode, struct file *file, u_int cmd, u_long arg)
+static int mfm_ioctl(struct block_device *bdev, struct file *file, u_int cmd, u_long arg)
 {
-	struct mfm_info *p = inode->i_bdev->bd_disk->private_data;
+	struct mfm_info *p = bdev->bd_disk->private_data;
 	struct hd_geometry *geo = (struct hd_geometry *) arg;
 	if (cmd != HDIO_GETGEO)
 		return -EINVAL;
@@ -1167,7 +1167,7 @@
 		return -EFAULT;
 	if (put_user (p->cylinders, &geo->cylinders))
 		return -EFAULT;
-	if (put_user (get_start_sect(inode->i_bdev), &geo->start))
+	if (put_user (get_start_sect(bdev), &geo->start))
 		return -EFAULT;
 	return 0;
 }
--- diff/drivers/acpi/Kconfig	2003-10-09 09:47:33.000000000 +0100
+++ source/drivers/acpi/Kconfig	2003-12-29 09:30:39.000000000 +0000
@@ -251,12 +251,6 @@
 	  This driver will enable your system to shut down using ACPI, and
 	  dump your ACPI DSDT table using /proc/acpi/dsdt.
 
-config ACPI_EFI
-	bool
-	depends on ACPI_INTERPRETER
-	depends on IA64
-	default y
-
 config ACPI_RELAXED_AML
 	bool "Relaxed AML"
 	depends on ACPI_INTERPRETER
@@ -269,5 +263,23 @@
 	  particular, many Toshiba laptops require this for correct operation
 	  of the AC module.
 
+config X86_PM_TIMER
+	bool "Power Management Timer Support"
+	depends on X86 && ACPI
+	depends on ACPI_BOOT && EXPERIMENTAL
+	default n
+	help
+	  The Power Management Timer is available on all ACPI-capable,
+	  in most cases even if ACPI is unusable or blacklisted.
+
+	  This timing source is not affected by powermanagement features
+	  like aggressive processor idling, throttling, frequency and/or
+	  voltage scaling, unlike the commonly used Time Stamp Counter
+	  (TSC) timing source.
+
+	  So, if you see messages like 'Losing too many ticks!' in the
+	  kernel logs, and/or you are using a this on a notebook which
+	  does not yet have an HPET, you should say "Y" here.
+
 endmenu
 
--- diff/drivers/acpi/bus.c	2003-10-27 09:20:43.000000000 +0000
+++ source/drivers/acpi/bus.c	2003-12-29 09:30:39.000000000 +0000
@@ -39,7 +39,7 @@
 #define _COMPONENT		ACPI_BUS_COMPONENT
 ACPI_MODULE_NAME		("acpi_bus")
 
-extern void acpi_pic_set_level_irq(unsigned int irq);
+extern void __init acpi_pic_sci_set_trigger(unsigned int irq);
 
 FADT_DESCRIPTOR			acpi_fadt;
 struct acpi_device		*acpi_root;
@@ -615,7 +615,7 @@
 	if (acpi_ioapic)
 		mp_config_ioapic_for_sci(acpi_fadt.sci_int);
 	else
-		acpi_pic_set_level_irq(acpi_fadt.sci_int);
+		acpi_pic_sci_set_trigger(acpi_fadt.sci_int);
 #endif
 
 	status = acpi_enable_subsystem(ACPI_FULL_INITIALIZATION);
--- diff/drivers/acpi/dispatcher/dsinit.c	2003-10-09 09:47:33.000000000 +0100
+++ source/drivers/acpi/dispatcher/dsinit.c	2003-12-29 09:30:39.000000000 +0000
@@ -106,7 +106,7 @@
 		status = acpi_ds_initialize_region (obj_handle);
 		if (ACPI_FAILURE (status)) {
 			ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Region %p [%4.4s] - Init failure, %s\n",
-				obj_handle, ((struct acpi_namespace_node *) obj_handle)->name.ascii,
+				obj_handle, acpi_ut_get_node_name (obj_handle),
 				acpi_format_exception (status)));
 		}
 
@@ -141,7 +141,7 @@
 		status = acpi_ds_parse_method (obj_handle);
 		if (ACPI_FAILURE (status)) {
 			ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Method %p [%4.4s] - parse failure, %s\n",
-				obj_handle, ((struct acpi_namespace_node *) obj_handle)->name.ascii,
+				obj_handle, acpi_ut_get_node_name (obj_handle),
 				acpi_format_exception (status)));
 
 			/* This parse failed, but we will continue parsing more methods */
--- diff/drivers/acpi/dispatcher/dsmethod.c	2003-06-09 14:18:18.000000000 +0100
+++ source/drivers/acpi/dispatcher/dsmethod.c	2003-12-29 09:30:39.000000000 +0000
@@ -94,7 +94,7 @@
 	}
 
 	ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "**** Parsing [%4.4s] **** named_obj=%p\n",
-		((struct acpi_namespace_node *) obj_handle)->name.ascii, obj_handle));
+		acpi_ut_get_node_name (obj_handle), obj_handle));
 
 	/* Extract the method object from the method Node */
 
@@ -169,7 +169,7 @@
 
 	ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
 		"**** [%4.4s] Parsed **** named_obj=%p Op=%p\n",
-		((struct acpi_namespace_node *) obj_handle)->name.ascii, obj_handle, op));
+		acpi_ut_get_node_name (obj_handle), obj_handle, op));
 
 	acpi_ps_delete_parse_tree (op);
 	return_ACPI_STATUS (status);
--- diff/drivers/acpi/dispatcher/dsmthdat.c	2003-06-30 10:07:33.000000000 +0100
+++ source/drivers/acpi/dispatcher/dsmthdat.c	2003-12-29 09:30:39.000000000 +0000
@@ -567,13 +567,13 @@
 	acpi_status                     status;
 	struct acpi_namespace_node      *node;
 	union acpi_operand_object       *current_obj_desc;
+	union acpi_operand_object       *new_obj_desc;
 
 
 	ACPI_FUNCTION_TRACE ("ds_store_object_to_local");
 	ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Opcode=%d Idx=%d Obj=%p\n",
 		opcode, index, obj_desc));
 
-
 	/* Parameter validation */
 
 	if (!obj_desc) {
@@ -595,6 +595,18 @@
 	}
 
 	/*
+	 * If the reference count on the object is more than one, we must
+	 * take a copy of the object before we store.
+	 */
+	new_obj_desc = obj_desc;
+	if (obj_desc->common.reference_count > 1) {
+		status = acpi_ut_copy_iobject_to_iobject (obj_desc, &new_obj_desc, walk_state);
+		if (ACPI_FAILURE (status)) {
+			return_ACPI_STATUS (status);
+		}
+	}
+
+	/*
 	 * If there is an object already in this slot, we either
 	 * have to delete it, or if this is an argument and there
 	 * is an object reference stored there, we have to do
@@ -624,8 +636,8 @@
 			 * operand objects of type Reference.
 			 */
 			if (ACPI_GET_DESCRIPTOR_TYPE (current_obj_desc) != ACPI_DESC_TYPE_OPERAND) {
-				ACPI_REPORT_ERROR (("Invalid descriptor type while storing to method arg: %X\n",
-					current_obj_desc->common.type));
+				ACPI_REPORT_ERROR (("Invalid descriptor type while storing to method arg: [%s]\n",
+						acpi_ut_get_descriptor_name (current_obj_desc)));
 				return_ACPI_STATUS (AE_AML_INTERNAL);
 			}
 
@@ -636,15 +648,21 @@
 			if ((current_obj_desc->common.type == ACPI_TYPE_LOCAL_REFERENCE) &&
 				(current_obj_desc->reference.opcode == AML_REF_OF_OP)) {
 				ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
-					"Arg (%p) is an obj_ref(Node), storing in node %p\n",
-					obj_desc, current_obj_desc));
+						"Arg (%p) is an obj_ref(Node), storing in node %p\n",
+						new_obj_desc, current_obj_desc));
 
 				/*
 				 * Store this object to the Node
 				 * (perform the indirect store)
 				 */
-				status = acpi_ex_store_object_to_node (obj_desc,
+				status = acpi_ex_store_object_to_node (new_obj_desc,
 						 current_obj_desc->reference.object, walk_state);
+
+				/* Remove local reference if we copied the object above */
+
+				if (new_obj_desc != obj_desc) {
+					acpi_ut_remove_reference (new_obj_desc);
+				}
 				return_ACPI_STATUS (status);
 			}
 		}
@@ -657,12 +675,18 @@
 	}
 
 	/*
-	 * Install the obj_stack descriptor (*obj_desc) into
+	 * Install the Obj descriptor (*new_obj_desc) into
 	 * the descriptor for the Arg or Local.
-	 * Install the new object in the stack entry
 	 * (increments the object reference count by one)
 	 */
-	status = acpi_ds_method_data_set_value (opcode, index, obj_desc, walk_state);
+	status = acpi_ds_method_data_set_value (opcode, index, new_obj_desc, walk_state);
+
+	/* Remove local reference if we copied the object above */
+
+	if (new_obj_desc != obj_desc) {
+		acpi_ut_remove_reference (new_obj_desc);
+	}
+
 	return_ACPI_STATUS (status);
 }
 
--- diff/drivers/acpi/dispatcher/dsopcode.c	2003-11-25 15:24:57.000000000 +0000
+++ source/drivers/acpi/dispatcher/dsopcode.c	2003-12-29 09:30:39.000000000 +0000
@@ -201,7 +201,7 @@
 
 	ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname (ACPI_TYPE_BUFFER_FIELD, node, NULL));
 	ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] buffer_field Arg Init\n",
-		node->name.ascii));
+		acpi_ut_get_node_name (node)));
 
 	/* Execute the AML code for the term_arg arguments */
 
@@ -346,7 +346,7 @@
 	ACPI_DEBUG_EXEC (acpi_ut_display_init_pathname (ACPI_TYPE_REGION, node, NULL));
 
 	ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] op_region Arg Init at AML %p\n",
-		node->name.ascii, extra_desc->extra.aml_start));
+		acpi_ut_get_node_name (node), extra_desc->extra.aml_start));
 
 	/* Execute the argument AML */
 
@@ -438,8 +438,8 @@
 	 * after resolution in acpi_ex_resolve_operands().
 	 */
 	if (ACPI_GET_DESCRIPTOR_TYPE (result_desc) != ACPI_DESC_TYPE_NAMED) {
-		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "(%s) destination must be a NS Node\n",
-			acpi_ps_get_opcode_name (aml_opcode)));
+		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "(%s) destination not a NS Node [%s]\n",
+				acpi_ps_get_opcode_name (aml_opcode), acpi_ut_get_descriptor_name (result_desc)));
 
 		status = AE_AML_OPERAND_TYPE;
 		goto cleanup;
@@ -514,14 +514,16 @@
 		goto cleanup;
 	}
 
-
 	/* Entire field must fit within the current length of the buffer */
 
 	if ((bit_offset + bit_count) >
 		(8 * (u32) buffer_desc->buffer.length)) {
 		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
-			"Field size %d exceeds Buffer size %d (bits)\n",
-			 bit_offset + bit_count, 8 * (u32) buffer_desc->buffer.length));
+			"Field [%4.4s] size %d exceeds Buffer [%4.4s] size %d (bits)\n",
+			 acpi_ut_get_node_name (result_desc),
+			 bit_offset + bit_count,
+			 acpi_ut_get_node_name (buffer_desc->buffer.node),
+			 8 * (u32) buffer_desc->buffer.length));
 		status = AE_AML_BUFFER_LIMIT;
 		goto cleanup;
 	}
@@ -742,7 +744,7 @@
 
 	ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "rgn_obj %p Addr %8.8X%8.8X Len %X\n",
 		obj_desc,
-		ACPI_HIDWORD (obj_desc->region.address), ACPI_LODWORD (obj_desc->region.address),
+		ACPI_FORMAT_UINT64 (obj_desc->region.address),
 		obj_desc->region.length));
 
 	/* Now the address and length are valid for this opregion */
--- diff/drivers/acpi/dispatcher/dswexec.c	2003-06-09 14:18:18.000000000 +0100
+++ source/drivers/acpi/dispatcher/dswexec.c	2003-12-29 09:30:39.000000000 +0000
@@ -416,10 +416,24 @@
 			status = acpi_gbl_op_type_dispatch [op_type] (walk_state);
 		}
 		else {
-			ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
-				"[%s]: Could not resolve operands, %s\n",
-				acpi_ps_get_opcode_name (walk_state->opcode),
-				acpi_format_exception (status)));
+			/*
+			 * Treat constructs of the form "Store(local_x,local_x)" as noops when the
+			 * Local is uninitialized.
+			 */
+			if  ((status == AE_AML_UNINITIALIZED_LOCAL) &&
+				(walk_state->opcode == AML_STORE_OP) &&
+				(walk_state->operands[0]->common.type == ACPI_TYPE_LOCAL_REFERENCE) &&
+				(walk_state->operands[1]->common.type == ACPI_TYPE_LOCAL_REFERENCE) &&
+				(walk_state->operands[0]->reference.opcode ==
+				 walk_state->operands[1]->reference.opcode)) {
+				status = AE_OK;
+			}
+			else {
+				ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
+					"[%s]: Could not resolve operands, %s\n",
+					acpi_ps_get_opcode_name (walk_state->opcode),
+					acpi_format_exception (status)));
+			}
 		}
 
 		/* Always delete the argument objects and clear the operand stack */
--- diff/drivers/acpi/dispatcher/dswload.c	2003-10-09 09:47:33.000000000 +0100
+++ source/drivers/acpi/dispatcher/dswload.c	2003-12-29 09:30:39.000000000 +0000
@@ -167,7 +167,7 @@
 	object_type = walk_state->op_info->object_type;
 
 	ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
-		"State=%p Op=%p [%s] ", walk_state, op, acpi_ut_get_type_name (object_type)));
+		"State=%p Op=%p [%s]\n", walk_state, op, acpi_ut_get_type_name (object_type)));
 
 	switch (walk_state->opcode) {
 	case AML_SCOPE_OP:
@@ -260,10 +260,12 @@
 		if ((walk_state->opcode != AML_SCOPE_OP) &&
 			(!(walk_state->parse_flags & ACPI_PARSE_DEFERRED_OP))) {
 			flags |= ACPI_NS_ERROR_IF_FOUND;
-			ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DISPATCH, "Cannot already exist\n"));
+			ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "[%s] Cannot already exist\n",
+					acpi_ut_get_type_name (object_type)));
 		}
 		else {
-			ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DISPATCH, "Both Find or Create allowed\n"));
+			ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "[%s] Both Find or Create allowed\n",
+					acpi_ut_get_type_name (object_type)));
 		}
 
 		/*
--- diff/drivers/acpi/dispatcher/dswscope.c	2003-10-09 09:47:33.000000000 +0100
+++ source/drivers/acpi/dispatcher/dswscope.c	2003-12-29 09:30:39.000000000 +0000
@@ -146,7 +146,7 @@
 	if (old_scope_info) {
 		ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC,
 			"[%4.4s] (%s)",
-			old_scope_info->scope.node->name.ascii,
+			acpi_ut_get_node_name (old_scope_info->scope.node),
 			acpi_ut_get_type_name (old_scope_info->common.value)));
 	}
 	else {
@@ -156,7 +156,7 @@
 
 	ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC,
 		", New scope -> [%4.4s] (%s)\n",
-		scope_info->scope.node->name.ascii,
+		acpi_ut_get_node_name (scope_info->scope.node),
 		acpi_ut_get_type_name (scope_info->common.value)));
 
 	/* Push new scope object onto stack */
@@ -207,14 +207,14 @@
 	ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
 		"[%.2d] Popped scope [%4.4s] (%s), New scope -> ",
 		(u32) walk_state->scope_depth,
-		scope_info->scope.node->name.ascii,
+		acpi_ut_get_node_name (scope_info->scope.node),
 		acpi_ut_get_type_name (scope_info->common.value)));
 
 	new_scope_info = walk_state->scope_info;
 	if (new_scope_info) {
 		ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC,
 			"[%4.4s] (%s)\n",
-			new_scope_info->scope.node->name.ascii,
+			acpi_ut_get_node_name (new_scope_info->scope.node),
 			acpi_ut_get_type_name (new_scope_info->common.value)));
 	}
 	else {
--- diff/drivers/acpi/events/evgpe.c	2003-10-27 09:20:43.000000000 +0000
+++ source/drivers/acpi/events/evgpe.c	2003-12-29 09:30:39.000000000 +0000
@@ -139,12 +139,10 @@
 {
 	u32                             int_status = ACPI_INTERRUPT_NOT_HANDLED;
 	u8                              enabled_status_byte;
-	u8                              bit_mask;
 	struct acpi_gpe_register_info   *gpe_register_info;
 	u32                             in_value;
 	acpi_status                     status;
 	struct acpi_gpe_block_info      *gpe_block;
-	u32                             gpe_number;
 	u32                             i;
 	u32                             j;
 
@@ -187,11 +185,9 @@
 
 			ACPI_DEBUG_PRINT ((ACPI_DB_INTERRUPTS,
 				"GPE pair: Status %8.8X%8.8X = %02X, Enable %8.8X%8.8X = %02X\n",
-				ACPI_HIDWORD (gpe_register_info->status_address.address),
-				ACPI_LODWORD (gpe_register_info->status_address.address),
+				ACPI_FORMAT_UINT64 (gpe_register_info->status_address.address),
 				gpe_register_info->status,
-				ACPI_HIDWORD (gpe_register_info->enable_address.address),
-				ACPI_LODWORD (gpe_register_info->enable_address.address),
+				ACPI_FORMAT_UINT64 (gpe_register_info->enable_address.address),
 				gpe_register_info->enable));
 
 			/* First check if there is anything active at all in this register */
@@ -206,19 +202,17 @@
 
 			/* Now look at the individual GPEs in this byte register */
 
-			for (j = 0, bit_mask = 1; j < ACPI_GPE_REGISTER_WIDTH; j++, bit_mask <<= 1) {
+			for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++) {
 				/* Examine one GPE bit */
 
-				if (enabled_status_byte & bit_mask) {
+				if (enabled_status_byte & acpi_gbl_decode_to8bit[j]) {
 					/*
 					 * Found an active GPE. Dispatch the event to a handler
 					 * or method.
 					 */
-					gpe_number = (i * ACPI_GPE_REGISTER_WIDTH) + j;
-
 					int_status |= acpi_ev_gpe_dispatch (
-							&gpe_block->event_info[gpe_number],
-							j + gpe_register_info->base_gpe_number);
+							  &gpe_block->event_info[(i * ACPI_GPE_REGISTER_WIDTH) + j],
+							  j + gpe_register_info->base_gpe_number);
 				}
 			}
 		}
@@ -294,7 +288,7 @@
 		if (ACPI_FAILURE (status)) {
 			ACPI_REPORT_ERROR (("%s while evaluating method [%4.4s] for GPE[%2X]\n",
 				acpi_format_exception (status),
-				local_gpe_event_info.method_node->name.ascii, gpe_number));
+				acpi_ut_get_node_name (local_gpe_event_info.method_node), gpe_number));
 		}
 	}
 
@@ -367,6 +361,18 @@
 		/* Invoke the installed handler (at interrupt level) */
 
 		gpe_event_info->handler (gpe_event_info->context);
+
+		/* It is now safe to clear level-triggered events. */
+
+		if (gpe_event_info->flags & ACPI_EVENT_LEVEL_TRIGGERED) {
+			status = acpi_hw_clear_gpe (gpe_event_info);
+			if (ACPI_FAILURE (status)) {
+				ACPI_REPORT_ERROR ((
+					"acpi_ev_gpe_dispatch: Unable to clear GPE[%2X]\n",
+					gpe_number));
+				return_VALUE (ACPI_INTERRUPT_NOT_HANDLED);
+			}
+		}
 	}
 	else if (gpe_event_info->method_node) {
 		/*
@@ -375,13 +381,16 @@
 		 */
 		status = acpi_hw_disable_gpe (gpe_event_info);
 		if (ACPI_FAILURE (status)) {
-			ACPI_REPORT_ERROR (("acpi_ev_gpe_dispatch: Unable to disable GPE[%2X]\n",
+			ACPI_REPORT_ERROR ((
+				"acpi_ev_gpe_dispatch: Unable to disable GPE[%2X]\n",
 				gpe_number));
 			return_VALUE (ACPI_INTERRUPT_NOT_HANDLED);
 		}
 
-		/* Execute the method associated with the GPE. */
-
+		/*
+		 * Execute the method associated with the GPE
+		 * NOTE: Level-triggered GPEs are cleared after the method completes.
+		 */
 		if (ACPI_FAILURE (acpi_os_queue_for_execution (OSD_PRIORITY_GPE,
 				 acpi_ev_asynch_execute_gpe_method,
 				 gpe_event_info))) {
@@ -399,22 +408,12 @@
 
 		/*
 		 * Disable the GPE.  The GPE will remain disabled until the ACPI
-		 * Core Subsystem is restarted, or the handler is reinstalled.
+		 * Core Subsystem is restarted, or a handler is installed.
 		 */
 		status = acpi_hw_disable_gpe (gpe_event_info);
 		if (ACPI_FAILURE (status)) {
-			ACPI_REPORT_ERROR (("acpi_ev_gpe_dispatch: Unable to disable GPE[%2X]\n",
-				gpe_number));
-			return_VALUE (ACPI_INTERRUPT_NOT_HANDLED);
-		}
-	}
-
-	/* It is now safe to clear level-triggered events. */
-
-	if (gpe_event_info->flags & ACPI_EVENT_LEVEL_TRIGGERED) {
-		status = acpi_hw_clear_gpe (gpe_event_info);
-		if (ACPI_FAILURE (status)) {
-			ACPI_REPORT_ERROR (("acpi_ev_gpe_dispatch: Unable to clear GPE[%2X]\n",
+			ACPI_REPORT_ERROR ((
+				"acpi_ev_gpe_dispatch: Unable to disable GPE[%2X]\n",
 				gpe_number));
 			return_VALUE (ACPI_INTERRUPT_NOT_HANDLED);
 		}
--- diff/drivers/acpi/events/evgpeblk.c	2003-06-30 10:07:33.000000000 +0100
+++ source/drivers/acpi/events/evgpeblk.c	2003-12-29 09:30:39.000000000 +0000
@@ -477,7 +477,7 @@
  *
  * RETURN:      Status
  *
- * DESCRIPTION: Install new GPE block with mutex support
+ * DESCRIPTION: Remove a GPE block
  *
  ******************************************************************************/
 
@@ -743,8 +743,7 @@
 				((gpe_block->register_count * ACPI_GPE_REGISTER_WIDTH) -1)),
 		gpe_device->name.ascii,
 		gpe_block->register_count,
-		ACPI_HIDWORD (gpe_block->block_address.address),
-		ACPI_LODWORD (gpe_block->block_address.address),
+		ACPI_FORMAT_UINT64 (gpe_block->block_address.address),
 		interrupt_level));
 
 	/* Find all GPE methods (_Lxx, _Exx) for this block */
--- diff/drivers/acpi/events/evmisc.c	2003-06-09 14:18:18.000000000 +0100
+++ source/drivers/acpi/events/evmisc.c	2003-12-29 09:30:39.000000000 +0000
@@ -195,7 +195,8 @@
 		/* There is no per-device notify handler for this device */
 
 		ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
-			"No notify handler for [%4.4s] node %p\n", node->name.ascii, node));
+			"No notify handler for [%4.4s] node %p\n",
+			acpi_ut_get_node_name (node), node));
 	}
 
 	return (status);
--- diff/drivers/acpi/events/evregion.c	2003-10-09 09:47:33.000000000 +0100
+++ source/drivers/acpi/events/evregion.c	2003-12-29 09:30:39.000000000 +0000
@@ -136,7 +136,7 @@
  *
  ******************************************************************************/
 
-static acpi_status
+acpi_status
 acpi_ev_execute_reg_method (
 	union acpi_operand_object      *region_obj,
 	u32                             function)
@@ -202,7 +202,7 @@
  *
  * FUNCTION:    acpi_ev_address_space_dispatch
  *
- * PARAMETERS:  region_obj          - internal region object
+ * PARAMETERS:  region_obj          - Internal region object
  *              space_id            - ID of the address space (0-255)
  *              Function            - Read or Write operation
  *              Address             - Where in the space to read or write
@@ -243,9 +243,11 @@
 
 	/* Ensure that there is a handler associated with this region */
 
-	handler_desc = region_obj->region.address_space;
+	handler_desc = region_obj->region.handler;
 	if (!handler_desc) {
-		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "no handler for region(%p) [%s]\n",
+		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
+			"No handler for Region [%4.4s] (%p) [%s]\n",
+			acpi_ut_get_node_name (region_obj->region.node),
 			region_obj, acpi_ut_get_region_name (region_obj->region.space_id)));
 
 		return_ACPI_STATUS (AE_NOT_EXIST);
@@ -320,8 +322,8 @@
 
 	ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
 		"Handler %p (@%p) Address %8.8X%8.8X [%s]\n",
-		&region_obj->region.address_space->address_space, handler,
-		ACPI_HIDWORD (address), ACPI_LODWORD (address),
+		&region_obj->region.handler->address_space, handler,
+		ACPI_FORMAT_UINT64 (address),
 		acpi_ut_get_region_name (region_obj->region.space_id)));
 
 	if (!(handler_desc->address_space.flags & ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)) {
@@ -359,6 +361,7 @@
 	return_ACPI_STATUS (status);
 }
 
+
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ev_detach_region
@@ -398,7 +401,7 @@
 
 	/* Get the address handler from the region object */
 
-	handler_obj = region_obj->region.address_space;
+	handler_obj = region_obj->region.handler;
 	if (!handler_obj) {
 		/* This region has no handler, all done */
 
@@ -472,7 +475,7 @@
 			 * If the region is on the handler's list
 			 * this better be the region's handler
 			 */
-			region_obj->region.address_space = NULL;
+			region_obj->region.handler = NULL;
 			acpi_ut_remove_reference (handler_obj);
 
 			return_VOID;
@@ -515,17 +518,15 @@
 	union acpi_operand_object       *region_obj,
 	u8                              acpi_ns_is_locked)
 {
-	acpi_status                     status;
-	acpi_status                     status2;
-
 
 	ACPI_FUNCTION_TRACE ("ev_attach_region");
 
 
 	ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
-		"Adding Region %p to address handler %p [%s]\n",
-		region_obj, handler_obj, acpi_ut_get_region_name (region_obj->region.space_id)));
-
+		"Adding Region [%4.4s] %p to address handler %p [%s]\n",
+		acpi_ut_get_node_name (region_obj->region.node),
+		region_obj, handler_obj,
+		acpi_ut_get_region_name (region_obj->region.space_id)));
 
 	/* Link this region to the front of the handler's list */
 
@@ -534,34 +535,14 @@
 
 	/* Install the region's handler */
 
-	if (region_obj->region.address_space) {
+	if (region_obj->region.handler) {
 		return_ACPI_STATUS (AE_ALREADY_EXISTS);
 	}
 
-	region_obj->region.address_space = handler_obj;
+	region_obj->region.handler = handler_obj;
 	acpi_ut_add_reference (handler_obj);
 
-	/*
-	 * Tell all users that this region is usable by running the _REG
-	 * method
-	 */
-	if (acpi_ns_is_locked) {
-		status2 = acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
-		if (ACPI_FAILURE (status2)) {
-			return_ACPI_STATUS (status2);
-		}
-	}
-
-	status = acpi_ev_execute_reg_method (region_obj, 1);
-
-	if (acpi_ns_is_locked) {
-		status2 = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
-		if (ACPI_FAILURE (status2)) {
-			return_ACPI_STATUS (status2);
-		}
-	}
-
-	return_ACPI_STATUS (status);
+	return_ACPI_STATUS (AE_OK);
 }
 
 
@@ -569,9 +550,7 @@
  *
  * FUNCTION:    acpi_ev_install_handler
  *
- * PARAMETERS:  Handle              - Node to be dumped
- *              Level               - Nesting level of the handle
- *              Context             - Passed into acpi_ns_walk_namespace
+ * PARAMETERS:  walk_namespace callback
  *
  * DESCRIPTION: This routine installs an address handler into objects that are
  *              of type Region or Device.
@@ -640,7 +619,7 @@
 	if (ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_DEVICE) {
 		/* Check if this Device already has a handler for this address space */
 
-		next_handler_obj = obj_desc->device.address_space;
+		next_handler_obj = obj_desc->device.handler;
 		while (next_handler_obj) {
 			/* Found a handler, is it for the same address space? */
 
@@ -697,4 +676,77 @@
 	return (status);
 }
 
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ev_reg_run
+ *
+ * PARAMETERS:  walk_namespace callback
+ *
+ * DESCRIPTION: Run _REg method for region objects of the requested space_iD
+ *
+ ******************************************************************************/
+
+acpi_status
+acpi_ev_reg_run (
+	acpi_handle                     obj_handle,
+	u32                             level,
+	void                            *context,
+	void                            **return_value)
+{
+	union acpi_operand_object       *handler_obj;
+	union acpi_operand_object       *obj_desc;
+	struct acpi_namespace_node      *node;
+	acpi_status                     status;
+
+
+	ACPI_FUNCTION_NAME ("ev_reg_run");
+
+
+	handler_obj = (union acpi_operand_object   *) context;
+
+	/* Parameter validation */
+
+	if (!handler_obj) {
+		return (AE_OK);
+	}
+
+	/* Convert and validate the device handle */
+
+	node = acpi_ns_map_handle_to_node (obj_handle);
+	if (!node) {
+		return (AE_BAD_PARAMETER);
+	}
+
+	/*
+	 * We only care about regions.and objects
+	 * that are allowed to have address space handlers
+	 */
+	if ((node->type != ACPI_TYPE_REGION) &&
+		(node != acpi_gbl_root_node)) {
+		return (AE_OK);
+	}
+
+	/* Check for an existing internal object */
+
+	obj_desc = acpi_ns_get_attached_object (node);
+	if (!obj_desc) {
+		/* No object, just exit */
+
+		return (AE_OK);
+	}
+
+
+	/* Object is a Region */
+
+	if (obj_desc->region.space_id != handler_obj->address_space.space_id) {
+		/*
+		 * This region is for a different address space
+		 * -- just ignore it
+		 */
+		return (AE_OK);
+	}
+
+	status = acpi_ev_execute_reg_method (obj_desc, 1);
+	return (status);
+}
 
--- diff/drivers/acpi/events/evrgnini.c	2003-06-09 14:18:18.000000000 +0100
+++ source/drivers/acpi/events/evrgnini.c	2003-12-29 09:30:39.000000000 +0000
@@ -177,7 +177,7 @@
 	ACPI_FUNCTION_TRACE ("ev_pci_config_region_setup");
 
 
-	handler_obj = region_obj->region.address_space;
+	handler_obj = region_obj->region.handler;
 	if (!handler_obj) {
 		/*
 		 * No installed handler. This shouldn't happen because the dispatch
@@ -239,7 +239,7 @@
 						else {
 							ACPI_REPORT_ERROR ((
 								"Could not install pci_config handler for Root Bridge %4.4s, %s\n",
-								pci_root_node->name.ascii, acpi_format_exception (status)));
+								acpi_ut_get_node_name (pci_root_node), acpi_format_exception (status)));
 						}
 					}
 					break;
@@ -469,7 +469,7 @@
 
 	/* Setup defaults */
 
-	region_obj->region.address_space = NULL;
+	region_obj->region.handler = NULL;
 	region_obj2->extra.method_REG = NULL;
 	region_obj->common.flags &= ~(AOPOBJ_SETUP_COMPLETE);
 	region_obj->common.flags |= AOPOBJ_OBJECT_INITIALIZED;
@@ -502,17 +502,17 @@
 			switch (node->type) {
 			case ACPI_TYPE_DEVICE:
 
-				handler_obj = obj_desc->device.address_space;
+				handler_obj = obj_desc->device.handler;
 				break;
 
 			case ACPI_TYPE_PROCESSOR:
 
-				handler_obj = obj_desc->processor.address_space;
+				handler_obj = obj_desc->processor.handler;
 				break;
 
 			case ACPI_TYPE_THERMAL:
 
-				handler_obj = obj_desc->thermal_zone.address_space;
+				handler_obj = obj_desc->thermal_zone.handler;
 				break;
 
 			default:
@@ -533,6 +533,26 @@
 					status = acpi_ev_attach_region (handler_obj, region_obj,
 							 acpi_ns_locked);
 
+					/*
+					 * Tell all users that this region is usable by running the _REG
+					 * method
+					 */
+					if (acpi_ns_locked) {
+						status = acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
+						if (ACPI_FAILURE (status)) {
+							return_ACPI_STATUS (status);
+						}
+					}
+
+					status = acpi_ev_execute_reg_method (region_obj, 1);
+
+					if (acpi_ns_locked) {
+						status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
+						if (ACPI_FAILURE (status)) {
+							return_ACPI_STATUS (status);
+						}
+					}
+
 					return_ACPI_STATUS (AE_OK);
 				}
 
--- diff/drivers/acpi/events/evxfregn.c	2003-06-09 14:18:18.000000000 +0100
+++ source/drivers/acpi/events/evxfregn.c	2003-12-29 09:30:39.000000000 +0000
@@ -173,7 +173,7 @@
 		 * The attached device object already exists.
 		 * Make sure the handler is not already installed.
 		 */
-		handler_obj = obj_desc->device.address_space;
+		handler_obj = obj_desc->device.handler;
 
 		/* Walk the handler list for this device */
 
@@ -240,7 +240,8 @@
 
 	ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
 		"Installing address handler for region %s(%X) on Device %4.4s %p(%p)\n",
-		acpi_ut_get_region_name (space_id), space_id, node->name.ascii, node, obj_desc));
+		acpi_ut_get_region_name (space_id), space_id,
+		acpi_ut_get_node_name (node), node, obj_desc));
 
 	/*
 	 * Install the handler
@@ -267,13 +268,13 @@
 
 	/* Install at head of Device.address_space list */
 
-	handler_obj->address_space.next      = obj_desc->device.address_space;
+	handler_obj->address_space.next      = obj_desc->device.handler;
 
 	/*
 	 * The Device object is the first reference on the handler_obj.
 	 * Each region that uses the handler adds a reference.
 	 */
-	obj_desc->device.address_space = handler_obj;
+	obj_desc->device.handler = handler_obj;
 
 	/*
 	 * Walk the namespace finding all of the regions this
@@ -291,6 +292,17 @@
 			  ACPI_NS_WALK_UNLOCK, acpi_ev_install_handler,
 			  handler_obj, NULL);
 
+	/*
+	 * Now we can run the _REG methods for all Regions for this
+	 * space ID.  This is a separate walk in order to handle any
+	 * interdependencies between regions and _REG methods.  (i.e. handlers
+	 * must be installed for all regions of this Space ID before we
+	 * can run any _REG methods.
+	 */
+	status = acpi_ns_walk_namespace (ACPI_TYPE_ANY, device, ACPI_UINT32_MAX,
+			  ACPI_NS_WALK_UNLOCK, acpi_ev_reg_run,
+			  handler_obj, NULL);
+
 unlock_and_exit:
 	(void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
 	return_ACPI_STATUS (status);
@@ -357,8 +369,8 @@
 
 	/* Find the address handler the user requested */
 
-	handler_obj = obj_desc->device.address_space;
-	last_obj_ptr = &obj_desc->device.address_space;
+	handler_obj = obj_desc->device.handler;
+	last_obj_ptr = &obj_desc->device.handler;
 	while (handler_obj) {
 		/* We have a handler, see if user requested this one */
 
--- diff/drivers/acpi/executer/exdump.c	2003-06-09 14:18:18.000000000 +0100
+++ source/drivers/acpi/executer/exdump.c	2003-12-29 09:30:39.000000000 +0000
@@ -89,27 +89,27 @@
 
 	if (!obj_desc) {
 		/*
-		 * This usually indicates that something serious is wrong --
-		 * since most (if not all)
-		 * code that dumps the stack expects something to be there!
+		 * This usually indicates that something serious is wrong
 		 */
-		acpi_os_printf ("Null stack entry ptr\n");
+		acpi_os_printf ("Null Object Descriptor\n");
 		return;
 	}
 
 	if (ACPI_GET_DESCRIPTOR_TYPE (obj_desc) == ACPI_DESC_TYPE_NAMED) {
-		ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p NS Node: ", obj_desc));
+		ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p is a NS Node: ", obj_desc));
 		ACPI_DUMP_ENTRY (obj_desc, ACPI_LV_EXEC);
 		return;
 	}
 
 	if (ACPI_GET_DESCRIPTOR_TYPE (obj_desc) != ACPI_DESC_TYPE_OPERAND) {
-		ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p is not a local object\n", obj_desc));
+		ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+				"%p is not a node or operand object: [%s]\n",
+				obj_desc, acpi_ut_get_descriptor_name (obj_desc)));
 		ACPI_DUMP_BUFFER (obj_desc, sizeof (union acpi_operand_object));
 		return;
 	}
 
-	/*  obj_desc is a valid object */
+	/* obj_desc is a valid object */
 
 	ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p ", obj_desc));
 
@@ -151,11 +151,10 @@
 					 obj_desc->reference.offset);
 
 			if (ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_INTEGER) {
-				/* Value is a Number */
+				/* Value is an Integer */
 
 				acpi_os_printf (" value is [%8.8X%8.8x]",
-						 ACPI_HIDWORD(obj_desc->integer.value),
-						 ACPI_LODWORD(obj_desc->integer.value));
+						 ACPI_FORMAT_UINT64 (obj_desc->integer.value));
 			}
 
 			acpi_os_printf ("\n");
@@ -169,11 +168,10 @@
 
 			if (ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_INTEGER) {
 
-				/* Value is a Number */
+				/* Value is an Integer */
 
 				acpi_os_printf (" value is [%8.8X%8.8x]",
-						 ACPI_HIDWORD(obj_desc->integer.value),
-						 ACPI_LODWORD(obj_desc->integer.value));
+						 ACPI_FORMAT_UINT64 (obj_desc->integer.value));
 			}
 
 			acpi_os_printf ("\n");
@@ -189,7 +187,7 @@
 
 		default:
 
-			/*  unknown opcode  */
+			/* Unknown opcode */
 
 			acpi_os_printf ("Unknown Reference opcode=%X\n",
 				obj_desc->reference.opcode);
@@ -229,8 +227,7 @@
 	case ACPI_TYPE_INTEGER:
 
 		acpi_os_printf ("Integer %8.8X%8.8X\n",
-				 ACPI_HIDWORD (obj_desc->integer.value),
-				 ACPI_LODWORD (obj_desc->integer.value));
+				 ACPI_FORMAT_UINT64 (obj_desc->integer.value));
 		break;
 
 
@@ -271,8 +268,7 @@
 		}
 		else {
 			acpi_os_printf (" base %8.8X%8.8X Length %X\n",
-				ACPI_HIDWORD (obj_desc->region.address),
-				ACPI_LODWORD (obj_desc->region.address),
+				ACPI_FORMAT_UINT64 (obj_desc->region.address),
 				obj_desc->region.length);
 		}
 		break;
@@ -494,7 +490,7 @@
 	acpi_os_printf ("%20s : %p\n", title, value);
 #else
 	acpi_os_printf ("%20s : %8.8X%8.8X\n", title,
-			 ACPI_HIDWORD (value), ACPI_LODWORD (value));
+			 ACPI_FORMAT_UINT64 (value));
 #endif
 }
 
@@ -525,7 +521,7 @@
 		}
 	}
 
-	acpi_os_printf ("%20s : %4.4s\n",     "Name", node->name.ascii);
+	acpi_os_printf ("%20s : %4.4s\n",     "Name", acpi_ut_get_node_name (node));
 	acpi_ex_out_string ("Type",           acpi_ut_get_type_name (node->type));
 	acpi_ex_out_integer ("Flags",         node->flags);
 	acpi_ex_out_integer ("Owner Id",      node->owner_id);
@@ -573,7 +569,8 @@
 	}
 
 	if (ACPI_GET_DESCRIPTOR_TYPE (obj_desc) != ACPI_DESC_TYPE_OPERAND) {
-		acpi_os_printf ("ex_dump_object_descriptor: %p is not a valid ACPI object\n", obj_desc);
+		acpi_os_printf ("ex_dump_object_descriptor: %p is not an ACPI operand object: [%s]\n",
+				obj_desc, acpi_ut_get_descriptor_name (obj_desc));
 		return_VOID;
 	}
 
@@ -589,8 +586,7 @@
 	case ACPI_TYPE_INTEGER:
 
 		acpi_os_printf ("%20s : %8.8X%8.8X\n", "Value",
-				  ACPI_HIDWORD (obj_desc->integer.value),
-				  ACPI_LODWORD (obj_desc->integer.value));
+				ACPI_FORMAT_UINT64 (obj_desc->integer.value));
 		break;
 
 
@@ -635,7 +631,7 @@
 
 	case ACPI_TYPE_DEVICE:
 
-		acpi_ex_out_pointer ("address_space", obj_desc->device.address_space);
+		acpi_ex_out_pointer ("Handler",     obj_desc->device.handler);
 		acpi_ex_out_pointer ("system_notify", obj_desc->device.system_notify);
 		acpi_ex_out_pointer ("device_notify", obj_desc->device.device_notify);
 		break;
@@ -673,7 +669,7 @@
 		acpi_ex_out_integer ("Flags",        obj_desc->region.flags);
 		acpi_ex_out_address ("Address",      obj_desc->region.address);
 		acpi_ex_out_integer ("Length",       obj_desc->region.length);
-		acpi_ex_out_pointer ("address_space", obj_desc->region.address_space);
+		acpi_ex_out_pointer ("Handler",      obj_desc->region.handler);
 		acpi_ex_out_pointer ("Next",         obj_desc->region.next);
 		break;
 
@@ -694,7 +690,7 @@
 		acpi_ex_out_address ("Address",      (acpi_physical_address) obj_desc->processor.address);
 		acpi_ex_out_pointer ("system_notify", obj_desc->processor.system_notify);
 		acpi_ex_out_pointer ("device_notify", obj_desc->processor.device_notify);
-		acpi_ex_out_pointer ("address_space", obj_desc->processor.address_space);
+		acpi_ex_out_pointer ("Handler",      obj_desc->processor.handler);
 		break;
 
 
@@ -702,7 +698,7 @@
 
 		acpi_ex_out_pointer ("system_notify", obj_desc->thermal_zone.system_notify);
 		acpi_ex_out_pointer ("device_notify", obj_desc->thermal_zone.device_notify);
-		acpi_ex_out_pointer ("address_space", obj_desc->thermal_zone.address_space);
+		acpi_ex_out_pointer ("Handler",      obj_desc->thermal_zone.handler);
 		break;
 
 
--- diff/drivers/acpi/executer/exfldio.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/acpi/executer/exfldio.c	2003-12-29 09:30:39.000000000 +0000
@@ -138,8 +138,9 @@
 			 */
 			ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
 				"Field [%4.4s] access width (%d bytes) too large for region [%4.4s] (length %X)\n",
-				obj_desc->common_field.node->name.ascii, obj_desc->common_field.access_byte_width,
-				rgn_desc->region.node->name.ascii, rgn_desc->region.length));
+				acpi_ut_get_node_name (obj_desc->common_field.node),
+				obj_desc->common_field.access_byte_width,
+				acpi_ut_get_node_name (rgn_desc->region.node), rgn_desc->region.length));
 		}
 
 		/*
@@ -148,9 +149,10 @@
 		 */
 		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
 			"Field [%4.4s] Base+Offset+Width %X+%X+%X is beyond end of region [%4.4s] (length %X)\n",
-			obj_desc->common_field.node->name.ascii, obj_desc->common_field.base_byte_offset,
+			acpi_ut_get_node_name (obj_desc->common_field.node),
+			obj_desc->common_field.base_byte_offset,
 			field_datum_byte_offset, obj_desc->common_field.access_byte_width,
-			rgn_desc->region.node->name.ascii, rgn_desc->region.length));
+			acpi_ut_get_node_name (rgn_desc->region.node), rgn_desc->region.length));
 
 		#ifdef CONFIG_ACPI_RELAXED_AML
 		{
@@ -261,7 +263,7 @@
 		obj_desc->common_field.access_byte_width,
 		obj_desc->common_field.base_byte_offset,
 		field_datum_byte_offset,
-		ACPI_HIDWORD (address), ACPI_LODWORD (address)));
+		ACPI_FORMAT_UINT64 (address)));
 
 	/* Invoke the appropriate address_space/op_region handler */
 
@@ -514,12 +516,12 @@
 	if (ACPI_SUCCESS (status)) {
 		if (read_write == ACPI_READ) {
 			ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Value Read %8.8X%8.8X, Width %d\n",
-					   ACPI_HIDWORD (*value), ACPI_LODWORD (*value),
+					   ACPI_FORMAT_UINT64 (*value),
 					   obj_desc->common_field.access_byte_width));
 		}
 		else {
 			ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Value Written %8.8X%8.8X, Width %d\n",
-					   ACPI_HIDWORD (*value), ACPI_LODWORD (*value),
+					   ACPI_FORMAT_UINT64 (*value),
 					   obj_desc->common_field.access_byte_width));
 		}
 	}
@@ -612,11 +614,11 @@
 
 	ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
 		"Mask %8.8X%8.8X, datum_offset %X, Width %X, Value %8.8X%8.8X, merged_value %8.8X%8.8X\n",
-		ACPI_HIDWORD (mask), ACPI_LODWORD (mask),
+		ACPI_FORMAT_UINT64 (mask),
 		field_datum_byte_offset,
 		obj_desc->common_field.access_byte_width,
-		ACPI_HIDWORD (field_value), ACPI_LODWORD (field_value),
-		ACPI_HIDWORD (merged_value),ACPI_LODWORD (merged_value)));
+		ACPI_FORMAT_UINT64 (field_value),
+		ACPI_FORMAT_UINT64 (merged_value)));
 
 	/* Write the merged value */
 
@@ -784,12 +786,13 @@
 {
 	acpi_status                     status;
 	u32                             field_datum_byte_offset;
-	u32                             datum_offset;
-	acpi_integer                    previous_raw_datum;
+	u32                             buffer_datum_offset;
+	acpi_integer                    previous_raw_datum = 0;
 	acpi_integer                    this_raw_datum = 0;
 	acpi_integer                    merged_datum = 0;
 	u32                             byte_field_length;
 	u32                             datum_count;
+	u32                             i;
 
 
 	ACPI_FUNCTION_TRACE ("ex_extract_from_field");
@@ -812,77 +815,74 @@
 	datum_count = ACPI_ROUND_UP_TO (byte_field_length,
 			   obj_desc->common_field.access_byte_width);
 
+	/*
+	 * If the field is not aligned on a datum boundary and does not
+	 * fit within a single datum, we must read an extra datum.
+	 *
+	 * We could just split the aligned and non-aligned cases since the
+	 * aligned case is so very simple, but this would require more code.
+	 */
+	if ((obj_desc->common_field.end_field_valid_bits != 0)    &&
+		(!(obj_desc->common_field.flags & AOPOBJ_SINGLE_DATUM))) {
+		datum_count++;
+	}
+
 	ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
 		"byte_len %X, datum_len %X, byte_gran %X\n",
 		byte_field_length, datum_count,obj_desc->common_field.access_byte_width));
 
 	/*
 	 * Clear the caller's buffer (the whole buffer length as given)
-	 * This is very important, especially in the cases where a byte is read,
-	 * but the buffer is really a u32 (4 bytes).
+	 * This is very important, especially in the cases where the buffer
+	 * is longer than the size of the field.
 	 */
 	ACPI_MEMSET (buffer, 0, buffer_length);
 
-	/* Read the first raw datum to prime the loop */
-
 	field_datum_byte_offset = 0;
-	datum_offset= 0;
-
-	status = acpi_ex_field_datum_io (obj_desc, field_datum_byte_offset,
-			  &previous_raw_datum, ACPI_READ);
-	if (ACPI_FAILURE (status)) {
-		return_ACPI_STATUS (status);
-	}
-
+	buffer_datum_offset= 0;
 
-	/* We might actually be done if the request fits in one datum */
+	/* Read the entire field */
 
-	if ((datum_count == 1) &&
-		(obj_desc->common_field.flags & AOPOBJ_SINGLE_DATUM)) {
-		/* 1) Shift the valid data bits down to start at bit 0 */
+	for (i = 0; i < datum_count; i++) {
+		status = acpi_ex_field_datum_io (obj_desc, field_datum_byte_offset,
+				  &this_raw_datum, ACPI_READ);
+		if (ACPI_FAILURE (status)) {
+			return_ACPI_STATUS (status);
+		}
 
-		merged_datum = (previous_raw_datum >> obj_desc->common_field.start_field_bit_offset);
+		/* We might actually be done if the request fits in one datum */
 
-		/* 2) Mask off any upper unused bits (bits not part of the field) */
+		if ((datum_count == 1) &&
+			(obj_desc->common_field.flags & AOPOBJ_SINGLE_DATUM)) {
+			/* 1) Shift the valid data bits down to start at bit 0 */
 
-		if (obj_desc->common_field.end_buffer_valid_bits) {
-			merged_datum &= ACPI_MASK_BITS_ABOVE (obj_desc->common_field.end_buffer_valid_bits);
-		}
+			merged_datum = (this_raw_datum >> obj_desc->common_field.start_field_bit_offset);
 
-		/* Store the datum to the caller buffer */
+			/* 2) Mask off any upper unused bits (bits not part of the field) */
 
-		acpi_ex_set_buffer_datum (merged_datum, buffer, buffer_length,
-				obj_desc->common_field.access_byte_width, datum_offset);
+			if (obj_desc->common_field.end_buffer_valid_bits) {
+				merged_datum &= ACPI_MASK_BITS_ABOVE (obj_desc->common_field.end_buffer_valid_bits);
+			}
 
-		return_ACPI_STATUS (AE_OK);
-	}
+			/* Store the datum to the caller buffer */
 
+			acpi_ex_set_buffer_datum (merged_datum, buffer, buffer_length,
+					obj_desc->common_field.access_byte_width, buffer_datum_offset);
 
-	/* We need to get more raw data to complete one or more field data */
+			return_ACPI_STATUS (AE_OK);
+		}
 
-	while (datum_offset < datum_count) {
-		field_datum_byte_offset += obj_desc->common_field.access_byte_width;
+		/* Special handling for the last datum to ignore extra bits */
 
-		/*
-		 * If the field is aligned on a byte boundary, we don't want
-		 * to perform a final read, since this would potentially read
-		 * past the end of the region.
-		 *
-		 * We could just split the aligned and non-aligned cases since the
-		 * aligned case is so very simple, but this would require more code.
-		 */
-		if ((obj_desc->common_field.start_field_bit_offset != 0) ||
-			((obj_desc->common_field.start_field_bit_offset == 0) &&
-			(datum_offset < (datum_count -1)))) {
+		if ((i >= (datum_count -1))          &&
+			(obj_desc->common_field.end_field_valid_bits)) {
 			/*
-			 * Get the next raw datum, it contains some or all bits
-			 * of the current field datum
+			 * This is the last iteration of the loop.  We need to clear
+			 * any unused bits (bits that are not part of this field) before
+			 * we store the final merged datum into the caller buffer.
 			 */
-			status = acpi_ex_field_datum_io (obj_desc, field_datum_byte_offset,
-					  &this_raw_datum, ACPI_READ);
-			if (ACPI_FAILURE (status)) {
-				return_ACPI_STATUS (status);
-			}
+			this_raw_datum &=
+				ACPI_MASK_BITS_ABOVE (obj_desc->common_field.end_field_valid_bits);
 		}
 
 		/*
@@ -891,48 +891,48 @@
 		if (obj_desc->common_field.start_field_bit_offset == 0) {
 			/* Field is not skewed and we can just copy the datum */
 
-			merged_datum = previous_raw_datum;
+			acpi_ex_set_buffer_datum (this_raw_datum, buffer, buffer_length,
+					obj_desc->common_field.access_byte_width, buffer_datum_offset);
+			buffer_datum_offset++;
 		}
 		else {
-			/*
-			 * Put together the appropriate bits of the two raw data to make a
-			 * single complete field datum
-			 *
-			 * 1) Normalize the first datum down to bit 0
-			 */
-			merged_datum = (previous_raw_datum >> obj_desc->common_field.start_field_bit_offset);
-
-			/* 2) Insert the second datum "above" the first datum */
+			/* Not aligned -- on the first iteration, just save the datum */
 
-			merged_datum |= (this_raw_datum << obj_desc->common_field.datum_valid_bits);
-
-			if ((datum_offset >= (datum_count -1))) {
+			if (i != 0) {
 				/*
-				 * This is the last iteration of the loop.  We need to clear
-				 * any unused bits (bits that are not part of this field) that
-				 * came from the last raw datum before we store the final
-				 * merged datum into the caller buffer.
+				 * Put together the appropriate bits of the two raw data to make a
+				 * single complete field datum
+				 *
+				 * 1) Normalize the first datum down to bit 0
 				 */
-				if (obj_desc->common_field.end_buffer_valid_bits) {
-					merged_datum &=
-						ACPI_MASK_BITS_ABOVE (obj_desc->common_field.end_buffer_valid_bits);
-				}
+				merged_datum = (previous_raw_datum >> obj_desc->common_field.start_field_bit_offset);
+
+				/* 2) Insert the second datum "above" the first datum */
+
+				merged_datum |= (this_raw_datum << obj_desc->common_field.datum_valid_bits);
+
+				acpi_ex_set_buffer_datum (merged_datum, buffer, buffer_length,
+						obj_desc->common_field.access_byte_width, buffer_datum_offset);
+				buffer_datum_offset++;
 			}
+
+			/*
+			 * Save the raw datum that was just acquired since it may contain bits
+			 * of the *next* field datum
+			 */
+			previous_raw_datum = this_raw_datum;
 		}
 
-		/*
-		 * Store the merged field datum in the caller's buffer, according to
-		 * the granularity of the field (size of each datum).
-		 */
-		acpi_ex_set_buffer_datum (merged_datum, buffer, buffer_length,
-				obj_desc->common_field.access_byte_width, datum_offset);
+		field_datum_byte_offset += obj_desc->common_field.access_byte_width;
+	}
 
-		/*
-		 * Save the raw datum that was just acquired since it may contain bits
-		 * of the *next* field datum.  Update offsets
-		 */
-		previous_raw_datum = this_raw_datum;
-		datum_offset++;
+	/* For non-aligned case, there is one last datum to insert */
+
+	if (obj_desc->common_field.start_field_bit_offset != 0) {
+		merged_datum = (this_raw_datum >> obj_desc->common_field.start_field_bit_offset);
+
+		acpi_ex_set_buffer_datum (merged_datum, buffer, buffer_length,
+				obj_desc->common_field.access_byte_width, buffer_datum_offset);
 	}
 
 	return_ACPI_STATUS (AE_OK);
--- diff/drivers/acpi/executer/exmisc.c	2003-02-26 16:01:07.000000000 +0000
+++ source/drivers/acpi/executer/exmisc.c	2003-12-29 09:30:39.000000000 +0000
@@ -121,8 +121,8 @@
 
 	default:
 
-		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid descriptor type %X in %p\n",
-			ACPI_GET_DESCRIPTOR_TYPE (obj_desc), obj_desc));
+		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%p has invalid descriptor [%s]\n",
+				obj_desc, acpi_ut_get_descriptor_name (obj_desc)));
 		return_ACPI_STATUS (AE_TYPE);
 	}
 
@@ -139,7 +139,7 @@
 	*return_desc = reference_obj;
 
 	ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Object %p Type [%s], returning Reference %p\n",
-		obj_desc, acpi_ut_get_object_type_name (obj_desc), *return_desc));
+			obj_desc, acpi_ut_get_object_type_name (obj_desc), *return_desc));
 
 	return_ACPI_STATUS (AE_OK);
 }
--- diff/drivers/acpi/executer/exmutex.c	2003-02-26 16:01:07.000000000 +0000
+++ source/drivers/acpi/executer/exmutex.c	2003-12-29 09:30:39.000000000 +0000
@@ -159,7 +159,7 @@
 
 	if (!walk_state->thread) {
 		ACPI_REPORT_ERROR (("Cannot acquire Mutex [%4.4s], null thread info\n",
-				obj_desc->mutex.node->name.ascii));
+				acpi_ut_get_node_name (obj_desc->mutex.node)));
 		return_ACPI_STATUS (AE_AML_INTERNAL);
 	}
 
@@ -169,7 +169,7 @@
 	 */
 	if (walk_state->thread->current_sync_level > obj_desc->mutex.sync_level) {
 		ACPI_REPORT_ERROR (("Cannot acquire Mutex [%4.4s], incorrect sync_level\n",
-				obj_desc->mutex.node->name.ascii));
+				acpi_ut_get_node_name (obj_desc->mutex.node)));
 		return_ACPI_STATUS (AE_AML_MUTEX_ORDER);
 	}
 
@@ -242,7 +242,7 @@
 
 	if (!obj_desc->mutex.owner_thread) {
 		ACPI_REPORT_ERROR (("Cannot release Mutex [%4.4s], not acquired\n",
-				obj_desc->mutex.node->name.ascii));
+				acpi_ut_get_node_name (obj_desc->mutex.node)));
 		return_ACPI_STATUS (AE_AML_MUTEX_NOT_ACQUIRED);
 	}
 
@@ -250,7 +250,7 @@
 
 	if (!walk_state->thread) {
 		ACPI_REPORT_ERROR (("Cannot release Mutex [%4.4s], null thread info\n",
-				obj_desc->mutex.node->name.ascii));
+				acpi_ut_get_node_name (obj_desc->mutex.node)));
 		return_ACPI_STATUS (AE_AML_INTERNAL);
 	}
 
@@ -260,7 +260,7 @@
 		ACPI_REPORT_ERROR ((
 			"Thread %X cannot release Mutex [%4.4s] acquired by thread %X\n",
 			walk_state->thread->thread_id,
-			obj_desc->mutex.node->name.ascii,
+			acpi_ut_get_node_name (obj_desc->mutex.node),
 			obj_desc->mutex.owner_thread->thread_id));
 		return_ACPI_STATUS (AE_AML_NOT_OWNER);
 	}
@@ -271,7 +271,7 @@
 	 */
 	if (obj_desc->mutex.sync_level > walk_state->thread->current_sync_level) {
 		ACPI_REPORT_ERROR (("Cannot release Mutex [%4.4s], incorrect sync_level\n",
-				obj_desc->mutex.node->name.ascii));
+				acpi_ut_get_node_name (obj_desc->mutex.node)));
 		return_ACPI_STATUS (AE_AML_MUTEX_ORDER);
 	}
 
--- diff/drivers/acpi/executer/exoparg1.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/acpi/executer/exoparg1.c	2003-12-29 09:30:39.000000000 +0000
@@ -351,8 +351,7 @@
 
 			if (digit > 0) {
 				ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Integer too large to convert to BCD: %8.8X%8.8X\n",
-					ACPI_HIDWORD(operand[0]->integer.value),
-					ACPI_LODWORD(operand[0]->integer.value)));
+						ACPI_FORMAT_UINT64 (operand[0]->integer.value)));
 				status = AE_AML_NUMERIC_OVERFLOW;
 				goto cleanup;
 			}
--- diff/drivers/acpi/executer/exoparg3.c	2003-02-26 16:01:07.000000000 +0000
+++ source/drivers/acpi/executer/exoparg3.c	2003-12-29 09:30:39.000000000 +0000
@@ -101,15 +101,14 @@
 
 
 	switch (walk_state->opcode) {
-
 	case AML_FATAL_OP:          /* Fatal (fatal_type fatal_code fatal_arg)   */
 
 		ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
 			"fatal_op: Type %X Code %X Arg %X <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n",
-			(u32) operand[0]->integer.value, (u32) operand[1]->integer.value,
+			(u32) operand[0]->integer.value,
+			(u32) operand[1]->integer.value,
 			(u32) operand[2]->integer.value));
 
-
 		fatal = ACPI_MEM_ALLOCATE (sizeof (struct acpi_signal_fatal_info));
 		if (fatal) {
 			fatal->type     = (u32) operand[0]->integer.value;
--- diff/drivers/acpi/executer/exprep.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/acpi/executer/exprep.c	2003-12-29 09:30:39.000000000 +0000
@@ -351,7 +351,7 @@
 	 */
 	nearest_byte_address =
 			ACPI_ROUND_BITS_DOWN_TO_BYTES (field_bit_position);
-	obj_desc->common_field.base_byte_offset =
+	obj_desc->common_field.base_byte_offset = (u32)
 			ACPI_ROUND_DOWN (nearest_byte_address, byte_alignment);
 
 	/*
@@ -539,7 +539,7 @@
 			  acpi_ns_get_type (info->field_node));
 
 	ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Set named_obj %p [%4.4s], obj_desc %p\n",
-			info->field_node, info->field_node->name.ascii, obj_desc));
+			info->field_node, acpi_ut_get_node_name (info->field_node), obj_desc));
 
 	/* Remove local reference to the object */
 
--- diff/drivers/acpi/executer/exregion.c	2003-05-21 11:50:14.000000000 +0100
+++ source/drivers/acpi/executer/exregion.c	2003-12-29 09:30:39.000000000 +0000
@@ -161,7 +161,7 @@
 				  (void **) &mem_info->mapped_logical_address);
 		if (ACPI_FAILURE (status)) {
 			ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not map memory at %8.8X%8.8X, size %X\n",
-				ACPI_HIDWORD (address), ACPI_LODWORD (address), (u32) window_size));
+					ACPI_FORMAT_UINT64 (address), (u32) window_size));
 			mem_info->mapped_length = 0;
 			return_ACPI_STATUS (status);
 		}
@@ -180,8 +180,8 @@
 			  ((acpi_integer) address - (acpi_integer) mem_info->mapped_physical_address);
 
 	ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
-		"system_memory %d (%d width) Address=%8.8X%8.8X\n", function, bit_width,
-		ACPI_HIDWORD (address), ACPI_LODWORD (address)));
+			"system_memory %d (%d width) Address=%8.8X%8.8X\n", function, bit_width,
+			ACPI_FORMAT_UINT64 (address)));
 
    /*
 	* Perform the memory read or write
@@ -290,8 +290,8 @@
 
 
 	ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
-		"system_iO %d (%d width) Address=%8.8X%8.8X\n", function, bit_width,
-		ACPI_HIDWORD (address), ACPI_LODWORD (address)));
+			"system_iO %d (%d width) Address=%8.8X%8.8X\n", function, bit_width,
+			ACPI_FORMAT_UINT64 (address)));
 
 	/* Decode the function parameter */
 
--- diff/drivers/acpi/executer/exresolv.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/acpi/executer/exresolv.c	2003-12-29 09:30:39.000000000 +0000
@@ -349,6 +349,8 @@
 			/* All "References" point to a NS node */
 
 			if (ACPI_GET_DESCRIPTOR_TYPE (node) != ACPI_DESC_TYPE_NAMED) {
+				ACPI_REPORT_ERROR (("acpi_ex_resolve_multiple: Not a NS node %p [%s]\n",
+						node, acpi_ut_get_descriptor_name (node)));
 				return_ACPI_STATUS (AE_AML_INTERNAL);
 			}
 
@@ -399,7 +401,9 @@
 			/* All "References" point to a NS node */
 
 			if (ACPI_GET_DESCRIPTOR_TYPE (node) != ACPI_DESC_TYPE_NAMED) {
-				return_ACPI_STATUS (AE_AML_INTERNAL);
+				ACPI_REPORT_ERROR (("acpi_ex_resolve_multiple: Not a NS node %p [%s]\n",
+						node, acpi_ut_get_descriptor_name (node)));
+			   return_ACPI_STATUS (AE_AML_INTERNAL);
 			}
 
 			/* Get the attached object */
--- diff/drivers/acpi/executer/exresop.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/acpi/executer/exresop.c	2003-12-29 09:30:39.000000000 +0000
@@ -247,8 +247,8 @@
 			/* Invalid descriptor */
 
 			ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
-				"Bad descriptor type %X in Obj %p\n",
-				ACPI_GET_DESCRIPTOR_TYPE (obj_desc), obj_desc));
+					"Invalid descriptor %p [%s]\n",
+					obj_desc, acpi_ut_get_descriptor_name (obj_desc)));
 
 			return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
 		}
--- diff/drivers/acpi/executer/exstore.c	2003-06-30 10:07:33.000000000 +0100
+++ source/drivers/acpi/executer/exstore.c	2003-12-29 09:30:39.000000000 +0000
@@ -190,8 +190,7 @@
 		case ACPI_TYPE_INTEGER:
 
 			ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "%8.8X%8.8X\n",
-					ACPI_HIDWORD (source_desc->integer.value),
-					ACPI_LODWORD (source_desc->integer.value)));
+					ACPI_FORMAT_UINT64 (source_desc->integer.value)));
 			break;
 
 
--- diff/drivers/acpi/executer/exsystem.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/acpi/executer/exsystem.c	2003-12-29 09:30:39.000000000 +0000
@@ -111,11 +111,16 @@
  *
  * FUNCTION:    acpi_ex_system_do_stall
  *
- * PARAMETERS:  how_long            - The amount of time to stall
+ * PARAMETERS:  how_long            - The amount of time to stall,
+ *                                    in microseconds
  *
  * RETURN:      Status
  *
  * DESCRIPTION: Suspend running thread for specified amount of time.
+ *              Note: ACPI specification requires that Stall() does not
+ *              relinquish the processor, and delays longer than 100 usec
+ *              should use Sleep() instead.  We allow stalls up to 255 usec
+ *              for compatibility with other interpreters and existing BIOSs.
  *
  ******************************************************************************/
 
@@ -129,12 +134,15 @@
 	ACPI_FUNCTION_ENTRY ();
 
 
-	if (how_long > 100) /* 100 microseconds */ {
+	if (how_long > 255) /* 255 microseconds */ {
 		/*
-		 * Longer than 100 usec, use sleep instead
-		 * (according to ACPI specification)
+		 * Longer than 255 usec, this is an error
+		 *
+		 * (ACPI specifies 100 usec as max, but this gives some slack in
+		 * order to support existing BIOSs)
 		 */
-		status = acpi_ex_system_do_suspend ((how_long / 1000) + 1);
+		ACPI_REPORT_ERROR (("Stall: Time parameter is too large (%d)\n", how_long));
+		status = AE_AML_OPERAND_VALUE;
 	}
 	else {
 		acpi_os_stall (how_long);
@@ -148,7 +156,8 @@
  *
  * FUNCTION:    acpi_ex_system_do_suspend
  *
- * PARAMETERS:  how_long            - The amount of time to suspend
+ * PARAMETERS:  how_long            - The amount of time to suspend,
+ *                                    in milliseconds
  *
  * RETURN:      None
  *
--- diff/drivers/acpi/hardware/hwacpi.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/acpi/hardware/hwacpi.c	2003-12-29 09:30:39.000000000 +0000
@@ -119,7 +119,7 @@
 	 * system does not support mode transition.
 	 */
 	if (!acpi_gbl_FADT->smi_cmd) {
-		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No SMI_CMD in FADT, mode transition failed.\n"));
+		ACPI_REPORT_ERROR (("No SMI_CMD in FADT, mode transition failed.\n"));
 		return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE);
 	}
 
@@ -131,7 +131,7 @@
 	 * transitions are not supported.
 	 */
 	if (!acpi_gbl_FADT->acpi_enable && !acpi_gbl_FADT->acpi_disable) {
-		ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "No mode transition supported in this system.\n"));
+		ACPI_REPORT_ERROR (("No ACPI mode transition supported in this system (enable/disable both zero)\n"));
 		return_ACPI_STATUS (AE_OK);
 	}
 
@@ -162,6 +162,7 @@
 	}
 
 	if (ACPI_FAILURE (status)) {
+		ACPI_REPORT_ERROR (("Could not write mode change, %s\n", acpi_format_exception (status)));
 		return_ACPI_STATUS (status);
 	}
 
@@ -171,18 +172,16 @@
 	 */
 	retry = 3000;
 	while (retry) {
-		status = AE_NO_HARDWARE_RESPONSE;
-
 		if (acpi_hw_get_mode() == mode) {
 			ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Mode %X successfully enabled\n", mode));
-			status = AE_OK;
-			break;
+			return_ACPI_STATUS (AE_OK);
 		}
 		acpi_os_stall(1000);
 		retry--;
 	}
 
-	return_ACPI_STATUS (status);
+	ACPI_REPORT_ERROR (("Hardware never changed modes\n"));
+	return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE);
 }
 
 
--- diff/drivers/acpi/hardware/hwregs.c	2003-08-20 14:16:08.000000000 +0100
+++ source/drivers/acpi/hardware/hwregs.c	2003-12-29 09:30:39.000000000 +0000
@@ -418,16 +418,14 @@
 
 		ACPI_DEBUG_PRINT ((ACPI_DB_IO, "PM2 control: Read %X from %8.8X%8.8X\n",
 			register_value,
-			ACPI_HIDWORD (acpi_gbl_FADT->xpm2_cnt_blk.address),
-			ACPI_LODWORD (acpi_gbl_FADT->xpm2_cnt_blk.address)));
+			ACPI_FORMAT_UINT64 (acpi_gbl_FADT->xpm2_cnt_blk.address)));
 
 		ACPI_REGISTER_INSERT_VALUE (register_value, bit_reg_info->bit_position,
 				bit_reg_info->access_bit_mask, value);
 
 		ACPI_DEBUG_PRINT ((ACPI_DB_IO, "About to write %4.4X to %8.8X%8.8X\n",
 			register_value,
-			ACPI_HIDWORD (acpi_gbl_FADT->xpm2_cnt_blk.address),
-			ACPI_LODWORD (acpi_gbl_FADT->xpm2_cnt_blk.address)));
+			ACPI_FORMAT_UINT64 (acpi_gbl_FADT->xpm2_cnt_blk.address)));
 
 		status = acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK,
 				   ACPI_REGISTER_PM2_CONTROL, (u8) (register_value));
@@ -763,8 +761,7 @@
 
 	ACPI_DEBUG_PRINT ((ACPI_DB_IO, "Read:  %8.8X width %2d from %8.8X%8.8X (%s)\n",
 			*value, width,
-			ACPI_HIDWORD (reg->address),
-			ACPI_LODWORD (reg->address),
+			ACPI_FORMAT_UINT64 (reg->address),
 			acpi_ut_get_region_name (reg->address_space_id)));
 
 	return (status);
@@ -850,8 +847,7 @@
 
 	ACPI_DEBUG_PRINT ((ACPI_DB_IO, "Wrote: %8.8X width %2d   to %8.8X%8.8X (%s)\n",
 			value, width,
-			ACPI_HIDWORD (reg->address),
-			ACPI_LODWORD (reg->address),
+			ACPI_FORMAT_UINT64 (reg->address),
 			acpi_ut_get_region_name (reg->address_space_id)));
 
 	return (status);
--- diff/drivers/acpi/hardware/hwsleep.c	2003-06-30 10:07:33.000000000 +0100
+++ source/drivers/acpi/hardware/hwsleep.c	2003-12-29 09:30:39.000000000 +0000
@@ -181,6 +181,13 @@
 		return_ACPI_STATUS (status);
 	}
 
+	/* Set the system indicators to show the desired sleep state. */
+
+	status = acpi_evaluate_object (NULL, "\\_SI._SST", &arg_list, NULL);
+	if (ACPI_FAILURE (status) && status != AE_NOT_FOUND) {
+		 ACPI_REPORT_ERROR (("Method _SST failed, %s\n", acpi_format_exception (status)));
+	}
+
 	return_ACPI_STATUS (AE_OK);
 }
 
@@ -220,27 +227,28 @@
 		return_ACPI_STATUS (AE_AML_OPERAND_VALUE);
 	}
 
-
 	sleep_type_reg_info = acpi_hw_get_bit_register_info (ACPI_BITREG_SLEEP_TYPE_A);
 	sleep_enable_reg_info = acpi_hw_get_bit_register_info (ACPI_BITREG_SLEEP_ENABLE);
 
-	/* Clear wake status */
+	if (sleep_state != ACPI_STATE_S5) {
+		/* Clear wake status */
 
-	status = acpi_set_register (ACPI_BITREG_WAKE_STATUS, 1, ACPI_MTX_DO_NOT_LOCK);
-	if (ACPI_FAILURE (status)) {
-		return_ACPI_STATUS (status);
-	}
+		status = acpi_set_register (ACPI_BITREG_WAKE_STATUS, 1, ACPI_MTX_DO_NOT_LOCK);
+		if (ACPI_FAILURE (status)) {
+			return_ACPI_STATUS (status);
+		}
 
-	status = acpi_hw_clear_acpi_status(ACPI_MTX_DO_NOT_LOCK);
-	if (ACPI_FAILURE (status)) {
-		return_ACPI_STATUS (status);
-	}
+		status = acpi_hw_clear_acpi_status (ACPI_MTX_DO_NOT_LOCK);
+		if (ACPI_FAILURE (status)) {
+			return_ACPI_STATUS (status);
+		}
 
-	/* Disable BM arbitration */
+		/* Disable BM arbitration */
 
-	status = acpi_set_register (ACPI_BITREG_ARB_DISABLE, 1, ACPI_MTX_DO_NOT_LOCK);
-	if (ACPI_FAILURE (status)) {
-		return_ACPI_STATUS (status);
+		status = acpi_set_register (ACPI_BITREG_ARB_DISABLE, 1, ACPI_MTX_DO_NOT_LOCK);
+		if (ACPI_FAILURE (status)) {
+			return_ACPI_STATUS (status);
+		}
 	}
 
 	status = acpi_hw_disable_non_wakeup_gpes();
@@ -297,11 +305,13 @@
 		return_ACPI_STATUS (status);
 	}
 
-	/*
-	 * Wait a second, then try again. This is to get S4/5 to work on all machines.
-	 */
 	if (sleep_state > ACPI_STATE_S3) {
 		/*
+		 * We wanted to sleep > S3, but it didn't happen (by virtue of the fact that
+		 * we are still executing!)
+		 *
+		 * Wait ten seconds, then try again. This is to get S4/S5 to work on all machines.
+		 *
 		 * We wait so long to allow chipsets that poll this reg very slowly to
 		 * still read the right value. Ideally, this entire block would go
 		 * away entirely.
@@ -354,6 +364,7 @@
 
 	ACPI_FUNCTION_TRACE ("acpi_enter_sleep_state_s4bios");
 
+
 	acpi_set_register (ACPI_BITREG_WAKE_STATUS, 1, ACPI_MTX_DO_NOT_LOCK);
 	acpi_hw_clear_acpi_status(ACPI_MTX_DO_NOT_LOCK);
 
@@ -389,15 +400,38 @@
 
 acpi_status
 acpi_leave_sleep_state (
-	u8                          sleep_state)
+	u8                              sleep_state)
 {
-	struct acpi_object_list     arg_list;
-	union acpi_object           arg;
-	acpi_status                 status;
+	struct acpi_object_list         arg_list;
+	union acpi_object               arg;
+	acpi_status                     status;
+	struct acpi_bit_register_info   *sleep_type_reg_info;
+	struct acpi_bit_register_info   *sleep_enable_reg_info;
+	u32                             pm1x_control;
 
 
 	ACPI_FUNCTION_TRACE ("acpi_leave_sleep_state");
 
+	/* Some machines require SLP_TYPE and SLP_EN to be cleared */
+
+	sleep_type_reg_info = acpi_hw_get_bit_register_info (ACPI_BITREG_SLEEP_TYPE_A);
+	sleep_enable_reg_info = acpi_hw_get_bit_register_info (ACPI_BITREG_SLEEP_ENABLE);
+
+	/* Get current value of PM1A control */
+
+	status = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK,
+			 ACPI_REGISTER_PM1_CONTROL, &pm1x_control);
+	if (ACPI_SUCCESS (status)) {
+		/* Clear SLP_TYP and SLP_EN */
+
+		pm1x_control &= ~(sleep_type_reg_info->access_bit_mask |
+				   sleep_enable_reg_info->access_bit_mask);
+
+		acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK,
+				ACPI_REGISTER_PM1A_CONTROL, pm1x_control);
+		acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK,
+				ACPI_REGISTER_PM1B_CONTROL, pm1x_control);
+	}
 
 	/* Ensure enter_sleep_state_prep -> enter_sleep_state ordering */
 
@@ -407,12 +441,17 @@
 
 	arg_list.count = 1;
 	arg_list.pointer = &arg;
-
 	arg.type = ACPI_TYPE_INTEGER;
-	arg.integer.value = sleep_state;
 
 	/* Ignore any errors from these methods */
 
+	arg.integer.value = 0;
+	status = acpi_evaluate_object (NULL, "\\_SI._SST", &arg_list, NULL);
+	if (ACPI_FAILURE (status) && status != AE_NOT_FOUND) {
+		ACPI_REPORT_ERROR (("Method _SST failed, %s\n", acpi_format_exception (status)));
+	}
+
+	arg.integer.value = sleep_state;
 	status = acpi_evaluate_object (NULL, "\\_BFS", &arg_list, NULL);
 	if (ACPI_FAILURE (status) && status != AE_NOT_FOUND) {
 		ACPI_REPORT_ERROR (("Method _BFS failed, %s\n", acpi_format_exception (status)));
@@ -430,8 +469,8 @@
 		return_ACPI_STATUS (status);
 	}
 
-	/* Disable BM arbitration */
-	status = acpi_set_register (ACPI_BITREG_ARB_DISABLE, 0, ACPI_MTX_LOCK);
+	/* Enable BM arbitration */
 
+	status = acpi_set_register (ACPI_BITREG_ARB_DISABLE, 0, ACPI_MTX_LOCK);
 	return_ACPI_STATUS (status);
 }
--- diff/drivers/acpi/namespace/nsaccess.c	2003-05-21 11:50:14.000000000 +0100
+++ source/drivers/acpi/namespace/nsaccess.c	2003-12-29 09:30:39.000000000 +0000
@@ -314,8 +314,8 @@
 	else {
 		prefix_node = scope_info->scope.node;
 		if (ACPI_GET_DESCRIPTOR_TYPE (prefix_node) != ACPI_DESC_TYPE_NAMED) {
-			ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "[%p] Not a namespace node\n",
-				prefix_node));
+			ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%p Not a namespace node [%s]\n",
+					prefix_node, acpi_ut_get_descriptor_name (prefix_node)));
 			return_ACPI_STATUS (AE_AML_INTERNAL);
 		}
 
@@ -379,7 +379,7 @@
 
 			ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
 				"Searching relative to prefix scope [%4.4s] (%p)\n",
-				prefix_node->name.ascii, prefix_node));
+				acpi_ut_get_node_name (prefix_node), prefix_node));
 
 			/*
 			 * Handle multiple Parent Prefixes (carat) by just getting
@@ -413,7 +413,7 @@
 			if (search_parent_flag == ACPI_NS_NO_UPSEARCH) {
 				ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
 					"Search scope is [%4.4s], path has %d carat(s)\n",
-					this_node->name.ascii, num_carats));
+					acpi_ut_get_node_name (this_node), num_carats));
 			}
 		}
 
--- diff/drivers/acpi/namespace/nsalloc.c	2003-06-09 14:18:18.000000000 +0100
+++ source/drivers/acpi/namespace/nsalloc.c	2003-12-29 09:30:39.000000000 +0000
@@ -271,7 +271,7 @@
 		 * alphabetic placement.
 		 */
 		previous_child_node = NULL;
-		while (acpi_ns_compare_names (child_node->name.ascii, node->name.ascii) < 0) {
+		while (acpi_ns_compare_names (acpi_ut_get_node_name (child_node), acpi_ut_get_node_name (node)) < 0) {
 			if (child_node->flags & ANOBJ_END_OF_PEER_LIST) {
 				/* Last peer;  Clear end-of-list flag */
 
@@ -335,8 +335,9 @@
 	node->type = (u8) type;
 
 	ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "%4.4s (%s) added to %4.4s (%s) %p at %p\n",
-		node->name.ascii, acpi_ut_get_type_name (node->type),
-		parent_node->name.ascii, acpi_ut_get_type_name (parent_node->type), parent_node, node));
+		acpi_ut_get_node_name (node), acpi_ut_get_type_name (node->type),
+		acpi_ut_get_node_name (parent_node), acpi_ut_get_type_name (parent_node->type),
+		parent_node, node));
 
 	/*
 	 * Increment the reference count(s) of all parents up to
--- diff/drivers/acpi/namespace/nsdump.c	2003-10-09 09:47:33.000000000 +0100
+++ source/drivers/acpi/namespace/nsdump.c	2003-12-29 09:30:39.000000000 +0000
@@ -50,8 +50,8 @@
 #define _COMPONENT          ACPI_NAMESPACE
 	 ACPI_MODULE_NAME    ("nsdump")
 
-#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
 
+#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
 
 /*******************************************************************************
  *
@@ -76,7 +76,7 @@
 		return;
 	}
 
-		/* Print the entire name */
+	/* Print the entire name */
 
 	ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "["));
 
@@ -205,7 +205,7 @@
 	 * Now we can print out the pertinent information
 	 */
 	acpi_os_printf ("%4.4s %-12s %p ",
-			this_node->name.ascii, acpi_ut_get_type_name (type), this_node);
+			acpi_ut_get_node_name (this_node), acpi_ut_get_type_name (type), this_node);
 
 	dbg_level = acpi_dbg_level;
 	acpi_dbg_level = 0;
@@ -250,8 +250,7 @@
 		case ACPI_TYPE_INTEGER:
 
 			acpi_os_printf ("= %8.8X%8.8X\n",
-					 ACPI_HIDWORD (obj_desc->integer.value),
-					 ACPI_LODWORD (obj_desc->integer.value));
+					 ACPI_FORMAT_UINT64 (obj_desc->integer.value));
 			break;
 
 
@@ -302,8 +301,7 @@
 			acpi_os_printf ("[%s]", acpi_ut_get_region_name (obj_desc->region.space_id));
 			if (obj_desc->region.flags & AOPOBJ_DATA_VALID) {
 				acpi_os_printf (" Addr %8.8X%8.8X Len %.4X\n",
-						 ACPI_HIDWORD (obj_desc->region.address),
-						 ACPI_LODWORD (obj_desc->region.address),
+						 ACPI_FORMAT_UINT64 (obj_desc->region.address),
 						 obj_desc->region.length);
 			}
 			else {
@@ -324,7 +322,7 @@
 			if (obj_desc->buffer_field.buffer_obj &&
 				obj_desc->buffer_field.buffer_obj->buffer.node) {
 				acpi_os_printf ("Buf [%4.4s]",
-						obj_desc->buffer_field.buffer_obj->buffer.node->name.ascii);
+						acpi_ut_get_node_name (obj_desc->buffer_field.buffer_obj->buffer.node));
 			}
 			break;
 
@@ -332,29 +330,29 @@
 		case ACPI_TYPE_LOCAL_REGION_FIELD:
 
 			acpi_os_printf ("Rgn [%4.4s]",
-					obj_desc->common_field.region_obj->region.node->name.ascii);
+					acpi_ut_get_node_name (obj_desc->common_field.region_obj->region.node));
 			break;
 
 
 		case ACPI_TYPE_LOCAL_BANK_FIELD:
 
 			acpi_os_printf ("Rgn [%4.4s] Bnk [%4.4s]",
-					obj_desc->common_field.region_obj->region.node->name.ascii,
-					obj_desc->bank_field.bank_obj->common_field.node->name.ascii);
+					acpi_ut_get_node_name (obj_desc->common_field.region_obj->region.node),
+					acpi_ut_get_node_name (obj_desc->bank_field.bank_obj->common_field.node));
 			break;
 
 
 		case ACPI_TYPE_LOCAL_INDEX_FIELD:
 
 			acpi_os_printf ("Idx [%4.4s] Dat [%4.4s]",
-					obj_desc->index_field.index_obj->common_field.node->name.ascii,
-					obj_desc->index_field.data_obj->common_field.node->name.ascii);
+					acpi_ut_get_node_name (obj_desc->index_field.index_obj->common_field.node),
+					acpi_ut_get_node_name (obj_desc->index_field.data_obj->common_field.node));
 			break;
 
 
 		case ACPI_TYPE_LOCAL_ALIAS:
 
-			acpi_os_printf ("Target %4.4s (%p)\n", ((struct acpi_namespace_node *) obj_desc)->name.ascii, obj_desc);
+			acpi_os_printf ("Target %4.4s (%p)\n", acpi_ut_get_node_name (obj_desc), obj_desc);
 			break;
 
 		default:
@@ -371,7 +369,7 @@
 		case ACPI_TYPE_LOCAL_BANK_FIELD:
 		case ACPI_TYPE_LOCAL_INDEX_FIELD:
 
-			acpi_os_printf ("Off %.2X Len %.2X Acc %.2hd\n",
+			acpi_os_printf (" Off %.3X Len %.2X Acc %.2hd\n",
 					(obj_desc->common_field.base_byte_offset * 8)
 						+ obj_desc->common_field.start_field_bit_offset,
 					obj_desc->common_field.bit_length,
@@ -408,8 +406,8 @@
 
 		case ACPI_TYPE_INTEGER:
 
-			acpi_os_printf (" N:%X%X\n", ACPI_HIDWORD(obj_desc->integer.value),
-					 ACPI_LODWORD(obj_desc->integer.value));
+			acpi_os_printf (" I:%8.8X8.8%X\n",
+					ACPI_FORMAT_UINT64 (obj_desc->integer.value));
 			break;
 
 		case ACPI_TYPE_STRING:
@@ -485,7 +483,8 @@
 
 		default:
 
-			acpi_os_printf ("(String or Buffer ptr - not an object descriptor)\n");
+			acpi_os_printf ("(String or Buffer ptr - not an object descriptor) [%s]\n",
+					acpi_ut_get_descriptor_name (obj_desc));
 			bytes_to_dump = 16;
 			break;
 		}
@@ -581,7 +580,6 @@
 	info.owner_id = owner_id;
 	info.display_type = display_type;
 
-
 	(void) acpi_ns_walk_namespace (type, start_handle, max_depth,
 			 ACPI_NS_WALK_NO_UNLOCK, acpi_ns_dump_one_object,
 			 (void *) &info, NULL);
@@ -628,7 +626,6 @@
 		ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, "\\\n"));
 	}
 
-
 	acpi_ns_dump_objects (ACPI_TYPE_ANY, ACPI_DISPLAY_OBJECTS, max_depth,
 			ACPI_UINT32_MAX, search_handle);
 	return_VOID;
--- diff/drivers/acpi/namespace/nsdumpdv.c	2003-06-09 14:18:18.000000000 +0100
+++ source/drivers/acpi/namespace/nsdumpdv.c	2003-12-29 09:30:39.000000000 +0000
@@ -93,7 +93,7 @@
 
 		ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "    HID: %s, ADR: %8.8X%8.8X, Status: %X\n",
 				  info->hardware_id.value,
-				  ACPI_HIDWORD (info->address), ACPI_LODWORD (info->address),
+				  ACPI_FORMAT_UINT64 (info->address),
 				  info->current_status));
 		ACPI_MEM_FREE (info);
 	}
--- diff/drivers/acpi/namespace/nsinit.c	2003-02-26 16:01:07.000000000 +0000
+++ source/drivers/acpi/namespace/nsinit.c	2003-12-29 09:30:39.000000000 +0000
@@ -144,10 +144,17 @@
 
 	ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "Executing all Device _STA and_INI methods:"));
 
-	/* Walk namespace for all objects of type Device */
+	status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
+	if (ACPI_FAILURE (status)) {
+		return_ACPI_STATUS (status);
+	}
+
+	/* Walk namespace for all objects of type Device or Processor */
 
-	status = acpi_ns_walk_namespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
-			  ACPI_UINT32_MAX, FALSE, acpi_ns_init_one_device, &info, NULL);
+	status = acpi_ns_walk_namespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
+			  ACPI_UINT32_MAX, TRUE, acpi_ns_init_one_device, &info, NULL);
+
+	(void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
 
 	if (ACPI_FAILURE (status)) {
 		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "walk_namespace failed! %s\n",
@@ -290,7 +297,8 @@
 		ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ERROR, "\n"));
 		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
 				"Could not execute arguments for [%4.4s] (%s), %s\n",
-				node->name.ascii, acpi_ut_get_type_name (type), acpi_format_exception (status)));
+				acpi_ut_get_node_name (node), acpi_ut_get_type_name (type),
+				acpi_format_exception (status)));
 	}
 
 	/* Print a dot for each object unless we are going to print the entire pathname */
@@ -338,45 +346,48 @@
 	ACPI_FUNCTION_TRACE ("ns_init_one_device");
 
 
-	if ((acpi_dbg_level <= ACPI_LV_ALL_EXCEPTIONS) && (!(acpi_dbg_level & ACPI_LV_INFO))) {
-		ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "."));
-	}
-
-	info->device_count++;
-
-	status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
-	if (ACPI_FAILURE (status)) {
-		return_ACPI_STATUS (status);
-	}
-
 	node = acpi_ns_map_handle_to_node (obj_handle);
 	if (!node) {
-		(void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
 		return_ACPI_STATUS (AE_BAD_PARAMETER);
 	}
 
-	status = acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
-	if (ACPI_FAILURE (status)) {
-		return_ACPI_STATUS (status);
+	/*
+	 * We will run _STA/_INI on Devices and Processors only
+	 */
+	if ((node->type != ACPI_TYPE_DEVICE) &&
+		(node->type != ACPI_TYPE_PROCESSOR)) {
+		return_ACPI_STATUS (AE_OK);
 	}
 
+	if ((acpi_dbg_level <= ACPI_LV_ALL_EXCEPTIONS) && (!(acpi_dbg_level & ACPI_LV_INFO))) {
+		ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "."));
+	}
+
+	info->device_count++;
+
 	/*
 	 * Run _STA to determine if we can run _INI on the device.
 	 */
 	ACPI_DEBUG_EXEC (acpi_ut_display_init_pathname (ACPI_TYPE_METHOD, node, "_STA"));
 	status = acpi_ut_execute_STA (node, &flags);
+
 	if (ACPI_FAILURE (status)) {
-		/* Ignore error and move on to next device */
+		if (node->type == ACPI_TYPE_DEVICE) {
+			/* Ignore error and move on to next device */
 
-		return_ACPI_STATUS (AE_OK);
-	}
+			return_ACPI_STATUS (AE_OK);
+		}
 
-	info->num_STA++;
+		/* _STA is not required for Processor objects */
+	}
+	else {
+		info->num_STA++;
 
-	if (!(flags & 0x01)) {
-		/* don't look at children of a not present device */
+		if (!(flags & 0x01)) {
+			/* Don't look at children of a not present device */
 
-		return_ACPI_STATUS(AE_CTRL_DEPTH);
+			return_ACPI_STATUS(AE_CTRL_DEPTH);
+		}
 	}
 
 	/*
--- diff/drivers/acpi/namespace/nsobject.c	2003-02-26 16:01:07.000000000 +0000
+++ source/drivers/acpi/namespace/nsobject.c	2003-12-29 09:30:39.000000000 +0000
@@ -104,7 +104,8 @@
 	if (ACPI_GET_DESCRIPTOR_TYPE (node) != ACPI_DESC_TYPE_NAMED) {
 		/* Not a name handle */
 
-		ACPI_REPORT_ERROR (("ns_attach_object: Invalid handle\n"));
+		ACPI_REPORT_ERROR (("ns_attach_object: Invalid handle %p [%s]\n",
+				node, acpi_ut_get_descriptor_name (node)));
 		return_ACPI_STATUS (AE_BAD_PARAMETER);
 	}
 
@@ -151,7 +152,7 @@
 	}
 
 	ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Installing %p into Node %p [%4.4s]\n",
-		obj_desc, node, node->name.ascii));
+		obj_desc, node, acpi_ut_get_node_name (node)));
 
 	/* Detach an existing attached object if present */
 
@@ -234,7 +235,7 @@
 	node->type = ACPI_TYPE_ANY;
 
 	ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Node %p [%4.4s] Object %p\n",
-		node, node->name.ascii, obj_desc));
+		node, acpi_ut_get_node_name (node), obj_desc));
 
 	/* Remove one reference on the object (and all subobjects) */
 
--- diff/drivers/acpi/namespace/nssearch.c	2003-10-09 09:47:33.000000000 +0100
+++ source/drivers/acpi/namespace/nssearch.c	2003-12-29 09:30:39.000000000 +0000
@@ -119,7 +119,7 @@
 			ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
 				"Name [%4.4s] (%s) %p found in scope [%4.4s] %p\n",
 				(char *) &target_name, acpi_ut_get_type_name (next_node->type),
-				next_node, node->name.ascii, node));
+				next_node, acpi_ut_get_node_name (node), node));
 
 			*return_node = next_node;
 			return_ACPI_STATUS (AE_OK);
@@ -145,7 +145,7 @@
 	ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
 		"Name [%4.4s] (%s) not found in search in scope [%4.4s] %p first child %p\n",
 		(char *) &target_name, acpi_ut_get_type_name (type),
-		node->name.ascii, node, node->child));
+		acpi_ut_get_node_name (node), node, node->child));
 
 	return_ACPI_STATUS (AE_NOT_FOUND);
 }
--- diff/drivers/acpi/namespace/nsutils.c	2003-10-09 09:47:33.000000000 +0100
+++ source/drivers/acpi/namespace/nsutils.c	2003-12-29 09:30:39.000000000 +0000
@@ -977,8 +977,8 @@
 		parent_node = acpi_ns_get_parent_node (child_node);
 		if (parent_node) {
 			ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Parent of %p [%4.4s] is %p [%4.4s]\n",
-				child_node, child_node->name.ascii,
-				parent_node, parent_node->name.ascii));
+				child_node, acpi_ut_get_node_name (child_node),
+				parent_node, acpi_ut_get_node_name (parent_node)));
 
 			if (parent_node->name.integer) {
 				return_VALUE ((acpi_name) parent_node->name.integer);
@@ -986,7 +986,7 @@
 		}
 
 		ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "unable to find parent of %p (%4.4s)\n",
-			child_node, child_node->name.ascii));
+			child_node, acpi_ut_get_node_name (child_node)));
 	}
 
 	return_VALUE (ACPI_UNKNOWN_NAME);
--- diff/drivers/acpi/namespace/nsxfname.c	2003-06-09 14:18:18.000000000 +0100
+++ source/drivers/acpi/namespace/nsxfname.c	2003-12-29 09:30:39.000000000 +0000
@@ -199,7 +199,7 @@
 
 	/* Just copy the ACPI name from the Node and zero terminate it */
 
-	ACPI_STRNCPY (buffer->pointer, node->name.ascii,
+	ACPI_STRNCPY (buffer->pointer, acpi_ut_get_node_name (node),
 			 ACPI_NAME_SIZE);
 	((char *) buffer->pointer) [ACPI_NAME_SIZE] = 0;
 	status = AE_OK;
--- diff/drivers/acpi/osl.c	2003-08-26 10:00:52.000000000 +0100
+++ source/drivers/acpi/osl.c	2003-12-29 09:30:39.000000000 +0000
@@ -41,10 +41,7 @@
 #include <acpi/acpi_bus.h>
 #include <asm/uaccess.h>
 
-#ifdef CONFIG_ACPI_EFI
 #include <linux/efi.h>
-u64 efi_mem_attributes (u64 phys_addr);
-#endif
 
 
 #define _COMPONENT		ACPI_OS_SERVICES
@@ -140,22 +137,24 @@
 acpi_status
 acpi_os_get_root_pointer(u32 flags, struct acpi_pointer *addr)
 {
-#ifdef CONFIG_ACPI_EFI
-	addr->pointer_type = ACPI_PHYSICAL_POINTER;
-	if (efi.acpi20)
-		addr->pointer.physical = (acpi_physical_address) virt_to_phys(efi.acpi20);
-	else if (efi.acpi)
-		addr->pointer.physical = (acpi_physical_address) virt_to_phys(efi.acpi);
-	else {
-		printk(KERN_ERR PREFIX "System description tables not found\n");
-		return AE_NOT_FOUND;
-	}
-#else
-	if (ACPI_FAILURE(acpi_find_root_pointer(flags, addr))) {
-		printk(KERN_ERR PREFIX "System description tables not found\n");
-		return AE_NOT_FOUND;
+	if (efi_enabled) {
+		addr->pointer_type = ACPI_PHYSICAL_POINTER;
+		if (efi.acpi20)
+			addr->pointer.physical =
+				(acpi_physical_address) virt_to_phys(efi.acpi20);
+		else if (efi.acpi)
+			addr->pointer.physical =
+				(acpi_physical_address) virt_to_phys(efi.acpi);
+		else {
+			printk(KERN_ERR PREFIX "System description tables not found\n");
+			return AE_NOT_FOUND;
+		}
+	} else {
+		if (ACPI_FAILURE(acpi_find_root_pointer(flags, addr))) {
+			printk(KERN_ERR PREFIX "System description tables not found\n");
+			return AE_NOT_FOUND;
+		}
 	}
-#endif /*CONFIG_ACPI_EFI*/
 
 	return AE_OK;
 }
@@ -163,22 +162,22 @@
 acpi_status
 acpi_os_map_memory(acpi_physical_address phys, acpi_size size, void **virt)
 {
-#ifdef CONFIG_ACPI_EFI
-	if (EFI_MEMORY_WB & efi_mem_attributes(phys)) {
-		*virt = phys_to_virt(phys);
+	if (efi_enabled) {
+		if (EFI_MEMORY_WB & efi_mem_attributes(phys)) {
+			*virt = phys_to_virt(phys);
+		} else {
+			*virt = ioremap(phys, size);
+		}
 	} else {
-		*virt = ioremap(phys, size);
-	}
-#else
-	if (phys > ULONG_MAX) {
-		printk(KERN_ERR PREFIX "Cannot map memory that high\n");
-		return AE_BAD_PARAMETER;
+		if (phys > ULONG_MAX) {
+			printk(KERN_ERR PREFIX "Cannot map memory that high\n");
+			return AE_BAD_PARAMETER;
+		}
+		/*
+	 	 * ioremap checks to ensure this is in reserved space
+	 	 */
+		*virt = ioremap((unsigned long) phys, size);
 	}
-	/*
-	 * ioremap checks to ensure this is in reserved space
-	 */
-	*virt = ioremap((unsigned long) phys, size);
-#endif
 
 	if (!*virt)
 		return AE_NO_MEMORY;
@@ -369,19 +368,17 @@
 {
 	u32			dummy;
 	void			*virt_addr;
-
-#ifdef CONFIG_ACPI_EFI
 	int			iomem = 0;
 
-	if (EFI_MEMORY_WB & efi_mem_attributes(phys_addr)) {
+	if (efi_enabled) {
+		if (EFI_MEMORY_WB & efi_mem_attributes(phys_addr)) {
+			virt_addr = phys_to_virt(phys_addr);
+		} else {
+			iomem = 1;
+			virt_addr = ioremap(phys_addr, width);
+		}
+	} else
 		virt_addr = phys_to_virt(phys_addr);
-	} else {
-		iomem = 1;
-		virt_addr = ioremap(phys_addr, width);
-	}
-#else
-	virt_addr = phys_to_virt(phys_addr);
-#endif
 	if (!value)
 		value = &dummy;
 
@@ -399,10 +396,10 @@
 		BUG();
 	}
 
-#ifdef CONFIG_ACPI_EFI
-	if (iomem)
-		iounmap(virt_addr);
-#endif
+	if (efi_enabled) {
+		if (iomem)
+			iounmap(virt_addr);
+	}
 
 	return AE_OK;
 }
@@ -414,19 +411,17 @@
 	u32			width)
 {
 	void			*virt_addr;
-
-#ifdef CONFIG_ACPI_EFI
 	int			iomem = 0;
 
-	if (EFI_MEMORY_WB & efi_mem_attributes(phys_addr)) {
+	if (efi_enabled) {
+		if (EFI_MEMORY_WB & efi_mem_attributes(phys_addr)) {
+			virt_addr = phys_to_virt(phys_addr);
+		} else {
+			iomem = 1;
+			virt_addr = ioremap(phys_addr, width);
+		}
+	} else
 		virt_addr = phys_to_virt(phys_addr);
-	} else {
-		iomem = 1;
-		virt_addr = ioremap(phys_addr, width);
-	}
-#else
-	virt_addr = phys_to_virt(phys_addr);
-#endif
 
 	switch (width) {
 	case 8:
@@ -442,10 +437,8 @@
 		BUG();
 	}
 
-#ifdef CONFIG_ACPI_EFI
 	if (iomem)
 		iounmap(virt_addr);
-#endif
 
 	return AE_OK;
 }
--- diff/drivers/acpi/parser/psargs.c	2003-06-09 14:18:18.000000000 +0100
+++ source/drivers/acpi/parser/psargs.c	2003-12-29 09:30:39.000000000 +0000
@@ -490,7 +490,7 @@
 acpi_ps_get_next_field (
 	struct acpi_parse_state         *parser_state)
 {
-	u32                             aml_offset = ACPI_PTR_DIFF (parser_state->aml,
+	u32                             aml_offset = (u32) ACPI_PTR_DIFF (parser_state->aml,
 			 parser_state->aml_start);
 	union acpi_parse_object         *field;
 	u16                             opcode;
@@ -677,7 +677,7 @@
 
 			/* Fill in bytelist data */
 
-			arg->common.value.size = ACPI_PTR_DIFF (parser_state->pkg_end,
+			arg->common.value.size = (u32) ACPI_PTR_DIFF (parser_state->pkg_end,
 					  parser_state->aml);
 			arg->named.data = parser_state->aml;
 
--- diff/drivers/acpi/parser/psparse.c	2003-10-09 09:47:33.000000000 +0100
+++ source/drivers/acpi/parser/psparse.c	2003-12-29 09:30:40.000000000 +0000
@@ -498,7 +498,7 @@
 		if (!op) {
 			/* Get the next opcode from the AML stream */
 
-			walk_state->aml_offset = ACPI_PTR_DIFF (parser_state->aml,
+			walk_state->aml_offset = (u32) ACPI_PTR_DIFF (parser_state->aml,
 					   parser_state->aml_start);
 			walk_state->opcode   = acpi_ps_peek_opcode (parser_state);
 
@@ -710,7 +710,7 @@
 
 				while (GET_CURRENT_ARG_TYPE (walk_state->arg_types) &&
 						!walk_state->arg_count) {
-					walk_state->aml_offset = ACPI_PTR_DIFF (parser_state->aml,
+					walk_state->aml_offset = (u32) ACPI_PTR_DIFF (parser_state->aml,
 							   parser_state->aml_start);
 					status = acpi_ps_get_next_arg (walk_state, parser_state,
 							 GET_CURRENT_ARG_TYPE (walk_state->arg_types), &arg);
--- diff/drivers/acpi/parser/psxface.c	2003-06-09 14:18:18.000000000 +0100
+++ source/drivers/acpi/parser/psxface.c	2003-12-29 09:30:40.000000000 +0000
@@ -127,7 +127,8 @@
 
 	op = acpi_ps_create_scope_op ();
 	if (!op) {
-		return_ACPI_STATUS (AE_NO_MEMORY);
+		status = AE_NO_MEMORY;
+		goto cleanup1;
 	}
 
 	/*
@@ -142,20 +143,24 @@
 	walk_state = acpi_ds_create_walk_state (obj_desc->method.owning_id,
 			   NULL, NULL, NULL);
 	if (!walk_state) {
-		return_ACPI_STATUS (AE_NO_MEMORY);
+		status = AE_NO_MEMORY;
+		goto cleanup2;
 	}
 
 	status = acpi_ds_init_aml_walk (walk_state, op, method_node, obj_desc->method.aml_start,
 			  obj_desc->method.aml_length, NULL, NULL, 1);
 	if (ACPI_FAILURE (status)) {
-		acpi_ds_delete_walk_state (walk_state);
-		return_ACPI_STATUS (status);
+		goto cleanup3;
 	}
 
 	/* Parse the AML */
 
 	status = acpi_ps_parse_aml (walk_state);
 	acpi_ps_delete_parse_tree (op);
+	if (ACPI_FAILURE (status)) {
+		goto cleanup1; /* Walk state is already deleted */
+
+	}
 
 	/*
 	 * 2) Execute the method.  Performs second pass parse simultaneously
@@ -168,7 +173,8 @@
 
 	op = acpi_ps_create_scope_op ();
 	if (!op) {
-		return_ACPI_STATUS (AE_NO_MEMORY);
+		status = AE_NO_MEMORY;
+		goto cleanup1;
 	}
 
 	/* Init new op with the method name and pointer back to the NS node */
@@ -180,22 +186,30 @@
 
 	walk_state = acpi_ds_create_walk_state (0, NULL, NULL, NULL);
 	if (!walk_state) {
-		return_ACPI_STATUS (AE_NO_MEMORY);
+		status = AE_NO_MEMORY;
+		goto cleanup2;
 	}
 
 	status = acpi_ds_init_aml_walk (walk_state, op, method_node, obj_desc->method.aml_start,
 			  obj_desc->method.aml_length, params, return_obj_desc, 3);
 	if (ACPI_FAILURE (status)) {
-		acpi_ds_delete_walk_state (walk_state);
-		return_ACPI_STATUS (status);
+		goto cleanup3;
 	}
 
 	/*
 	 * The walk of the parse tree is where we actually execute the method
 	 */
 	status = acpi_ps_parse_aml (walk_state);
+	goto cleanup2; /* Walk state already deleted */
+
+
+cleanup3:
+	acpi_ds_delete_walk_state (walk_state);
+
+cleanup2:
 	acpi_ps_delete_parse_tree (op);
 
+cleanup1:
 	if (params) {
 		/* Take away the extra reference that we gave the parameters above */
 
@@ -206,6 +220,10 @@
 		}
 	}
 
+	if (ACPI_FAILURE (status)) {
+		return_ACPI_STATUS (status);
+	}
+
 	/*
 	 * If the method has returned an object, signal this to the caller with
 	 * a control exception code
--- diff/drivers/acpi/pci_irq.c	2003-10-09 09:47:33.000000000 +0100
+++ source/drivers/acpi/pci_irq.c	2003-12-29 09:30:40.000000000 +0000
@@ -237,7 +237,7 @@
                           PCI Interrupt Routing Support
    -------------------------------------------------------------------------- */
 
-static int
+int
 acpi_pci_irq_lookup (struct pci_bus *bus, int device, int pin)
 {
 	struct acpi_prt_entry	*entry = NULL;
--- diff/drivers/acpi/pci_link.c	2003-10-09 09:47:33.000000000 +0100
+++ source/drivers/acpi/pci_link.c	2003-12-29 09:30:40.000000000 +0000
@@ -99,7 +99,7 @@
 	void			*context)
 {
 	struct acpi_pci_link	*link = (struct acpi_pci_link *) context;
-	int			i = 0;
+	u32			i = 0;
 
 	ACPI_FUNCTION_TRACE("acpi_pci_link_check_possible");
 
@@ -294,7 +294,10 @@
 
 	if (!link->irq.active) {
 		ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "No active IRQ resource found\n"));
-		printk(KERN_WARNING "_CRS returns NULL! Using IRQ %d for device (%s [%s]).\n", irq, acpi_device_name(link->device), acpi_device_bid(link->device));
+		printk(KERN_WARNING "_CRS returns NULL! Using IRQ %d for"
+			"device (%s [%s]).\n", irq,
+			acpi_device_name(link->device),
+			acpi_device_bid(link->device));
 		link->irq.active = irq;
 	}
 	
@@ -429,30 +432,67 @@
                             PCI Link IRQ Management
    -------------------------------------------------------------------------- */
 
-#define ACPI_MAX_IRQS		256
-#define ACPI_MAX_ISA_IRQ	16
-
 /*
- * IRQ penalties are used to promote PCI IRQ balancing.  We set each ISA-
- * possible IRQ (0-15) with a default penalty relative to its feasibility
- * for PCI's use:
+ * "acpi_irq_balance" (default in APIC mode) enables ACPI to use PIC Interrupt
+ * Link Devices to move the PIRQs around to minimize sharing.
+ * 
+ * "acpi_irq_nobalance" (default in PIC mode) tells ACPI not to move any PIC IRQs
+ * that the BIOS has already set to active.  This is necessary because
+ * ACPI has no automatic means of knowing what ISA IRQs are used.  Note that
+ * if the BIOS doesn't set a Link Device active, ACPI needs to program it
+ * even if acpi_irq_nobalance is set.
+ *
+ * A tables of penalties avoids directing PCI interrupts to well known
+ * ISA IRQs. Boot params are available to over-ride the default table:
  *
- *   Never use:		0, 1, 2 (timer, keyboard, and cascade)
- *   Avoid using:	13, 14, and 15 (FP error and IDE)
- *   Penalize:		3, 4, 6, 7, 12 (known ISA uses)
+ * List interrupts that are free for PCI use.
+ * acpi_irq_pci=n[,m]
  *
- * Thus we're left with IRQs 5, 9, 10, 11, and everything above 15 (IO[S]APIC)
- * as 'best bets' for PCI use.
+ * List interrupts that should not be used for PCI:
+ * acpi_irq_isa=n[,m]
+ *
+ * Note that PCI IRQ routers have a list of possible IRQs,
+ * which may not include the IRQs this table says are available.
+ * 
+ * Since this heuristic can't tell the difference between a link
+ * that no device will attach to, vs. a link which may be shared
+ * by multiple active devices -- it is not optimal.
+ *
+ * If interrupt performance is that important, get an IO-APIC system
+ * with a pin dedicated to each device.  Or for that matter, an MSI
+ * enabled system.
  */
 
+#define ACPI_MAX_IRQS		256
+#define ACPI_MAX_ISA_IRQ	16
+
+#define PIRQ_PENALTY_PCI_AVAILABLE	(0)
+#define PIRQ_PENALTY_PCI_POSSIBLE	(16*16)
+#define PIRQ_PENALTY_PCI_USING		(16*16*16)
+#define PIRQ_PENALTY_ISA_TYPICAL	(16*16*16*16)
+#define PIRQ_PENALTY_ISA_USED		(16*16*16*16*16)
+#define PIRQ_PENALTY_ISA_ALWAYS		(16*16*16*16*16*16)
+
 static int acpi_irq_penalty[ACPI_MAX_IRQS] = {
-	1000000,  1000000,  1000000,    10000, 
-	  10000,        0,    10000,    10000,
-	  10000,        0,        0,        0, 
-	  10000,   100000,   100000,   100000,
+	PIRQ_PENALTY_ISA_ALWAYS,	/* IRQ0 timer */
+	PIRQ_PENALTY_ISA_ALWAYS,	/* IRQ1 keyboard */
+	PIRQ_PENALTY_ISA_ALWAYS,	/* IRQ2 cascade */
+	PIRQ_PENALTY_ISA_TYPICAL,	/* IRQ3	serial */
+	PIRQ_PENALTY_ISA_TYPICAL,	/* IRQ4	serial */
+	PIRQ_PENALTY_ISA_TYPICAL,	/* IRQ5 sometimes SoundBlaster */
+	PIRQ_PENALTY_ISA_TYPICAL,	/* IRQ6 */
+	PIRQ_PENALTY_ISA_TYPICAL,	/* IRQ7 parallel, spurious */
+	PIRQ_PENALTY_ISA_TYPICAL,	/* IRQ8 rtc, sometimes */
+	PIRQ_PENALTY_PCI_AVAILABLE,	/* IRQ9  PCI, often acpi */
+	PIRQ_PENALTY_PCI_AVAILABLE,	/* IRQ10 PCI */
+	PIRQ_PENALTY_PCI_AVAILABLE,	/* IRQ11 PCI */
+	PIRQ_PENALTY_ISA_TYPICAL,	/* IRQ12 mouse */
+	PIRQ_PENALTY_ISA_USED,	/* IRQ13 fpe, sometimes */
+	PIRQ_PENALTY_ISA_USED,	/* IRQ14 ide0 */
+	PIRQ_PENALTY_ISA_USED,	/* IRQ15 ide1 */
+			/* >IRQ15 */
 };
 
-
 int
 acpi_pci_link_check (void)
 {
@@ -473,20 +513,30 @@
 			continue;
 		}
 
-		if (link->irq.active)
-			acpi_irq_penalty[link->irq.active] += 100;
-		else if (link->irq.possible_count) {
-			int penalty = 100 / link->irq.possible_count;
-			for (i=0; i<link->irq.possible_count; i++) {
+		/*
+		 * reflect the possible and active irqs in the penalty table --
+		 * useful for breaking ties.
+		 */
+		if (link->irq.possible_count) {
+			int penalty = PIRQ_PENALTY_PCI_POSSIBLE / link->irq.possible_count;
+
+			for (i = 0; i < link->irq.possible_count; i++) {
 				if (link->irq.possible[i] < ACPI_MAX_ISA_IRQ)
 					acpi_irq_penalty[link->irq.possible[i]] += penalty;
 			}
+
+		} else if (link->irq.active) {
+			acpi_irq_penalty[link->irq.active] += PIRQ_PENALTY_PCI_POSSIBLE;
 		}
 	}
+	/* Add a penalty for the SCI */
+	acpi_irq_penalty[acpi_fadt.sci_int] += PIRQ_PENALTY_PCI_USING;
 
 	return_VALUE(0);
 }
 
+static int acpi_irq_balance;	/* 0: static, 1: balance */
+
 static int acpi_pci_link_allocate(struct acpi_pci_link* link) {
 	int irq;
 	int i;
@@ -500,12 +550,14 @@
 		irq = link->irq.active;
 	} else {
 		irq = link->irq.possible[0];
+	}
 
+	if (acpi_irq_balance || !link->irq.active) {
 		/*
 		 * Select the best IRQ.  This is done in reverse to promote
 		 * the use of IRQs 9, 10, 11, and >15.
 		 */
-		for (i=(link->irq.possible_count-1); i>0; i--) {
+		for (i = (link->irq.possible_count - 1); i >= 0; i--) {
 			if (acpi_irq_penalty[irq] > acpi_irq_penalty[link->irq.possible[i]])
 				irq = link->irq.possible[i];
 		}
@@ -518,13 +570,14 @@
 			acpi_device_bid(link->device));
 		return_VALUE(-ENODEV);
 	} else {
-		acpi_irq_penalty[link->irq.active] += 100;
+		acpi_irq_penalty[link->irq.active] += PIRQ_PENALTY_PCI_USING;
 		printk(PREFIX "%s [%s] enabled at IRQ %d\n", 
 			acpi_device_name(link->device),
 			acpi_device_bid(link->device), link->irq.active);
 	}
 
 	link->irq.setonboot = 1;
+
 	return_VALUE(0);
 }
 
@@ -607,9 +660,12 @@
 	if (result)
 		goto end;
 
+	/* query and set link->irq.active */
 	acpi_pci_link_get_current(link);
 
-	printk(PREFIX "%s [%s] (IRQs", acpi_device_name(device), acpi_device_bid(device));
+//#ifdef CONFIG_ACPI_DEBUG
+	printk(PREFIX "%s [%s] (IRQs", acpi_device_name(device),
+		acpi_device_bid(device));
 	for (i = 0; i < link->irq.possible_count; i++) {
 		if (link->irq.active == link->irq.possible[i]) {
 			printk(" *%d", link->irq.possible[i]);
@@ -619,6 +675,7 @@
 			printk(" %d", link->irq.possible[i]);
 	}
 	printk(")\n");
+//#endif /* CONFIG_ACPI_DEBUG */
 
 	/* TBD: Acquire/release lock */
 	list_add_tail(&link->node, &acpi_link.entries);
@@ -654,6 +711,77 @@
 	return_VALUE(0);
 }
 
+/*
+ * modify acpi_irq_penalty[] from cmdline
+ */
+static int __init acpi_irq_penalty_update(char *str, int used)
+{
+	int i;
+
+	for (i = 0; i < 16; i++) {
+		int retval;
+		int irq;
+
+		retval = get_option(&str,&irq);
+
+		if (!retval)
+			break;	/* no number found */
+
+		if (irq < 0)
+			continue;
+		
+		if (irq >= ACPI_MAX_IRQS)
+			continue;
+
+		if (used)
+			acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED;
+		else
+			acpi_irq_penalty[irq] = PIRQ_PENALTY_PCI_AVAILABLE;
+
+		if (retval != 2)	/* no next number */
+			break;
+	}
+	return 1;
+}
+
+/*
+ * Over-ride default table to reserve additional IRQs for use by ISA
+ * e.g. acpi_irq_isa=5
+ * Useful for telling ACPI how not to interfere with your ISA sound card.
+ */
+static int __init acpi_irq_isa(char *str)
+{
+	return(acpi_irq_penalty_update(str, 1));
+}
+__setup("acpi_irq_isa=", acpi_irq_isa);
+
+/*
+ * Over-ride default table to free additional IRQs for use by PCI
+ * e.g. acpi_irq_pci=7,15
+ * Used for acpi_irq_balance to free up IRQs to reduce PCI IRQ sharing.
+ */
+static int __init acpi_irq_pci(char *str)
+{
+	return(acpi_irq_penalty_update(str, 0));
+}
+__setup("acpi_irq_pci=", acpi_irq_pci);
+
+static int __init acpi_irq_nobalance_set(char *str)
+{
+printk("ACPI STATIC SET\n");
+	acpi_irq_balance = 0;
+	return(1);
+}
+__setup("acpi_irq_nobalance", acpi_irq_nobalance_set);
+
+int __init acpi_irq_balance_set(char *str)
+{
+printk("ACPI BALANCE SET\n");
+	acpi_irq_balance = 1;
+	return(1);
+}
+__setup("acpi_irq_balance", acpi_irq_balance_set);
+
 
 static int __init acpi_pci_link_init (void)
 {
--- diff/drivers/acpi/pci_root.c	2003-11-25 15:24:57.000000000 +0000
+++ source/drivers/acpi/pci_root.c	2003-12-29 09:30:40.000000000 +0000
@@ -62,8 +62,6 @@
 	acpi_handle		handle;
 	struct acpi_pci_id	id;
 	struct pci_bus		*bus;
-	u64			mem_tra;
-	u64			io_tra;
 };
 
 static LIST_HEAD(acpi_pci_roots);
@@ -115,97 +113,6 @@
 	}
 }
 
-void
-acpi_pci_get_translations (
-	struct acpi_pci_id	*id,
-	u64			*mem_tra,
-	u64			*io_tra)
-{
-	struct list_head	*node = NULL;
-	struct acpi_pci_root	*entry;
-
-	/* TBD: Locking */
-	list_for_each(node, &acpi_pci_roots) {
-		entry = list_entry(node, struct acpi_pci_root, node);
-		if ((id->segment == entry->id.segment)
-			&& (id->bus == entry->id.bus)) {
-			*mem_tra = entry->mem_tra;
-			*io_tra = entry->io_tra;
-			return;
-		}
-	}
-
-	*mem_tra = 0;
-	*io_tra = 0;
-}
-
-
-static u64
-acpi_pci_root_bus_tra (
-       struct acpi_resource	*resource,
-       int			type)
-{
-	struct acpi_resource_address16 *address16;
-	struct acpi_resource_address32 *address32;
-	struct acpi_resource_address64 *address64;
-
-	while (1) {
-		switch (resource->id) {
-		case ACPI_RSTYPE_END_TAG:
-			return 0;
-
-		case ACPI_RSTYPE_ADDRESS16:
-			address16 = (struct acpi_resource_address16 *) &resource->data;
-			if (type == address16->resource_type) {
-				return address16->address_translation_offset;
-			}
-			break;
-
-		case ACPI_RSTYPE_ADDRESS32:
-			address32 = (struct acpi_resource_address32 *) &resource->data;
-			if (type == address32->resource_type) {
-				return address32->address_translation_offset;
-			}
-			break;
-
-		case ACPI_RSTYPE_ADDRESS64:
-			address64 = (struct acpi_resource_address64 *) &resource->data;
-			if (type == address64->resource_type) {
-				return address64->address_translation_offset;
-			}
-			break;
-		}
-		resource = ACPI_PTR_ADD (struct acpi_resource,
-				resource, resource->length);
-	}
-
-	return 0;
-}
-
-
-static int
-acpi_pci_evaluate_crs (
-	struct acpi_pci_root	*root)
-{
-	acpi_status		status;
-	struct acpi_buffer	buffer = {ACPI_ALLOCATE_BUFFER, NULL};
-
-	ACPI_FUNCTION_TRACE("acpi_pci_evaluate_crs");
-
-	status = acpi_get_current_resources (root->handle, &buffer);
-	if (ACPI_FAILURE(status))
-		return_VALUE(-ENODEV);
-
-	root->io_tra = acpi_pci_root_bus_tra ((struct acpi_resource *)
-			buffer.pointer, ACPI_IO_RANGE);
-	root->mem_tra = acpi_pci_root_bus_tra ((struct acpi_resource *)
-			buffer.pointer, ACPI_MEMORY_RANGE);
-
-	acpi_os_free(buffer.pointer);
-	return_VALUE(0);
-}
-
-
 static int
 acpi_pci_root_add (
 	struct acpi_device	*device)
@@ -288,10 +195,8 @@
 	root->id.function = device->pnp.bus_address & 0xFFFF;
 
 	/*
-	 * Evaluate _CRS to get root bridge resources
 	 * TBD: Need PCI interface for enumeration/configuration of roots.
 	 */
- 	acpi_pci_evaluate_crs(root);
 
  	/* TBD: Locking */
  	list_add_tail(&root->node, &acpi_pci_roots);
--- diff/drivers/acpi/resources/rscalc.c	2003-05-21 11:50:14.000000000 +0100
+++ source/drivers/acpi/resources/rscalc.c	2003-12-29 09:30:40.000000000 +0000
@@ -696,7 +696,7 @@
 		default:
 			/*
 			 * If we get here, everything is out of sync,
-			 *  so exit with an error
+			 * exit with an error
 			 */
 			return_ACPI_STATUS (AE_AML_INVALID_RESOURCE_TYPE);
 		}
@@ -704,7 +704,7 @@
 		/*
 		 * Update the return value and counter
 		 */
-		buffer_size += ACPI_ALIGN_RESOURCE_SIZE(structure_size);
+		buffer_size += (u32) ACPI_ALIGN_RESOURCE_SIZE (structure_size);
 		bytes_parsed += bytes_consumed;
 
 		/*
--- diff/drivers/acpi/resources/rscreate.c	2003-02-26 16:01:07.000000000 +0000
+++ source/drivers/acpi/resources/rscreate.c	2003-12-29 09:30:40.000000000 +0000
@@ -331,7 +331,7 @@
 
 		/* Now align the current length */
 
-		user_prt->length = ACPI_ROUND_UP_to_64_bITS (user_prt->length);
+		user_prt->length = (u32) ACPI_ROUND_UP_to_64_bITS (user_prt->length);
 
 		/*
 		 * 4) Fourth subobject: Dereference the PRT.source_index
--- diff/drivers/acpi/resources/rsdump.c	2003-02-26 16:01:07.000000000 +0000
+++ source/drivers/acpi/resources/rsdump.c	2003-12-29 09:30:40.000000000 +0000
@@ -899,24 +899,19 @@
 			 "" : "not ");
 
 	acpi_os_printf ("  Granularity: %8.8X%8.8X\n",
-			 ACPI_HIDWORD (address64_data->granularity),
-			 ACPI_LODWORD (address64_data->granularity));
+			 ACPI_FORMAT_UINT64 (address64_data->granularity));
 
 	acpi_os_printf ("  Address range min: %8.8X%8.8X\n",
-			 ACPI_HIDWORD (address64_data->min_address_range),
-			 ACPI_HIDWORD (address64_data->min_address_range));
+			 ACPI_FORMAT_UINT64 (address64_data->min_address_range));
 
 	acpi_os_printf ("  Address range max: %8.8X%8.8X\n",
-			 ACPI_HIDWORD (address64_data->max_address_range),
-			 ACPI_HIDWORD (address64_data->max_address_range));
+			 ACPI_FORMAT_UINT64 (address64_data->max_address_range));
 
 	acpi_os_printf ("  Address translation offset: %8.8X%8.8X\n",
-			 ACPI_HIDWORD (address64_data->address_translation_offset),
-			 ACPI_HIDWORD (address64_data->address_translation_offset));
+			 ACPI_FORMAT_UINT64 (address64_data->address_translation_offset));
 
 	acpi_os_printf ("  Address Length: %8.8X%8.8X\n",
-			 ACPI_HIDWORD (address64_data->address_length),
-			 ACPI_HIDWORD (address64_data->address_length));
+			 ACPI_FORMAT_UINT64 (address64_data->address_length));
 
 	if(0xFF != address64_data->resource_source.index) {
 		acpi_os_printf ("  Resource Source Index: %X\n",
@@ -1126,8 +1121,7 @@
 			acpi_os_printf ("PCI IRQ Routing Table structure %X.\n", count++);
 
 			acpi_os_printf ("  Address: %8.8X%8.8X\n",
-					 ACPI_HIDWORD (prt_element->address),
-					 ACPI_LODWORD (prt_element->address));
+					 ACPI_FORMAT_UINT64 (prt_element->address));
 
 			acpi_os_printf ("  Pin: %X\n", prt_element->pin);
 
--- diff/drivers/acpi/resources/rsirq.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/acpi/resources/rsirq.c	2003-12-29 09:30:40.000000000 +0000
@@ -132,26 +132,28 @@
 		temp8 = *buffer;
 
 		/*
-		 * Check for HE, LL or HL
+		 * Check for HE, LL interrupts
 		 */
-		if (temp8 & 0x01) {
+		switch (temp8 & 0x09) {
+		case 0x01: /* HE */
 			output_struct->data.irq.edge_level = ACPI_EDGE_SENSITIVE;
 			output_struct->data.irq.active_high_low = ACPI_ACTIVE_HIGH;
-		}
-		else {
-			if (temp8 & 0x8) {
-				output_struct->data.irq.edge_level = ACPI_LEVEL_SENSITIVE;
-				output_struct->data.irq.active_high_low = ACPI_ACTIVE_LOW;
-			}
-			else {
-				/*
-				 * Only _LL and _HE polarity/trigger interrupts
-				 * are allowed (ACPI spec v1.0b ection 6.4.2.1),
-				 * so an error will occur if we reach this point
-				 */
-				ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid interrupt polarity/trigger in resource list\n"));
-				return_ACPI_STATUS (AE_BAD_DATA);
-			}
+			break;
+
+		case 0x08: /* LL */
+			output_struct->data.irq.edge_level = ACPI_LEVEL_SENSITIVE;
+			output_struct->data.irq.active_high_low = ACPI_ACTIVE_LOW;
+			break;
+
+		default:
+			/*
+			 * Only _LL and _HE polarity/trigger interrupts
+			 * are allowed (ACPI spec, section "IRQ Format")
+			 * so 0x00 and 0x09 are illegal.
+			 */
+			ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
+				"Invalid interrupt polarity/trigger in resource list, %X\n", temp8));
+			return_ACPI_STATUS (AE_BAD_DATA);
 		}
 
 		/*
@@ -419,7 +421,7 @@
 		 * Point the String pointer to the end of this structure.
 		 */
 		output_struct->data.extended_irq.resource_source.string_ptr =
-				(char *)(output_struct + struct_size);
+				(char *)((char *) output_struct + struct_size);
 
 		temp_ptr = (u8 *) output_struct->data.extended_irq.resource_source.string_ptr;
 
--- diff/drivers/acpi/resources/rslist.c	2003-02-26 16:01:07.000000000 +0000
+++ source/drivers/acpi/resources/rslist.c	2003-12-29 09:30:40.000000000 +0000
@@ -312,8 +312,8 @@
 		 * Set the Buffer to the next structure
 		 */
 		resource = ACPI_CAST_PTR (struct acpi_resource, buffer);
-		resource->length = ACPI_ALIGN_RESOURCE_SIZE(resource->length);
-		buffer += ACPI_ALIGN_RESOURCE_SIZE(structure_size);
+		resource->length = (u32) ACPI_ALIGN_RESOURCE_SIZE (resource->length);
+		buffer += ACPI_ALIGN_RESOURCE_SIZE (structure_size);
 
 	} /*  end while */
 
--- diff/drivers/acpi/scan.c	2003-06-09 14:18:18.000000000 +0100
+++ source/drivers/acpi/scan.c	2003-12-29 09:30:40.000000000 +0000
@@ -336,6 +336,9 @@
 
 	ACPI_FUNCTION_TRACE("acpi_bus_register_driver");
 
+	if (acpi_disabled)
+		return_VALUE(-ENODEV);
+
 	if (driver) {
 		spin_lock(&acpi_device_lock);
 		list_add_tail(&driver->node, &acpi_bus_drivers);
--- diff/drivers/acpi/sleep/proc.c	2003-09-30 15:46:12.000000000 +0100
+++ source/drivers/acpi/sleep/proc.c	2003-12-29 09:30:40.000000000 +0000
@@ -374,6 +374,9 @@
 {
 	struct proc_dir_entry	*entry = NULL;
 
+	if (acpi_disabled)
+		return 0;
+ 
 	/* 'sleep' [R/W]*/
 	entry = create_proc_entry(ACPI_SYSTEM_FILE_SLEEP,
 				  S_IFREG|S_IRUGO|S_IWUSR, acpi_root_dir);
--- diff/drivers/acpi/tables.c	2003-10-09 09:47:33.000000000 +0100
+++ source/drivers/acpi/tables.c	2003-12-29 09:30:40.000000000 +0000
@@ -60,6 +60,9 @@
 	[ACPI_HPET]		= "HPET",
 };
 
+static char *mps_inti_flags_polarity[] = { "dfl", "high", "res", "low" };
+static char *mps_inti_flags_trigger[] = { "dfl", "edge", "res", "level" };
+
 /* System Description Table (RSDT/XSDT) */
 struct acpi_table_sdt {
 	unsigned long		pa;
@@ -136,8 +139,14 @@
 	{
 		struct acpi_table_int_src_ovr *p =
 			(struct acpi_table_int_src_ovr*) header;
-		printk(KERN_INFO PREFIX "INT_SRC_OVR (bus[%d] irq[0x%x] global_irq[0x%x] polarity[0x%x] trigger[0x%x])\n",
-			p->bus, p->bus_irq, p->global_irq, p->flags.polarity, p->flags.trigger);
+		printk(KERN_INFO PREFIX "INT_SRC_OVR (bus %d bus_irq %d global_irq %d %s %s)\n",
+			p->bus, p->bus_irq, p->global_irq,
+			mps_inti_flags_polarity[p->flags.polarity],
+			mps_inti_flags_trigger[p->flags.trigger]);
+		if(p->flags.reserved)
+			printk(KERN_INFO PREFIX "INT_SRC_OVR unexpected reserved flags: 0x%x\n",
+				p->flags.reserved);
+
 	}
 		break;
 
@@ -145,8 +154,9 @@
 	{
 		struct acpi_table_nmi_src *p =
 			(struct acpi_table_nmi_src*) header;
-		printk(KERN_INFO PREFIX "NMI_SRC (polarity[0x%x] trigger[0x%x] global_irq[0x%x])\n",
-			p->flags.polarity, p->flags.trigger, p->global_irq);
+		printk(KERN_INFO PREFIX "NMI_SRC (%s %s global_irq %d)\n",
+			mps_inti_flags_polarity[p->flags.polarity],
+			mps_inti_flags_trigger[p->flags.trigger], p->global_irq);
 	}
 		break;
 
@@ -154,8 +164,10 @@
 	{
 		struct acpi_table_lapic_nmi *p =
 			(struct acpi_table_lapic_nmi*) header;
-		printk(KERN_INFO PREFIX "LAPIC_NMI (acpi_id[0x%02x] polarity[0x%x] trigger[0x%x] lint[0x%x])\n",
-			p->acpi_id, p->flags.polarity, p->flags.trigger, p->lint);
+		printk(KERN_INFO PREFIX "LAPIC_NMI (acpi_id[0x%02x] %s %s lint[0x%x])\n",
+			p->acpi_id,
+			mps_inti_flags_polarity[p->flags.polarity],
+			mps_inti_flags_trigger[p->flags.trigger], p->lint);
 	}
 		break;
 
@@ -190,8 +202,10 @@
 	{
 		struct acpi_table_plat_int_src *p =
 			(struct acpi_table_plat_int_src*) header;
-		printk(KERN_INFO PREFIX "PLAT_INT_SRC (polarity[0x%x] trigger[0x%x] type[0x%x] id[0x%04x] eid[0x%x] iosapic_vector[0x%x] global_irq[0x%x]\n",
-			p->flags.polarity, p->flags.trigger, p->type, p->id, p->eid, p->iosapic_vector, p->global_irq);
+		printk(KERN_INFO PREFIX "PLAT_INT_SRC (%s %s type[0x%x] id[0x%04x] eid[0x%x] iosapic_vector[0x%x] global_irq[0x%x]\n",
+			mps_inti_flags_polarity[p->flags.polarity],
+			mps_inti_flags_trigger[p->flags.trigger],
+			p->type, p->id, p->eid, p->iosapic_vector, p->global_irq);
 	}
 		break;
 
--- diff/drivers/acpi/tables/tbget.c	2003-08-20 14:16:08.000000000 +0100
+++ source/drivers/acpi/tables/tbget.c	2003-12-29 09:30:40.000000000 +0000
@@ -148,8 +148,7 @@
 				  (void *) &header);
 		if (ACPI_FAILURE (status)) {
 			ACPI_REPORT_ERROR (("Could not map memory at %8.8X%8.8X for length %X\n",
-				ACPI_HIDWORD (address->pointer.physical),
-				ACPI_LODWORD (address->pointer.physical),
+				ACPI_FORMAT_UINT64 (address->pointer.physical),
 				sizeof (struct acpi_table_header)));
 			return_ACPI_STATUS (status);
 		}
@@ -365,8 +364,7 @@
 		if (ACPI_FAILURE (status)) {
 			ACPI_REPORT_ERROR (("Could not map memory for table [%4.4s] at %8.8X%8.8X for length %X\n",
 				header->signature,
-				ACPI_HIDWORD (address->pointer.physical),
-				ACPI_LODWORD (address->pointer.physical), header->length));
+				ACPI_FORMAT_UINT64 (address->pointer.physical), header->length));
 			return (status);
 		}
 
@@ -408,8 +406,7 @@
 	ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
 		"Found table [%4.4s] at %8.8X%8.8X, mapped/copied to %p\n",
 		full_table->signature,
-		ACPI_HIDWORD (address->pointer.physical),
-		ACPI_LODWORD (address->pointer.physical), full_table));
+		ACPI_FORMAT_UINT64 (address->pointer.physical), full_table));
 
 	return_ACPI_STATUS (status);
 }
@@ -458,6 +455,7 @@
 	if (instance == 1) {
 		/* Get the first */
 
+		*table_ptr_loc = NULL;
 		if (acpi_gbl_table_lists[table_type].next) {
 			*table_ptr_loc = acpi_gbl_table_lists[table_type].next->pointer;
 		}
--- diff/drivers/acpi/tables/tbgetall.c	2003-06-09 14:18:18.000000000 +0100
+++ source/drivers/acpi/tables/tbgetall.c	2003-12-29 09:30:40.000000000 +0000
@@ -240,8 +240,7 @@
 		if ((status != AE_OK) && (status != AE_TABLE_NOT_SUPPORTED)) {
 			ACPI_REPORT_WARNING (("%s, while getting table at %8.8X%8.8X\n",
 				acpi_format_exception (status),
-				ACPI_HIDWORD (address.pointer.value),
-				ACPI_LODWORD (address.pointer.value)));
+				ACPI_FORMAT_UINT64 (address.pointer.value)));
 		}
 	}
 
--- diff/drivers/acpi/tables/tbrsdt.c	2003-08-20 14:16:08.000000000 +0100
+++ source/drivers/acpi/tables/tbrsdt.c	2003-12-29 09:30:40.000000000 +0000
@@ -278,8 +278,7 @@
 	ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
 		"RSDP located at %p, points to RSDT physical=%8.8X%8.8X \n",
 		acpi_gbl_RSDP,
-		ACPI_HIDWORD (address.pointer.value),
-		ACPI_LODWORD (address.pointer.value)));
+		ACPI_FORMAT_UINT64 (address.pointer.value)));
 
 	/* Check the RSDT or XSDT signature */
 
--- diff/drivers/acpi/tables/tbxface.c	2003-06-09 14:18:18.000000000 +0100
+++ source/drivers/acpi/tables/tbxface.c	2003-12-29 09:30:40.000000000 +0000
@@ -251,7 +251,7 @@
 	/* Find all tables of the requested type */
 
 	table_desc = acpi_gbl_table_lists[table_type].next;
-	while (table_desc); {
+	while (table_desc) {
 		/*
 		 * Delete all namespace entries owned by this table.  Note that these
 		 * entries can appear anywhere in the namespace by virtue of the AML
--- diff/drivers/acpi/tables/tbxfroot.c	2003-08-20 14:16:08.000000000 +0100
+++ source/drivers/acpi/tables/tbxfroot.c	2003-12-29 09:30:40.000000000 +0000
@@ -211,8 +211,7 @@
 	ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
 		"RSDP located at %p, RSDT physical=%8.8X%8.8X \n",
 		acpi_gbl_RSDP,
-		ACPI_HIDWORD (address.pointer.value),
-		ACPI_LODWORD (address.pointer.value)));
+		ACPI_FORMAT_UINT64 (address.pointer.value)));
 
 	/* Insert processor_mode flags */
 
--- diff/drivers/acpi/thermal.c	2003-08-20 14:16:08.000000000 +0100
+++ source/drivers/acpi/thermal.c	2003-12-29 09:30:40.000000000 +0000
@@ -467,6 +467,7 @@
 	if (result)
 		return_VALUE(result);
 
+	printk(KERN_EMERG "Critical temperature reached (%ld C), shutting down.\n", KELVIN_TO_CELSIUS(tz->temperature));
 	acpi_bus_generate_event(device, ACPI_THERMAL_NOTIFY_CRITICAL, tz->trips.critical.flags.enabled);
 
 	acpi_thermal_call_usermode(ACPI_THERMAL_PATH_POWEROFF);
--- diff/drivers/acpi/utilities/utalloc.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/acpi/utilities/utalloc.c	2003-12-29 09:30:40.000000000 +0000
@@ -902,71 +902,30 @@
 
 			descriptor = ACPI_CAST_PTR (union acpi_descriptor, &element->user_space);
 			if (descriptor->descriptor_id != ACPI_DESC_TYPE_CACHED) {
-				acpi_os_printf ("%p Len %04X %9.9s-%d ",
+				acpi_os_printf ("%p Len %04X %9.9s-%d [%s] ",
 						 descriptor, element->size, element->module,
-						 element->line);
+						 element->line, acpi_ut_get_descriptor_name (descriptor));
 
-				/* Most of the elements will be internal objects. */
+				/* Most of the elements will be Operand objects. */
 
 				switch (ACPI_GET_DESCRIPTOR_TYPE (descriptor)) {
 				case ACPI_DESC_TYPE_OPERAND:
-					acpi_os_printf ("obj_type %12.12s R%hd",
+					acpi_os_printf ("%12.12s R%hd",
 							acpi_ut_get_type_name (descriptor->object.common.type),
 							descriptor->object.common.reference_count);
 					break;
 
 				case ACPI_DESC_TYPE_PARSER:
-					acpi_os_printf ("parse_obj aml_opcode %04hX",
+					acpi_os_printf ("aml_opcode %04hX",
 							descriptor->op.asl.aml_opcode);
 					break;
 
 				case ACPI_DESC_TYPE_NAMED:
-					acpi_os_printf ("Node %4.4s",
-							descriptor->node.name.ascii);
-					break;
-
-				case ACPI_DESC_TYPE_STATE:
-					acpi_os_printf ("Untyped state_obj");
-					break;
-
-				case ACPI_DESC_TYPE_STATE_UPDATE:
-					acpi_os_printf ("UPDATE state_obj");
-					break;
-
-				case ACPI_DESC_TYPE_STATE_PACKAGE:
-					acpi_os_printf ("PACKAGE state_obj");
-					break;
-
-				case ACPI_DESC_TYPE_STATE_CONTROL:
-					acpi_os_printf ("CONTROL state_obj");
-					break;
-
-				case ACPI_DESC_TYPE_STATE_RPSCOPE:
-					acpi_os_printf ("ROOT-PARSE-SCOPE state_obj");
-					break;
-
-				case ACPI_DESC_TYPE_STATE_PSCOPE:
-					acpi_os_printf ("PARSE-SCOPE state_obj");
-					break;
-
-				case ACPI_DESC_TYPE_STATE_WSCOPE:
-					acpi_os_printf ("WALK-SCOPE state_obj");
-					break;
-
-				case ACPI_DESC_TYPE_STATE_RESULT:
-					acpi_os_printf ("RESULT state_obj");
-					break;
-
-				case ACPI_DESC_TYPE_STATE_NOTIFY:
-					acpi_os_printf ("NOTIFY state_obj");
-					break;
-
-				case ACPI_DESC_TYPE_STATE_THREAD:
-					acpi_os_printf ("THREAD state_obj");
+					acpi_os_printf ("%4.4s",
+							acpi_ut_get_node_name (&descriptor->node));
 					break;
 
 				default:
-					/* All types should appear above */
 					break;
 				}
 
--- diff/drivers/acpi/utilities/utdebug.c	2003-05-21 11:50:14.000000000 +0100
+++ source/drivers/acpi/utilities/utdebug.c	2003-12-29 09:30:40.000000000 +0000
@@ -447,7 +447,7 @@
 
 	acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
 			"%s %8.8X%8.8X\n", acpi_gbl_fn_exit_str,
-			ACPI_HIDWORD (value), ACPI_LODWORD (value));
+			ACPI_FORMAT_UINT64 (value));
 
 	acpi_gbl_nesting_level--;
 }
--- diff/drivers/acpi/utilities/utdelete.c	2003-10-27 09:20:43.000000000 +0000
+++ source/drivers/acpi/utilities/utdelete.c	2003-12-29 09:30:40.000000000 +0000
@@ -140,7 +140,7 @@
 
 		/* Walk the handler list for this device */
 
-		handler_desc = object->device.address_space;
+		handler_desc = object->device.handler;
 		while (handler_desc) {
 			next_desc = handler_desc->address_space.next;
 			acpi_ut_remove_reference (handler_desc);
@@ -193,7 +193,7 @@
 			 * default handlers -- and therefore, we created the context object
 			 * locally, it was not created by an external caller.
 			 */
-			handler_desc = object->region.address_space;
+			handler_desc = object->region.handler;
 			if (handler_desc) {
 				if (handler_desc->address_space.hflags & ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) {
 					obj_pointer = second_desc->extra.region_context;
--- diff/drivers/acpi/utilities/uteval.c	2003-06-09 14:18:18.000000000 +0100
+++ source/drivers/acpi/utilities/uteval.c	2003-12-29 09:30:40.000000000 +0000
@@ -91,7 +91,7 @@
 	if (ACPI_FAILURE (status)) {
 		if (status == AE_NOT_FOUND) {
 			ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s.%s] was not found\n",
-				prefix_node->name.ascii, path));
+				acpi_ut_get_node_name (prefix_node), path));
 		}
 		else {
 			ACPI_REPORT_METHOD_ERROR ("Method execution failed",
@@ -544,7 +544,7 @@
 		if (AE_NOT_FOUND == status) {
 			ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
 				"_STA on %4.4s was not found, assuming device is present\n",
-				device_node->name.ascii));
+				acpi_ut_get_node_name (device_node)));
 
 			*flags = 0x0F;
 			status = AE_OK;
--- diff/drivers/acpi/utilities/utglobal.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/acpi/utilities/utglobal.c	2003-12-29 09:30:40.000000000 +0000
@@ -358,7 +358,7 @@
 	/* ACPI_EVENT_GLOBAL        */  {ACPI_BITREG_GLOBAL_LOCK_STATUS,    ACPI_BITREG_GLOBAL_LOCK_ENABLE,  ACPI_BITMASK_GLOBAL_LOCK_STATUS,    ACPI_BITMASK_GLOBAL_LOCK_ENABLE},
 	/* ACPI_EVENT_POWER_BUTTON  */  {ACPI_BITREG_POWER_BUTTON_STATUS,   ACPI_BITREG_POWER_BUTTON_ENABLE, ACPI_BITMASK_POWER_BUTTON_STATUS,   ACPI_BITMASK_POWER_BUTTON_ENABLE},
 	/* ACPI_EVENT_SLEEP_BUTTON  */  {ACPI_BITREG_SLEEP_BUTTON_STATUS,   ACPI_BITREG_SLEEP_BUTTON_ENABLE, ACPI_BITMASK_SLEEP_BUTTON_STATUS,   ACPI_BITMASK_SLEEP_BUTTON_ENABLE},
-	/* ACPI_EVENT_RTC           */  {ACPI_BITREG_RT_CLOCK_STATUS,       ACPI_BITREG_RT_CLOCK_ENABLE,     0,                                  0},
+	/* ACPI_EVENT_RTC           */  {ACPI_BITREG_RT_CLOCK_STATUS,       ACPI_BITREG_RT_CLOCK_ENABLE,     ACPI_BITMASK_RT_CLOCK_STATUS,       ACPI_BITMASK_RT_CLOCK_ENABLE},
 };
 
 /*****************************************************************************
@@ -534,6 +534,99 @@
 }
 
 
+/*****************************************************************************
+ *
+ * FUNCTION:    acpi_ut_get_node_name
+ *
+ * PARAMETERS:  Object               - A namespace node
+ *
+ * RETURN:      Pointer to a string
+ *
+ * DESCRIPTION: Validate the node and return the node's ACPI name.
+ *
+ ****************************************************************************/
+
+char *
+acpi_ut_get_node_name (
+	void                            *object)
+{
+	struct acpi_namespace_node      *node;
+
+
+	if (!object)
+	{
+		return ("NULL NODE");
+	}
+
+	node = (struct acpi_namespace_node *) object;
+
+	if (node->descriptor != ACPI_DESC_TYPE_NAMED)
+	{
+		return ("****");
+	}
+
+	if (!acpi_ut_valid_acpi_name (* (u32 *) node->name.ascii))
+	{
+		return ("----");
+	}
+
+	return (node->name.ascii);
+}
+
+
+/*****************************************************************************
+ *
+ * FUNCTION:    acpi_ut_get_descriptor_name
+ *
+ * PARAMETERS:  Object               - An ACPI object
+ *
+ * RETURN:      Pointer to a string
+ *
+ * DESCRIPTION: Validate object and return the descriptor type
+ *
+ ****************************************************************************/
+
+static const char                   *acpi_gbl_desc_type_names[] = /* printable names of descriptor types */
+{
+	/* 00 */ "Invalid",
+	/* 01 */ "Cached",
+	/* 02 */ "State-Generic",
+	/* 03 */ "State-Update",
+	/* 04 */ "State-Package",
+	/* 05 */ "State-Control",
+	/* 06 */ "State-root_parse_scope",
+	/* 07 */ "State-parse_scope",
+	/* 08 */ "State-walk_scope",
+	/* 09 */ "State-Result",
+	/* 10 */ "State-Notify",
+	/* 11 */ "State-Thread",
+	/* 12 */ "Walk",
+	/* 13 */ "Parser",
+	/* 14 */ "Operand",
+	/* 15 */ "Node"
+};
+
+
+char *
+acpi_ut_get_descriptor_name (
+	void                            *object)
+{
+
+	if (!object)
+	{
+		return ("NULL OBJECT");
+	}
+
+	if (ACPI_GET_DESCRIPTOR_TYPE (object) > ACPI_DESC_TYPE_MAX)
+	{
+		return ((char *) acpi_gbl_bad_type);
+	}
+
+	return ((char *) acpi_gbl_desc_type_names[ACPI_GET_DESCRIPTOR_TYPE (object)]);
+
+}
+
+
 #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
 /*
  * Strings and procedures used for debug only
--- diff/drivers/acpi/utilities/utobject.c	2003-06-09 14:18:18.000000000 +0100
+++ source/drivers/acpi/utilities/utobject.c	2003-12-29 09:30:40.000000000 +0000
@@ -223,29 +223,10 @@
 
 		return (TRUE);
 
-	case ACPI_DESC_TYPE_NAMED:
-
-		ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
-			"**** Obj %p is a named obj, not ACPI obj\n", object));
-		break;
-
-	case ACPI_DESC_TYPE_PARSER:
-
-		ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
-			"**** Obj %p is a parser obj, not ACPI obj\n", object));
-		break;
-
-	case ACPI_DESC_TYPE_CACHED:
-
-		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
-			"**** Obj %p has already been released to internal cache\n", object));
-		break;
-
 	default:
-
-		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
-			"**** Obj %p has unknown descriptor type %X\n", object,
-			ACPI_GET_DESCRIPTOR_TYPE (object)));
+		ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+				"%p is not not an ACPI operand obj [%s]\n",
+				object, acpi_ut_get_descriptor_name (object)));
 		break;
 	}
 
@@ -322,7 +303,8 @@
 
 	if (ACPI_GET_DESCRIPTOR_TYPE (object) != ACPI_DESC_TYPE_OPERAND) {
 		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
-			"Obj %p is not an ACPI object\n", object));
+				"%p is not an ACPI Operand object [%s]\n", object,
+				acpi_ut_get_descriptor_name (object)));
 		return_VOID;
 	}
 
--- diff/drivers/base/firmware_class.c	2003-08-26 10:00:52.000000000 +0100
+++ source/drivers/base/firmware_class.c	2003-12-29 09:30:40.000000000 +0000
@@ -415,18 +415,22 @@
 	void (*cont)(const struct firmware *fw, void *context);
 };
 
-static void
+static int
 request_firmware_work_func(void *arg)
 {
 	struct firmware_work *fw_work = arg;
 	const struct firmware *fw;
-	if (!arg)
-		return;
+	if (!arg) {
+		WARN_ON(1);
+		return 0;
+	}
+	daemonize("%s/%s", "firmware", fw_work->name);
 	request_firmware(&fw, fw_work->name, fw_work->device);
 	fw_work->cont(fw, fw_work->context);
 	release_firmware(fw);
 	module_put(fw_work->module);
 	kfree(fw_work);
+	return 0;
 }
 
 /**
@@ -451,6 +455,8 @@
 {
 	struct firmware_work *fw_work = kmalloc(sizeof (struct firmware_work),
 						GFP_ATOMIC);
+	int ret;
+
 	if (!fw_work)
 		return -ENOMEM;
 	if (!try_module_get(module)) {
@@ -465,9 +471,14 @@
 		.context = context,
 		.cont = cont,
 	};
-	INIT_WORK(&fw_work->work, request_firmware_work_func, fw_work);
 
-	schedule_work(&fw_work->work);
+	ret = kernel_thread(request_firmware_work_func, fw_work,
+			    CLONE_FS | CLONE_FILES);
+	
+	if (ret < 0) {
+		fw_work->cont(NULL, fw_work->context);
+		return ret;
+	}
 	return 0;
 }
 
--- diff/drivers/base/node.c	2003-08-26 10:00:52.000000000 +0100
+++ source/drivers/base/node.c	2003-12-29 09:30:40.000000000 +0000
@@ -18,18 +18,16 @@
 static ssize_t node_read_cpumap(struct sys_device * dev, char * buf)
 {
 	struct node *node_dev = to_node(dev);
-	cpumask_t tmp = node_dev->cpumap;
-	int k, len = 0;
+	cpumask_t mask = node_dev->cpumap;
+	int len;
 
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(buf, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		buf += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-        len += sprintf(buf, "\n");
+	/* FIXME - someone should pass us a buffer size (count) or
+	 * use seq_file or something to avoid buffer overrun risk. */
+	len = cpumask_snprintf(buf, 99 /* XXX FIXME */, mask);
+	len += sprintf(buf + len, "\n");
 	return len;
 }
+
 static SYSDEV_ATTR(cpumap,S_IRUGO,node_read_cpumap,NULL);
 
 #define K(x) ((x) << (PAGE_SHIFT - 10))
--- diff/drivers/base/platform.c	2003-09-30 15:46:12.000000000 +0100
+++ source/drivers/base/platform.c	2003-12-29 09:30:40.000000000 +0000
@@ -14,8 +14,8 @@
 #include <linux/module.h>
 #include <linux/init.h>
 
-struct device legacy_bus = {
-	.bus_id		= "legacy",
+struct device platform_bus = {
+	.bus_id		= "platform",
 };
 
 /**
@@ -29,7 +29,7 @@
 		return -EINVAL;
 
 	if (!pdev->dev.parent)
-		pdev->dev.parent = &legacy_bus;
+		pdev->dev.parent = &platform_bus;
 
 	pdev->dev.bus = &platform_bus_type;
 	
@@ -105,11 +105,11 @@
 
 int __init platform_bus_init(void)
 {
-	device_register(&legacy_bus);
+	device_register(&platform_bus);
 	return bus_register(&platform_bus_type);
 }
 
-EXPORT_SYMBOL(legacy_bus);
+EXPORT_SYMBOL(platform_bus);
 EXPORT_SYMBOL(platform_bus_type);
 EXPORT_SYMBOL(platform_device_register);
 EXPORT_SYMBOL(platform_device_unregister);
--- diff/drivers/block/DAC960.c	2003-09-30 15:46:12.000000000 +0100
+++ source/drivers/block/DAC960.c	2003-12-29 09:30:40.000000000 +0000
@@ -67,9 +67,9 @@
 	}
 }
 
-static int DAC960_open(struct inode *inode, struct file *file)
+static int DAC960_open(struct block_device *bdev, struct file *file)
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
+	struct gendisk *disk = bdev->bd_disk;
 	DAC960_Controller_T *p = disk->queue->queuedata;
 	int drive_nr = (long)disk->private_data;
 
@@ -84,17 +84,17 @@
 			return -ENXIO;
 	}
 
-	check_disk_change(inode->i_bdev);
+	check_disk_change(bdev);
 
 	if (!get_capacity(p->disks[drive_nr]))
 		return -ENXIO;
 	return 0;
 }
 
-static int DAC960_ioctl(struct inode *inode, struct file *file,
+static int DAC960_ioctl(struct block_device *bdev, struct file *file,
 			unsigned int cmd, unsigned long arg)
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
+	struct gendisk *disk = bdev->bd_disk;
 	DAC960_Controller_T *p = disk->queue->queuedata;
 	int drive_nr = (long)disk->private_data;
 	struct hd_geometry g, *loc = (struct hd_geometry *)arg;
@@ -128,7 +128,7 @@
 		g.cylinders = i->ConfigurableDeviceSize / (g.heads * g.sectors);
 	}
 	
-	g.start = get_start_sect(inode->i_bdev);
+	g.start = get_start_sect(bdev);
 
 	return copy_to_user(loc, &g, sizeof g) ? -EFAULT : 0; 
 }
@@ -2474,7 +2474,6 @@
 static boolean DAC960_RegisterBlockDevice(DAC960_Controller_T *Controller)
 {
   int MajorNumber = DAC960_MAJOR + Controller->ControllerNumber;
-  struct request_queue *RequestQueue;
   int n;
 
   /*
@@ -2483,26 +2482,22 @@
   if (register_blkdev(MajorNumber, "dac960") < 0)
       return false;
 
-  /*
-    Initialize the I/O Request Queue.
-  */
-  RequestQueue = blk_init_queue(DAC960_RequestFunction,&Controller->queue_lock);
-  if (!RequestQueue) {
-      unregister_blkdev(MajorNumber, "dac960");
-      return false;
-  }
-  Controller->RequestQueue = RequestQueue;
-  blk_queue_bounce_limit(RequestQueue, Controller->BounceBufferLimit);
-  RequestQueue->queuedata = Controller;
-  blk_queue_max_hw_segments(RequestQueue,
-			    Controller->DriverScatterGatherLimit);
-  blk_queue_max_phys_segments(RequestQueue,
-		 	    Controller->DriverScatterGatherLimit);
-  blk_queue_max_sectors(RequestQueue, Controller->MaxBlocksPerCommand);
-
   for (n = 0; n < DAC960_MaxLogicalDrives; n++) {
 	struct gendisk *disk = Controller->disks[n];
+  	struct request_queue *RequestQueue;
 
+	/* for now, let all request queues share controller's lock */
+  	RequestQueue = blk_init_queue(DAC960_RequestFunction,&Controller->queue_lock);
+  	if (!RequestQueue) {
+		printk("DAC960: failure to allocate request queue\n");
+		continue;
+  	}
+  	Controller->RequestQueue[n] = RequestQueue;
+  	blk_queue_bounce_limit(RequestQueue, Controller->BounceBufferLimit);
+  	RequestQueue->queuedata = Controller;
+  	blk_queue_max_hw_segments(RequestQueue, Controller->DriverScatterGatherLimit);
+	blk_queue_max_phys_segments(RequestQueue, Controller->DriverScatterGatherLimit);
+	blk_queue_max_sectors(RequestQueue, Controller->MaxBlocksPerCommand);
 	disk->queue = RequestQueue;
 	sprintf(disk->disk_name, "rd/c%dd%d", Controller->ControllerNumber, n);
 	sprintf(disk->devfs_name, "rd/host%d/target%d", Controller->ControllerNumber, n);
@@ -2527,17 +2522,17 @@
   int MajorNumber = DAC960_MAJOR + Controller->ControllerNumber;
   int disk;
 
-  for (disk = 0; disk < DAC960_MaxLogicalDrives; disk++)
-	  del_gendisk(Controller->disks[disk]);
+  /* does order matter when deleting gendisk and cleanup in request queue? */
+  for (disk = 0; disk < DAC960_MaxLogicalDrives; disk++) {
+	del_gendisk(Controller->disks[disk]);
+	blk_cleanup_queue(Controller->RequestQueue[disk]);
+	Controller->RequestQueue[disk] = NULL;
+  }
 
   /*
     Unregister the Block Device Major Number for this DAC960 Controller.
   */
   unregister_blkdev(MajorNumber, "dac960");
-  /*
-    Remove the I/O Request Queue.
-  */
-  blk_cleanup_queue(Controller->RequestQueue);
 }
 
 /*
@@ -3253,58 +3248,83 @@
 }
 
 
+static int DAC960_process_queue(DAC960_Controller_T *Controller, struct request_queue *req_q)
+{
+	struct request *Request;
+	DAC960_Command_T *Command;
+
+   while(1) {
+	Request = elv_next_request(req_q);
+	if (!Request)
+		return 1;
+
+	Command = DAC960_AllocateCommand(Controller);
+	if (Command == NULL)
+		return 0;
+
+	if (rq_data_dir(Request) == READ) {
+		Command->DmaDirection = PCI_DMA_FROMDEVICE;
+		Command->CommandType = DAC960_ReadCommand;
+	} else {
+		Command->DmaDirection = PCI_DMA_TODEVICE;
+		Command->CommandType = DAC960_WriteCommand;
+	}
+	Command->Completion = Request->waiting;
+	Command->LogicalDriveNumber = (long)Request->rq_disk->private_data;
+	Command->BlockNumber = Request->sector;
+	Command->BlockCount = Request->nr_sectors;
+	Command->Request = Request;
+	blkdev_dequeue_request(Request);
+	Command->SegmentCount = blk_rq_map_sg(req_q,
+		  Command->Request, Command->cmd_sglist);
+	/* pci_map_sg MAY change the value of SegCount */
+	Command->SegmentCount = pci_map_sg(Controller->PCIDevice, Command->cmd_sglist,
+		 Command->SegmentCount, Command->DmaDirection);
+
+	DAC960_QueueReadWriteCommand(Command);
+  }
+}
+
 /*
   DAC960_ProcessRequest attempts to remove one I/O Request from Controller's
   I/O Request Queue and queues it to the Controller.  WaitForCommand is true if
   this function should wait for a Command to become available if necessary.
   This function returns true if an I/O Request was queued and false otherwise.
 */
-
-static boolean DAC960_ProcessRequest(DAC960_Controller_T *Controller,
-				     boolean WaitForCommand)
+static void DAC960_ProcessRequest(DAC960_Controller_T *controller)
 {
-  struct request_queue *RequestQueue = Controller->RequestQueue;
-  struct request *Request;
-  DAC960_Command_T *Command;
+	int i;
 
-  if (!Controller->ControllerInitialized)
-     return false;
+	if (!controller->ControllerInitialized)
+		return;
 
-  while (true) {
-      Request = elv_next_request(RequestQueue);
-      if (!Request)
-	      return false;
+	/* Do this better later! */
+	for (i = controller->req_q_index; i < DAC960_MaxLogicalDrives; i++) {
+		struct request_queue *req_q = controller->RequestQueue[i];
 
-      Command = DAC960_AllocateCommand(Controller);
-      if (Command != NULL)
-          break;
+		if (req_q == NULL)
+			continue;
 
-      if (!WaitForCommand)
-          return false;
+		if (!DAC960_process_queue(controller, req_q)) {
+			controller->req_q_index = i;
+			return;
+		}
+	}
 
-      DAC960_WaitForCommand(Controller);
-  }
-  if (rq_data_dir(Request) == READ) {
-    Command->DmaDirection = PCI_DMA_FROMDEVICE;
-    Command->CommandType = DAC960_ReadCommand;
-  } else {
-    Command->DmaDirection = PCI_DMA_TODEVICE;
-    Command->CommandType = DAC960_WriteCommand;
-  }
-  Command->Completion = Request->waiting;
-  Command->LogicalDriveNumber = (long)Request->rq_disk->private_data;
-  Command->BlockNumber = Request->sector;
-  Command->BlockCount = Request->nr_sectors;
-  Command->Request = Request;
-  blkdev_dequeue_request(Request);
-  Command->SegmentCount = blk_rq_map_sg(Controller->RequestQueue,
-		  Command->Request, Command->cmd_sglist);
-  /* pci_map_sg MAY change the value of SegCount */
-  Command->SegmentCount = pci_map_sg(Controller->PCIDevice, Command->cmd_sglist,
-		 Command->SegmentCount, Command->DmaDirection);
+	if (controller->req_q_index == 0)
+		return;
 
-  DAC960_QueueReadWriteCommand(Command);
-  return true;
+	for (i = 0; i < controller->req_q_index; i++) {
+		struct request_queue *req_q = controller->RequestQueue[i];
+
+		if (req_q == NULL)
+			continue;
+
+		if (!DAC960_process_queue(controller, req_q)) {
+			controller->req_q_index = i;
+			return;
+		}
+	}
 }
 
 
@@ -3321,6 +3341,7 @@
 {
   DAC960_Controller_T *Controller = Command->Controller;
   struct request *Request = Command->Request;
+  struct request_queue *req_q = Controller->RequestQueue[Command->LogicalDriveNumber];
 
   if (Command->DmaDirection == PCI_DMA_FROMDEVICE)
     Command->CommandType = DAC960_ReadRetryCommand;
@@ -3333,11 +3354,9 @@
    * code should almost never be called, just go with a
    * simple coding.
    */
-  (void)blk_rq_map_sg(Controller->RequestQueue, Command->Request,
-                                        Command->cmd_sglist);
+  (void)blk_rq_map_sg(req_q, Command->Request, Command->cmd_sglist);
 
-  (void)pci_map_sg(Controller->PCIDevice, Command->cmd_sglist, 1,
-		                        Command->DmaDirection);
+  (void)pci_map_sg(Controller->PCIDevice, Command->cmd_sglist, 1, Command->DmaDirection);
   /*
    * Resubmitting the request sector at a time is really tedious.
    * But, this should almost never happen.  So, we're willing to pay
@@ -3357,9 +3376,7 @@
 
 static void DAC960_RequestFunction(struct request_queue *RequestQueue)
 {
-	int i = 0;
-	while (DAC960_ProcessRequest(RequestQueue->queuedata, (i++ == 0)))
-		;
+	DAC960_ProcessRequest(RequestQueue->queuedata);
 }
 
 /*
@@ -5205,8 +5222,7 @@
     Attempt to remove additional I/O Requests from the Controller's
     I/O Request Queue and queue them to the Controller.
   */
-  while (DAC960_ProcessRequest(Controller, false))
-	  ;
+  DAC960_ProcessRequest(Controller);
   spin_unlock_irqrestore(&Controller->queue_lock, flags);
   return IRQ_HANDLED;
 }
@@ -5249,8 +5265,7 @@
     Attempt to remove additional I/O Requests from the Controller's
     I/O Request Queue and queue them to the Controller.
   */
-  while (DAC960_ProcessRequest(Controller, false))
-	  ;
+  DAC960_ProcessRequest(Controller);
   spin_unlock_irqrestore(&Controller->queue_lock, flags);
   return IRQ_HANDLED;
 }
@@ -5289,8 +5304,7 @@
     Attempt to remove additional I/O Requests from the Controller's
     I/O Request Queue and queue them to the Controller.
   */
-  while (DAC960_ProcessRequest(Controller, false))
-	  ;
+  DAC960_ProcessRequest(Controller);
   spin_unlock_irqrestore(&Controller->queue_lock, flags);
   return IRQ_HANDLED;
 }
@@ -5329,8 +5343,7 @@
     Attempt to remove additional I/O Requests from the Controller's
     I/O Request Queue and queue them to the Controller.
   */
-  while (DAC960_ProcessRequest(Controller, false))
-	  ;
+  DAC960_ProcessRequest(Controller);
   spin_unlock_irqrestore(&Controller->queue_lock, flags);
   return IRQ_HANDLED;
 }
@@ -5365,8 +5378,7 @@
     Attempt to remove additional I/O Requests from the Controller's
     I/O Request Queue and queue them to the Controller.
   */
-  while (DAC960_ProcessRequest(Controller, false))
-	  ;
+  DAC960_ProcessRequest(Controller);
   spin_unlock_irqrestore(&Controller->queue_lock, flags);
   return IRQ_HANDLED;
 }
@@ -5440,8 +5452,7 @@
     Attempt to remove additional I/O Requests from the Controller's
     I/O Request Queue and queue them to the Controller.
   */
-  while (DAC960_ProcessRequest(Controller, false))
-	  ;
+  DAC960_ProcessRequest(Controller);
   spin_unlock_irqrestore(&Controller->queue_lock, flags);
   return IRQ_HANDLED;
 }
--- diff/drivers/block/DAC960.h	2003-09-30 15:46:12.000000000 +0100
+++ source/drivers/block/DAC960.h	2003-12-29 09:30:40.000000000 +0000
@@ -2333,7 +2333,8 @@
   DAC960_Command_T *FreeCommands;
   unsigned char *CombinedStatusBuffer;
   unsigned char *CurrentStatusBuffer;
-  struct request_queue *RequestQueue;
+  struct request_queue *RequestQueue[DAC960_MaxLogicalDrives];
+  int req_q_index;
   spinlock_t queue_lock;
   wait_queue_head_t CommandWaitQueue;
   wait_queue_head_t HealthStatusWaitQueue;
--- diff/drivers/block/Kconfig.iosched	2003-10-09 09:47:16.000000000 +0100
+++ source/drivers/block/Kconfig.iosched	2003-12-29 09:30:40.000000000 +0000
@@ -27,3 +27,10 @@
 	  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	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/block/Makefile	2003-12-29 09:30:40.000000000 +0000
@@ -18,6 +18,7 @@
 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/acsi.c	2003-10-09 09:47:33.000000000 +0100
+++ source/drivers/block/acsi.c	2003-12-29 09:30:40.000000000 +0000
@@ -359,10 +359,9 @@
 static void do_end_requests( void );
 static void do_acsi_request( request_queue_t * );
 static void redo_acsi_request( void );
-static int acsi_ioctl( struct inode *inode, struct file *file, unsigned int
+static int acsi_ioctl(struct block_device *bdev, struct file *file, unsigned int
                        cmd, unsigned long arg );
-static int acsi_open( struct inode * inode, struct file * filp );
-static int acsi_release( struct inode * inode, struct file * file );
+static int acsi_open(struct block_device *bdev, struct file *filp);
 static void acsi_prevent_removal(struct acsi_info_struct *aip, int flag );
 static int acsi_change_blk_size( int target, int lun);
 static int acsi_mode_sense( int target, int lun, SENSE_DATA *sd );
@@ -1081,10 +1080,10 @@
  ***********************************************************************/
 
 
-static int acsi_ioctl( struct inode *inode, struct file *file,
-					   unsigned int cmd, unsigned long arg )
+static int acsi_ioctl(struct block_device *bdev, struct file *file,
+		      unsigned int cmd, unsigned long arg )
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
+	struct gendisk *disk = bdev->bd_disk;
 	struct acsi_info_struct *aip = disk->private_data;
 	switch (cmd) {
 	  case HDIO_GETGEO:
@@ -1096,7 +1095,7 @@
 	    put_user( 64, &geo->heads );
 	    put_user( 32, &geo->sectors );
 	    put_user( aip->size >> 11, &geo->cylinders );
-		put_user(get_start_sect(inode->i_bdev), &geo->start);
+		put_user(get_start_sect(bdev), &geo->start);
 		return 0;
 	  }
 	  case SCSI_IOCTL_GET_IDLUN:
@@ -1126,16 +1125,16 @@
  *
  */
 
-static int acsi_open( struct inode * inode, struct file * filp )
+static int acsi_open(struct block_device *bdev, struct file *filp)
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
+	struct gendisk *disk = bdev->bd_disk;
 	struct acsi_info_struct *aip = disk->private_data;
 
 	if (aip->access_count == 0 && aip->removable) {
 #if 0
 		aip->changed = 1;	/* safety first */
 #endif
-		check_disk_change( inode->i_bdev );
+		check_disk_change(bdev);
 		if (aip->changed)	/* revalidate was not successful (no medium) */
 			return -ENXIO;
 		acsi_prevent_removal(aip, 1);
@@ -1143,10 +1142,11 @@
 	aip->access_count++;
 
 	if (filp && filp->f_mode) {
-		check_disk_change( inode->i_bdev );
+		check_disk_change(bdev);
 		if (filp->f_mode & 2) {
 			if (aip->read_only) {
-				acsi_release( inode, filp );
+				if (--aip->access_count == 0 && aip->removable)
+					acsi_prevent_removal(aip, 0);
 				return -EROFS;
 			}
 		}
@@ -1160,9 +1160,8 @@
  * be forgotten about...
  */
 
-static int acsi_release( struct inode * inode, struct file * file )
+static int acsi_release(struct gendisk *disk)
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
 	struct acsi_info_struct *aip = disk->private_data;
 	if (--aip->access_count == 0 && aip->removable)
 		acsi_prevent_removal(aip, 0);
@@ -1328,8 +1327,6 @@
  ********************************************************************/
 
 
-extern struct block_device_operations acsi_fops;
-
 static struct gendisk *acsi_gendisk[MAX_DEV];
 
 #define MAX_SCSI_DEVICE_CODE 10
--- diff/drivers/block/amiflop.c	2003-09-17 12:28:04.000000000 +0100
+++ source/drivers/block/amiflop.c	2003-12-29 09:30:40.000000000 +0000
@@ -1434,10 +1434,11 @@
 	redo_fd_request();
 }
 
-static int fd_ioctl(struct inode *inode, struct file *filp,
+static int fd_ioctl(struct block_device *bdev, struct file *filp,
 		    unsigned int cmd, unsigned long param)
 {
-	int drive = iminor(inode) & 3;
+	struct amiga_floppy_struct *floppy = bdev->bd_disk->private_data;
+	int drive = floppy - unit;
 	static struct floppy_struct getprm;
 
 	switch(cmd){
@@ -1459,7 +1460,7 @@
 			rel_fdc();
 			return -EBUSY;
 		}
-		fsync_bdev(inode->i_bdev);
+		fsync_bdev(bdev);
 		if (fd_motor_on(drive) == 0) {
 			rel_fdc();
 			return -ENODEV;
@@ -1488,7 +1489,7 @@
 		break;
 	case FDFMTEND:
 		floppy_off(drive);
-		invalidate_bdev(inode->i_bdev, 0);
+		invalidate_bdev(bdev, 0);
 		break;
 	case FDGETPRM:
 		memset((void *)&getprm, 0, sizeof (getprm));
@@ -1559,10 +1560,11 @@
  * /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 block_device *bdev, struct file *filp)
 {
-	int drive = iminor(inode) & 3;
-	int system =  (iminor(inode) & 4) >> 2;
+	struct amiga_floppy_struct *p = bdev->bd_disk->private_data;
+	int drive = p - unit;
+	int system =  (MINOR(bdev->bd_dev) & 4) >> 2;
 	int old_dev;
 	unsigned long flags;
 
@@ -1572,7 +1574,7 @@
 		return -EBUSY;
 
 	if (filp && filp->f_mode & 3) {
-		check_disk_change(inode->i_bdev);
+		check_disk_change(bdev);
 		if (filp->f_mode & 2 ) {
 			int wrprot;
 
@@ -1607,9 +1609,10 @@
 	return 0;
 }
 
-static int floppy_release(struct inode * inode, struct file * filp)
+static int floppy_release(struct gendisk *disk)
 {
-	int drive = iminor(inode) & 3;
+	struct amiga_floppy_struct *p = disk->private_data;
+	int drive = p - unit;
 
 	if (unit[drive].dirty == 1) {
 		del_timer (flush_track_timer + drive);
--- diff/drivers/block/as-iosched.c	2003-11-25 15:24:57.000000000 +0000
+++ source/drivers/block/as-iosched.c	2003-12-29 09:30:40.000000000 +0000
@@ -70,6 +70,7 @@
 /* Bits in as_io_context.state */
 enum as_io_states {
 	AS_TASK_RUNNING=0,	/* Process has not exitted */
+	AS_TASK_IOSTARTED,	/* Process has started some IO */
 	AS_TASK_IORUNNING,	/* Process has completed some IO */
 };
 
@@ -99,7 +100,14 @@
 	sector_t last_sector[2];	/* last REQ_SYNC & REQ_ASYNC sectors */
 	struct list_head *dispatch;	/* driver dispatch queue */
 	struct list_head *hash;		/* request hash */
-	unsigned long new_success; /* anticipation success on new proc */
+
+	unsigned long exit_prob;	/* probability a task will exit while
+					   being waited on */
+	unsigned long new_ttime_total; 	/* mean thinktime on new proc */
+	unsigned long new_ttime_mean;
+	u64 new_seek_total;		/* mean seek on new proc */
+	sector_t new_seek_mean;
+
 	unsigned long current_batch_expires;
 	unsigned long last_check_fifo[2];
 	int changed_batch;		/* 1: waiting for old batch to end */
@@ -137,6 +145,10 @@
 				   scheduler */
 	AS_RQ_DISPATCHED,	/* On the dispatch list. It belongs to the
 				   driver now */
+	AS_RQ_PRESCHED,		/* Debug poisoning for requests being used */
+	AS_RQ_REMOVED,
+	AS_RQ_MERGED,
+	AS_RQ_POSTSCHED,	/* when they shouldn't be */
 };
 
 struct as_rq {
@@ -183,6 +195,7 @@
 /* Called when the task exits */
 static void exit_as_io_context(struct as_io_context *aic)
 {
+	WARN_ON(!test_bit(AS_TASK_RUNNING, &aic->state));
 	clear_bit(AS_TASK_RUNNING, &aic->state);
 }
 
@@ -585,18 +598,11 @@
 	int status = ad->antic_status;
 
 	if (status == ANTIC_WAIT_REQ || status == ANTIC_WAIT_NEXT) {
-		struct as_io_context *aic;
-
 		if (status == ANTIC_WAIT_NEXT)
 			del_timer(&ad->antic_timer);
 		ad->antic_status = ANTIC_FINISHED;
 		/* see as_work_handler */
 		kblockd_schedule_work(&ad->antic_work);
-
-		aic = ad->io_context->aic;
-		if (aic->seek_samples == 0)
-			/* new process */
-			ad->new_success = (ad->new_success * 3) / 4 + 256;
 	}
 }
 
@@ -612,14 +618,15 @@
 	spin_lock_irqsave(q->queue_lock, flags);
 	if (ad->antic_status == ANTIC_WAIT_REQ
 			|| ad->antic_status == ANTIC_WAIT_NEXT) {
-		struct as_io_context *aic;
+		struct as_io_context *aic = ad->io_context->aic;
+
 		ad->antic_status = ANTIC_FINISHED;
 		kblockd_schedule_work(&ad->antic_work);
 
-		aic = ad->io_context->aic;
-		if (aic->seek_samples == 0)
-			/* new process */
-			ad->new_success = (ad->new_success * 3) / 4;
+		if (aic->ttime_samples == 0) {
+			/* process anticipated on has exitted or timed out*/
+			ad->exit_prob = (7*ad->exit_prob + 256)/8;
+		}
 	}
 	spin_unlock_irqrestore(q->queue_lock, flags);
 }
@@ -633,7 +640,7 @@
 	unsigned long delay;	/* milliseconds */
 	sector_t last = ad->last_sector[ad->batch_data_dir];
 	sector_t next = arq->request->sector;
-	sector_t delta;	/* acceptable close offset (in sectors) */
+	sector_t delta; /* acceptable close offset (in sectors) */
 
 	if (ad->antic_status == ANTIC_OFF || !ad->ioc_finished)
 		delay = 0;
@@ -650,6 +657,7 @@
 	return (last - (delta>>1) <= next) && (next <= last + delta);
 }
 
+static void as_update_thinktime(struct as_data *ad, struct as_io_context *aic, unsigned long ttime);
 /*
  * as_can_break_anticipation returns true if we have been anticipating this
  * request.
@@ -667,9 +675,27 @@
 {
 	struct io_context *ioc;
 	struct as_io_context *aic;
+	sector_t s;
+
+	ioc = ad->io_context;
+	BUG_ON(!ioc);
+
+	if (arq && ioc == arq->io_context) {
+		/* request from same process */
+		return 1;
+	}
 
 	if (arq && arq->is_sync == REQ_SYNC && as_close_req(ad, arq)) {
 		/* close request */
+		struct as_io_context *aic = ioc->aic;
+		if (aic) {
+			unsigned long thinktime;
+			spin_lock(&aic->lock);
+			thinktime = jiffies - aic->last_end_request;
+			aic->last_end_request = jiffies;
+			as_update_thinktime(ad, aic, thinktime);
+			spin_unlock(&aic->lock);
+		}
 		return 1;
 	}
 
@@ -681,20 +707,14 @@
 		return 1;
 	}
 
-	ioc = ad->io_context;
-	BUG_ON(!ioc);
-
-	if (arq && ioc == arq->io_context) {
-		/* request from same process */
-		return 1;
-	}
-
 	aic = ioc->aic;
 	if (!aic)
 		return 0;
 
 	if (!test_bit(AS_TASK_RUNNING, &aic->state)) {
 		/* process anticipated on has exitted */
+		if (aic->ttime_samples == 0)
+			ad->exit_prob = (7*ad->exit_prob + 256)/8;
 		return 1;
 	}
 
@@ -708,28 +728,36 @@
 		return 1;
 	}
 
-	if (ad->new_success < 256 &&
-			(aic->seek_samples == 0 || aic->ttime_samples == 0)) {
-		/*
-		 * Process has just started IO and we have a bad history of
-		 * success anticipating on new processes!
-		 */
-		return 1;
-	}
-
-	if (aic->ttime_mean > ad->antic_expire) {
+	if (aic->ttime_samples == 0) {
+		if (ad->new_ttime_mean > ad->antic_expire)
+			return 1;
+		if (ad->exit_prob > 128)
+			return 1;
+	} else if (aic->ttime_mean > ad->antic_expire) {
 		/* the process thinks too much between requests */
 		return 1;
 	}
 
-	if (arq && aic->seek_samples) {
-		sector_t s;
-		if (ad->last_sector[REQ_SYNC] < arq->request->sector)
-			s = arq->request->sector - ad->last_sector[REQ_SYNC];
-		else
-			s = ad->last_sector[REQ_SYNC] - arq->request->sector;
+	if (!arq)
+		return 0;
+
+	if (ad->last_sector[REQ_SYNC] < arq->request->sector)
+		s = arq->request->sector - ad->last_sector[REQ_SYNC];
+	else
+		s = ad->last_sector[REQ_SYNC] - arq->request->sector;
+
+	if (aic->seek_samples == 0) {
+		/*
+		 * Process has just started IO. Use past statistics to
+		 * guage success possibility
+		 */
+		if (ad->new_seek_mean/2 > s) {
+			/* this request is better than what we're expecting */
+			return 1;
+		}
 
-		if (aic->seek_mean > (s>>1)) {
+	} else {
+		if (aic->seek_mean/2 > s) {
 			/* this request is better than what we're expecting */
 			return 1;
 		}
@@ -774,12 +802,51 @@
 	return 1;
 }
 
+static void as_update_thinktime(struct as_data *ad, struct as_io_context *aic, unsigned long ttime)
+{
+	/* fixed point: 1.0 == 1<<8 */
+	if (aic->ttime_samples == 0) {
+		ad->new_ttime_total = (7*ad->new_ttime_total + 256*ttime) / 8;
+		ad->new_ttime_mean = ad->new_ttime_total / 256;
+
+		ad->exit_prob = (7*ad->exit_prob)/8;
+	}
+	aic->ttime_samples = (7*aic->ttime_samples + 256) / 8;
+	aic->ttime_total = (7*aic->ttime_total + 256*ttime) / 8;
+	aic->ttime_mean = (aic->ttime_total + 128) / aic->ttime_samples;
+}
+
+static void as_update_seekdist(struct as_data *ad, struct as_io_context *aic, sector_t sdist)
+{
+	u64 total;
+
+	if (aic->seek_samples == 0) {
+		ad->new_seek_total = (7*ad->new_seek_total + 256*(u64)sdist)/8;
+		ad->new_seek_mean = ad->new_seek_total / 256;
+	}
+
+	/*
+	 * Don't allow the seek distance to get too large from the
+	 * odd fragment, pagein, etc
+	 */
+	if (aic->seek_samples <= 60) /* second&third seek */
+		sdist = min(sdist, (aic->seek_mean * 4) + 2*1024*1024);
+	else
+		sdist = min(sdist, (aic->seek_mean * 4)	+ 2*1024*64);
+
+	aic->seek_samples = (7*aic->seek_samples + 256) / 8;
+	aic->seek_total = (7*aic->seek_total + (u64)256*sdist) / 8;
+	total = aic->seek_total + (aic->seek_samples/2);
+	do_div(total, aic->seek_samples);
+	aic->seek_mean = (sector_t)total;
+}
+
 /*
  * as_update_iohist keeps a decaying histogram of IO thinktimes, and
  * updates @aic->ttime_mean based on that. It is called when a new
  * request is queued.
  */
-static void as_update_iohist(struct as_io_context *aic, struct request *rq)
+static void as_update_iohist(struct as_data *ad, struct as_io_context *aic, struct request *rq)
 {
 	struct as_rq *arq = RQ_DATA(rq);
 	int data_dir = arq->is_sync;
@@ -790,60 +857,29 @@
 		return;
 
 	if (data_dir == REQ_SYNC) {
+		unsigned long in_flight = atomic_read(&aic->nr_queued)
+					+ atomic_read(&aic->nr_dispatched);
 		spin_lock(&aic->lock);
-
-		if (test_bit(AS_TASK_IORUNNING, &aic->state)
-				&& !atomic_read(&aic->nr_queued)
-				&& !atomic_read(&aic->nr_dispatched)) {
+		if (test_bit(AS_TASK_IORUNNING, &aic->state) ||
+			test_bit(AS_TASK_IOSTARTED, &aic->state)) {
 			/* Calculate read -> read thinktime */
-			thinktime = jiffies - aic->last_end_request;
-			thinktime = min(thinktime, MAX_THINKTIME-1);
-			/* fixed point: 1.0 == 1<<8 */
-			aic->ttime_samples += 256;
-			aic->ttime_total += 256*thinktime;
-			if (aic->ttime_samples)
-				/* fixed point factor is cancelled here */
-				aic->ttime_mean = (aic->ttime_total + 128)
-							/ aic->ttime_samples;
-			aic->ttime_samples = (aic->ttime_samples>>1)
-						+ (aic->ttime_samples>>2);
-			aic->ttime_total = (aic->ttime_total>>1)
-						+ (aic->ttime_total>>2);
-		}
-
-		/* Calculate read -> read seek distance */
-		if (!aic->seek_samples)
-			seek_dist = 0;
-		else if (aic->last_request_pos < rq->sector)
-			seek_dist = rq->sector - aic->last_request_pos;
-		else
-			seek_dist = aic->last_request_pos - rq->sector;
-
+			if (test_bit(AS_TASK_IORUNNING, &aic->state)
+							&& in_flight == 0) {
+				thinktime = jiffies - aic->last_end_request;
+				thinktime = min(thinktime, MAX_THINKTIME-1);
+			} else
+				thinktime = 0;
+			as_update_thinktime(ad, aic, thinktime);
+
+			/* Calculate read -> read seek distance */
+			if (aic->last_request_pos < rq->sector)
+				seek_dist = rq->sector - aic->last_request_pos;
+			else
+				seek_dist = aic->last_request_pos - rq->sector;
+			as_update_seekdist(ad, aic, seek_dist);
+		}
 		aic->last_request_pos = rq->sector + rq->nr_sectors;
-
-		/*
-		 * Don't allow the seek distance to get too large from the
-		 * odd fragment, pagein, etc
-		 */
-		if (aic->seek_samples < 400) /* second&third seek */
-			seek_dist = min(seek_dist, (aic->seek_mean * 4)
-							+ 2*1024*1024);
-		else
-			seek_dist = min(seek_dist, (aic->seek_mean * 4)
-							+ 2*1024*64);
-
-		aic->seek_samples += 256;
-		aic->seek_total += (u64)256*seek_dist;
-		if (aic->seek_samples) {
-			u64 total = aic->seek_total + (aic->seek_samples>>1);
-			do_div(total, aic->seek_samples);
-			aic->seek_mean = (sector_t)total;
-		}
-		aic->seek_samples = (aic->seek_samples>>1)
-					+ (aic->seek_samples>>2);
-		aic->seek_total = (aic->seek_total>>1)
-					+ (aic->seek_total>>2);
-
+		set_bit(AS_TASK_IOSTARTED, &aic->state);
 		spin_unlock(&aic->lock);
 	}
 }
@@ -908,15 +944,25 @@
 {
 	struct as_data *ad = q->elevator.elevator_data;
 	struct as_rq *arq = RQ_DATA(rq);
-	struct as_io_context *aic;
 
 	WARN_ON(!list_empty(&rq->queuelist));
 
-	if (unlikely(arq->state != AS_RQ_DISPATCHED))
-		return;
+	if (arq->state == AS_RQ_PRESCHED) {
+		WARN_ON(arq->io_context);
+		goto out;
+	}
+
+	if (arq->state == AS_RQ_MERGED)
+		goto out_ioc;
+
+	if (arq->state != AS_RQ_REMOVED) {
+		printk("arq->state %d\n", arq->state);
+		WARN_ON(1);
+		goto out;
+	}
 
 	if (!blk_fs_request(rq))
-		return;
+		goto out;
 
 	if (ad->changed_batch && ad->nr_dispatched == 1) {
 		kblockd_schedule_work(&ad->antic_work);
@@ -940,10 +986,7 @@
 		ad->new_batch = 0;
 	}
 
-	if (!arq->io_context)
-		return;
-
-	if (ad->io_context == arq->io_context) {
+	if (ad->io_context == arq->io_context && ad->io_context) {
 		ad->antic_start = jiffies;
 		ad->ioc_finished = 1;
 		if (ad->antic_status == ANTIC_WAIT_REQ) {
@@ -955,18 +998,23 @@
 		}
 	}
 
-	aic = arq->io_context->aic;
-	if (!aic)
-		return;
+out_ioc:
+	if (!arq->io_context)
+		goto out;
 
-	spin_lock(&aic->lock);
 	if (arq->is_sync == REQ_SYNC) {
-		set_bit(AS_TASK_IORUNNING, &aic->state);
-		aic->last_end_request = jiffies;
+		struct as_io_context *aic = arq->io_context->aic;
+		if (aic) {
+			spin_lock(&aic->lock);
+			set_bit(AS_TASK_IORUNNING, &aic->state);
+			aic->last_end_request = jiffies;
+			spin_unlock(&aic->lock);
+		}
 	}
-	spin_unlock(&aic->lock);
 
 	put_io_context(arq->io_context);
+out:
+	arq->state = AS_RQ_POSTSCHED;
 }
 
 /*
@@ -1035,14 +1083,14 @@
 	struct as_rq *arq = RQ_DATA(rq);
 
 	if (unlikely(arq->state == AS_RQ_NEW))
-		return;
-
-	if (!arq) {
-		WARN_ON(1);
-		return;
-	}
+		goto out;
 
 	if (ON_RB(&arq->rb_node)) {
+		if (arq->state != AS_RQ_QUEUED) {
+			printk("arq->state %d\n", arq->state);
+			WARN_ON(1);
+			goto out;
+		}
 		/*
 		 * We'll lose the aliased request(s) here. I don't think this
 		 * will ever happen, but if it does, hopefully someone will
@@ -1050,8 +1098,16 @@
 		 */
 		WARN_ON(!list_empty(&rq->queuelist));
 		as_remove_queued_request(q, rq);
-	} else
+	} else {
+		if (arq->state != AS_RQ_DISPATCHED) {
+			printk("arq->state %d\n", arq->state);
+			WARN_ON(1);
+			goto out;
+		}
 		as_remove_dispatched_request(q, rq);
+	}
+out:
+	arq->state = AS_RQ_REMOVED;
 }
 
 /*
@@ -1229,9 +1285,9 @@
 			 */
 			goto dispatch_writes;
 
- 		if (ad->batch_data_dir == REQ_ASYNC) {
+		if (ad->batch_data_dir == REQ_ASYNC) {
 			WARN_ON(ad->new_batch);
- 			ad->changed_batch = 1;
+			ad->changed_batch = 1;
 		}
 		ad->batch_data_dir = REQ_SYNC;
 		arq = list_entry_fifo(ad->fifo_list[ad->batch_data_dir].next);
@@ -1247,8 +1303,8 @@
 dispatch_writes:
 		BUG_ON(RB_EMPTY(&ad->sort_list[REQ_ASYNC]));
 
- 		if (ad->batch_data_dir == REQ_SYNC) {
- 			ad->changed_batch = 1;
+		if (ad->batch_data_dir == REQ_SYNC) {
+			ad->changed_batch = 1;
 
 			/*
 			 * new_batch might be 1 when the queue runs out of
@@ -1291,8 +1347,6 @@
 			ad->new_batch = 1;
 
 		ad->changed_batch = 0;
-
-		arq->request->flags |= REQ_SOFTBARRIER;
 	}
 
 	/*
@@ -1369,8 +1423,8 @@
 	arq->io_context = as_get_io_context();
 
 	if (arq->io_context) {
+		as_update_iohist(ad, arq->io_context->aic, arq->request);
 		atomic_inc(&arq->io_context->aic->nr_queued);
-		as_update_iohist(arq->io_context->aic, arq->request);
 	}
 
 	alias = as_add_arq_rb(ad, arq);
@@ -1391,6 +1445,7 @@
 
 	} else {
 		as_add_aliased_request(ad, arq, alias);
+
 		/*
 		 * have we been anticipating this request?
 		 * or does it come from the same process as the one we are
@@ -1416,6 +1471,11 @@
 	struct as_rq *arq = RQ_DATA(rq);
 
 	if (arq) {
+		if (arq->state != AS_RQ_REMOVED) {
+			printk("arq->state %d\n", arq->state);
+			WARN_ON(1);
+		}
+
 		arq->state = AS_RQ_DISPATCHED;
 		if (arq->io_context && arq->io_context->aic)
 			atomic_inc(&arq->io_context->aic->nr_dispatched);
@@ -1427,8 +1487,6 @@
 
 	/* Stop anticipating - let this request get through */
 	as_antic_stop(ad);
-
-	return;
 }
 
 static void
@@ -1437,10 +1495,20 @@
 	struct as_data *ad = q->elevator.elevator_data;
 	struct as_rq *arq = RQ_DATA(rq);
 
+	if (arq) {
+		if (arq->state != AS_RQ_PRESCHED) {
+			printk("arq->state: %d\n", arq->state);
+			WARN_ON(1);
+		}
+		arq->state = AS_RQ_NEW;
+	}
+
 	/* barriers must flush the reorder queue */
 	if (unlikely(rq->flags & (REQ_SOFTBARRIER | REQ_HARDBARRIER)
-			&& where == ELEVATOR_INSERT_SORT))
+			&& where == ELEVATOR_INSERT_SORT)) {
+		WARN_ON(1);
 		where = ELEVATOR_INSERT_BACK;
+	}
 
 	switch (where) {
 		case ELEVATOR_INSERT_BACK:
@@ -1675,7 +1743,8 @@
 	 * kill knowledge of next, this one is a goner
 	 */
 	as_remove_queued_request(q, next);
-	put_io_context(anext->io_context);
+
+	anext->state = AS_RQ_MERGED;
 }
 
 /*
@@ -1708,6 +1777,11 @@
 		return;
 	}
 
+	if (arq->state != AS_RQ_POSTSCHED && arq->state != AS_RQ_PRESCHED) {
+		printk("arq->state %d\n", arq->state);
+		WARN_ON(1);
+	}
+
 	mempool_free(arq, ad->arq_pool);
 	rq->elevator_private = NULL;
 }
@@ -1721,7 +1795,7 @@
 		memset(arq, 0, sizeof(*arq));
 		RB_CLEAR(&arq->rb_node);
 		arq->request = rq;
-		arq->state = AS_RQ_NEW;
+		arq->state = AS_RQ_PRESCHED;
 		arq->io_context = NULL;
 		INIT_LIST_HEAD(&arq->hash);
 		arq->on_hash = 0;
@@ -1823,8 +1897,6 @@
 	if (ad->write_batch_count < 2)
 		ad->write_batch_count = 2;
 
-	ad->new_success = 512;
-
 	return 0;
 }
 
@@ -1860,6 +1932,17 @@
 	return count;
 }
 
+static ssize_t as_est_show(struct as_data *ad, char *page)
+{
+	int pos = 0;
+
+	pos += sprintf(page+pos, "%lu %% exit probability\n", 100*ad->exit_prob/256);
+	pos += sprintf(page+pos, "%lu ms new thinktime\n", ad->new_ttime_mean);
+	pos += sprintf(page+pos, "%llu sectors new seek distance\n", (unsigned long long)ad->new_seek_mean);
+
+	return pos;
+}
+
 #define SHOW_FUNCTION(__FUNC, __VAR)					\
 static ssize_t __FUNC(struct as_data *ad, char *page)		\
 {									\
@@ -1891,6 +1974,10 @@
 			&ad->batch_expire[REQ_ASYNC], 0, INT_MAX);
 #undef STORE_FUNCTION
 
+static struct as_fs_entry as_est_entry = {
+	.attr = {.name = "est_time", .mode = S_IRUGO },
+	.show = as_est_show,
+};
 static struct as_fs_entry as_readexpire_entry = {
 	.attr = {.name = "read_expire", .mode = S_IRUGO | S_IWUSR },
 	.show = as_readexpire_show,
@@ -1918,6 +2005,7 @@
 };
 
 static struct attribute *default_attrs[] = {
+	&as_est_entry.attr,
 	&as_readexpire_entry.attr,
 	&as_writeexpire_entry.attr,
 	&as_anticexpire_entry.attr,
--- diff/drivers/block/ataflop.c	2003-09-17 12:28:04.000000000 +0100
+++ source/drivers/block/ataflop.c	2003-12-29 09:30:40.000000000 +0000
@@ -364,13 +364,12 @@
 static __inline__ void copy_buffer( void *from, void *to);
 static void setup_req_params( int drive );
 static void redo_fd_request( void);
-static int fd_ioctl( struct inode *inode, struct file *filp, unsigned int
+static int fd_ioctl(struct block_device *bdev, struct file *filp, unsigned int
                      cmd, unsigned long param);
 static void fd_probe( int drive );
 static int fd_test_drive_present( int drive );
 static void config_types( void );
-static int floppy_open( struct inode *inode, struct file *filp );
-static int floppy_release( struct inode * inode, struct file * filp );
+static int floppy_open(struct block_device *bdev, struct file *filp );
 
 /************************* End of Prototypes **************************/
 
@@ -1496,10 +1495,10 @@
 	atari_enable_irq( IRQ_MFP_FDC );
 }
 
-static int fd_ioctl(struct inode *inode, struct file *filp,
+static int fd_ioctl(struct block_device *bdev, struct file *filp,
 		    unsigned int cmd, unsigned long param)
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
+	struct gendisk *disk = bdev->bd_disk;
 	struct atari_floppy_struct *floppy = disk->private_data;
 	int drive = floppy - unit;
 	int type = floppy->type;
@@ -1673,7 +1672,7 @@
 		/* invalidate the buffer track to force a reread */
 		BufferDrive = -1;
 		set_bit(drive, &fake_change);
-		check_disk_change(inode->i_bdev);
+		check_disk_change(bdev);
 		return 0;
 	default:
 		return -EINVAL;
@@ -1816,10 +1815,10 @@
  * drive with different device numbers.
  */
 
-static int floppy_open( struct inode *inode, struct file *filp )
+static int floppy_open(struct block_device *bdev, struct file *filp )
 {
-	struct atari_floppy_struct *p = inode->i_bdev->bd_disk->private_data;
-	int type  = iminor(inode) >> 2;
+	struct atari_floppy_struct *p = bdev->bd_disk->private_data;
+	int type  = MINOR(bdev->bd_dev) >> 2;
 
 	DPRINT(("fd_open: type=%d\n",type));
 	if (p->ref && p->type != type)
@@ -1839,14 +1838,13 @@
 		return 0;
 
 	if (filp->f_mode & 3) {
-		check_disk_change(inode->i_bdev);
+		check_disk_change(bdev);
 		if (filp->f_mode & 2) {
 			if (p->wpstat) {
 				if (p->ref < 0)
 					p->ref = 0;
 				else
 					p->ref--;
-				floppy_release(inode, filp);
 				return -EROFS;
 			}
 		}
@@ -1855,9 +1853,9 @@
 }
 
 
-static int floppy_release( struct inode * inode, struct file * filp )
+static int floppy_release(struct gendisk *disk)
 {
-	struct atari_floppy_struct *p = inode->i_bdev->bd_disk->private_data;
+	struct atari_floppy_struct *p = disk->private_data;
 	if (p->ref < 0)
 		p->ref = 0;
 	else if (!p->ref--) {
--- diff/drivers/block/cciss.c	2003-10-09 09:47:33.000000000 +0100
+++ source/drivers/block/cciss.c	2003-12-29 09:30:40.000000000 +0000
@@ -112,9 +112,9 @@
 static ctlr_info_t *hba[MAX_CTLR];
 
 static void do_cciss_request(request_queue_t *q);
-static int cciss_open(struct inode *inode, struct file *filep);
-static int cciss_release(struct inode *inode, struct file *filep);
-static int cciss_ioctl(struct inode *inode, struct file *filep, 
+static int cciss_open(struct block_device *bdev, struct file *filep);
+static int cciss_release(struct gendisk *disk);
+static int cciss_ioctl(struct block_device *bdev, struct file *filep,
 		unsigned int cmd, unsigned long arg);
 
 static int revalidate_allvol(ctlr_info_t *host);
@@ -362,13 +362,13 @@
 /*
  * Open.  Make sure the device is really there.
  */
-static int cciss_open(struct inode *inode, struct file *filep)
+static int cciss_open(struct block_device *bdev, struct file *filep)
 {
-	ctlr_info_t *host = get_host(inode->i_bdev->bd_disk);
-	drive_info_struct *drv = get_drv(inode->i_bdev->bd_disk);
+	ctlr_info_t *host = get_host(bdev->bd_disk);
+	drive_info_struct *drv = get_drv(bdev->bd_disk);
 
 #ifdef CCISS_DEBUG
-	printk(KERN_DEBUG "cciss_open %s\n", inode->i_bdev->bd_disk->disk_name);
+	printk(KERN_DEBUG "cciss_open %s\n", bdev->bd_disk->disk_name);
 #endif /* CCISS_DEBUG */ 
 
 	/*
@@ -378,7 +378,7 @@
 	 * for "raw controller".
 	 */
 	if (drv->nr_blocks == 0) {
-		if (iminor(inode) != 0)
+		if (bdev != bdev->bd_contains || drv != host->drv)
 			return -ENXIO;
 		if (!capable(CAP_SYS_ADMIN))
 			return -EPERM;
@@ -390,13 +390,13 @@
 /*
  * Close.  Sync first.
  */
-static int cciss_release(struct inode *inode, struct file *filep)
+static int cciss_release(struct gendisk *disk)
 {
-	ctlr_info_t *host = get_host(inode->i_bdev->bd_disk);
-	drive_info_struct *drv = get_drv(inode->i_bdev->bd_disk);
+	ctlr_info_t *host = get_host(disk);
+	drive_info_struct *drv = get_drv(disk);
 
 #ifdef CCISS_DEBUG
-	printk(KERN_DEBUG "cciss_release %s\n", inode->i_bdev->bd_disk->disk_name);
+	printk(KERN_DEBUG "cciss_release %s\n", disk->disk_name);
 #endif /* CCISS_DEBUG */
 
 	drv->usage_count--;
@@ -407,10 +407,9 @@
 /*
  * ioctl 
  */
-static int cciss_ioctl(struct inode *inode, struct file *filep, 
+static int cciss_ioctl(struct block_device *bdev, struct file *filep,
 		unsigned int cmd, unsigned long arg)
 {
-	struct block_device *bdev = inode->i_bdev;
 	struct gendisk *disk = bdev->bd_disk;
 	ctlr_info_t *host = get_host(disk);
 	drive_info_struct *drv = get_drv(disk);
@@ -433,7 +432,7 @@
                         driver_geo.sectors = 0x3f;
                         driver_geo.cylinders = (int)drv->nr_blocks / (0xff*0x3f);
                 }
-                driver_geo.start= get_start_sect(inode->i_bdev);
+                driver_geo.start= get_start_sect(bdev);
                 if (copy_to_user((void *) arg, &driver_geo,
                                 sizeof( struct hd_geometry)))
                         return  -EFAULT;
--- diff/drivers/block/cpqarray.c	2003-10-09 09:47:33.000000000 +0100
+++ source/drivers/block/cpqarray.c	2003-12-29 09:30:40.000000000 +0000
@@ -128,9 +128,9 @@
 	unsigned int blkcnt,
 	unsigned int log_unit );
 
-static int ida_open(struct inode *inode, struct file *filep);
-static int ida_release(struct inode *inode, struct file *filep);
-static int ida_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg);
+static int ida_open(struct block_device *bdev, struct file *filep);
+static int ida_release(struct gendisk *disk);
+static int ida_ioctl(struct block_device *bdev, struct file *filep, unsigned int cmd, unsigned long arg);
 static int ida_ctlr_ioctl(ctlr_info_t *h, int dsk, ida_ioctl_t *io);
 
 static void do_ida_request(request_queue_t *q);
@@ -715,12 +715,12 @@
 /*
  * Open.  Make sure the device is really there.
  */
-static int ida_open(struct inode *inode, struct file *filep)
+static int ida_open(struct block_device *bdev, struct file *filep)
 {
-	drv_info_t *drv = get_drv(inode->i_bdev->bd_disk);
-	ctlr_info_t *host = get_host(inode->i_bdev->bd_disk);
+	drv_info_t *drv = get_drv(bdev->bd_disk);
+	ctlr_info_t *host = get_host(bdev->bd_disk);
 
-	DBGINFO(printk("ida_open %s\n", inode->i_bdev->bd_disk->disk_name));
+	DBGINFO(printk("ida_open %s\n", bdev->bd_disk->disk_name));
 	/*
 	 * Root is allowed to open raw volume zero even if it's not configured
 	 * so array config can still work.  I don't think I really like this,
@@ -740,9 +740,9 @@
 /*
  * Close.  Sync first.
  */
-static int ida_release(struct inode *inode, struct file *filep)
+static int ida_release(struct gendisk *disk)
 {
-	ctlr_info_t *host = get_host(inode->i_bdev->bd_disk);
+	ctlr_info_t *host = get_host(disk);
 	host->usage_count--;
 	return 0;
 }
@@ -1022,10 +1022,10 @@
  *  ida_ioctl does some miscellaneous stuff like reporting drive geometry,
  *  setting readahead and submitting commands from userspace to the controller.
  */
-static int ida_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg)
+static int ida_ioctl(struct block_device *bdev, struct file *filep, unsigned int cmd, unsigned long arg)
 {
-	drv_info_t *drv = get_drv(inode->i_bdev->bd_disk);
-	ctlr_info_t *host = get_host(inode->i_bdev->bd_disk);
+	drv_info_t *drv = get_drv(bdev->bd_disk);
+	ctlr_info_t *host = get_host(bdev->bd_disk);
 	int error;
 	int diskinfo[4];
 	struct hd_geometry *geo = (struct hd_geometry *)arg;
@@ -1046,7 +1046,7 @@
 		put_user(diskinfo[0], &geo->heads);
 		put_user(diskinfo[1], &geo->sectors);
 		put_user(diskinfo[2], &geo->cylinders);
-		put_user(get_start_sect(inode->i_bdev), &geo->start);
+		put_user(get_start_sect(bdev), &geo->start);
 		return 0;
 	case IDAGETDRVINFO:
 		if (copy_to_user(&io->c.drv, drv, sizeof(drv_info_t)))
@@ -1076,7 +1076,7 @@
 		put_user(host->ctlr_sig, (int*)arg);
 		return 0;
 	case IDAREVALIDATEVOLS:
-		if (iminor(inode) != 0)
+		if (bdev != bdev->bd_contains || drv != host->drv)
 			return -ENXIO;
 		return revalidate_allvol(host);
 	case IDADRIVERVERSION:
--- diff/drivers/block/cryptoloop.c	2003-08-26 10:00:52.000000000 +0100
+++ source/drivers/block/cryptoloop.c	2003-12-29 09:30:40.000000000 +0000
@@ -87,43 +87,49 @@
 
 
 static int
-cryptoloop_transfer_ecb(struct loop_device *lo, int cmd, char *raw_buf,
-		     char *loop_buf, int size, sector_t IV)
+cryptoloop_transfer_ecb(struct loop_device *lo, int cmd,
+			struct page *raw_page, unsigned raw_off,
+			struct page *loop_page, unsigned loop_off,
+			int size, sector_t IV)
 {
 	struct crypto_tfm *tfm = (struct crypto_tfm *) lo->key_data;
 	struct scatterlist sg_out = { 0, };
 	struct scatterlist sg_in = { 0, };
 
 	encdec_ecb_t encdecfunc;
-	char const *in;
-	char *out;
+	struct page *in_page, *out_page;
+	unsigned in_offs, out_offs;
 
 	if (cmd == READ) {
-		in = raw_buf;
-		out = loop_buf;
+		in_page = raw_page;
+		in_offs = raw_off;
+		out_page = loop_page;
+		out_offs = loop_off;
 		encdecfunc = tfm->crt_u.cipher.cit_decrypt;
 	} else {
-		in = loop_buf;
-		out = raw_buf;
+		in_page = loop_page;
+		in_offs = loop_off;
+		out_page = raw_page;
+		out_offs = raw_off;
 		encdecfunc = tfm->crt_u.cipher.cit_encrypt;
 	}
 
 	while (size > 0) {
 		const int sz = min(size, LOOP_IV_SECTOR_SIZE);
 
-		sg_in.page = virt_to_page(in);
-		sg_in.offset = (unsigned long)in & ~PAGE_MASK;
+		sg_in.page = in_page;
+		sg_in.offset = in_offs;
 		sg_in.length = sz;
 
-		sg_out.page = virt_to_page(out);
-		sg_out.offset = (unsigned long)out & ~PAGE_MASK;
+		sg_out.page = out_page;
+		sg_out.offset = out_offs;
 		sg_out.length = sz;
 
 		encdecfunc(tfm, &sg_out, &sg_in, sz);
 
 		size -= sz;
-		in += sz;
-		out += sz;
+		in_offs += sz;
+		out_offs += sz;
 	}
 
 	return 0;
@@ -135,24 +141,30 @@
 			unsigned int nsg, u8 *iv);
 
 static int
-cryptoloop_transfer_cbc(struct loop_device *lo, int cmd, char *raw_buf,
-		     char *loop_buf, int size, sector_t IV)
+cryptoloop_transfer_cbc(struct loop_device *lo, int cmd,
+			struct page *raw_page, unsigned raw_off,
+			struct page *loop_page, unsigned loop_off,
+			int size, sector_t IV)
 {
 	struct crypto_tfm *tfm = (struct crypto_tfm *) lo->key_data;
 	struct scatterlist sg_out = { 0, };
 	struct scatterlist sg_in = { 0, };
 
 	encdec_cbc_t encdecfunc;
-	char const *in;
-	char *out;
+	struct page *in_page, *out_page;
+	unsigned in_offs, out_offs;
 
 	if (cmd == READ) {
-		in = raw_buf;
-		out = loop_buf;
+		in_page = raw_page;
+		in_offs = raw_off;
+		out_page = loop_page;
+		out_offs = loop_off;
 		encdecfunc = tfm->crt_u.cipher.cit_decrypt_iv;
 	} else {
-		in = loop_buf;
-		out = raw_buf;
+		in_page = loop_page;
+		in_offs = loop_off;
+		out_page = raw_page;
+		out_offs = raw_off;
 		encdecfunc = tfm->crt_u.cipher.cit_encrypt_iv;
 	}
 
@@ -161,39 +173,43 @@
 		u32 iv[4] = { 0, };
 		iv[0] = cpu_to_le32(IV & 0xffffffff);
 
-		sg_in.page = virt_to_page(in);
-		sg_in.offset = offset_in_page(in);
+		sg_in.page = in_page;
+		sg_in.offset = in_offs;
 		sg_in.length = sz;
 
-		sg_out.page = virt_to_page(out);
-		sg_out.offset = offset_in_page(out);
+		sg_out.page = out_page;
+		sg_out.offset = out_offs;
 		sg_out.length = sz;
 
 		encdecfunc(tfm, &sg_out, &sg_in, sz, (u8 *)iv);
 
 		IV++;
 		size -= sz;
-		in += sz;
-		out += sz;
+		in_offs += sz;
+		out_offs += sz;
 	}
 
 	return 0;
 }
 
 static int
-cryptoloop_transfer(struct loop_device *lo, int cmd, char *raw_buf,
-		     char *loop_buf, int size, sector_t IV)
+cryptoloop_transfer(struct loop_device *lo, int cmd,
+		    struct page *raw_page, unsigned raw_off,
+		    struct page *loop_page, unsigned loop_off,
+		    int size, sector_t IV)
 {
 	struct crypto_tfm *tfm = (struct crypto_tfm *) lo->key_data;
 	if(tfm->crt_cipher.cit_mode == CRYPTO_TFM_MODE_ECB)
 	{
 		lo->transfer = cryptoloop_transfer_ecb;
-		return cryptoloop_transfer_ecb(lo, cmd, raw_buf, loop_buf, size, IV);
+		return cryptoloop_transfer_ecb(lo, cmd, raw_page, raw_off,
+					       loop_page, loop_off, size, IV);
 	}	
 	if(tfm->crt_cipher.cit_mode == CRYPTO_TFM_MODE_CBC)
 	{	
 		lo->transfer = cryptoloop_transfer_cbc;
-		return cryptoloop_transfer_cbc(lo, cmd, raw_buf, loop_buf, size, IV);
+		return cryptoloop_transfer_cbc(lo, cmd, raw_page, raw_off,
+					       loop_page, loop_off, size, IV);
 	}
 	
 	/*  This is not supposed to happen */
--- diff/drivers/block/floppy.c	2003-09-30 15:46:12.000000000 +0100
+++ source/drivers/block/floppy.c	2003-12-29 09:30:40.000000000 +0000
@@ -2563,7 +2563,7 @@
 			       current_count_sectors);
 			if (CT(COMMAND) == FD_READ)
 				printk("read\n");
-			if (CT(COMMAND) == FD_READ)
+			if (CT(COMMAND) == FD_WRITE)
 				printk("write\n");
 			break;
 		}
@@ -2894,7 +2894,7 @@
 			       current_count_sectors);
 			if (CT(COMMAND) == FD_READ)
 				printk("read\n");
-			if (CT(COMMAND) == FD_READ)
+			if (CT(COMMAND) == FD_WRITE)
 				printk("write\n");
 			return 0;
 		}
@@ -3456,14 +3456,14 @@
 	return 0;
 }
 
-static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
+static int fd_ioctl(struct block_device *bdev, struct file *filp, unsigned int cmd,
 		    unsigned long param)
 {
 #define FD_IOCTL_ALLOWED ((filp) && (filp)->private_data)
 #define OUT(c,x) case c: outparam = (const char *) (x); break
 #define IN(c,x,tag) case c: *(x) = inparam. tag ; return 0
 
-	int drive = (long)inode->i_bdev->bd_disk->private_data;
+	int drive = (long)bdev->bd_disk->private_data;
 	int i, type = ITYPE(UDRS->fd_device);
 	int ret;
 	int size;
@@ -3539,11 +3539,11 @@
 			current_type[drive] = NULL;
 			floppy_sizes[drive] = MAX_DISK_SIZE << 1;
 			UDRS->keep_data = 0;
-			return invalidate_drive(inode->i_bdev);
+			return invalidate_drive(bdev);
 		case FDSETPRM:
 		case FDDEFPRM:
 			return set_geometry(cmd, & inparam.g,
-					    drive, type, inode->i_bdev);
+					    drive, type, bdev);
 		case FDGETPRM:
 			ECALL(get_floppy_geometry(drive, type, 
 						  (struct floppy_struct**)
@@ -3574,7 +3574,7 @@
 		case FDFMTEND:
 		case FDFLUSH:
 			LOCK_FDC(drive,1);
-			return invalidate_drive(inode->i_bdev);
+			return invalidate_drive(bdev);
 
 		case FDSETEMSGTRESH:
 			UDP->max_errors.reporting =
@@ -3685,9 +3685,9 @@
 		printk("\n");
 }
 
-static int floppy_release(struct inode * inode, struct file * filp)
+static int floppy_release(struct gendisk *disk)
 {
-	int drive = (long)inode->i_bdev->bd_disk->private_data;
+	int drive = (long)disk->private_data;
 
 	down(&open_lock);
 	if (UDRS->fd_ref < 0)
@@ -3708,9 +3708,9 @@
  * /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 block_device *bdev, struct file * filp)
 {
-	int drive = (long)inode->i_bdev->bd_disk->private_data;
+	int drive = (long)bdev->bd_disk->private_data;
 	int old_dev;
 	int try;
 	int res = -EBUSY;
@@ -3719,7 +3719,7 @@
 	filp->private_data = (void*) 0;
 	down(&open_lock);
 	old_dev = UDRS->fd_device;
-	if (opened_bdev[drive] && opened_bdev[drive] != inode->i_bdev)
+	if (opened_bdev[drive] && opened_bdev[drive] != bdev)
 		goto out2;
 
 	if (!UDRS->fd_ref && (UDP->flags & FD_BROKEN_DCL)){
@@ -3739,7 +3739,7 @@
 	else
 		UDRS->fd_ref++;
 
-	opened_bdev[drive] = inode->i_bdev;
+	opened_bdev[drive] = bdev;
 
 	res = -ENXIO;
 
@@ -3774,9 +3774,9 @@
 		}
 	}
 
-	UDRS->fd_device = iminor(inode);
-	set_capacity(disks[drive], floppy_sizes[iminor(inode)]);
-	if (old_dev != -1 && old_dev != iminor(inode)) {
+	UDRS->fd_device = MINOR(bdev->bd_dev);
+	set_capacity(disks[drive], floppy_sizes[MINOR(bdev->bd_dev)]);
+	if (old_dev != -1 && old_dev != MINOR(bdev->bd_dev)) {
 		if (buffer_drive == drive)
 			buffer_track = -1;
 	}
@@ -3784,8 +3784,7 @@
 	/* 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) || 
-	    (inode->i_sb && (permission(inode,2, NULL) == 0)))
+	if ((filp->f_mode & 2) || permission(filp->f_dentry->d_inode,2,NULL) == 0)
 	    filp->private_data = (void*) 8;
 
 	if (UFDCS->rawcmd == 1)
@@ -3794,7 +3793,7 @@
 	if (!(filp->f_flags & O_NDELAY)) {
 		if (filp->f_mode & 3) {
 			UDRS->last_checked = 0;
-			check_disk_change(inode->i_bdev);
+			check_disk_change(bdev);
 			if (UTESTF(FD_DISK_CHANGED))
 				goto out;
 		}
--- diff/drivers/block/floppy98.c	2003-09-17 12:28:04.000000000 +0100
+++ source/drivers/block/floppy98.c	2003-12-29 09:30:40.000000000 +0000
@@ -2594,7 +2594,7 @@
 			       current_count_sectors);
 			if (CT(COMMAND) == FD_READ)
 				printk("read\n");
-			if (CT(COMMAND) == FD_READ)
+			if (CT(COMMAND) == FD_WRITE)
 				printk("write\n");
 			break;
 		}
@@ -2925,7 +2925,7 @@
 			       current_count_sectors);
 			if (CT(COMMAND) == FD_READ)
 				printk("read\n");
-			if (CT(COMMAND) == FD_READ)
+			if (CT(COMMAND) == FD_WRITE)
 				printk("write\n");
 			return 0;
 		}
@@ -3484,14 +3484,14 @@
 	return 0;
 }
 
-static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
+static int fd_ioctl(struct block_device *bdev, struct file *filp, unsigned int cmd,
 		    unsigned long param)
 {
 #define FD_IOCTL_ALLOWED ((filp) && (filp)->private_data)
 #define OUT(c,x) case c: outparam = (const char *) (x); break
 #define IN(c,x,tag) case c: *(x) = inparam. tag ; return 0
 
-	int drive = (long)inode->i_bdev->bd_disk->private_data;
+	int drive = (long)bdev->bd_disk->private_data;
 	int i, type = ITYPE(UDRS->fd_device);
 	int ret;
 	int size;
@@ -3566,11 +3566,11 @@
 			current_type[drive] = NULL;
 			floppy_sizes[drive] = MAX_DISK_SIZE << 1;
 			UDRS->keep_data = 0;
-			return invalidate_drive(inode->i_bdev);
+			return invalidate_drive(bdev);
 		case FDSETPRM:
 		case FDDEFPRM:
 			return set_geometry(cmd, & inparam.g,
-					    drive, type, inode->i_bdev);
+					    drive, type, bdev);
 		case FDGETPRM:
 			ECALL(get_floppy_geometry(drive, type, 
 						  (struct floppy_struct**)
@@ -3625,7 +3625,7 @@
 		case FDFMTEND:
 		case FDFLUSH:
 			LOCK_FDC(drive,1);
-			return invalidate_drive(inode->i_bdev);
+			return invalidate_drive(bdev);
 
 		case FDSETEMSGTRESH:
 			UDP->max_errors.reporting =
@@ -3735,9 +3735,9 @@
 		printk("\n");
 }
 
-static int floppy_release(struct inode * inode, struct file * filp)
+static int floppy_release(struct gendisk *disk)
 {
-	int drive = (long)inode->i_bdev->bd_disk->private_data;
+	int drive = (long)disk->private_data;
 
 	down(&open_lock);
 	if (UDRS->fd_ref < 0)
@@ -3758,11 +3758,10 @@
  * /dev/PS0 etc), and disallows simultaneous access to the same
  * drive with different device numbers.
  */
-#define RETERR(x) do{floppy_release(inode,filp); return -(x);}while(0)
 
-static int floppy_open(struct inode * inode, struct file * filp)
+static int floppy_open(struct block_device *bdev, struct file *filp)
 {
-	int drive = (long)inode->i_bdev->bd_disk->private_data;
+	int drive = (long)bdev->bd_disk->private_data;
 	int old_dev;
 	int try;
 	int res = -EBUSY;
@@ -3789,7 +3788,7 @@
 
 	down(&open_lock);
 	old_dev = UDRS->fd_device;
-	if (opened_bdev[drive] && opened_bdev[drive] != inode->i_bdev)
+	if (opened_bdev[drive] && opened_bdev[drive] != bdev)
 		goto out2;
 
 	if (!UDRS->fd_ref && (UDP->flags & FD_BROKEN_DCL)){
@@ -3809,7 +3808,7 @@
 	else
 		UDRS->fd_ref++;
 
-	opened_bdev[drive] = inode->i_bdev;
+	opened_bdev[drive] = bdev;
 
 	res = -ENXIO;
 
@@ -3844,9 +3843,9 @@
 		}
 	}
 
-	UDRS->fd_device = iminor(inode);
-	set_capacity(disks[drive], floppy_sizes[iminor(inode)]);
-	if (old_dev != -1 && old_dev != iminor(inode)) {
+	UDRS->fd_device = MINOR(bdev->bd_dev);
+	set_capacity(disks[drive], floppy_sizes[MINOR(bdev->bd_dev)]);
+	if (old_dev != -1 && old_dev != MINOR(bdev->bd_dev)) {
 		if (buffer_drive == drive)
 			buffer_track = -1;
 	}
@@ -3859,8 +3858,7 @@
 	/* 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) || 
-	    (inode->i_sb && (permission(inode,2) == 0)))
+	if ((filp->f_mode & 2) || permission(filp->f_dentry->d_inode,2) == 0)
 	    filp->private_data = (void*) 8;
 
 	if (UFDCS->rawcmd == 1)
@@ -3873,7 +3871,7 @@
 	if (!(filp->f_flags & O_NDELAY)) {
 		if (filp->f_mode & 3) {
 			UDRS->last_checked = 0;
-			check_disk_change(inode->i_bdev);
+			check_disk_change(bdev);
 			if (UTESTF(FD_DISK_CHANGED))
 				goto out;
 		}
--- diff/drivers/block/genhd.c	2003-10-09 09:47:33.000000000 +0100
+++ source/drivers/block/genhd.c	2003-12-29 09:30:40.000000000 +0000
@@ -296,7 +296,9 @@
 
 static struct kobject *base_probe(dev_t dev, int *part, void *data)
 {
-	request_module("block-major-%d", MAJOR(dev));
+	if (request_module("block-major-%d-%d", MAJOR(dev), MINOR(dev)) > 0)
+		/* Make old-style 2.4 aliases work */
+		request_module("block-major-%d", MAJOR(dev));
 	return NULL;
 }
 
--- diff/drivers/block/ioctl.c	2003-09-17 12:28:04.000000000 +0100
+++ source/drivers/block/ioctl.c	2003-12-29 09:30:40.000000000 +0000
@@ -132,10 +132,9 @@
 	return put_user(val, (u64 *)arg);
 }
 
-int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd,
+int blkdev_ioctl(struct block_device *bdev, struct file *file, unsigned cmd,
 			unsigned long arg)
 {
-	struct block_device *bdev = inode->i_bdev;
 	struct gendisk *disk = bdev->bd_disk;
 	struct backing_dev_info *bdi;
 	int holder;
@@ -194,7 +193,7 @@
 		if (!capable(CAP_SYS_ADMIN))
 			return -EACCES;
 		if (disk->fops->ioctl) {
-			ret = disk->fops->ioctl(inode, file, cmd, arg);
+			ret = disk->fops->ioctl(bdev, file, cmd, arg);
 			if (ret != -EINVAL)
 				return ret;
 		}
@@ -203,7 +202,7 @@
 		return 0;
 	case BLKROSET:
 		if (disk->fops->ioctl) {
-			ret = disk->fops->ioctl(inode, file, cmd, arg);
+			ret = disk->fops->ioctl(bdev, file, cmd, arg);
 			if (ret != -EINVAL)
 				return ret;
 		}
@@ -215,7 +214,7 @@
 		return 0;
 	default:
 		if (disk->fops->ioctl)
-			return disk->fops->ioctl(inode, file, cmd, arg);
+			return disk->fops->ioctl(bdev, file, cmd, arg);
 	}
 	return -ENOTTY;
 }
--- diff/drivers/block/ll_rw_blk.c	2003-11-25 15:24:57.000000000 +0000
+++ source/drivers/block/ll_rw_blk.c	2003-12-29 09:30:40.000000000 +0000
@@ -517,10 +517,10 @@
 {
 	int bits, i;
 
-	if (depth > q->nr_requests * 2) {
-		depth = q->nr_requests * 2;
-		printk(KERN_ERR "%s: adjusted depth to %d\n",
-				__FUNCTION__, depth);
+	if (depth > q->nr_requests / 2) {
+		q->nr_requests = depth * 2;
+		printk(KERN_INFO "%s: large TCQ depth: adjusted nr_requests "
+				 "to %lu\n", __FUNCTION__, q->nr_requests);
 	}
 
 	tags->tag_index = kmalloc(depth * sizeof(struct request *), GFP_ATOMIC);
@@ -780,11 +780,6 @@
 	"REQ_PM_SUSPEND",
 	"REQ_PM_RESUME",
 	"REQ_PM_SHUTDOWN",
-	"REQ_IDETAPE_PC1",
-	"REQ_IDETAPE_PC2",
-	"REQ_IDETAPE_READ",
-	"REQ_IDETAPE_WRITE",
-	"REQ_IDETAPE_READ_BUFFER",
 };
 
 void blk_dump_rq_flags(struct request *rq, char *msg)
@@ -1335,6 +1330,8 @@
 	&iosched_as;
 #elif defined(CONFIG_IOSCHED_DEADLINE)
 	&iosched_deadline;
+#elif defined(CONFIG_IOSCHED_CFQ)
+	&iosched_cfq;
 #elif defined(CONFIG_IOSCHED_NOOP)
 	&elevator_noop;
 #else
@@ -1353,6 +1350,10 @@
 	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;
@@ -1875,29 +1876,52 @@
 		spin_unlock_irqrestore(q->queue_lock, flags);
 	}
 }
-
 EXPORT_SYMBOL(blk_put_request);
 
 /**
- * blk_congestion_wait - wait for a queue to become uncongested
+ * blk_congestion_wait_wq - wait for a queue to become uncongested,
  * @rw: READ or WRITE
  * @timeout: timeout in jiffies
+ * @wait : wait queue entry to use for waiting or async notification
+ * (NULL defaults to synchronous behaviour)
  *
  * Waits for up to @timeout jiffies for a queue (any queue) to exit congestion.
  * If no queues are congested then just wait for the next request to be
  * returned.
+ *
+ * If the wait queue parameter specifies an async i/o callback,
+ * then instead of blocking, just register the callback on the wait
+ * queue for async notification when the queue gets uncongested.
  */
-void blk_congestion_wait(int rw, long timeout)
+int blk_congestion_wait_wq(int rw, long timeout, wait_queue_t *wait)
 {
-	DEFINE_WAIT(wait);
 	wait_queue_head_t *wqh = &congestion_wqh[rw];
+	DEFINE_WAIT(local_wait);
+
+	if (!wait)
+		wait = &local_wait;
 
 	blk_run_queues();
-	prepare_to_wait(wqh, &wait, TASK_UNINTERRUPTIBLE);
+	prepare_to_wait(wqh, wait, TASK_UNINTERRUPTIBLE);
+	if (!is_sync_wait(wait)) {
+		/*
+		 * if we've queued an async wait queue
+		 * callback do not block; just tell the
+		 * caller to return and retry later when
+		 * the callback is notified
+		 */
+		return -EIOCBRETRY;
+	}
 	io_schedule_timeout(timeout);
-	finish_wait(wqh, &wait);
+	finish_wait(wqh, wait);
+	return 0;
 }
+EXPORT_SYMBOL(blk_congestion_wait_wq);
 
+void blk_congestion_wait(int rw, long timeout)
+{
+	blk_congestion_wait_wq(rw, timeout, NULL);
+}
 EXPORT_SYMBOL(blk_congestion_wait);
 
 /*
--- diff/drivers/block/loop.c	2003-10-09 09:47:16.000000000 +0100
+++ source/drivers/block/loop.c	2003-12-29 09:30:40.000000000 +0000
@@ -55,6 +55,7 @@
 #include <linux/errno.h>
 #include <linux/major.h>
 #include <linux/wait.h>
+#include <linux/blkdev.h>
 #include <linux/blkpg.h>
 #include <linux/init.h>
 #include <linux/devfs_fs_kernel.h>
@@ -75,24 +76,34 @@
 /*
  * Transfer functions
  */
-static int transfer_none(struct loop_device *lo, int cmd, char *raw_buf,
-			 char *loop_buf, int size, sector_t real_block)
+static int transfer_none(struct loop_device *lo, int cmd,
+			 struct page *raw_page, unsigned raw_off,
+			 struct page *loop_page, unsigned loop_off,
+			 int size, sector_t real_block)
 {
-	if (raw_buf != loop_buf) {
-		if (cmd == READ)
-			memcpy(loop_buf, raw_buf, size);
-		else
-			memcpy(raw_buf, loop_buf, size);
-	}
+	char *raw_buf = kmap_atomic(raw_page, KM_USER0) + raw_off;
+	char *loop_buf = kmap_atomic(loop_page, KM_USER1) + loop_off;
+
+	if (cmd == READ)
+		memcpy(loop_buf, raw_buf, size);
+	else
+		memcpy(raw_buf, loop_buf, size);
 
+	kunmap_atomic(raw_buf, KM_USER0);
+	kunmap_atomic(loop_buf, KM_USER1);
+	cond_resched();
 	return 0;
 }
 
-static int transfer_xor(struct loop_device *lo, int cmd, char *raw_buf,
-			char *loop_buf, int size, sector_t real_block)
-{
-	char	*in, *out, *key;
-	int	i, keysize;
+static int transfer_xor(struct loop_device *lo, int cmd,
+			struct page *raw_page, unsigned raw_off,
+			struct page *loop_page, unsigned loop_off,
+			int size, sector_t real_block)
+{
+	char *raw_buf = kmap_atomic(raw_page, KM_USER0) + raw_off;
+	char *loop_buf = kmap_atomic(loop_page, KM_USER1) + loop_off;
+	char *in, *out, *key;
+	int i, keysize;
 
 	if (cmd == READ) {
 		in = raw_buf;
@@ -106,6 +117,10 @@
 	keysize = lo->lo_encrypt_key_size;
 	for (i = 0; i < size; i++)
 		*out++ = *in++ ^ key[(i & 511) % keysize];
+
+	kunmap_atomic(raw_buf, KM_USER0);
+	kunmap_atomic(loop_buf, KM_USER1);
+	cond_resched();
 	return 0;
 }
 
@@ -140,8 +155,7 @@
 	sector_t x;
 
 	/* Compute loopsize in bytes */
-	size = i_size_read(lo->lo_backing_file->f_dentry->
-				d_inode->i_mapping->host);
+	size = i_size_read(lo->lo_backing_file->f_mapping->host);
 	offset = lo->lo_offset;
 	loopsize = size - offset;
 	if (lo->lo_sizelimit > 0 && lo->lo_sizelimit < loopsize)
@@ -162,32 +176,33 @@
 }
 
 static inline int
-lo_do_transfer(struct loop_device *lo, int cmd, char *rbuf,
-	       char *lbuf, int size, sector_t rblock)
+lo_do_transfer(struct loop_device *lo, int cmd,
+	       struct page *rpage, unsigned roffs,
+	       struct page *lpage, unsigned loffs,
+	       int size, sector_t rblock)
 {
 	if (!lo->transfer)
 		return 0;
 
-	return lo->transfer(lo, cmd, rbuf, lbuf, size, rblock);
+	return lo->transfer(lo, cmd, rpage, roffs, lpage, loffs, size, rblock);
 }
 
 static int
 do_lo_send(struct loop_device *lo, struct bio_vec *bvec, int bsize, loff_t pos)
 {
 	struct file *file = lo->lo_backing_file; /* kudos to NFsckingS */
-	struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
+	struct address_space *mapping = file->f_mapping;
 	struct address_space_operations *aops = mapping->a_ops;
 	struct page *page;
-	char *kaddr, *data;
 	pgoff_t index;
-	unsigned size, offset;
+	unsigned size, offset, bv_offs;
 	int len;
 	int ret = 0;
 
 	down(&mapping->host->i_sem);
 	index = pos >> PAGE_CACHE_SHIFT;
 	offset = pos & ((pgoff_t)PAGE_CACHE_SIZE - 1);
-	data = kmap(bvec->bv_page) + bvec->bv_offset;
+	bv_offs = bvec->bv_offset;
 	len = bvec->bv_len;
 	while (len > 0) {
 		sector_t IV;
@@ -204,25 +219,28 @@
 			goto fail;
 		if (aops->prepare_write(file, page, offset, offset+size))
 			goto unlock;
-		kaddr = kmap(page);
-		transfer_result = lo_do_transfer(lo, WRITE, kaddr + offset,
-						 data, size, IV);
+		transfer_result = lo_do_transfer(lo, WRITE, page, offset,
+						 bvec->bv_page, bv_offs,
+						 size, IV);
 		if (transfer_result) {
+			char *kaddr;
+
 			/*
 			 * The transfer failed, but we still write the data to
 			 * keep prepare/commit calls balanced.
 			 */
 			printk(KERN_ERR "loop: transfer error block %llu\n",
 			       (unsigned long long)index);
+			kaddr = kmap_atomic(page, KM_USER0);
 			memset(kaddr + offset, 0, size);
+			kunmap_atomic(kaddr, KM_USER0);
 		}
 		flush_dcache_page(page);
-		kunmap(page);
 		if (aops->commit_write(file, page, offset, offset+size))
 			goto unlock;
 		if (transfer_result)
 			goto unlock;
-		data += size;
+		bv_offs += size;
 		len -= size;
 		offset = 0;
 		index++;
@@ -232,7 +250,6 @@
 	}
 	up(&mapping->host->i_sem);
 out:
-	kunmap(bvec->bv_page);
 	return ret;
 
 unlock:
@@ -247,12 +264,10 @@
 static int
 lo_send(struct loop_device *lo, struct bio *bio, int bsize, loff_t pos)
 {
-	unsigned vecnr;
-	int ret = 0;
-
-	for (vecnr = 0; vecnr < bio->bi_vcnt; vecnr++) {
-		struct bio_vec *bvec = &bio->bi_io_vec[vecnr];
+	struct bio_vec *bvec;
+	int i, ret = 0;
 
+	bio_for_each_segment(bvec, bio, i) {
 		ret = do_lo_send(lo, bvec, bsize, pos);
 		if (ret < 0)
 			break;
@@ -263,7 +278,8 @@
 
 struct lo_read_data {
 	struct loop_device *lo;
-	char *data;
+	struct page *page;
+	unsigned offset;
 	int bsize;
 };
 
@@ -271,7 +287,6 @@
 lo_read_actor(read_descriptor_t *desc, struct page *page,
 	      unsigned long offset, unsigned long size)
 {
-	char *kaddr;
 	unsigned long count = desc->count;
 	struct lo_read_data *p = (struct lo_read_data*)desc->buf;
 	struct loop_device *lo = p->lo;
@@ -282,18 +297,16 @@
 	if (size > count)
 		size = count;
 
-	kaddr = kmap(page);
-	if (lo_do_transfer(lo, READ, kaddr + offset, p->data, size, IV)) {
+	if (lo_do_transfer(lo, READ, page, offset, p->page, p->offset, size, IV)) {
 		size = 0;
 		printk(KERN_ERR "loop: transfer error block %ld\n",
 		       page->index);
 		desc->error = -EINVAL;
 	}
-	kunmap(page);
 	
 	desc->count = count - size;
 	desc->written += size;
-	p->data += size;
+	p->offset += size;
 	return size;
 }
 
@@ -306,24 +319,22 @@
 	int retval;
 
 	cookie.lo = lo;
-	cookie.data = kmap(bvec->bv_page) + bvec->bv_offset;
+	cookie.page = bvec->bv_page;
+	cookie.offset = bvec->bv_offset;
 	cookie.bsize = bsize;
 	file = lo->lo_backing_file;
 	retval = file->f_op->sendfile(file, &pos, bvec->bv_len,
 			lo_read_actor, &cookie);
-	kunmap(bvec->bv_page);
 	return (retval < 0)? retval: 0;
 }
 
 static int
 lo_receive(struct loop_device *lo, struct bio *bio, int bsize, loff_t pos)
 {
-	unsigned vecnr;
-	int ret = 0;
-
-	for (vecnr = 0; vecnr < bio->bi_vcnt; vecnr++) {
-		struct bio_vec *bvec = &bio->bi_io_vec[vecnr];
+	struct bio_vec *bvec;
+	int i, ret = 0;
 
+	bio_for_each_segment(bvec, bio, i) {
 		ret = do_lo_receive(lo, bvec, bsize, pos);
 		if (ret < 0)
 			break;
@@ -345,23 +356,6 @@
 	return ret;
 }
 
-static int loop_end_io_transfer(struct bio *, unsigned int, int);
-
-static void loop_put_buffer(struct bio *bio)
-{
-	/*
-	 * check bi_end_io, may just be a remapped bio
-	 */
-	if (bio && bio->bi_end_io == loop_end_io_transfer) {
-		int i;
-
-		for (i = 0; i < bio->bi_vcnt; i++)
-			__free_page(bio->bi_io_vec[i].bv_page);
-
-		bio_put(bio);
-	}
-}
-
 /*
  * Add bio to back of pending list
  */
@@ -399,129 +393,8 @@
 	return bio;
 }
 
-/*
- * if this was a WRITE lo->transfer stuff has already been done. for READs,
- * queue it for the loop thread and let it do the transfer out of
- * bi_end_io context (we don't want to do decrypt of a page with irqs
- * disabled)
- */
-static int loop_end_io_transfer(struct bio *bio, unsigned int bytes_done, int err)
-{
-	struct bio *rbh = bio->bi_private;
-	struct loop_device *lo = rbh->bi_bdev->bd_disk->private_data;
-
-	if (bio->bi_size)
-		return 1;
-
-	if (err || bio_rw(bio) == WRITE) {
-		bio_endio(rbh, rbh->bi_size, err);
-		if (atomic_dec_and_test(&lo->lo_pending))
-			up(&lo->lo_bh_mutex);
-		loop_put_buffer(bio);
-	} else
-		loop_add_bio(lo, bio);
-
-	return 0;
-}
-
-static struct bio *loop_copy_bio(struct bio *rbh)
-{
-	struct bio *bio;
-	struct bio_vec *bv;
-	int i;
-
-	bio = bio_alloc(__GFP_NOWARN, rbh->bi_vcnt);
-	if (!bio)
-		return NULL;
-
-	/*
-	 * iterate iovec list and alloc pages
-	 */
-	__bio_for_each_segment(bv, rbh, i, 0) {
-		struct bio_vec *bbv = &bio->bi_io_vec[i];
-
-		bbv->bv_page = alloc_page(__GFP_NOWARN|__GFP_HIGHMEM);
-		if (bbv->bv_page == NULL)
-			goto oom;
-
-		bbv->bv_len = bv->bv_len;
-		bbv->bv_offset = bv->bv_offset;
-	}
-
-	bio->bi_vcnt = rbh->bi_vcnt;
-	bio->bi_size = rbh->bi_size;
-
-	return bio;
-
-oom:
-	while (--i >= 0)
-		__free_page(bio->bi_io_vec[i].bv_page);
-
-	bio_put(bio);
-	return NULL;
-}
-
-static struct bio *loop_get_buffer(struct loop_device *lo, struct bio *rbh)
-{
-	struct bio *bio;
-
-	/*
-	 * When called on the page reclaim -> writepage path, this code can
-	 * trivially consume all memory.  So we drop PF_MEMALLOC to avoid
-	 * stealing all the page reserves and throttle to the writeout rate.
-	 * pdflush will have been woken by page reclaim.  Let it do its work.
-	 */
-	do {
-		int flags = current->flags;
-
-		current->flags &= ~PF_MEMALLOC;
-		bio = loop_copy_bio(rbh);
-		if (flags & PF_MEMALLOC)
-			current->flags |= PF_MEMALLOC;
-
-		if (bio == NULL)
-			blk_congestion_wait(WRITE, HZ/10);
-	} while (bio == NULL);
-
-	bio->bi_end_io = loop_end_io_transfer;
-	bio->bi_private = rbh;
-	bio->bi_sector = rbh->bi_sector + (lo->lo_offset >> 9);
-	bio->bi_rw = rbh->bi_rw;
-	bio->bi_bdev = lo->lo_device;
-
-	return bio;
-}
-
-static int loop_transfer_bio(struct loop_device *lo,
-			     struct bio *to_bio, struct bio *from_bio)
-{
-	sector_t IV;
-	struct bio_vec *from_bvec, *to_bvec;
-	char *vto, *vfrom;
-	int ret = 0, i;
-
-	IV = from_bio->bi_sector + (lo->lo_offset >> 9);
-
-	__bio_for_each_segment(from_bvec, from_bio, i, 0) {
-		to_bvec = &to_bio->bi_io_vec[i];
-
-		kmap(from_bvec->bv_page);
-		kmap(to_bvec->bv_page);
-		vfrom = page_address(from_bvec->bv_page) + from_bvec->bv_offset;
-		vto = page_address(to_bvec->bv_page) + to_bvec->bv_offset;
-		ret |= lo_do_transfer(lo, bio_data_dir(to_bio), vto, vfrom,
-					from_bvec->bv_len, IV);
-		kunmap(from_bvec->bv_page);
-		kunmap(to_bvec->bv_page);
-		IV += from_bvec->bv_len >> 9;
-	}
-
-	return ret;
-}
-		
 static int loop_make_request(request_queue_t *q, struct bio *old_bio)
 {
-	struct bio *new_bio = NULL;
 	struct loop_device *lo = q->queuedata;
 	int rw = bio_rw(old_bio);
 
@@ -543,31 +416,11 @@
 		printk(KERN_ERR "loop: unknown command (%x)\n", rw);
 		goto err;
 	}
-
-	/*
-	 * file backed, queue for loop_thread to handle
-	 */
-	if (lo->lo_flags & LO_FLAGS_DO_BMAP) {
-		loop_add_bio(lo, old_bio);
-		return 0;
-	}
-
-	/*
-	 * piggy old buffer on original, and submit for I/O
-	 */
-	new_bio = loop_get_buffer(lo, old_bio);
-	if (rw == WRITE) {
-		if (loop_transfer_bio(lo, new_bio, old_bio))
-			goto err;
-	}
-
-	generic_make_request(new_bio);
+	loop_add_bio(lo, old_bio);
 	return 0;
-
 err:
 	if (atomic_dec_and_test(&lo->lo_pending))
 		up(&lo->lo_bh_mutex);
-	loop_put_buffer(new_bio);
 out:
 	bio_io_error(old_bio, old_bio->bi_size);
 	return 0;
@@ -580,20 +433,8 @@
 {
 	int ret;
 
-	/*
-	 * For block backed loop, we know this is a READ
-	 */
-	if (lo->lo_flags & LO_FLAGS_DO_BMAP) {
-		ret = do_bio_filebacked(lo, bio);
-		bio_endio(bio, bio->bi_size, ret);
-	} else {
-		struct bio *rbh = bio->bi_private;
-
-		ret = loop_transfer_bio(lo, bio, rbh);
-
-		bio_endio(rbh, rbh->bi_size, ret);
-		loop_put_buffer(bio);
-	}
+	ret = do_bio_filebacked(lo, bio);
+	bio_endio(bio, bio->bi_size, ret);
 }
 
 /*
@@ -660,6 +501,7 @@
 	struct file	*file;
 	struct inode	*inode;
 	struct block_device *lo_device = NULL;
+	struct address_space *mapping;
 	unsigned lo_blocksize;
 	int		lo_flags = 0;
 	int		error;
@@ -676,35 +518,27 @@
 	if (!file)
 		goto out;
 
-	error = -EINVAL;
-	inode = file->f_dentry->d_inode;
+	mapping = file->f_mapping;
+	inode = mapping->host;
 
 	if (!(file->f_mode & FMODE_WRITE))
 		lo_flags |= LO_FLAGS_READ_ONLY;
 
-	if (S_ISBLK(inode->i_mode)) {
-		lo_device = inode->i_bdev;
-		if (lo_device == bdev) {
-			error = -EBUSY;
-			goto out;
-		}
-		lo_blocksize = block_size(lo_device);
-		if (bdev_read_only(lo_device))
-			lo_flags |= LO_FLAGS_READ_ONLY;
-	} else if (S_ISREG(inode->i_mode)) {
-		struct address_space_operations *aops = inode->i_mapping->a_ops;
+	error = -EINVAL;
+
+	if (S_ISREG(inode->i_mode) || S_ISBLK(inode->i_mode)) {
+		struct address_space_operations *aops = mapping->a_ops;
 		/*
 		 * If we can't read - sorry. If we only can't write - well,
 		 * it's going to be read-only.
 		 */
-		if (!inode->i_fop->sendfile)
+		if (!lo_file->f_op->sendfile)
 			goto out_putf;
 
 		if (!aops->prepare_write || !aops->commit_write)
 			lo_flags |= LO_FLAGS_READ_ONLY;
 
 		lo_blocksize = inode->i_blksize;
-		lo_flags |= LO_FLAGS_DO_BMAP;
 		error = 0;
 	} else
 		goto out_putf;
@@ -728,9 +562,8 @@
 		fput(file);
 		goto out_putf;
 	}
-	lo->old_gfp_mask = mapping_gfp_mask(inode->i_mapping);
-	mapping_set_gfp_mask(inode->i_mapping,
-			     lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS));
+	lo->old_gfp_mask = mapping_gfp_mask(mapping);
+	mapping_set_gfp_mask(mapping, lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS));
 
 	set_blocksize(bdev, lo_blocksize);
 
@@ -743,20 +576,6 @@
 	blk_queue_make_request(lo->lo_queue, loop_make_request);
 	lo->lo_queue->queuedata = lo;
 
-	/*
-	 * we remap to a block device, make sure we correctly stack limits
-	 */
-	if (S_ISBLK(inode->i_mode)) {
-		request_queue_t *q = bdev_get_queue(lo_device);
-
-		blk_queue_max_sectors(lo->lo_queue, q->max_sectors);
-		blk_queue_max_phys_segments(lo->lo_queue,q->max_phys_segments);
-		blk_queue_max_hw_segments(lo->lo_queue, q->max_hw_segments);
-		blk_queue_max_segment_size(lo->lo_queue, q->max_segment_size);
-		blk_queue_segment_boundary(lo->lo_queue, q->seg_boundary_mask);
-		blk_queue_merge_bvec(lo->lo_queue, q->merge_bvec_fn);
-	}
-
 	kernel_thread(loop_thread, lo, CLONE_KERNEL);
 	down(&lo->lo_sem);
 
@@ -846,7 +665,7 @@
 	memset(lo->lo_file_name, 0, LO_NAME_SIZE);
 	invalidate_bdev(bdev, 0);
 	set_capacity(disks[lo->lo_number], 0);
-	mapping_set_gfp_mask(filp->f_dentry->d_inode->i_mapping, gfp);
+	mapping_set_gfp_mask(filp->f_mapping, gfp);
 	lo->lo_state = Lo_unbound;
 	fput(filp);
 	/* This is safe: open() is still holding a reference. */
@@ -1056,19 +875,19 @@
 	return err;
 }
 
-static int lo_ioctl(struct inode * inode, struct file * file,
+static int lo_ioctl(struct block_device *bdev, struct file *file,
 	unsigned int cmd, unsigned long arg)
 {
-	struct loop_device *lo = inode->i_bdev->bd_disk->private_data;
+	struct loop_device *lo = bdev->bd_disk->private_data;
 	int err;
 
 	down(&lo->lo_ctl_mutex);
 	switch (cmd) {
 	case LOOP_SET_FD:
-		err = loop_set_fd(lo, file, inode->i_bdev, arg);
+		err = loop_set_fd(lo, file, bdev, arg);
 		break;
 	case LOOP_CLR_FD:
-		err = loop_clr_fd(lo, inode->i_bdev);
+		err = loop_clr_fd(lo, bdev);
 		break;
 	case LOOP_SET_STATUS:
 		err = loop_set_status_old(lo, (struct loop_info *) arg);
@@ -1089,9 +908,9 @@
 	return err;
 }
 
-static int lo_open(struct inode *inode, struct file *file)
+static int lo_open(struct block_device *bdev, struct file *file)
 {
-	struct loop_device *lo = inode->i_bdev->bd_disk->private_data;
+	struct loop_device *lo = bdev->bd_disk->private_data;
 
 	down(&lo->lo_ctl_mutex);
 	lo->lo_refcnt++;
@@ -1100,9 +919,9 @@
 	return 0;
 }
 
-static int lo_release(struct inode *inode, struct file *file)
+static int lo_release(struct gendisk *disk)
 {
-	struct loop_device *lo = inode->i_bdev->bd_disk->private_data;
+	struct loop_device *lo = disk->private_data;
 
 	down(&lo->lo_ctl_mutex);
 	--lo->lo_refcnt;
@@ -1124,6 +943,7 @@
 MODULE_PARM(max_loop, "i");
 MODULE_PARM_DESC(max_loop, "Maximum number of loop devices (1-256)");
 MODULE_LICENSE("GPL");
+MODULE_ALIAS_BLOCKDEV_MAJOR(LOOP_MAJOR);
 
 int loop_register_transfer(struct loop_func_table *funcs)
 {
--- diff/drivers/block/nbd.c	2003-08-26 10:00:52.000000000 +0100
+++ source/drivers/block/nbd.c	2003-12-29 09:30:40.000000000 +0000
@@ -535,10 +535,10 @@
 	return;
 }
 
-static int nbd_ioctl(struct inode *inode, struct file *file,
+static int nbd_ioctl(struct block_device *bdev, struct file *file,
 		     unsigned int cmd, unsigned long arg)
 {
-	struct nbd_device *lo = inode->i_bdev->bd_disk->private_data;
+	struct nbd_device *lo = bdev->bd_disk->private_data;
 	int error;
 	struct request sreq ;
 
@@ -593,7 +593,7 @@
 		error = -EINVAL;
 		file = fget(arg);
 		if (file) {
-			inode = file->f_dentry->d_inode;
+			struct inode *inode = file->f_dentry->d_inode;
 			if (inode->i_sock) {
 				lo->file = file;
 				lo->sock = SOCKET_I(inode);
@@ -606,20 +606,20 @@
 	case NBD_SET_BLKSIZE:
 		lo->blksize = arg;
 		lo->bytesize &= ~(lo->blksize-1);
-		inode->i_bdev->bd_inode->i_size = lo->bytesize;
-		set_blocksize(inode->i_bdev, lo->blksize);
+		bdev->bd_inode->i_size = lo->bytesize;
+		set_blocksize(bdev, lo->blksize);
 		set_capacity(lo->disk, lo->bytesize >> 9);
 		return 0;
 	case NBD_SET_SIZE:
 		lo->bytesize = arg & ~(lo->blksize-1);
-		inode->i_bdev->bd_inode->i_size = lo->bytesize;
-		set_blocksize(inode->i_bdev, lo->blksize);
+		bdev->bd_inode->i_size = lo->bytesize;
+		set_blocksize(bdev, lo->blksize);
 		set_capacity(lo->disk, lo->bytesize >> 9);
 		return 0;
 	case NBD_SET_SIZE_BLOCKS:
 		lo->bytesize = ((u64) arg) * lo->blksize;
-		inode->i_bdev->bd_inode->i_size = lo->bytesize;
-		set_blocksize(inode->i_bdev, lo->blksize);
+		bdev->bd_inode->i_size = lo->bytesize;
+		set_blocksize(bdev, lo->blksize);
 		set_capacity(lo->disk, lo->bytesize >> 9);
 		return 0;
 	case NBD_DO_IT:
@@ -664,11 +664,11 @@
 	case NBD_PRINT_DEBUG:
 #ifdef PARANOIA
 		printk(KERN_INFO "%s: next = %p, prev = %p. Global: in %d, out %d\n",
-			inode->i_bdev->bd_disk->disk_name, lo->queue_head.next,
+			bdev->bd_disk->disk_name, lo->queue_head.next,
 			lo->queue_head.prev, requests_in, requests_out);
 #else
 		printk(KERN_INFO "%s: next = %p, prev = %p\n",
-			inode->i_bdev->bd_disk->disk_name,
+			bdev->bd_disk->disk_name,
 			lo->queue_head.next, lo->queue_head.prev);
 #endif
 		return 0;
--- diff/drivers/block/paride/pcd.c	2003-08-20 14:16:27.000000000 +0100
+++ source/drivers/block/paride/pcd.c	2003-12-29 09:30:40.000000000 +0000
@@ -243,23 +243,23 @@
 
 /* kernel glue structures */
 
-static int pcd_block_open(struct inode *inode, struct file *file)
+static int pcd_block_open(struct block_device *bdev, struct file *file)
 {
-	struct pcd_unit *cd = inode->i_bdev->bd_disk->private_data;
-	return cdrom_open(&cd->info, inode, file);
+	struct pcd_unit *cd = bdev->bd_disk->private_data;
+	return cdrom_open(&cd->info, bdev, file);
 }
 
-static int pcd_block_release(struct inode *inode, struct file *file)
+static int pcd_block_release(struct gendisk *disk)
 {
-	struct pcd_unit *cd = inode->i_bdev->bd_disk->private_data;
-	return cdrom_release(&cd->info, file);
+	struct pcd_unit *cd = disk->private_data;
+	return cdrom_release(&cd->info);
 }
 
-static int pcd_block_ioctl(struct inode *inode, struct file *file,
+static int pcd_block_ioctl(struct block_device *bdev, struct file *file,
 				unsigned cmd, unsigned long arg)
 {
-	struct pcd_unit *cd = inode->i_bdev->bd_disk->private_data;
-	return cdrom_ioctl(&cd->info, inode, cmd, arg);
+	struct pcd_unit *cd = bdev->bd_disk->private_data;
+	return cdrom_ioctl(&cd->info, bdev, cmd, arg);
 }
 
 static int pcd_block_media_changed(struct gendisk *disk)
--- diff/drivers/block/paride/pd.c	2003-09-17 12:28:04.000000000 +0100
+++ source/drivers/block/paride/pd.c	2003-12-29 09:30:40.000000000 +0000
@@ -236,11 +236,11 @@
 #define IDE_EJECT		0xed
 
 void pd_setup(char *str, int *ints);
-static int pd_open(struct inode *inode, struct file *file);
+static int pd_open(struct block_device *bdev, struct file *file);
 static void do_pd_request(request_queue_t * q);
-static int pd_ioctl(struct inode *inode, struct file *file,
+static int pd_ioctl(struct block_device *bdev, struct file *file,
 		    unsigned int cmd, unsigned long arg);
-static int pd_release(struct inode *inode, struct file *file);
+static int pd_release(struct gendisk *disk);
 static int pd_revalidate(struct gendisk *p);
 static int pd_detect(void);
 static void do_pd_read(void);
@@ -304,8 +304,6 @@
 
 /* kernel glue structures */
 
-extern struct block_device_operations pd_fops;
-
 static struct block_device_operations pd_fops = {
 	.owner		= THIS_MODULE,
 	.open		= pd_open,
@@ -337,9 +335,9 @@
 	}
 }
 
-static int pd_open(struct inode *inode, struct file *file)
+static int pd_open(struct block_device *bdev, struct file *file)
 {
-	struct pd_unit *disk = inode->i_bdev->bd_disk->private_data;
+	struct pd_unit *disk = bdev->bd_disk->private_data;
 
 	disk->access++;
 
@@ -350,10 +348,10 @@
 	return 0;
 }
 
-static int pd_ioctl(struct inode *inode, struct file *file,
+static int pd_ioctl(struct block_device *bdev, struct file *file,
 	 unsigned int cmd, unsigned long arg)
 {
-	struct pd_unit *disk = inode->i_bdev->bd_disk->private_data;
+	struct pd_unit *disk = bdev->bd_disk->private_data;
 	struct hd_geometry *geo = (struct hd_geometry *) arg;
 	struct hd_geometry g;
 
@@ -372,7 +370,7 @@
 			g.sectors = disk->sectors;
 			g.cylinders = disk->cylinders;
 		}
-		g.start = get_start_sect(inode->i_bdev);
+		g.start = get_start_sect(bdev);
 		if (copy_to_user(geo, &g, sizeof(struct hd_geometry)))
 			return -EFAULT;
 		return 0;
@@ -381,9 +379,9 @@
 	}
 }
 
-static int pd_release(struct inode *inode, struct file *file)
+static int pd_release(struct gendisk *p)
 {
-	struct pd_unit *disk = inode->i_bdev->bd_disk->private_data;
+	struct pd_unit *disk = p->private_data;
 
 	if (!--disk->access && disk->removable)
 		pd_doorlock(disk, IDE_DOORUNLOCK);
--- diff/drivers/block/paride/pf.c	2003-08-20 14:16:27.000000000 +0100
+++ source/drivers/block/paride/pf.c	2003-12-29 09:30:40.000000000 +0000
@@ -222,12 +222,12 @@
 #define ATAPI_READ_10		0x28
 #define ATAPI_WRITE_10		0x2a
 
-static int pf_open(struct inode *inode, struct file *file);
+static int pf_open(struct block_device *bdev, struct file *file);
 static void do_pf_request(request_queue_t * q);
-static int pf_ioctl(struct inode *inode, struct file *file,
+static int pf_ioctl(struct block_device *bdev, struct file *file,
 		    unsigned int cmd, unsigned long arg);
 
-static int pf_release(struct inode *inode, struct file *file);
+static int pf_release(struct gendisk *disk);
 
 static int pf_detect(void);
 static void do_pf_read(void);
@@ -315,9 +315,9 @@
 	}
 }
 
-static int pf_open(struct inode *inode, struct file *file)
+static int pf_open(struct block_device *bdev, struct file *file)
 {
-	struct pf_unit *pf = inode->i_bdev->bd_disk->private_data;
+	struct pf_unit *pf = bdev->bd_disk->private_data;
 
 	pf_identify(pf);
 
@@ -334,9 +334,9 @@
 	return 0;
 }
 
-static int pf_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
+static int pf_ioctl(struct block_device *bdev, struct file *file, unsigned int cmd, unsigned long arg)
 {
-	struct pf_unit *pf = inode->i_bdev->bd_disk->private_data;
+	struct pf_unit *pf = bdev->bd_disk->private_data;
 	struct hd_geometry *geo = (struct hd_geometry *) arg;
 	struct hd_geometry g;
 	sector_t capacity;
@@ -365,9 +365,9 @@
 	return 0;
 }
 
-static int pf_release(struct inode *inode, struct file *file)
+static int pf_release(struct gendisk *disk)
 {
-	struct pf_unit *pf = inode->i_bdev->bd_disk->private_data;
+	struct pf_unit *pf = disk->private_data;
 
 	if (pf->access <= 0)
 		return -EINVAL;
--- diff/drivers/block/ps2esdi.c	2003-10-09 09:47:33.000000000 +0100
+++ source/drivers/block/ps2esdi.c	2003-12-29 09:30:40.000000000 +0000
@@ -81,7 +81,7 @@
 static void ps2esdi_normal_interrupt_handler(u_int);
 static void ps2esdi_initial_reset_int_handler(u_int);
 static void ps2esdi_geometry_int_handler(u_int);
-static int ps2esdi_ioctl(struct inode *inode, struct file *file,
+static int ps2esdi_ioctl(struct block_device *bdev, struct file *file,
 			 u_int cmd, u_long arg);
 
 static int ps2esdi_read_status_words(int num_words, int max_words, u_short * buffer);
@@ -1059,10 +1059,10 @@
 
 }
 
-static int ps2esdi_ioctl(struct inode *inode,
+static int ps2esdi_ioctl(struct block_device *bdev,
 			 struct file *file, u_int cmd, u_long arg)
 {
-	struct ps2esdi_i_struct *p = inode->i_bdev->bd_disk->private_data;
+	struct ps2esdi_i_struct *p = bdev->bd_disk->private_data;
 	struct ps2esdi_geometry *geometry = (struct ps2esdi_geometry *) arg;
 	int err;
 
@@ -1073,7 +1073,7 @@
 	put_user(p->head, (char *) &geometry->heads);
 	put_user(p->sect, (char *) &geometry->sectors);
 	put_user(p->cyl, (short *) &geometry->cylinders);
-	put_user(get_start_sect(inode->i_bdev), (long *) &geometry->start);
+	put_user(get_start_sect(bdev), (long *) &geometry->start);
 	return 0;
 }
 
--- diff/drivers/block/rd.c	2003-10-09 09:47:16.000000000 +0100
+++ source/drivers/block/rd.c	2003-12-29 09:30:40.000000000 +0000
@@ -1,15 +1,15 @@
 /*
  * ramdisk.c - Multiple RAM disk driver - gzip-loading version - v. 0.8 beta.
- * 
- * (C) Chad Page, Theodore Ts'o, et. al, 1995. 
+ *
+ * (C) Chad Page, Theodore Ts'o, et. al, 1995.
  *
  * This RAM disk is designed to have filesystems created on it and mounted
- * just like a regular floppy disk.  
- *  
+ * just like a regular floppy disk.
+ *
  * It also does something suggested by Linus: use the buffer cache as the
  * RAM disk data.  This makes it possible to dynamically allocate the RAM disk
- * buffer - with some consequences I have to deal with as I write this. 
- * 
+ * buffer - with some consequences I have to deal with as I write this.
+ *
  * This code is based on the original ramdisk.c, written mostly by
  * Theodore Ts'o (TYT) in 1991.  The code was largely rewritten by
  * Chad Page to use the buffer cache to store the RAM disk data in
@@ -33,7 +33,7 @@
  *
  *  Added initrd: Werner Almesberger & Hans Lermen, Feb '96
  *
- * 4/25/96 : Made RAM disk size a parameter (default is now 4 MB) 
+ * 4/25/96 : Made RAM disk size a parameter (default is now 4 MB)
  *		- Chad Page
  *
  * Add support for fs images split across >1 disk, Paul Gortmaker, Mar '98
@@ -60,7 +60,7 @@
 #include <asm/uaccess.h>
 
 /* The RAM disk size is now a parameter */
-#define NUM_RAMDISKS 16		/* This cannot be overridden (yet) */ 
+#define NUM_RAMDISKS 16		/* This cannot be overridden (yet) */
 
 /* Various static variables go here.  Most are used only in the RAM disk code.
  */
@@ -73,7 +73,7 @@
  * Parameters for the boot-loading of the RAM disk.  These are set by
  * init/main.c (from arguments to the kernel command line) or from the
  * architecture-specific setup routine (from the stored boot sector
- * information). 
+ * information).
  */
 int rd_size = CONFIG_BLK_DEV_RAM_SIZE;		/* Size of the RAM disks */
 /*
@@ -94,7 +94,7 @@
  *               2000 Transmeta Corp.
  * aops copied from ramfs.
  */
-static int ramdisk_readpage(struct file *file, struct page * page)
+static int ramdisk_readpage(struct file *file, struct page *page)
 {
 	if (!PageUptodate(page)) {
 		void *kaddr = kmap_atomic(page, KM_USER0);
@@ -108,7 +108,8 @@
 	return 0;
 }
 
-static int ramdisk_prepare_write(struct file *file, struct page *page, unsigned offset, unsigned to)
+static int ramdisk_prepare_write(struct file *file, struct page *page,
+				unsigned offset, unsigned to)
 {
 	if (!PageUptodate(page)) {
 		void *kaddr = kmap_atomic(page, KM_USER0);
@@ -122,7 +123,8 @@
 	return 0;
 }
 
-static int ramdisk_commit_write(struct file *file, struct page *page, unsigned offset, unsigned to)
+static int ramdisk_commit_write(struct file *file, struct page *page,
+				unsigned offset, unsigned to)
 {
 	return 0;
 }
@@ -212,7 +214,7 @@
  * 19-JAN-1998  Richard Gooch <rgooch@atnf.csiro.au>  Added devfs support
  *
  */
-static int rd_make_request(request_queue_t * q, struct bio *bio)
+static int rd_make_request(request_queue_t *q, struct bio *bio)
 {
 	struct block_device *bdev = bio->bi_bdev;
 	struct address_space * mapping = bdev->bd_inode->i_mapping;
@@ -242,17 +244,19 @@
 	return 0;
 } 
 
-static int rd_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
+static int rd_ioctl(struct block_device *bdev, struct file *file,
+			unsigned int cmd, unsigned long arg)
 {
 	int error;
-	struct block_device *bdev = inode->i_bdev;
 
 	if (cmd != BLKFLSBUF)
 		return -EINVAL;
 
-	/* special: we want to release the ramdisk memory,
-	   it's not like with the other blockdevices where
-	   this ioctl only flushes away the buffer cache. */
+	/*
+	 * special: we want to release the ramdisk memory, it's not like with
+	 * the other blockdevices where this ioctl only flushes away the buffer
+	 * cache
+	 */
 	error = -EBUSY;
 	down(&bdev->bd_sem);
 	if (bdev->bd_openers <= 2) {
@@ -268,16 +272,15 @@
 	.memory_backed	= 1,	/* Does not contribute to dirty memory */
 };
 
-static int rd_open(struct inode * inode, struct file * filp)
+static int rd_open(struct block_device *bdev, struct file *filp)
 {
-	unsigned unit = iminor(inode);
+	unsigned unit = MINOR(bdev->bd_dev);
 
 	/*
 	 * Immunize device against invalidate_buffers() and prune_icache().
 	 */
 	if (rd_bdev[unit] == NULL) {
-		struct block_device *bdev = inode->i_bdev;
-		inode = igrab(bdev->bd_inode);
+		struct inode *inode = igrab(bdev->bd_inode);
 		rd_bdev[unit] = bdev;
 		bdev->bd_openers++;
 		bdev->bd_block_size = rd_blocksize;
@@ -295,12 +298,14 @@
 	.ioctl =	rd_ioctl,
 };
 
-/* Before freeing the module, invalidate all of the protected buffers! */
-static void __exit rd_cleanup (void)
+/*
+ * Before freeing the module, invalidate all of the protected buffers!
+ */
+static void __exit rd_cleanup(void)
 {
 	int i;
 
-	for (i = 0 ; i < NUM_RAMDISKS; i++) {
+	for (i = 0; i < NUM_RAMDISKS; i++) {
 		struct block_device *bdev = rd_bdev[i];
 		rd_bdev[i] = NULL;
 		if (bdev) {
@@ -311,17 +316,19 @@
 		put_disk(rd_disks[i]);
 	}
 	devfs_remove("rd");
-	unregister_blkdev(RAMDISK_MAJOR, "ramdisk" );
+	unregister_blkdev(RAMDISK_MAJOR, "ramdisk");
 }
 
-/* This is the registration and initialization section of the RAM disk driver */
-static int __init rd_init (void)
+/*
+ * This is the registration and initialization section of the RAM disk driver
+ */
+static int __init rd_init(void)
 {
 	int i;
 	int err = -ENOMEM;
 
 	if (rd_blocksize > PAGE_SIZE || rd_blocksize < 512 ||
-	    (rd_blocksize & (rd_blocksize-1))) {
+			(rd_blocksize & (rd_blocksize-1))) {
 		printk("RAMDISK: wrong blocksize %d, reverting to defaults\n",
 		       rd_blocksize);
 		rd_blocksize = BLOCK_SIZE;
@@ -362,8 +369,8 @@
 
 	/* rd_size is given in kB */
 	printk("RAMDISK driver initialized: "
-	       "%d RAM disks of %dK size %d blocksize\n",
-	       NUM_RAMDISKS, rd_size, rd_blocksize);
+		"%d RAM disks of %dK size %d blocksize\n",
+		NUM_RAMDISKS, rd_size, rd_blocksize);
 
 	return 0;
 out_queue:
--- diff/drivers/block/scsi_ioctl.c	2003-12-19 09:51:11.000000000 +0000
+++ source/drivers/block/scsi_ioctl.c	2003-12-29 09:30:40.000000000 +0000
@@ -312,7 +312,7 @@
 		return -EFAULT;
 	if (in_len > PAGE_SIZE || out_len > PAGE_SIZE)
 		return -EINVAL;
-	if (get_user(opcode, sic->data))
+	if (get_user(opcode, (int *)sic->data))
 		return -EFAULT;
 
 	bytes = max(in_len, out_len);
--- diff/drivers/block/swim3.c	2003-08-20 14:16:27.000000000 +0100
+++ source/drivers/block/swim3.c	2003-12-29 09:30:40.000000000 +0000
@@ -239,10 +239,9 @@
 		      int interruptible);
 static void release_drive(struct floppy_state *fs);
 static int fd_eject(struct floppy_state *fs);
-static int floppy_ioctl(struct inode *inode, struct file *filp,
+static int floppy_ioctl(struct block_device *bdev, struct file *filp,
 			unsigned int cmd, unsigned long param);
-static int floppy_open(struct inode *inode, struct file *filp);
-static int floppy_release(struct inode *inode, struct file *filp);
+static int floppy_open(struct block_device *bdev, struct file *filp);
 static int floppy_check_change(struct gendisk *disk);
 static int floppy_revalidate(struct gendisk *disk);
 static int swim3_add_device(struct device_node *swims);
@@ -811,10 +810,10 @@
 static struct floppy_struct floppy_type =
 	{ 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,NULL };	/*  7 1.44MB 3.5"   */
 
-static int floppy_ioctl(struct inode *inode, struct file *filp,
+static int floppy_ioctl(struct block_device *bdev, struct file *filp,
 			unsigned int cmd, unsigned long param)
 {
-	struct floppy_state *fs = inode->i_bdev->bd_disk->private_data;
+	struct floppy_state *fs = bdev->bd_disk->private_data;
 	int err;
 		
 	if ((cmd & 0x80) && !capable(CAP_SYS_ADMIN))
@@ -838,9 +837,9 @@
 	return -ENOTTY;
 }
 
-static int floppy_open(struct inode *inode, struct file *filp)
+static int floppy_open(struct block_device *bdev, struct file *filp)
 {
-	struct floppy_state *fs = inode->i_bdev->bd_disk->private_data;
+	struct floppy_state *fs = bdev->bd_disk->private_data;
 	volatile struct swim3 *sw = fs->swim3;
 	int n, err = 0;
 
@@ -876,7 +875,7 @@
 
 	if (err == 0 && (filp->f_flags & O_NDELAY) == 0
 	    && (filp->f_mode & 3)) {
-		check_disk_change(inode->i_bdev);
+		check_disk_change(bdev);
 		if (fs->ejected)
 			err = -ENXIO;
 	}
@@ -904,9 +903,9 @@
 	return 0;
 }
 
-static int floppy_release(struct inode *inode, struct file *filp)
+static int floppy_release(struct gendisk *disk)
 {
-	struct floppy_state *fs = inode->i_bdev->bd_disk->private_data;
+	struct floppy_state *fs = disk->private_data;
 	volatile struct swim3 *sw = fs->swim3;
 	if (fs->ref_count > 0 && --fs->ref_count == 0) {
 		swim3_action(fs, MOTOR_OFF);
--- diff/drivers/block/swim_iop.c	2003-10-09 09:47:33.000000000 +0100
+++ source/drivers/block/swim_iop.c	2003-12-29 09:30:40.000000000 +0000
@@ -98,10 +98,10 @@
 static void swimiop_status_update(int, struct swim_drvstatus *);
 static int swimiop_eject(struct floppy_state *fs);
 
-static int floppy_ioctl(struct inode *inode, struct file *filp,
+static int floppy_ioctl(struct block_device *bdev, struct file *filp,
 			unsigned int cmd, unsigned long param);
-static int floppy_open(struct inode *inode, struct file *filp);
-static int floppy_release(struct inode *inode, struct file *filp);
+static int floppy_open(struct block_device *bdev, struct file *filp);
+static int floppy_release(struct gendisk *disk);
 static int floppy_check_change(struct gendisk *disk);
 static int floppy_revalidate(struct gendisk *disk);
 static int grab_drive(struct floppy_state *fs, enum swim_state state,
@@ -348,10 +348,10 @@
 static struct floppy_struct floppy_type =
 	{ 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,NULL };	/*  7 1.44MB 3.5"   */
 
-static int floppy_ioctl(struct inode *inode, struct file *filp,
+static int floppy_ioctl(struct block_device *bdev, struct file *filp,
 			unsigned int cmd, unsigned long param)
 {
-	struct floppy_state *fs = inode->i_bdev->bd_disk->private_data;
+	struct floppy_state *fs = bdev->bd_disk->private_data;
 	int err;
 
 	if ((cmd & 0x80) && !capable(CAP_SYS_ADMIN))
@@ -372,15 +372,15 @@
 	return -ENOTTY;
 }
 
-static int floppy_open(struct inode *inode, struct file *filp)
+static int floppy_open(struct block_device *bdev, struct file *filp)
 {
-	struct floppy_state *fs = inode->i_bdev->bd_disk->private_data;
+	struct floppy_state *fs = bdev->bd_disk->private_data;
 
 	if (fs->ref_count == -1 || filp->f_flags & O_EXCL)
 		return -EBUSY;
 
 	if ((filp->f_flags & O_NDELAY) == 0 && (filp->f_mode & 3)) {
-		check_disk_change(inode->i_bdev);
+		check_disk_change(bdev);
 		if (fs->ejected)
 			return -ENXIO;
 	}
@@ -396,9 +396,9 @@
 	return 0;
 }
 
-static int floppy_release(struct inode *inode, struct file *filp)
+static int floppy_release(struct gendisk *disk)
 {
-	struct floppy_state *fs = inode->i_bdev->bd_disk->private_data;
+	struct floppy_state *fs = disk->private_data;
 	if (fs->ref_count > 0)
 		fs->ref_count--;
 	return 0;
--- diff/drivers/block/umem.c	2003-09-30 15:46:12.000000000 +0100
+++ source/drivers/block/umem.c	2003-12-29 09:30:40.000000000 +0000
@@ -153,7 +153,6 @@
 };
 
 static struct cardinfo cards[MM_MAXCARDS];
-static struct block_device_operations mm_fops;
 static struct timer_list battery_timer;
 
 static int num_cards = 0;
@@ -818,10 +817,10 @@
 --                            mm_ioctl
 -----------------------------------------------------------------------------------
 */
-static int mm_ioctl(struct inode *i, struct file *f, unsigned int cmd, unsigned long arg)
+static int mm_ioctl(struct block_device *bdev, struct file *f, unsigned int cmd, unsigned long arg)
 {
 	if (cmd == HDIO_GETGEO) {
-		struct cardinfo *card = i->i_bdev->bd_disk->private_data;
+		struct cardinfo *card = bdev->bd_disk->private_data;
 		int size = card->mm_size * (1024 / MM_HARDSECT);
 		struct hd_geometry geo;
 		/*
@@ -831,7 +830,7 @@
 		 */
 		geo.heads     = 64;
 		geo.sectors   = 32;
-		geo.start     = get_start_sect(i->i_bdev);
+		geo.start     = get_start_sect(bdev);
 		geo.cylinders = size / (geo.heads * geo.sectors);
 
 		if (copy_to_user((void *) arg, &geo, sizeof(geo)))
--- diff/drivers/block/xd.c	2003-09-30 15:46:12.000000000 +0100
+++ source/drivers/block/xd.c	2003-12-29 09:30:40.000000000 +0000
@@ -322,9 +322,9 @@
 }
 
 /* xd_ioctl: handle device ioctl's */
-static int xd_ioctl (struct inode *inode,struct file *file,u_int cmd,u_long arg)
+static int xd_ioctl (struct block_device *bdev,struct file *file,u_int cmd,u_long arg)
 {
-	XD_INFO *p = inode->i_bdev->bd_disk->private_data;
+	XD_INFO *p = bdev->bd_disk->private_data;
 
 	switch (cmd) {
 		case HDIO_GETGEO:
@@ -334,7 +334,7 @@
 			g.heads = p->heads;
 			g.sectors = p->sectors;
 			g.cylinders = p->cylinders;
-			g.start = get_start_sect(inode->i_bdev);
+			g.start = get_start_sect(bdev);
 			return copy_to_user(geometry, &g, sizeof g) ? -EFAULT : 0;
 		}
 		case HDIO_SET_DMA:
--- diff/drivers/block/xd.h	2003-05-21 11:50:14.000000000 +0100
+++ source/drivers/block/xd.h	2003-12-29 09:30:40.000000000 +0000
@@ -105,7 +105,7 @@
 static u_char xd_initdrives (void (*init_drive)(u_char drive));
 
 static void do_xd_request (request_queue_t * q);
-static int xd_ioctl (struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg);
+static int xd_ioctl (struct block_device *bdev,struct file *file,unsigned int cmd,unsigned long arg);
 static int xd_readwrite (u_char operation,XD_INFO *disk,char *buffer,u_int block,u_int count);
 static void xd_recalibrate (u_char drive);
 
--- diff/drivers/block/z2ram.c	2003-09-30 15:46:12.000000000 +0100
+++ source/drivers/block/z2ram.c	2003-12-29 09:30:40.000000000 +0000
@@ -67,7 +67,6 @@
 
 static spinlock_t z2ram_lock = SPIN_LOCK_UNLOCKED;
 
-static struct block_device_operations z2_fops;
 static struct gendisk *z2ram_gendisk;
 
 static void do_z2_request(request_queue_t *q)
@@ -141,7 +140,7 @@
 }
 
 static int
-z2_open( struct inode *inode, struct file *filp )
+z2_open( struct block_device *bdev, struct file *filp )
 {
     int device;
     int max_z2_map = ( Z2RAM_SIZE / Z2RAM_CHUNKSIZE ) *
@@ -150,7 +149,7 @@
 	sizeof( z2ram_map[0] );
     int rc = -ENOMEM;
 
-    device = iminor(inode);
+    device = MINOR(bdev->bd_dev);
 
     if ( current_device != -1 && current_device != device )
     {
@@ -301,8 +300,7 @@
     return rc;
 }
 
-static int
-z2_release( struct inode *inode, struct file *filp )
+static int z2_release(struct gendisk *disk)
 {
     if ( current_device == -1 )
 	return 0;     
--- diff/drivers/cdrom/aztcd.c	2003-09-17 12:28:04.000000000 +0100
+++ source/drivers/cdrom/aztcd.c	2003-12-29 09:30:40.000000000 +0000
@@ -330,10 +330,10 @@
 
 /* Kernel Interface Functions */
 static int check_aztcd_media_change(struct gendisk *disk);
-static int aztcd_ioctl(struct inode *ip, struct file *fp, unsigned int cmd,
+static int aztcd_ioctl(struct block_device *bdev, struct file *fp, unsigned int cmd,
 		       unsigned long arg);
-static int aztcd_open(struct inode *ip, struct file *fp);
-static int aztcd_release(struct inode *inode, struct file *file);
+static int aztcd_open(struct block_device *bdev, struct file *fp);
+static int aztcd_release(struct gendisk *disk);
 
 static struct block_device_operations azt_fops = {
 	.owner		= THIS_MODULE,
@@ -1153,7 +1153,7 @@
 /*
  * Kernel IO-controls
 */
-static int aztcd_ioctl(struct inode *ip, struct file *fp, unsigned int cmd,
+static int aztcd_ioctl(struct block_device *bdev, struct file *fp, unsigned int cmd,
 		       unsigned long arg)
 {
 	int i;
@@ -1171,8 +1171,6 @@
 	       cmd, jiffies);
 	printk("aztcd Status %x\n", getAztStatus());
 #endif
-	if (!ip)
-		RETURNM("aztcd_ioctl 1", -EINVAL);
 	if (getAztStatus() < 0)
 		RETURNM("aztcd_ioctl 2", -EIO);
 	if ((!aztTocUpToDate) || (aztDiskChanged)) {
@@ -1624,7 +1622,7 @@
 /*
  * Open the device special file.  Check that a disk is in.
  */
-static int aztcd_open(struct inode *ip, struct file *fp)
+static int aztcd_open(struct block_device *bdev, struct file *fp)
 {
 	int st;
 
@@ -1673,12 +1671,11 @@
 /*
  * On close, we flush all azt blocks from the buffer cache.
  */
-static int aztcd_release(struct inode *inode, struct file *file)
+static int aztcd_release(struct gendisk *disk)
 {
 #ifdef AZT_DEBUG
 	printk("aztcd: executing aztcd_release\n");
-	printk("inode: %p, device: %s    file: %p\n", inode,
-	       inode->i_bdev->bd_disk->disk_name, file);
+	printk("disk: %p, device: %s\n", disk, disk->disk_name);
 #endif
 	if (!--azt_open_count) {
 		azt_invalidate_buffers();
--- diff/drivers/cdrom/cdrom.c	2003-10-09 09:47:33.000000000 +0100
+++ source/drivers/cdrom/cdrom.c	2003-12-29 09:30:40.000000000 +0000
@@ -228,10 +228,16 @@
    3.12 Oct 18, 2000 - Jens Axboe <axboe@suse.de>
   -- Use quiet bit on packet commands not known to work
 
+   3.20 Dec 17, 2003 - Jens Axboe <axboe@suse.de>
+  -- Various fixes and lots of cleanups not listed :-)
+  -- Locking fixes
+  -- Mt Rainier support
+  -- DVD-RAM write open fixes
+
 -------------------------------------------------------------------------*/
 
-#define REVISION "Revision: 3.12"
-#define VERSION "Id: cdrom.c 3.12 2000/10/18"
+#define REVISION "Revision: 3.20"
+#define VERSION "Id: cdrom.c 3.20 2003/12/17"
 
 /* I use an error-log mask to give fine grain control over the type of
    messages dumped to the system logs.  The available masks include: */
@@ -282,11 +288,25 @@
 static int lockdoor = 1;
 /* will we ever get to use this... sigh. */
 static int check_media_type;
+/* automatically restart mrw format */
+static int mrw_format_restart = 1;
 MODULE_PARM(debug, "i");
 MODULE_PARM(autoclose, "i");
 MODULE_PARM(autoeject, "i");
 MODULE_PARM(lockdoor, "i");
 MODULE_PARM(check_media_type, "i");
+MODULE_PARM(mrw_format_restart, "i");
+
+static spinlock_t cdrom_lock = SPIN_LOCK_UNLOCKED;
+
+static const char *mrw_format_status[] = {
+	"not mrw",
+	"bgformat inactive",
+	"bgformat active",
+	"mrw complete",
+};
+
+static const char *mrw_address_space[] = { "DMA", "GAA" };
 
 #if (ERRLOGMASK!=CD_NOTHING)
 #define cdinfo(type, fmt, args...) \
@@ -325,6 +345,10 @@
 static int cdrom_get_next_writable(struct cdrom_device_info *, long *);
 static void cdrom_count_tracks(struct cdrom_device_info *, tracktype*);
 
+static int cdrom_mrw_exit(struct cdrom_device_info *cdi);
+
+static int cdrom_get_disc_info(struct cdrom_device_info *cdi, disc_information *di);
+
 #ifdef CONFIG_SYSCTL
 static void cdrom_sysctl_register(void);
 #endif /* CONFIG_SYSCTL */ 
@@ -347,13 +371,14 @@
 
 	if (cdo->open == NULL || cdo->release == NULL)
 		return -2;
-	if ( !banner_printed ) {
+	if (!banner_printed) {
 		printk(KERN_INFO "Uniform CD-ROM driver " REVISION "\n");
 		banner_printed = 1;
 #ifdef CONFIG_SYSCTL
 		cdrom_sysctl_register();
 #endif /* CONFIG_SYSCTL */ 
 	}
+
 	ENSURE(drive_status, CDC_DRIVE_STATUS );
 	ENSURE(media_changed, CDC_MEDIA_CHANGED);
 	ENSURE(tray_move, CDC_CLOSE_TRAY | CDC_OPEN_TRAY);
@@ -367,6 +392,7 @@
 	ENSURE(generic_packet, CDC_GENERIC_PACKET);
 	cdi->mc_flags = 0;
 	cdo->n_minors = 0;
+	cdi->for_data = 0;
         cdi->options = CDO_USE_FFLAGS;
 	
 	if (autoclose==1 && CDROM_CAN(CDC_CLOSE_TRAY))
@@ -378,9 +404,14 @@
 	if (check_media_type==1)
 		cdi->options |= (int) CDO_CHECK_TYPE;
 
+	if (CDROM_CAN(CDC_MRW_W))
+		cdi->exit = cdrom_mrw_exit;
+
 	cdinfo(CD_REG_UNREG, "drive \"/dev/%s\" registered\n", cdi->name);
+	spin_lock(&cdrom_lock);
 	cdi->next = topCdromPtr; 	
 	topCdromPtr = cdi;
+	spin_unlock(&cdrom_lock);
 	return 0;
 }
 #undef ENSURE
@@ -391,23 +422,305 @@
 	cdinfo(CD_OPEN, "entering unregister_cdrom\n"); 
 
 	prev = NULL;
+	spin_lock(&cdrom_lock);
 	cdi = topCdromPtr;
 	while (cdi && cdi != unreg) {
 		prev = cdi;
 		cdi = cdi->next;
 	}
 
-	if (cdi == NULL)
+	if (cdi == NULL) {
+		spin_unlock(&cdrom_lock);
 		return -2;
+	}
 	if (prev)
 		prev->next = cdi->next;
 	else
 		topCdromPtr = cdi->next;
+
+	spin_unlock(&cdrom_lock);
+
+	if (cdi->exit)
+		cdi->exit(cdi);
+
 	cdi->ops->n_minors--;
 	cdinfo(CD_REG_UNREG, "drive \"/dev/%s\" unregistered\n", cdi->name);
 	return 0;
 }
 
+int cdrom_get_media_event(struct cdrom_device_info *cdi,
+			  struct media_event_desc *med)
+{
+	struct cdrom_generic_command cgc;
+	unsigned char buffer[8];
+	struct event_header *eh = (struct event_header *) buffer;
+
+	init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
+	cgc.cmd[0] = GPCMD_GET_EVENT_STATUS_NOTIFICATION;
+	cgc.cmd[1] = 1;		/* IMMED */
+	cgc.cmd[4] = 1 << 4;	/* media event */
+	cgc.cmd[8] = sizeof(buffer);
+	cgc.quiet = 1;
+
+	if (cdi->ops->generic_packet(cdi, &cgc))
+		return 1;
+
+	if (be16_to_cpu(eh->data_len) < sizeof(*med))
+		return 1;
+
+	memcpy(med, &buffer[sizeof(*eh)], sizeof(*med));
+	return 0;
+}
+
+/*
+ * the first prototypes used 0x2c as the page code for the mrw mode page,
+ * subsequently this was changed to 0x03. probe the one used by this drive
+ */
+int cdrom_mrw_probe_pc(struct cdrom_device_info *cdi)
+{
+	struct cdrom_generic_command cgc;
+	char buffer[16];
+
+	init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
+
+	cgc.timeout = HZ;
+	cgc.quiet = 1;
+
+	if (!cdrom_mode_sense(cdi, &cgc, MRW_MODE_PC, 0)) {
+		cdi->mrw_mode_page = MRW_MODE_PC;
+		return 0;
+	} else if (!cdrom_mode_sense(cdi, &cgc, MRW_MODE_PC_PRE1, 0)) {
+		cdi->mrw_mode_page = MRW_MODE_PC_PRE1;
+		return 0;
+	}
+
+	printk(KERN_ERR "cdrom: %s: unknown mrw mode page\n", cdi->name);
+	return 1;
+}
+
+int cdrom_is_mrw(struct cdrom_device_info *cdi, int *write)
+{
+	struct cdrom_generic_command cgc;
+	struct mrw_feature_desc *mfd;
+	unsigned char buffer[16];
+	int ret;
+
+	init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
+
+	cgc.cmd[0] = GPCMD_GET_CONFIGURATION;
+	cgc.cmd[3] = CDF_MRW;
+	cgc.cmd[8] = sizeof(buffer);
+	cgc.quiet = 1;
+
+	if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
+		return ret;
+
+	mfd = (struct mrw_feature_desc *)&buffer[sizeof(struct feature_header)];
+	*write = mfd->write;
+
+	if ((ret = cdrom_mrw_probe_pc(cdi)))
+		return ret;
+
+	return 0;
+}
+
+static int cdrom_mrw_bgformat(struct cdrom_device_info *cdi, int cont)
+{
+	struct cdrom_generic_command cgc;
+	unsigned char buffer[12];
+	int ret;
+
+	printk(KERN_INFO "cdrom: %sstarting format\n", cont ? "Re" : "");
+
+	/*
+	 * FmtData bit set (bit 4), format type is 1
+	 */
+	init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_WRITE);
+	cgc.cmd[0] = GPCMD_FORMAT_UNIT;
+	cgc.cmd[1] = (1 << 4) | 1;
+
+	cgc.timeout = 5 * 60 * HZ;
+
+	/*
+	 * 4 byte format list header, 8 byte format list descriptor
+	 */
+	buffer[1] = 1 << 1;
+	buffer[3] = 8;
+
+	/*
+	 * nr_blocks field
+	 */
+	buffer[4] = 0xff;
+	buffer[5] = 0xff;
+	buffer[6] = 0xff;
+	buffer[7] = 0xff;
+
+	buffer[8] = 0x24 << 2;
+	buffer[11] = cont;
+
+	ret = cdi->ops->generic_packet(cdi, &cgc);
+	if (ret)
+		printk(KERN_INFO "cdrom: bgformat failed\n");
+
+	return ret;
+}
+
+static int cdrom_mrw_bgformat_susp(struct cdrom_device_info *cdi, int immed)
+{
+	struct cdrom_generic_command cgc;
+
+	init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
+	cgc.cmd[0] = GPCMD_CLOSE_TRACK;
+
+	/*
+	 * Session = 1, Track = 0
+	 */
+	cgc.cmd[1] = !!immed;
+	cgc.cmd[2] = 1 << 1;
+
+	cgc.timeout = 5 * 60 * HZ;
+
+	return cdi->ops->generic_packet(cdi, &cgc);
+}
+
+static int cdrom_flush_cache(struct cdrom_device_info *cdi)
+{
+	struct cdrom_generic_command cgc;
+
+	init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
+	cgc.cmd[0] = GPCMD_FLUSH_CACHE;
+
+	cgc.timeout = 5 * 60 * HZ;
+
+	return cdi->ops->generic_packet(cdi, &cgc);
+}
+
+static int cdrom_mrw_exit(struct cdrom_device_info *cdi)
+{
+	disc_information di;
+	int ret = 0;
+
+	if (cdrom_get_disc_info(cdi, &di))
+		return 1;
+
+	if (di.mrw_status == CDM_MRW_BGFORMAT_ACTIVE) {
+		printk(KERN_INFO "cdrom: issuing MRW back ground format suspend\n");
+		ret = cdrom_mrw_bgformat_susp(cdi, 0);
+	}
+
+	if (!ret)
+		ret = cdrom_flush_cache(cdi);
+
+	return ret;
+}
+
+static int cdrom_mrw_set_lba_space(struct cdrom_device_info *cdi, int space)
+{
+	struct cdrom_generic_command cgc;
+	struct mode_page_header *mph;
+	char buffer[16];
+	int ret, offset, size;
+
+	init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
+
+	cgc.buffer = buffer;
+	cgc.buflen = sizeof(buffer);
+
+	if ((ret = cdrom_mode_sense(cdi, &cgc, cdi->mrw_mode_page, 0)))
+		return ret;
+
+	mph = (struct mode_page_header *) buffer;
+	offset = be16_to_cpu(mph->desc_length);
+	size = be16_to_cpu(mph->mode_data_length) + 2;
+
+	buffer[offset + 3] = space;
+	cgc.buflen = size;
+
+	if ((ret = cdrom_mode_select(cdi, &cgc)))
+		return ret;
+
+	printk(KERN_INFO "cdrom: %s: mrw address space %s selected\n", cdi->name, mrw_address_space[space]);
+	return 0;
+}
+
+static int cdrom_media_erasable(struct cdrom_device_info *cdi)
+{
+	disc_information di;
+
+	if (cdrom_get_disc_info(cdi, &di))
+		return 0;
+
+	return di.erasable;
+}
+
+/*
+ * FIXME: check RO bit
+ */
+static int cdrom_dvdram_open_write(struct cdrom_device_info *cdi)
+{
+	return !cdrom_media_erasable(cdi);
+}
+
+static int cdrom_mrw_open_write(struct cdrom_device_info *cdi)
+{
+	disc_information di;
+	int ret;
+
+	/*
+	 * always reset to DMA lba space on open
+	 */
+	if (cdrom_mrw_set_lba_space(cdi, MRW_LBA_DMA)) {
+		printk(KERN_ERR "cdrom: failed setting lba address space\n");
+		return 1;
+	}
+
+	if (cdrom_get_disc_info(cdi, &di))
+		return 1;
+
+	if (!di.erasable)
+		return 1;
+
+	/*
+	 * mrw_status
+	 * 0	-	not MRW formatted
+	 * 1	-	MRW bgformat started, but not running or complete
+	 * 2	-	MRW bgformat in progress
+	 * 3	-	MRW formatting complete
+	 */
+	ret = 0;
+	printk(KERN_INFO "cdrom open: mrw_status '%s'\n", mrw_format_status[di.mrw_status]);
+	if (!di.mrw_status)
+		ret = 1;
+	else if (di.mrw_status == CDM_MRW_BGFORMAT_INACTIVE && mrw_format_restart)
+		ret = cdrom_mrw_bgformat(cdi, 1);
+
+	return ret;
+}
+
+/*
+ * returns 0 for ok to open write, non-0 to disallow
+ */
+static int cdrom_open_write(struct cdrom_device_info *cdi)
+{
+	int ret = 1;
+
+	if (CDROM_CAN(CDC_MRW_W))
+		ret = cdrom_mrw_open_write(cdi);
+	else if (CDROM_CAN(CDC_DVD_RAM))
+		ret = cdrom_dvdram_open_write(cdi);
+
+	return ret;
+}
+
+static int cdrom_close_write(struct cdrom_device_info *cdi)
+{
+#if 0
+	return cdrom_flush_cache(cdi);
+#else
+	return 0;
+#endif
+}
+
 /* We use the open-option O_NONBLOCK to indicate that the
  * purpose of opening is only for subsequent ioctl() calls; no device
  * integrity checks are performed.
@@ -416,28 +729,36 @@
  * is in their own interest: device control becomes a lot easier
  * this way.
  */
-int cdrom_open(struct cdrom_device_info *cdi, struct inode *ip, struct file *fp)
+int cdrom_open(struct cdrom_device_info *cdi, struct block_device *bdev, struct file *fp)
 {
 	int ret;
 
 	cdinfo(CD_OPEN, "entering cdrom_open\n"); 
+	cdi->use_count++;
+	ret = -EROFS;
+	if (fp->f_mode & FMODE_WRITE) {
+		if (!(CDROM_CAN(CDC_RAM) || CDROM_CAN(CDC_MO_DRIVE)))
+			goto out;
+		if (cdrom_open_write(cdi))
+			goto out;
+	}
+
 	/* if this was a O_NONBLOCK open and we should honor the flags,
 	 * do a quick open without drive/disc integrity checks. */
 	if ((fp->f_flags & O_NONBLOCK) && (cdi->options & CDO_USE_FFLAGS))
 		ret = cdi->ops->open(cdi, 1);
-	else {
-		if ((fp->f_mode & FMODE_WRITE) && !CDROM_CAN(CDC_DVD_RAM))
-			return -EROFS;
-
+	else
 		ret = open_for_data(cdi);
-	}
 
 	if (!ret) cdi->use_count++;
 
 	cdinfo(CD_OPEN, "Use count for \"/dev/%s\" now %d\n", cdi->name, cdi->use_count);
 	/* Do this on open.  Don't wait for mount, because they might
 	    not be mounting, but opening with O_NONBLOCK */
-	check_disk_change(ip->i_bdev);
+	check_disk_change(bdev);
+out:
+	if (ret)
+		cdi->use_count--;
 	return ret;
 }
 
@@ -525,11 +846,12 @@
 		cdinfo(CD_OPEN, "open device failed.\n"); 
 		goto clean_up_and_return;
 	}
-	if (CDROM_CAN(CDC_LOCK) && cdi->options & CDO_LOCK) {
+	if (CDROM_CAN(CDC_LOCK) && (cdi->options & CDO_LOCK)) {
 			cdo->lock_door(cdi, 1);
 			cdinfo(CD_OPEN, "door locked.\n");
 	}
 	cdinfo(CD_OPEN, "device opened successfully.\n"); 
+	cdi->for_data = 1;
 	return ret;
 
 	/* Something failed.  Try to unlock the drive, because some drivers
@@ -603,32 +925,39 @@
 	return 0;
 }
 
-
 /* Admittedly, the logic below could be performed in a nicer way. */
-int cdrom_release(struct cdrom_device_info *cdi, struct file *fp)
+int cdrom_release(struct cdrom_device_info *cdi)
 {
 	struct cdrom_device_ops *cdo = cdi->ops;
-	int opened_for_data;
 
 	cdinfo(CD_CLOSE, "entering cdrom_release\n"); 
 
 	if (cdi->use_count > 0)
 		cdi->use_count--;
-	if (cdi->use_count == 0)
-		cdinfo(CD_CLOSE, "Use count for \"/dev/%s\" now zero\n", cdi->name);
-	if (cdi->use_count == 0 &&
-	    cdo->capability & CDC_LOCK && !keeplocked) {
+
+	if (cdi->use_count) {
+		cdo->release(cdi);
+		return 0;
+	}
+
+	cdinfo(CD_CLOSE, "Use count for \"/dev/%s\" now zero\n", cdi->name);
+	if ((cdo->capability & CDC_LOCK) && !keeplocked) {
 		cdinfo(CD_CLOSE, "Unlocking door!\n");
 		cdo->lock_door(cdi, 0);
 	}
-	opened_for_data = !(cdi->options & CDO_USE_FFLAGS) ||
-		!(fp && fp->f_flags & O_NONBLOCK);
+
+	/*
+	 * flush cache on last write release
+	 */
+	if (CDROM_CAN(CDC_RAM) && !cdi->use_count && cdi->for_data)
+		cdrom_close_write(cdi);
+
 	cdo->release(cdi);
-	if (cdi->use_count == 0) {      /* last process that closes dev*/
-		if (opened_for_data &&
-		    cdi->options & CDO_AUTO_EJECT && CDROM_CAN(CDC_OPEN_TRAY))
-			cdo->tray_move(cdi, 1);
-	}
+	if (cdi->for_data &&
+	    cdi->options & CDO_AUTO_EJECT && CDROM_CAN(CDC_OPEN_TRAY))
+		cdo->tray_move(cdi, 1);
+
+	cdi->for_data = 0;
 	return 0;
 }
 
@@ -1433,14 +1762,14 @@
  * these days. ATAPI / SCSI specific code now mainly resides in
  * mmc_ioct().
  */
-int cdrom_ioctl(struct cdrom_device_info *cdi, struct inode *ip,
+int cdrom_ioctl(struct cdrom_device_info *cdi, struct block_device *bdev,
 		unsigned int cmd, unsigned long arg)
 {
 	struct cdrom_device_ops *cdo = cdi->ops;
 	int ret;
 
 	/* Try the generic SCSI command ioctl's first.. */
-	ret = scsi_cmd_ioctl(ip->i_bdev, cmd, arg);
+	ret = scsi_cmd_ioctl(bdev, cmd, arg);
 	if (ret != -ENOTTY)
 		return ret;
 
@@ -1593,7 +1922,7 @@
 		cdinfo(CD_DO_IOCTL, "entering CDROM_RESET\n");
 		if (!CDROM_CAN(CDC_RESET))
 			return -ENOSYS;
-		invalidate_bdev(ip->i_bdev, 0);
+		invalidate_bdev(bdev, 0);
 		return cdo->reset(cdi);
 		}
 
@@ -2203,7 +2532,6 @@
 	return cdo->generic_packet(cdi, &cgc);
 }
 
-
 /* return the last written block on the CD-R media. this is for the udf
    file system. */
 int cdrom_get_last_written(struct cdrom_device_info *cdi, long *last_written)
@@ -2310,6 +2638,8 @@
 EXPORT_SYMBOL(cdrom_mode_select);
 EXPORT_SYMBOL(cdrom_mode_sense);
 EXPORT_SYMBOL(init_cdrom_command);
+EXPORT_SYMBOL(cdrom_get_media_event);
+EXPORT_SYMBOL(cdrom_is_mrw);
 
 #ifdef CONFIG_SYSCTL
 
@@ -2406,6 +2736,14 @@
 	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
 	    pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_DVD_RAM) != 0);
 
+	pos += sprintf(info+pos, "\nCan read MRW:");
+	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
+	    pos += sprintf(info+pos, "\t\t%d", CDROM_CAN(CDC_MRW) != 0);
+
+	pos += sprintf(info+pos, "\nCan write MRW:");
+	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
+	    pos += sprintf(info+pos, "\t\t%d", CDROM_CAN(CDC_MRW_W) != 0);
+
 	strcpy(info+pos,"\n\n");
 		
         return proc_dostring(ctl, write, filp, buffer, lenp);
--- diff/drivers/cdrom/cdu31a.c	2003-09-17 12:28:04.000000000 +0100
+++ source/drivers/cdrom/cdu31a.c	2003-12-29 09:30:40.000000000 +0000
@@ -3167,20 +3167,20 @@
 	.name		= "cdu31a"
 };
 
-static int scd_block_open(struct inode *inode, struct file *file)
+static int scd_block_open(struct block_device *bdev, struct file *file)
 {
-	return cdrom_open(&scd_info, inode, file);
+	return cdrom_open(&scd_info, bdev, file);
 }
 
-static int scd_block_release(struct inode *inode, struct file *file)
+static int scd_block_release(struct gendisk *disk)
 {
-	return cdrom_release(&scd_info, file);
+	return cdrom_release(&scd_info);
 }
 
-static int scd_block_ioctl(struct inode *inode, struct file *file,
+static int scd_block_ioctl(struct block_device *bdev, struct file *file,
 				unsigned cmd, unsigned long arg)
 {
-	return cdrom_ioctl(&scd_info, inode, cmd, arg);
+	return cdrom_ioctl(&scd_info, bdev, cmd, arg);
 }
 
 static int scd_block_media_changed(struct gendisk *disk)
--- diff/drivers/cdrom/cm206.c	2003-09-17 12:28:04.000000000 +0100
+++ source/drivers/cdrom/cm206.c	2003-12-29 09:30:40.000000000 +0000
@@ -1350,20 +1350,20 @@
 	.name		= "cm206",
 };
 
-static int cm206_block_open(struct inode *inode, struct file *file)
+static int cm206_block_open(struct block_device *bdev, struct file *file)
 {
-	return cdrom_open(&cm206_info, inode, file);
+	return cdrom_open(&cm206_info, bdev, file);
 }
 
-static int cm206_block_release(struct inode *inode, struct file *file)
+static int cm206_block_release(struct gendisk *disk)
 {
-	return cdrom_release(&cm206_info, file);
+	return cdrom_release(&cm206_info);
 }
 
-static int cm206_block_ioctl(struct inode *inode, struct file *file,
+static int cm206_block_ioctl(struct block_device *bdev, struct file *file,
 				unsigned cmd, unsigned long arg)
 {
-	return cdrom_ioctl(&cm206_info, inode, cmd, arg);
+	return cdrom_ioctl(&cm206_info, bdev, cmd, arg);
 }
 
 static int cm206_block_media_changed(struct gendisk *disk)
--- diff/drivers/cdrom/gscd.c	2003-09-30 15:46:12.000000000 +0100
+++ source/drivers/cdrom/gscd.c	2003-12-29 09:30:40.000000000 +0000
@@ -91,10 +91,10 @@
 /* Schnittstellen zum Kern/FS */
 
 static void __do_gscd_request(unsigned long dummy);
-static int gscd_ioctl(struct inode *, struct file *, unsigned int,
+static int gscd_ioctl(struct block_device *, struct file *, unsigned int,
 		      unsigned long);
-static int gscd_open(struct inode *, struct file *);
-static int gscd_release(struct inode *, struct file *);
+static int gscd_open(struct block_device *, struct file *);
+static int gscd_release(struct gendisk *disk);
 static int check_gscd_med_chg(struct gendisk *disk);
 
 /*      GoldStar Funktionen    */
@@ -190,8 +190,8 @@
 
 #endif
 
-static int gscd_ioctl(struct inode *ip, struct file *fp, unsigned int cmd,
-		      unsigned long arg)
+static int gscd_ioctl(struct block_device *bdev, struct file *fp,
+			unsigned int cmd, unsigned long arg)
 {
 	unsigned char to_do[10];
 	unsigned char dummy;
@@ -338,7 +338,7 @@
  * Open the device special file.  Check that a disk is in.
  */
 
-static int gscd_open(struct inode *ip, struct file *fp)
+static int gscd_open(struct block_device *bdev, struct file *fp)
 {
 	int st;
 
@@ -368,7 +368,7 @@
  * On close, we flush all gscd blocks from the buffer cache.
  */
 
-static int gscd_release(struct inode *inode, struct file *file)
+static int gscd_release(struct gendisk *disk)
 {
 
 #ifdef GSCD_DEBUG
--- diff/drivers/cdrom/mcd.c	2003-09-17 12:28:04.000000000 +0100
+++ source/drivers/cdrom/mcd.c	2003-12-29 09:30:40.000000000 +0000
@@ -214,20 +214,20 @@
 	.name		= "mcd",
 };
 
-static int mcd_block_open(struct inode *inode, struct file *file)
+static int mcd_block_open(struct block_device *bdev, struct file *file)
 {
-	return cdrom_open(&mcd_info, inode, file);
+	return cdrom_open(&mcd_info, bdev, file);
 }
 
-static int mcd_block_release(struct inode *inode, struct file *file)
+static int mcd_block_release(struct gendisk *disk)
 {
-	return cdrom_release(&mcd_info, file);
+	return cdrom_release(&mcd_info);
 }
 
-static int mcd_block_ioctl(struct inode *inode, struct file *file,
+static int mcd_block_ioctl(struct block_device *bdev, struct file *file,
 				unsigned cmd, unsigned long arg)
 {
-	return cdrom_ioctl(&mcd_info, inode, cmd, arg);
+	return cdrom_ioctl(&mcd_info, bdev, cmd, arg);
 }
 
 static int mcd_block_media_changed(struct gendisk *disk)
--- diff/drivers/cdrom/mcdx.c	2003-09-17 12:28:04.000000000 +0100
+++ source/drivers/cdrom/mcdx.c	2003-12-29 09:30:40.000000000 +0000
@@ -221,23 +221,23 @@
 int mcdx_init(void);
 void do_mcdx_request(request_queue_t * q);
 
-static int mcdx_block_open(struct inode *inode, struct file *file)
+static int mcdx_block_open(struct block_device *bdev, struct file *file)
 {
-	struct s_drive_stuff *p = inode->i_bdev->bd_disk->private_data;
-	return cdrom_open(&p->info, inode, file);
+	struct s_drive_stuff *p = bdev->bd_disk->private_data;
+	return cdrom_open(&p->info, bdev, file);
 }
 
-static int mcdx_block_release(struct inode *inode, struct file *file)
+static int mcdx_block_release(struct gendisk *disk)
 {
-	struct s_drive_stuff *p = inode->i_bdev->bd_disk->private_data;
-	return cdrom_release(&p->info, file);
+	struct s_drive_stuff *p = disk->private_data;
+	return cdrom_release(&p->info);
 }
 
-static int mcdx_block_ioctl(struct inode *inode, struct file *file,
+static int mcdx_block_ioctl(struct block_device *bdev, struct file *file,
 				unsigned cmd, unsigned long arg)
 {
-	struct s_drive_stuff *p = inode->i_bdev->bd_disk->private_data;
-	return cdrom_ioctl(&p->info, inode, cmd, arg);
+	struct s_drive_stuff *p = bdev->bd_disk->private_data;
+	return cdrom_ioctl(&p->info, bdev, cmd, arg);
 }
 
 static int mcdx_block_media_changed(struct gendisk *disk)
--- diff/drivers/cdrom/optcd.c	2003-09-17 12:28:04.000000000 +0100
+++ source/drivers/cdrom/optcd.c	2003-12-29 09:30:40.000000000 +0000
@@ -1713,16 +1713,13 @@
 /* VFS calls */
 
 
-static int opt_ioctl(struct inode *ip, struct file *fp,
+static int opt_ioctl(struct block_device *bdev, struct file *fp,
                      unsigned int cmd, unsigned long arg)
 {
 	int status, err, retval = 0;
 
 	DEBUG((DEBUG_VFS, "starting opt_ioctl"));
 
-	if (!ip)
-		return -EINVAL;
-
 	if (cmd == CDROMRESET)
 		return cdromreset();
 
@@ -1844,7 +1841,7 @@
 static int open_count = 0;
 
 /* Open device special file; check that a disk is in. */
-static int opt_open(struct inode *ip, struct file *fp)
+static int opt_open(struct block_device *bdev, struct file *fp)
 {
 	DEBUG((DEBUG_VFS, "starting opt_open"));
 
@@ -1904,13 +1901,12 @@
 
 
 /* Release device special file; flush all blocks from the buffer cache */
-static int opt_release(struct inode *ip, struct file *fp)
+static int opt_release(struct gendisk *disk)
 {
 	int status;
 
 	DEBUG((DEBUG_VFS, "executing opt_release"));
-	DEBUG((DEBUG_VFS, "inode: %p, device: %s, file: %p\n",
-		ip, ip->i_bdev->bd_disk->disk_name, fp));
+	DEBUG((DEBUG_VFS, "disk: %p, device: %s\n", disk, disk->disk_name));
 
 	if (!--open_count) {
 		toc_uptodate = 0;
--- diff/drivers/cdrom/sbpcd.c	2003-10-09 09:47:33.000000000 +0100
+++ source/drivers/cdrom/sbpcd.c	2003-12-29 09:30:40.000000000 +0000
@@ -5356,23 +5356,23 @@
 }
 /*==========================================================================*/
 
-static int sbpcd_block_open(struct inode *inode, struct file *file)
+static int sbpcd_block_open(struct block_device *bdev, struct file *file)
 {
-	struct sbpcd_drive *p = inode->i_bdev->bd_disk->private_data;
-	return cdrom_open(p->sbpcd_infop, inode, file);
+	struct sbpcd_drive *p = bdev->bd_disk->private_data;
+	return cdrom_open(p->sbpcd_infop, bdev, file);
 }
 
-static int sbpcd_block_release(struct inode *inode, struct file *file)
+static int sbpcd_block_release(struct gendisk *disk)
 {
-	struct sbpcd_drive *p = inode->i_bdev->bd_disk->private_data;
-	return cdrom_release(p->sbpcd_infop, file);
+	struct sbpcd_drive *p = disk->private_data;
+	return cdrom_release(p->sbpcd_infop);
 }
 
-static int sbpcd_block_ioctl(struct inode *inode, struct file *file,
+static int sbpcd_block_ioctl(struct block_device *bdev, struct file *file,
 				unsigned cmd, unsigned long arg)
 {
-	struct sbpcd_drive *p = inode->i_bdev->bd_disk->private_data;
-	return cdrom_ioctl(p->sbpcd_infop, inode, cmd, arg);
+	struct sbpcd_drive *p = bdev->bd_disk->private_data;
+	return cdrom_ioctl(p->sbpcd_infop, bdev, cmd, arg);
 }
 
 static int sbpcd_block_media_changed(struct gendisk *disk)
--- diff/drivers/cdrom/sjcd.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/cdrom/sjcd.c	2003-12-29 09:30:40.000000000 +0000
@@ -713,16 +713,13 @@
 /*
  * Do some user commands.
  */
-static int sjcd_ioctl(struct inode *ip, struct file *fp,
+static int sjcd_ioctl(struct block_device *bdev, struct file *fp,
 		      unsigned int cmd, unsigned long arg)
 {
 #if defined( SJCD_TRACE )
 	printk("SJCD:ioctl\n");
 #endif
 
-	if (ip == NULL)
-		return (-EINVAL);
-
 	sjcd_get_status();
 	if (!sjcd_status_valid)
 		return (-EIO);
@@ -1526,7 +1523,7 @@
 /*
  * Open the device special file. Check disk is in.
  */
-static int sjcd_open(struct inode *ip, struct file *fp)
+static int sjcd_open(struct block_device *bdev, struct file *fp)
 {
 	/*
 	 * Check the presence of device.
@@ -1611,7 +1608,7 @@
 /*
  * On close, we flush all sjcd blocks from the buffer cache.
  */
-static int sjcd_release(struct inode *inode, struct file *file)
+static int sjcd_release(struct gendisk *disk)
 {
 	int s;
 
--- diff/drivers/cdrom/sonycd535.c	2003-10-09 09:47:33.000000000 +0100
+++ source/drivers/cdrom/sonycd535.c	2003-12-29 09:30:40.000000000 +0000
@@ -201,7 +201,7 @@
 
 static int read_subcode(void);
 static void sony_get_toc(void);
-static int cdu_open(struct inode *inode, struct file *filp);
+static int cdu_open(struct block_device *bdev, struct file *filp);
 static inline unsigned int int_to_bcd(unsigned int val);
 static unsigned int bcd_to_int(unsigned int bcd);
 static int do_sony_cmd(Byte * cmd, int nCmd, Byte status[2],
@@ -1061,7 +1061,7 @@
  * The big ugly ioctl handler.
  */
 static int
-cdu_ioctl(struct inode *inode,
+cdu_ioctl(struct block_device *bdev,
 		  struct file *file,
 		  unsigned int cmd,
 		  unsigned long arg)
@@ -1360,9 +1360,7 @@
  * Open the drive for operations.  Spin the drive up and read the table of
  * contents if these have not already been done.
  */
-static int
-cdu_open(struct inode *inode,
-		 struct file *filp)
+static int cdu_open(struct block_device *bdev, struct file *filp)
 {
 	Byte status[2], cmd_buff[2];
 
@@ -1385,7 +1383,7 @@
 		sony_inuse = 0;
 		return -EIO;
 	}
-	check_disk_change(inode->i_bdev);
+	check_disk_change(bdev);
 	sony_usage++;
 
 #ifdef LOCK_DOORS
@@ -1402,9 +1400,7 @@
  * Close the drive.  Spin it down if no task is using it.  The spin
  * down will fail if playing audio, so audio play is OK.
  */
-static int
-cdu_release(struct inode *inode,
-			struct file *filp)
+static int cdu_release(struct gendisk *disk)
 {
 	Byte status[2], cmd_no;
 
--- diff/drivers/char/agp/alpha-agp.c	2003-09-30 15:46:12.000000000 +0100
+++ source/drivers/char/agp/alpha-agp.c	2003-12-29 09:30:40.000000000 +0000
@@ -13,7 +13,7 @@
 
 static struct page *alpha_core_agp_vm_nopage(struct vm_area_struct *vma,
 					     unsigned long address,
-					     int write_access)
+					     int *type)
 {
 	alpha_agp_info *agp = agp_bridge->dev_private_data;
 	dma_addr_t dma_addr;
@@ -30,6 +30,8 @@
 	 */
 	page = virt_to_page(__va(pa));
 	get_page(page);
+	if (type)
+		*type = VM_FAULT_MINOR;
 	return page;
 }
 
--- diff/drivers/char/drm/drmP.h	2003-09-30 15:46:12.000000000 +0100
+++ source/drivers/char/drm/drmP.h	2003-12-29 09:30:40.000000000 +0000
@@ -760,16 +760,16 @@
 				/* Mapping support (drm_vm.h) */
 extern struct page *DRM(vm_nopage)(struct vm_area_struct *vma,
 				   unsigned long address,
-				   int write_access);
+				   int *type);
 extern struct page *DRM(vm_shm_nopage)(struct vm_area_struct *vma,
 				       unsigned long address,
-				       int write_access);
+				       int *type);
 extern struct page *DRM(vm_dma_nopage)(struct vm_area_struct *vma,
 				       unsigned long address,
-				       int write_access);
+				       int *type);
 extern struct page *DRM(vm_sg_nopage)(struct vm_area_struct *vma,
 				      unsigned long address,
-				      int write_access);
+				      int *type);
 extern void	     DRM(vm_open)(struct vm_area_struct *vma);
 extern void	     DRM(vm_close)(struct vm_area_struct *vma);
 extern void	     DRM(vm_shm_close)(struct vm_area_struct *vma);
--- diff/drivers/char/drm/drm_vm.h	2003-07-22 18:54:27.000000000 +0100
+++ source/drivers/char/drm/drm_vm.h	2003-12-29 09:30:40.000000000 +0000
@@ -76,7 +76,7 @@
  */
 struct page *DRM(vm_nopage)(struct vm_area_struct *vma,
 			    unsigned long address,
-			    int write_access)
+			    int *type)
 {
 #if __REALLY_HAVE_AGP
 	drm_file_t *priv  = vma->vm_file->private_data;
@@ -133,6 +133,8 @@
 			  baddr, __va(agpmem->memory->memory[offset]), offset,
 			  atomic_read(&page->count));
 
+		if (type)
+			*type = VM_FAULT_MINOR;
 		return page;
         }
 vm_nopage_error:
@@ -154,7 +156,7 @@
  */
 struct page *DRM(vm_shm_nopage)(struct vm_area_struct *vma,
 				unsigned long address,
-				int write_access)
+				int *type)
 {
 	drm_map_t	 *map	 = (drm_map_t *)vma->vm_private_data;
 	unsigned long	 offset;
@@ -170,6 +172,8 @@
 	if (!page)
 		return NOPAGE_OOM;
 	get_page(page);
+	if (type)
+		*type = VM_FAULT_MINOR;
 
 	DRM_DEBUG("shm_nopage 0x%lx\n", address);
 	return page;
@@ -268,7 +272,7 @@
  */
 struct page *DRM(vm_dma_nopage)(struct vm_area_struct *vma,
 				unsigned long address,
-				int write_access)
+				int *type)
 {
 	drm_file_t	 *priv	 = vma->vm_file->private_data;
 	drm_device_t	 *dev	 = priv->dev;
@@ -287,6 +291,8 @@
 			     (offset & (~PAGE_MASK))));
 
 	get_page(page);
+	if (type)
+		*type = VM_FAULT_MINOR;
 
 	DRM_DEBUG("dma_nopage 0x%lx (page %lu)\n", address, page_nr);
 	return page;
@@ -304,7 +310,7 @@
  */
 struct page *DRM(vm_sg_nopage)(struct vm_area_struct *vma,
 			       unsigned long address,
-			       int write_access)
+			       int *type)
 {
 	drm_map_t        *map    = (drm_map_t *)vma->vm_private_data;
 	drm_file_t *priv = vma->vm_file->private_data;
@@ -325,6 +331,8 @@
 	page_offset = (offset >> PAGE_SHIFT) + (map_offset >> PAGE_SHIFT);
 	page = entry->pagelist[page_offset];
 	get_page(page);
+	if (type)
+		*type = VM_FAULT_MINOR;
 
 	return page;
 }
--- diff/drivers/char/keyboard.c	2003-10-27 09:20:43.000000000 +0000
+++ source/drivers/char/keyboard.c	2003-12-29 09:30:40.000000000 +0000
@@ -941,16 +941,16 @@
 	 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
 	 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
 	 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
-	 80, 81, 82, 83, 43, 85, 86, 87, 88,115,119,120,121,375,123, 90,
-	284,285,309,298,312, 91,327,328,329,331,333,335,336,337,338,339,
-	367,288,302,304,350, 92,334,512,116,377,109,111,373,347,348,349,
-	360, 93, 94, 95, 98,376,100,101,321,316,354,286,289,102,351,355,
+	 80, 81, 82, 83, 84, 93, 86, 87, 88, 94, 95, 85,259,375,260, 90,
+	284,285,309,311,312, 91,327,328,329,331,333,335,336,337,338,339,
+	367,288,302,304,350, 89,334,326,116,377,109,111,126,347,348,349,
+	360,261,262,263,298,376,100,101,321,316,373,286,289,102,351,355,
 	103,104,105,275,287,279,306,106,274,107,294,364,358,363,362,361,
-	291,108,381,281,290,272,292,305,280, 99,112,257,258,359,270,114,
-	118,117,125,374,379,115,112,125,121,123,264,265,266,267,268,269,
-	271,273,276,277,278,282,283,295,296,297,299,300,301,293,303,307,
-	308,310,313,314,315,317,318,319,320,357,322,323,324,325,326,330,
-	332,340,365,342,343,344,345,346,356,113,341,368,369,370,371,372 };
+	291,108,381,281,290,272,292,305,280, 99,112,257,258,359,113,114,
+	264,117,271,374,379,115,125,273,121,123, 92,265,266,267,268,269,
+	120,119,118,277,278,282,283,295,296,297,299,300,301,293,303,307,
+	308,310,313,314,315,317,318,319,320,357,322,323,324,325,276,330,
+	332,340,365,342,343,344,345,346,356,270,341,368,369,370,371,372 };
 
 #ifdef CONFIG_MAC_EMUMOUSEBTN
 extern int mac_hid_mouse_emulate_buttons(int, int, int);
@@ -972,11 +972,18 @@
 	if (keycode > 255 || !x86_keycodes[keycode])
 		return -1; 
 
-	if (keycode == KEY_PAUSE) {
-		put_queue(vc, 0xe1);
-		put_queue(vc, 0x1d | up_flag);
-		put_queue(vc, 0x45 | up_flag);
-		return 0;
+	switch (keycode) {
+		case KEY_PAUSE:
+			put_queue(vc, 0xe1);
+			put_queue(vc, 0x1d | up_flag);
+			put_queue(vc, 0x45 | up_flag);
+			return 0;
+		case KEY_LANG1:
+			if (!up_flag) put_queue(vc, 0xf1);
+			return 0;
+		case KEY_LANG2:
+			if (!up_flag) put_queue(vc, 0xf2);
+			return 0;
 	} 
 
 	if (keycode == KEY_SYSRQ && sysrq_alt) {
@@ -1052,6 +1059,9 @@
 	}
 	if (sysrq_down && down && !rep) {
 		handle_sysrq(kbd_sysrq_xlate[keycode], regs, tty);
+#ifdef CONFIG_KGDB_SYSRQ
+                sysrq_down = 0;        /* in case we miss the "up" event */
+#endif
 		return;
 	}
 #endif
--- diff/drivers/char/mem.c	2003-10-27 09:20:43.000000000 +0000
+++ source/drivers/char/mem.c	2003-12-29 09:30:40.000000000 +0000
@@ -24,6 +24,7 @@
 #include <linux/smp_lock.h>
 #include <linux/devfs_fs_kernel.h>
 #include <linux/ptrace.h>
+#include <linux/device.h>
 
 #include <asm/uaccess.h>
 #include <asm/io.h>
@@ -40,6 +41,7 @@
 extern void tapechar_init(void);
 #endif
 
+#ifdef pgprot_noncached
 /*
  * Architectures vary in how they handle caching for addresses
  * outside of main memory.
@@ -65,19 +67,21 @@
 	  && addr >= __pa(high_memory);
 #elif defined(CONFIG_IA64)
 	/*
-	 * On ia64, we ignore O_SYNC because we cannot tolerate memory attribute aliases.
+	 * On ia64, we ignore O_SYNC because we cannot tolerate memory
+	 * attribute aliases.
 	 */
 	return !(efi_mem_attributes(addr) & EFI_MEMORY_WB);
 #else
 	/*
-	 * Accessing memory above the top the kernel knows about or through a file pointer
-	 * that was marked O_SYNC will be done non-cached.
+	 * Accessing memory above the top the kernel knows about or through a
+	 * file pointer that was marked O_SYNC will be done non-cached.
 	 */
 	if (file->f_flags & O_SYNC)
 		return 1;
 	return addr >= __pa(high_memory);
 #endif
 }
+#endif		/* pgprot_noncached */
 
 #ifndef ARCH_HAS_VALID_PHYS_ADDR_RANGE
 static inline int valid_phys_addr_range(unsigned long addr, size_t *count)
@@ -167,28 +171,24 @@
 	return do_write_mem(file, __va(p), p, buf, count, ppos);
 }
 
-static int mmap_mem(struct file * file, struct vm_area_struct * vma)
+static int mmap_mem(struct file *file, struct vm_area_struct *vma)
 {
 	unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
-	int uncached;
 
-	uncached = uncached_access(file, offset);
 #ifdef pgprot_noncached
-	if (uncached)
+	if (uncached_access(file, offset))
 		vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
 #endif
 
-	/* Don't try to swap out physical pages.. */
-	vma->vm_flags |= VM_RESERVED;
-
 	/*
-	 * Don't dump addresses that are not real memory to a core file.
+	 * Don't try to swap out physical pages..
+	 * And treat /dev/mem mappings as "IO" regions: they may not
+	 * describe valid pageframes.
 	 */
-	if (uncached)
-		vma->vm_flags |= VM_IO;
+	vma->vm_flags |= VM_RESERVED|VM_IO;
 
-	if (remap_page_range(vma, vma->vm_start, offset, vma->vm_end-vma->vm_start,
-			     vma->vm_page_prot))
+	if (remap_page_range(vma, vma->vm_start, offset,
+			vma->vm_end-vma->vm_start, vma->vm_page_prot))
 		return -EAGAIN;
 	return 0;
 }
@@ -657,7 +657,7 @@
 	.open		= memory_open,	/* just a selector for the real open */
 };
 
-static const struct {
+static const struct mem_dev {
 	unsigned int		minor;
 	char			*name;
 	umode_t			mode;
@@ -676,6 +676,23 @@
 	{11,"kmsg",    S_IRUGO | S_IWUSR,           &kmsg_fops},
 };
 
+static void release_mem_dev(struct class_device *class_dev)
+{
+	kfree(class_dev);
+}
+
+static struct class mem_class = {
+	.name		= "mem",
+	.release	= &release_mem_dev,
+};
+
+static ssize_t show_dev(struct class_device *class_dev, char *buf)
+{
+	struct mem_dev *mem_dev = class_get_devdata(class_dev);
+	return print_dev_t(buf, MKDEV(MEM_MAJOR, mem_dev->minor));
+}
+static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL);
+
 static int __init chr_dev_init(void)
 {
 	int i;
@@ -683,7 +700,20 @@
 	if (register_chrdev(MEM_MAJOR,"mem",&memory_fops))
 		printk("unable to get major %d for memory devs\n", MEM_MAJOR);
 
+	class_register(&mem_class);
 	for (i = 0; i < ARRAY_SIZE(devlist); i++) {
+		struct class_device *class_dev;
+
+		class_dev = kmalloc(sizeof(*class_dev), GFP_KERNEL);
+		if (class_dev) {
+			memset(class_dev, 0x00, sizeof(*class_dev));
+			class_dev->class = &mem_class;
+			strncpy(class_dev->class_id, devlist[i].name, BUS_ID_SIZE);
+			class_set_devdata(class_dev, (void *)&devlist[i]);
+			if (!class_device_register(class_dev));
+				class_device_create_file(class_dev, &class_device_attr_dev);
+		}
+
 		devfs_mk_cdev(MKDEV(MEM_MAJOR, devlist[i].minor),
 				S_IFCHR | devlist[i].mode, devlist[i].name);
 	}
--- diff/drivers/char/misc.c	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/char/misc.c	2003-12-29 09:30:40.000000000 +0000
@@ -47,7 +47,7 @@
 #include <linux/devfs_fs_kernel.h>
 #include <linux/stat.h>
 #include <linux/init.h>
-
+#include <linux/device.h>
 #include <linux/tty.h>
 #include <linux/kmod.h>
 
@@ -180,6 +180,91 @@
 	return err;
 }
 
+/* Misc class implementation */
+
+/*
+ * TODO for 2.7:
+ *  - add a struct class_device to struct miscdevice and make all usages of
+ *    them dynamic.  This will let us get rid of struct misc_dev below.
+ */
+struct misc_dev {
+	struct list_head node;
+	dev_t dev;
+	struct class_device class_dev;
+};
+#define to_misc_dev(d) container_of(d, struct misc_dev, class_dev)
+
+static LIST_HEAD(misc_dev_list);
+static spinlock_t misc_dev_list_lock = SPIN_LOCK_UNLOCKED;
+
+static void release_misc_dev(struct class_device *class_dev)
+{
+	struct misc_dev *misc_dev = to_misc_dev(class_dev);
+	kfree(misc_dev);
+}
+
+static struct class misc_class = {
+	.name		= "misc",
+	.release	= &release_misc_dev,
+};
+
+static ssize_t show_dev(struct class_device *class_dev, char *buf)
+{
+	struct misc_dev *misc_dev = to_misc_dev(class_dev);
+	return print_dev_t(buf, misc_dev->dev);
+}
+static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL);
+
+static void misc_add_class_device(struct miscdevice *misc)
+{
+	struct misc_dev *misc_dev = NULL;
+	int retval;
+
+	misc_dev = kmalloc(sizeof(*misc_dev), GFP_KERNEL);
+	if (!misc_dev)
+		return;
+	memset(misc_dev, 0x00, sizeof(*misc_dev));
+
+	misc_dev->dev = MKDEV(MISC_MAJOR, misc->minor);
+	misc_dev->class_dev.dev = misc->dev;
+	misc_dev->class_dev.class = &misc_class;
+	snprintf(misc_dev->class_dev.class_id, BUS_ID_SIZE, "%s", misc->name);
+	retval = class_device_register(&misc_dev->class_dev);
+	if (retval)
+		goto error;
+	class_device_create_file(&misc_dev->class_dev, &class_device_attr_dev);
+	spin_lock(&misc_dev_list_lock);
+	list_add(&misc_dev->node, &misc_dev_list);
+	spin_unlock(&misc_dev_list_lock);
+	return;
+error:
+	kfree(misc_dev);
+}
+
+static void misc_remove_class_device(struct miscdevice *misc)
+{
+	struct misc_dev *misc_dev = NULL;
+	struct list_head *tmp;
+	int found = 0;
+
+	spin_lock(&misc_dev_list_lock);
+	list_for_each(tmp, &misc_dev_list) {
+		misc_dev = list_entry(tmp, struct misc_dev, node);
+		if ((MINOR(misc_dev->dev) == misc->minor)) {
+			found = 1;
+			break;
+		}
+	}
+	if (found) {
+		list_del(&misc_dev->node);
+		spin_unlock(&misc_dev_list_lock);
+		class_device_unregister(&misc_dev->class_dev);
+	} else {
+		spin_unlock(&misc_dev_list_lock);
+	}
+}
+
+
 static struct file_operations misc_fops = {
 	.owner		= THIS_MODULE,
 	.open		= misc_open,
@@ -236,6 +321,7 @@
 
 	devfs_mk_cdev(MKDEV(MISC_MAJOR, misc->minor),
 			S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP, misc->devfs_name);
+	misc_add_class_device(misc);
 
 	/*
 	 * Add it to the front, so that later devices can "override"
@@ -265,6 +351,7 @@
 
 	down(&misc_sem);
 	list_del(&misc->list);
+	misc_remove_class_device(misc);
 	devfs_remove(misc->devfs_name);
 	if (i < DYNAMIC_MINORS && i>0) {
 		misc_minors[i>>3] &= ~(1 << (misc->minor & 7));
@@ -285,6 +372,7 @@
 	if (ent)
 		ent->proc_fops = &misc_proc_fops;
 #endif
+	class_register(&misc_class);
 #ifdef CONFIG_MVME16x
 	rtc_MK48T08_init();
 #endif
@@ -319,4 +407,4 @@
 	}
 	return 0;
 }
-module_init(misc_init);
+subsys_initcall(misc_init);
--- diff/drivers/char/ppdev.c	2003-09-17 12:28:05.000000000 +0100
+++ source/drivers/char/ppdev.c	2003-12-29 09:30:40.000000000 +0000
@@ -67,6 +67,7 @@
 #include <asm/uaccess.h>
 #include <linux/ppdev.h>
 #include <linux/smp_lock.h>
+#include <linux/device.h>
 
 #define PP_VERSION "ppdev: user-space parallel port driver"
 #define CHRDEV "ppdev"
@@ -782,4 +783,4 @@
 module_exit(ppdev_cleanup);
 
 MODULE_LICENSE("GPL");
-
+MODULE_ALIAS_CHARDEV_MAJOR(PP_MAJOR);
--- diff/drivers/char/raw.c	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/char/raw.c	2003-12-29 09:30:40.000000000 +0000
@@ -74,6 +74,7 @@
 			goto out;
 		}
 		filp->f_flags |= O_DIRECT;
+		filp->f_mapping = bdev->bd_inode->i_mapping;
 		if (++raw_devices[minor].inuse == 1)
 			filp->f_dentry->d_inode->i_mapping =
 				bdev->bd_inode->i_mapping;
--- diff/drivers/char/sn_serial.c	2003-10-27 09:20:43.000000000 +0000
+++ source/drivers/char/sn_serial.c	2003-12-29 09:30:40.000000000 +0000
@@ -21,8 +21,9 @@
 #include <linux/sysrq.h>
 #include <linux/circ_buf.h>
 #include <linux/serial_reg.h>
+#include <asm/uaccess.h>
 #include <asm/sn/sn_sal.h>
-#include <asm/sn/pci/pciio.h>		/* this is needed for get_console_nasid */
+#include <asm/sn/pci/pciio.h>
 #include <asm/sn/simulator.h>
 #include <asm/sn/sn2/sn_private.h>
 
@@ -771,7 +772,7 @@
 	off_t	begin = 0;
 
 	len += sprintf(page, "sn_serial: nasid:%d irq:%d tx:%d rx:%d\n",
-		       get_console_nasid(), sn_sal_irq,
+		       ia64_sn_get_console_nasid(), sn_sal_irq,
 		       sn_total_tx_count, sn_total_rx_count);
 	*eof = 1;
 
@@ -813,6 +814,9 @@
 {
 	unsigned long flags;
 
+	if (sn_sal_is_asynch)
+		return;
+
 	sn_debug_printf("sn_serial: about to switch to asynchronous console\n");
 
 	/* without early_printk, we may be invoked late enough to race
--- diff/drivers/char/sx.c	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/char/sx.c	2003-12-29 09:30:40.000000000 +0000
@@ -509,13 +509,13 @@
 
 	func_enter ();
 
-	for (i=0; i < TIMEOUT_1 > 0;i++) 
+	for (i=0; i < TIMEOUT_1 ;i++)
 		if ((read_sx_byte (board, offset) & mask) == correctval) {
 			func_exit ();
 			return 1;
 		}
 
-	for (i=0; i < TIMEOUT_2 > 0;i++) {
+	for (i=0; i < TIMEOUT_2 ;i++) {
 		if ((read_sx_byte (board, offset) & mask) == correctval) {
 			func_exit ();
 			return 1;
@@ -535,13 +535,13 @@
 
 	func_enter ();
 
-	for (i=0; i < TIMEOUT_1 > 0;i++) 
+	for (i=0; i < TIMEOUT_1 ;i++)
 		if ((read_sx_byte (board, offset) & mask) != badval) {
 			func_exit ();
 			return 1;
 		}
 
-	for (i=0; i < TIMEOUT_2 > 0;i++) {
+	for (i=0; i < TIMEOUT_2 ;i++) {
 		if ((read_sx_byte (board, offset) & mask) != badval) {
 			func_exit ();
 			return 1;
--- diff/drivers/char/sysrq.c	2003-10-09 09:47:16.000000000 +0100
+++ source/drivers/char/sysrq.c	2003-12-29 09:30:40.000000000 +0000
@@ -35,6 +35,25 @@
 #include <linux/spinlock.h>
 
 #include <asm/ptrace.h>
+#ifdef CONFIG_KGDB_SYSRQ
+
+#define  GDB_OP &kgdb_op
+static void kgdb_sysrq(int key, struct pt_regs *pt_regs, struct tty_struct *tty)
+{
+	printk("kgdb sysrq\n");
+	breakpoint();
+}
+
+static struct sysrq_key_op kgdb_op = {
+	.handler	= kgdb_sysrq,
+	.help_msg	= "kGdb|Fgdb",
+	.action_msg	= "Debug breakpoint\n",
+};
+
+#else
+#define  GDB_OP NULL
+#endif
+
 
 extern void reset_vc(unsigned int);
 
@@ -238,8 +257,8 @@
 /* c */ NULL,
 /* d */	NULL,
 /* e */	&sysrq_term_op,
-/* f */	NULL,
-/* g */	NULL,
+/* f */	GDB_OP,
+/* g */	GDB_OP,
 /* h */	NULL,
 /* i */	&sysrq_kill_op,
 /* j */	NULL,
--- diff/drivers/char/vc_screen.c	2003-09-17 12:28:05.000000000 +0100
+++ source/drivers/char/vc_screen.c	2003-12-29 09:30:40.000000000 +0000
@@ -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,85 @@
 	.open		= vcs_open,
 };
 
+/* vc class implementation */
+
+struct vc_dev {
+	struct list_head node;
+	dev_t dev;
+	struct class_device class_dev;
+};
+#define to_vc_dev(d) container_of(d, struct vc_dev, class_dev)
+
+static LIST_HEAD(vc_dev_list);
+static spinlock_t vc_dev_list_lock = SPIN_LOCK_UNLOCKED;
+
+static void release_vc_dev(struct class_device *class_dev)
+{
+	struct vc_dev *vc_dev = to_vc_dev(class_dev);
+	kfree(vc_dev);
+}
+
+static struct class vc_class = {
+	.name		= "vc",
+	.release	= &release_vc_dev,
+};
+
+static ssize_t show_dev(struct class_device *class_dev, char *buf)
+{
+	struct vc_dev *vc_dev = to_vc_dev(class_dev);
+	return print_dev_t(buf, vc_dev->dev);
+}
+static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL);
+
+static int vc_add_class_device(dev_t dev, char *name, int minor)
+{
+	struct vc_dev *vc_dev = NULL;
+	int retval;
+
+	vc_dev = kmalloc(sizeof(*vc_dev), GFP_KERNEL);
+	if (!vc_dev)
+		return -ENOMEM;
+	memset(vc_dev, 0x00, sizeof(*vc_dev));
+
+	vc_dev->dev = dev;
+	vc_dev->class_dev.class = &vc_class;
+	snprintf(vc_dev->class_dev.class_id, BUS_ID_SIZE, name, minor);
+	retval = class_device_register(&vc_dev->class_dev);
+	if (retval)
+		goto error;
+	class_device_create_file(&vc_dev->class_dev, &class_device_attr_dev);
+	spin_lock(&vc_dev_list_lock);
+	list_add(&vc_dev->node, &vc_dev_list);
+	spin_unlock(&vc_dev_list_lock);
+	return 0;
+error:
+	kfree(vc_dev);
+	return retval;
+}
+
+static void vc_remove_class_device(int minor)
+{
+	struct vc_dev *vc_dev = NULL;
+	struct list_head *tmp;
+	int found = 0;
+
+	spin_lock(&vc_dev_list_lock);
+	list_for_each(tmp, &vc_dev_list) {
+		vc_dev = list_entry(tmp, struct vc_dev, node);
+		if (MINOR(vc_dev->dev) == minor) {
+			found = 1;
+			break;
+		}
+	}
+	if (found) {
+		list_del(&vc_dev->node);
+		spin_unlock(&vc_dev_list_lock);
+		class_device_unregister(&vc_dev->class_dev);
+	} else {
+		spin_unlock(&vc_dev_list_lock);
+	}
+}
+
 void vcs_make_devfs(struct tty_struct *tty)
 {
 	devfs_mk_cdev(MKDEV(VCS_MAJOR, tty->index + 1),
@@ -477,19 +557,26 @@
 	devfs_mk_cdev(MKDEV(VCS_MAJOR, tty->index + 129),
 			S_IFCHR|S_IRUSR|S_IWUSR,
 			"vcc/a%u", tty->index + 1);
+	vc_add_class_device(MKDEV(VCS_MAJOR, tty->index + 1), "vcs%u", tty->index + 1);
+	vc_add_class_device(MKDEV(VCS_MAJOR, tty->index + 129), "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);
+	vc_remove_class_device(tty->index + 1);
+	vc_remove_class_device(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);
+	class_register(&vc_class);
 
 	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");
+	vc_add_class_device(MKDEV(VCS_MAJOR, 0), "vcs", 0);
+	vc_add_class_device(MKDEV(VCS_MAJOR, 128), "vcsa", 128);
 	return 0;
 }
--- diff/drivers/char/vt_ioctl.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/char/vt_ioctl.c	2003-12-29 09:30:40.000000000 +0000
@@ -332,7 +332,7 @@
 }
 
 static inline int 
-do_unimap_ioctl(int cmd, struct unimapdesc *user_ud,int perm)
+do_unimap_ioctl(int cmd, struct unimapdesc *user_ud, int perm, unsigned int console)
 {
 	struct unimapdesc tmp;
 	int i = 0; 
@@ -348,9 +348,11 @@
 	case PIO_UNIMAP:
 		if (!perm)
 			return -EPERM;
-		return con_set_unimap(fg_console, tmp.entry_ct, tmp.entries);
+		return con_set_unimap(console, tmp.entry_ct, tmp.entries);
 	case GIO_UNIMAP:
-		return con_get_unimap(fg_console, tmp.entry_ct, &(user_ud->entry_ct), tmp.entries);
+		if (!perm && fg_console != console)
+			return -EPERM;
+		return con_get_unimap(console, tmp.entry_ct, &(user_ud->entry_ct), tmp.entries);
 	}
 	return 0;
 }
@@ -966,13 +968,13 @@
 			return -EPERM;
 		i = copy_from_user(&ui, (void *)arg, sizeof(struct unimapinit));
 		if (i) return -EFAULT;
-		con_clear_unimap(fg_console, &ui);
+		con_clear_unimap(console, &ui);
 		return 0;
 	      }
 
 	case PIO_UNIMAP:
 	case GIO_UNIMAP:
-		return do_unimap_ioctl(cmd, (struct unimapdesc *)arg, perm);
+		return do_unimap_ioctl(cmd, (struct unimapdesc *)arg, perm, console);
 
 	case VT_LOCKSWITCH:
 		if (!capable(CAP_SYS_TTY_CONFIG))
--- diff/drivers/char/watchdog/Kconfig	2003-09-30 15:46:13.000000000 +0100
+++ source/drivers/char/watchdog/Kconfig	2003-12-29 09:30:40.000000000 +0000
@@ -276,6 +276,21 @@
 
 	  Most people will say N.
 
+config W83627HF_WDT
+	tristate "W83627HF Watchdog Timer"
+	depends on WATCHDOG
+	---help---
+	  This is the driver for the hardware watchdog on the W83627HF chipset
+	  as used in Advantech PC-9578 and Tyan S2721-533 motherboards
+	  (and likely others).  This watchdog simply watches your kernel to
+	  make sure it doesn't freeze, and if it does, it reboots your computer
+	  after a certain amount of time.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called w83627hf_wdt.
+
+	  Most people will say N.
+
 config MACHZ_WDT
 	tristate "ZF MachZ Watchdog"
 	depends on WATCHDOG
--- diff/drivers/char/watchdog/Makefile	2003-09-17 12:28:05.000000000 +0100
+++ source/drivers/char/watchdog/Makefile	2003-12-29 09:30:40.000000000 +0000
@@ -25,6 +25,7 @@
 obj-$(CONFIG_EUROTECH_WDT) += eurotechwdt.o
 obj-$(CONFIG_SOFT_WATCHDOG) += softdog.o
 obj-$(CONFIG_W83877F_WDT) += w83877f_wdt.o
+obj-$(CONFIG_W83627HF_WDT) += w83627hf_wdt.o
 obj-$(CONFIG_SC520_WDT) += sc520_wdt.o
 obj-$(CONFIG_ALIM7101_WDT) += alim7101_wdt.o
 obj-$(CONFIG_ALIM1535_WDT) += alim1535_wdt.o
--- diff/drivers/char/watchdog/i810-tco.c	2003-09-30 15:46:13.000000000 +0100
+++ source/drivers/char/watchdog/i810-tco.c	2003-12-29 09:30:40.000000000 +0000
@@ -232,9 +232,8 @@
 
 		/* someone wrote to us, we should reload the timer */
 		tco_timer_reload ();
-		return 1;
 	}
-	return 0;
+	return len;
 }
 
 static int i810tco_ioctl (struct inode *inode, struct file *file,
--- diff/drivers/char/watchdog/ib700wdt.c	2003-09-17 12:28:05.000000000 +0100
+++ source/drivers/char/watchdog/ib700wdt.c	2003-12-29 09:30:40.000000000 +0000
@@ -161,9 +161,8 @@
 			}
 		}
 		ibwdt_ping();
-		return 1;
 	}
-	return 0;
+	return count;
 }
 
 static int
--- diff/drivers/char/watchdog/indydog.c	2003-08-20 14:16:27.000000000 +0100
+++ source/drivers/char/watchdog/indydog.c	2003-12-29 09:30:40.000000000 +0000
@@ -113,9 +113,8 @@
 			}
 		}
 		indydog_ping();
-		return 1;
 	}
-	return 0;
+	return len;
 }
 
 static int indydog_ioctl(struct inode *inode, struct file *file,
--- diff/drivers/char/watchdog/machzwd.c	2003-09-17 12:28:05.000000000 +0100
+++ source/drivers/char/watchdog/machzwd.c	2003-12-29 09:30:40.000000000 +0000
@@ -343,10 +343,9 @@
 		next_heartbeat = jiffies + ZF_USER_TIMEO;
 		dprintk("user ping at %ld\n", jiffies);
 		
-		return 1;
 	}
 
-	return 0;
+	return count;
 }
 
 static int zf_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
--- diff/drivers/char/watchdog/mixcomwd.c	2003-08-20 14:16:27.000000000 +0100
+++ source/drivers/char/watchdog/mixcomwd.c	2003-12-29 09:30:40.000000000 +0000
@@ -156,9 +156,8 @@
 			}
 		}
 		mixcomwd_ping();
-		return 1;
 	}
-	return 0;
+	return len;
 }
 
 static int mixcomwd_ioctl(struct inode *inode, struct file *file,
--- diff/drivers/char/watchdog/pcwd.c	2003-09-17 12:28:05.000000000 +0100
+++ source/drivers/char/watchdog/pcwd.c	2003-12-29 09:30:40.000000000 +0000
@@ -419,9 +419,8 @@
 			}
 		}
 		pcwd_send_heartbeat();
-		return 1;
 	}
-	return 0;
+	return len;
 }
 
 static int pcwd_open(struct inode *ino, struct file *filep)
--- diff/drivers/char/watchdog/sa1100_wdt.c	2003-08-20 14:16:27.000000000 +0100
+++ source/drivers/char/watchdog/sa1100_wdt.c	2003-12-29 09:30:40.000000000 +0000
@@ -106,7 +106,7 @@
 		OSMR3 = OSCR + pre_margin;
 	}
 
-	return len ? 1 : 0;
+	return len;
 }
 
 static struct watchdog_info ident = {
--- diff/drivers/char/watchdog/softdog.c	2003-08-20 14:16:27.000000000 +0100
+++ source/drivers/char/watchdog/softdog.c	2003-12-29 09:30:40.000000000 +0000
@@ -155,9 +155,8 @@
 			}
 		}
 		mod_timer(&watchdog_ticktock, jiffies+(soft_margin*HZ));
-		return 1;
 	}
-	return 0;
+	return len;
 }
 
 static int softdog_ioctl(struct inode *inode, struct file *file,
--- diff/drivers/char/watchdog/wdt.c	2003-09-17 12:28:05.000000000 +0100
+++ source/drivers/char/watchdog/wdt.c	2003-12-29 09:30:40.000000000 +0000
@@ -265,9 +265,8 @@
 			}
 		}
 		wdt_ping();
-		return 1;
 	}
-	return 0;
+	return count;
 }
 
 /**
--- diff/drivers/i2c/i2c-core.c	2003-09-30 15:46:14.000000000 +0100
+++ source/drivers/i2c/i2c-core.c	2003-12-29 09:30:40.000000000 +0000
@@ -136,10 +136,10 @@
 
 	/* Add the adapter to the driver core.
 	 * If the parent pointer is not set up,
-	 * we add this adapter to the legacy bus.
+	 * we add this adapter to the host bus.
 	 */
 	if (adap->dev.parent == NULL)
-		adap->dev.parent = &legacy_bus;
+		adap->dev.parent = &platform_bus;
 	sprintf(adap->dev.bus_id, "i2c-%d", adap->nr);
 	adap->dev.driver = &i2c_adapter_driver;
 	adap->dev.release = &i2c_adapter_dev_release;
--- diff/drivers/i2c/i2c-dev.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/i2c/i2c-dev.c	2003-12-29 09:30:40.000000000 +0000
@@ -223,7 +223,7 @@
 
 		/* Put an arbritrary limit on the number of messages that can
 		 * be sent at once */
-		if (rdwr_arg.nmsgs > 42)
+		if (rdwr_arg.nmsgs > I2C_RDRW_IOCTL_MAX_MSGS)
 			return -EINVAL;
 		
 		rdwr_pa = (struct i2c_msg *)
@@ -447,7 +447,7 @@
 
 	/* register this i2c device with the driver core */
 	i2c_dev->adap = adap;
-	if (adap->dev.parent == &legacy_bus)
+	if (adap->dev.parent == &platform_bus)
 		i2c_dev->class_dev.dev = &adap->dev;
 	else
 		i2c_dev->class_dev.dev = adap->dev.parent;
--- diff/drivers/ide/Kconfig	2003-11-25 15:24:57.000000000 +0000
+++ source/drivers/ide/Kconfig	2003-12-29 09:30:40.000000000 +0000
@@ -745,6 +745,14 @@
 	  This driver adds PIO/(U)DMA support for the ServerWorks OSB4/CSB5
 	  chipsets.
 
+config BLK_DEV_SGIIOC4
+	tristate "Silicon Graphics IOC4 chipset support"
+	depends on IA64_SGI_SN2
+	help
+	  This driver adds PIO & MultiMode DMA-2 support for the SGI IOC4
+	  chipset, which has one channel and can support two devices.
+	  Please say Y here if you have an Altix System from SGI.
+
 config BLK_DEV_SIIMAGE
 	tristate "Silicon Image chipset support"
 	help
--- diff/drivers/ide/arm/icside.c	2003-08-26 10:00:52.000000000 +0100
+++ source/drivers/ide/arm/icside.c	2003-12-29 09:30:40.000000000 +0000
@@ -214,7 +214,7 @@
 #define NR_ENTRIES 256
 #define TABLE_SIZE (NR_ENTRIES * 8)
 
-static void ide_build_sglist(ide_drive_t *drive, struct request *rq)
+static void icside_build_sglist(ide_drive_t *drive, struct request *rq)
 {
 	ide_hwif_t *hwif = drive->hwif;
 	struct icside_state *state = hwif->hwif_data;
@@ -543,7 +543,7 @@
 	BUG_ON(hwif->sg_dma_active);
 	BUG_ON(dma_channel_active(hwif->hw.dma));
 
-	ide_build_sglist(drive, rq);
+	icside_build_sglist(drive, rq);
 
 	/*
 	 * Ensure that we have the right interrupt routed.
--- diff/drivers/ide/ide-cd.c	2003-12-19 09:51:11.000000000 +0000
+++ source/drivers/ide/ide-cd.c	2003-12-29 09:30:40.000000000 +0000
@@ -291,10 +291,13 @@
  *			- Use extended sense on drives that support it for
  *			  correctly reporting tray status -- from
  *			  Michael D Johnson <johnsom@orst.edu>
+ * 4.60  Dec 17, 2003	- Add mt rainier support
+ *			- Bump timeout for packet commands, matches sr
+ *			- Odd stuff
  *
  *************************************************************************/
  
-#define IDECD_VERSION "4.59-ac1"
+#define IDECD_VERSION "4.60"
 
 #include <linux/config.h>
 #include <linux/module.h>
@@ -774,11 +777,36 @@
 
 		if (sense_key == NOT_READY) {
 			/* Tray open. */
-			cdrom_saw_media_change (drive);
+			if (rq_data_dir(rq) == READ) {
+				cdrom_saw_media_change (drive);
 
-			/* Fail the request. */
-			printk ("%s: tray open\n", drive->name);
-			do_end_request = 1;
+				/* Fail the request. */
+				printk ("%s: tray open\n", drive->name);
+				do_end_request = 1;
+			} else {
+				struct cdrom_info *info = drive->driver_data;
+
+				/* allow the drive 5 seconds to recover, some
+				 * devices will return this error while flushing
+				 * data from cache */
+				if (!rq->errors)
+					info->write_timeout = jiffies + ATAPI_WAIT_BUSY;
+				rq->errors = 1;
+				if (time_after(jiffies, info->write_timeout))
+					do_end_request = 1;
+				else {
+					unsigned long flags;
+
+					/*
+					 * take a breather relying on the
+					 * unplug timer to kick us again
+					 */
+					spin_lock_irqsave(&ide_lock, flags);
+					blk_plug_device(drive->queue);
+					spin_unlock_irqrestore(&ide_lock,flags);
+					return 1;
+				}
+			}
 		} else if (sense_key == UNIT_ATTENTION) {
 			/* Media change. */
 			cdrom_saw_media_change (drive);
@@ -844,9 +872,13 @@
 		case GPCMD_BLANK:
 		case GPCMD_FORMAT_UNIT:
 		case GPCMD_RESERVE_RZONE_TRACK:
-			wait = WAIT_CMD;
+		case GPCMD_CLOSE_TRACK:
+		case GPCMD_FLUSH_CACHE:
+			wait = ATAPI_WAIT_PC;
 			break;
 		default:
+			if (!(rq->flags & REQ_QUIET))
+				printk(KERN_INFO "ide-cd: cmd 0x%x timed out\n", rq->cmd[0]);
 			wait = 0;
 			break;
 	}
@@ -894,7 +926,7 @@
  
 	if (CDROM_CONFIG_FLAGS (drive)->drq_interrupt) {
 		/* packet command */
-		ide_execute_command(drive, WIN_PACKETCMD, handler, WAIT_CMD, cdrom_timer_expiry);
+		ide_execute_command(drive, WIN_PACKETCMD, handler, ATAPI_WAIT_PC, cdrom_timer_expiry);
 		return ide_started;
 	} else {
 		/* packet command */
@@ -1167,7 +1199,7 @@
 	}
 
 	/* Done moving data!  Wait for another interrupt. */
-	ide_set_handler(drive, &cdrom_read_intr, WAIT_CMD, NULL);
+	ide_set_handler(drive, &cdrom_read_intr, ATAPI_WAIT_PC, NULL);
 	return ide_started;
 }
 
@@ -1277,7 +1309,7 @@
 		(65534 / CD_FRAMESIZE) : 65535);
 
 	/* Set up the command */
-	rq->timeout = WAIT_CMD;
+	rq->timeout = ATAPI_WAIT_PC;
 
 	/* Send the command to the drive and return. */
 	return cdrom_transfer_packet_command(drive, rq, &cdrom_read_intr);
@@ -1286,7 +1318,7 @@
 
 #define IDECD_SEEK_THRESHOLD	(1000)			/* 1000 blocks */
 #define IDECD_SEEK_TIMER	(5 * WAIT_MIN_SLEEP)	/* 100 ms */
-#define IDECD_SEEK_TIMEOUT     WAIT_CMD			/* 10 sec */
+#define IDECD_SEEK_TIMEOUT	(2 * WAIT_CMD)		/* 20 sec */
 
 static ide_startstop_t cdrom_seek_intr (ide_drive_t *drive)
 {
@@ -1326,7 +1358,7 @@
 	rq->cmd[0] = GPCMD_SEEK;
 	put_unaligned(cpu_to_be32(frame), (unsigned int *) &rq->cmd[2]);
 
-	rq->timeout = WAIT_CMD;
+	rq->timeout = ATAPI_WAIT_PC;
 	return cdrom_transfer_packet_command(drive, rq, &cdrom_seek_intr);
 }
 
@@ -1502,7 +1534,7 @@
 	}
 
 	/* Now we wait for another interrupt. */
-	ide_set_handler(drive, &cdrom_pc_intr, WAIT_CMD, cdrom_timer_expiry);
+	ide_set_handler(drive, &cdrom_pc_intr, ATAPI_WAIT_PC, cdrom_timer_expiry);
 	return ide_started;
 }
 
@@ -1511,7 +1543,7 @@
 	struct request *rq = HWGROUP(drive)->rq;
 
 	if (!rq->timeout)
-		rq->timeout = WAIT_CMD;
+		rq->timeout = ATAPI_WAIT_PC;
 
 	/* Send the command to the drive and return. */
 	return cdrom_transfer_packet_command(drive, rq, &cdrom_pc_intr);
@@ -1716,11 +1748,8 @@
 	/*
 	 * If DRQ is clear, the command has completed.
 	 */
-	if ((stat & DRQ_STAT) == 0) {
-		if (rq->data_len)
-			printk("%s: %u residual after xfer\n", __FUNCTION__, rq->data_len);
+	if ((stat & DRQ_STAT) == 0)
 		goto end_request;
-	}
 
 	/*
 	 * check which way to transfer data
@@ -1826,10 +1855,8 @@
 		}
 	}
 
-	if (cdrom_decode_status(drive, 0, &stat)) {
-		printk("ide-cd: write_intr decode_status bad\n");
+	if (cdrom_decode_status(drive, 0, &stat))
 		return ide_stopped;
-	}
 
 	/*
 	 * using dma, transfer is complete now
@@ -1904,7 +1931,7 @@
 	}
 
 	/* re-arm handler */
-	ide_set_handler(drive, &cdrom_write_intr, 5 * WAIT_CMD, NULL);
+	ide_set_handler(drive, &cdrom_write_intr, ATAPI_WAIT_PC, NULL);
 	return ide_started;
 }
 
@@ -1915,7 +1942,7 @@
 #if 0	/* the immediate bit */
 	rq->cmd[1] = 1 << 3;
 #endif
-	rq->timeout = 2 * WAIT_CMD;
+	rq->timeout = ATAPI_WAIT_PC;
 
 	return cdrom_transfer_packet_command(drive, rq, cdrom_write_intr);
 }
@@ -1956,7 +1983,7 @@
 	struct request *rq = HWGROUP(drive)->rq;
 
 	if (!rq->timeout)
-		rq->timeout = WAIT_CMD;
+		rq->timeout = ATAPI_WAIT_PC;
 
 	return cdrom_transfer_packet_command(drive, rq, cdrom_newpc_intr);
 }
@@ -2242,6 +2269,7 @@
 		struct atapi_toc_header hdr;
 		struct atapi_toc_entry  ent;
 	} ms_tmp;
+	long last_written;
 
 	if (toc == NULL) {
 		/* Try to allocate space. */
@@ -2261,6 +2289,13 @@
 	if (CDROM_STATE_FLAGS(drive)->toc_valid)
 		return 0;
 
+	/* Try to get the total cdrom capacity. */
+	stat = cdrom_read_capacity(drive, &toc->capacity, sense);
+	if (stat)
+		toc->capacity = 0x1fffff;
+
+	set_capacity(drive->disk, toc->capacity * SECTORS_PER_FRAME);
+
 	/* First read just the header, so we know how long the TOC is. */
 	stat = cdrom_read_tocentry(drive, 0, 1, 0, (char *) &toc->hdr,
 				    sizeof(struct atapi_toc_header), sense);
@@ -2368,13 +2403,11 @@
 	toc->xa_flag = (ms_tmp.hdr.first_track != ms_tmp.hdr.last_track);
 
 	/* Now try to get the total cdrom capacity. */
-	stat = cdrom_get_last_written(cdi, (long *) &toc->capacity);
-	if (stat || !toc->capacity)
-		stat = cdrom_read_capacity(drive, &toc->capacity, sense);
-	if (stat)
-		toc->capacity = 0x1fffff;
-
-	set_capacity(drive->disk, toc->capacity * SECTORS_PER_FRAME);
+	stat = cdrom_get_last_written(cdi, &last_written);
+	if (!stat && last_written) {
+		toc->capacity = last_written;
+		set_capacity(drive->disk, toc->capacity * SECTORS_PER_FRAME);
+	}
 
 	/* Remember that we've read this stuff. */
 	CDROM_STATE_FLAGS(drive)->toc_valid = 1;
@@ -2483,7 +2516,7 @@
 	ide_drive_t *drive = (ide_drive_t*) cdi->handle;
 
 	if (cgc->timeout <= 0)
-		cgc->timeout = WAIT_CMD;
+		cgc->timeout = ATAPI_WAIT_PC;
 
 	/* here we queue the commands from the uniform CD-ROM
 	   layer. the packet must be complete, as we do not
@@ -2688,37 +2721,49 @@
         return 0;
 }
 
+/*
+ * add logic to try GET_EVENT command first to check for media and tray
+ * status. this should be supported by newer cd-r/w and all DVD etc
+ * drives
+ */
 static
 int ide_cdrom_drive_status (struct cdrom_device_info *cdi, int slot_nr)
 {
 	ide_drive_t *drive = (ide_drive_t*) cdi->handle;
+	struct media_event_desc med;
+	struct request_sense sense;
+	int stat;
 
-	if (slot_nr == CDSL_CURRENT) {
-		struct request_sense sense;
-		int stat = cdrom_check_status(drive, &sense);
-		if (stat == 0 || sense.sense_key == UNIT_ATTENTION)
-			return CDS_DISC_OK;
+	if (slot_nr != CDSL_CURRENT)
+		return -EINVAL;
 
-		if (sense.sense_key == NOT_READY && sense.asc == 0x04 &&
-		    sense.ascq == 0x04)
-			return CDS_DISC_OK;
+	stat = cdrom_check_status(drive, &sense);
+	if (!stat || sense.sense_key == UNIT_ATTENTION)
+		return CDS_DISC_OK;
 
+	if (!cdrom_get_media_event(cdi, &med)) {
+		if (med.media_present)
+			return CDS_DISC_OK;
+		if (med.door_open)
+			return CDS_TRAY_OPEN;
+	}
 
-		/*
-		 * If not using Mt Fuji extended media tray reports,
-		 * just return TRAY_OPEN since ATAPI doesn't provide
-		 * any other way to detect this...
-		 */
-		if (sense.sense_key == NOT_READY) {
-			if (sense.asc == 0x3a && sense.ascq == 1)
-				return CDS_NO_DISC;
-			else
-				return CDS_TRAY_OPEN;
-		}
+	if (sense.sense_key == NOT_READY && sense.asc == 0x04 && sense.ascq == 0x04)
+		return CDS_DISC_OK;
 
-		return CDS_DRIVE_NOT_READY;
+	/*
+	 * If not using Mt Fuji extended media tray reports,
+	 * just return TRAY_OPEN since ATAPI doesn't provide
+	 * any other way to detect this...
+	 */
+	if (sense.sense_key == NOT_READY) {
+		if (sense.asc == 0x3a && sense.ascq == 1)
+			return CDS_NO_DISC;
+		else
+			return CDS_TRAY_OPEN;
 	}
-	return -EINVAL;
+
+	return CDS_DRIVE_NOT_READY;
 }
 
 static
@@ -2826,7 +2871,8 @@
 				CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO | CDC_RESET |
 				CDC_IOCTLS | CDC_DRIVE_STATUS | CDC_CD_R |
 				CDC_CD_RW | CDC_DVD | CDC_DVD_R| CDC_DVD_RAM |
-				CDC_GENERIC_PACKET | CDC_MO_DRIVE,
+				CDC_GENERIC_PACKET | CDC_MO_DRIVE | CDC_MRW |
+				CDC_MRW_W | CDC_RAM,
 	.generic_packet		= ide_cdrom_packet,
 };
 
@@ -2861,6 +2907,10 @@
 		devinfo->mask |= CDC_CLOSE_TRAY;
 	if (!CDROM_CONFIG_FLAGS(drive)->mo_drive)
 		devinfo->mask |= CDC_MO_DRIVE;
+	if (!CDROM_CONFIG_FLAGS(drive)->mrw)
+		devinfo->mask |= CDC_MRW;
+	if (!CDROM_CONFIG_FLAGS(drive)->mrw_w)
+		devinfo->mask |= CDC_MRW_W;
 
 	return register_cdrom(devinfo);
 }
@@ -2881,14 +2931,6 @@
 	    !strcmp(drive->id->model, "WPI CDS-32X")))
 		size -= sizeof(cap->pad);
 
-	/* we have to cheat a little here. the packet will eventually
-	 * be queued with ide_cdrom_packet(), which extracts the
-	 * drive from cdi->handle. Since this device hasn't been
-	 * registered with the Uniform layer yet, it can't do this.
-	 * Same goes for cdi->ops.
-	 */
-	cdi->handle = (ide_drive_t *) drive;
-	cdi->ops = &ide_cdrom_dops;
 	init_cdrom_command(&cgc, cap, size, CGC_DATA_UNKNOWN);
 	do { /* we seem to get stat=0x01,err=0x00 the first time (??) */
 		stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CAPABILITIES_PAGE, 0);
@@ -2904,7 +2946,7 @@
 	struct cdrom_info *info = drive->driver_data;
 	struct cdrom_device_info *cdi = &info->devinfo;
 	struct atapi_capabilities_page cap;
-	int nslots = 1;
+	int nslots = 1, mrw_write = 0;
 
 	if (drive->media == ide_optical) {
 		CDROM_CONFIG_FLAGS(drive)->mo_drive = 1;
@@ -2912,15 +2954,34 @@
 		return nslots;
 	}
 
-	if (CDROM_CONFIG_FLAGS(drive)->nec260) {
-		CDROM_CONFIG_FLAGS(drive)->no_eject = 0;                       
-		CDROM_CONFIG_FLAGS(drive)->audio_play = 1;       
+	if (CDROM_CONFIG_FLAGS(drive)->nec260 ||
+	    !strcmp(drive->id->model,"STINGRAY 8422 IDE 8X CD-ROM 7-27-95")) {
+		CDROM_CONFIG_FLAGS(drive)->no_eject = 0;
+		CDROM_CONFIG_FLAGS(drive)->audio_play = 1;
 		return nslots;
 	}
 
+	/*
+	 * we have to cheat a little here. the packet will eventually
+	 * be queued with ide_cdrom_packet(), which extracts the
+	 * drive from cdi->handle. Since this device hasn't been
+	 * registered with the Uniform layer yet, it can't do this.
+	 * Same goes for cdi->ops.
+	 */
+	cdi->handle = (ide_drive_t *) drive;
+	cdi->ops = &ide_cdrom_dops;
+
 	if (ide_cdrom_get_capabilities(drive, &cap))
 		return 0;
 
+	if (!cdrom_is_mrw(cdi, &mrw_write)) {
+		CDROM_CONFIG_FLAGS(drive)->mrw = 1;
+		if (mrw_write) {
+			CDROM_CONFIG_FLAGS(drive)->mrw_w = 1;
+			CDROM_CONFIG_FLAGS(drive)->ram = 1;
+		}
+	}
+
 	if (cap.lock == 0)
 		CDROM_CONFIG_FLAGS(drive)->no_doorlock = 1;
 	if (cap.eject)
@@ -2933,8 +2994,10 @@
 		CDROM_CONFIG_FLAGS(drive)->test_write = 1;
 	if (cap.dvd_ram_read || cap.dvd_r_read || cap.dvd_rom)
 		CDROM_CONFIG_FLAGS(drive)->dvd = 1;
-	if (cap.dvd_ram_write)
+	if (cap.dvd_ram_write) {
 		CDROM_CONFIG_FLAGS(drive)->dvd_ram = 1;
+		CDROM_CONFIG_FLAGS(drive)->ram = 1;
+	}
 	if (cap.dvd_r_write)
 		CDROM_CONFIG_FLAGS(drive)->dvd_r = 1;
 	if (cap.audio_play)
@@ -2998,6 +3061,9 @@
         	(CDROM_CONFIG_FLAGS(drive)->cd_r)? "-R" : "", 
         	(CDROM_CONFIG_FLAGS(drive)->cd_rw)? "/RW" : "");
 
+	if (CDROM_CONFIG_FLAGS(drive)->mrw || CDROM_CONFIG_FLAGS(drive)->mrw_w)
+		printk(" CD-MR%s", CDROM_CONFIG_FLAGS(drive)->mrw_w ? "W" : "");
+
         if (CDROM_CONFIG_FLAGS(drive)->is_changer) 
         	printk(" changer w/%d slots", nslots);
         else 	
@@ -3105,14 +3171,11 @@
 	struct cdrom_device_info *cdi = &info->devinfo;
 	int nslots;
 
-	/*
-	 * default to read-only always and fix latter at the bottom
-	 */
-	set_disk_ro(drive->disk, 1);
-	blk_queue_hardsect_size(drive->queue, CD_FRAMESIZE);
-
 	blk_queue_prep_rq(drive->queue, ide_cdrom_prep_fn);
 	blk_queue_dma_alignment(drive->queue, 3);
+	drive->queue->unplug_delay = (1 * HZ) / 1000;
+	if (!drive->queue->unplug_delay)
+		drive->queue->unplug_delay = 1;
 
 	drive->special.all	= 0;
 	drive->ready_stat	= 0;
@@ -3215,8 +3278,13 @@
 
 	nslots = ide_cdrom_probe_capabilities (drive);
 
-	if (CDROM_CONFIG_FLAGS(drive)->dvd_ram)
-		set_disk_ro(drive->disk, 0);
+	/*
+	 * set correct block size and read-only for non-ram media
+	 */
+	set_disk_ro(drive->disk,
+		!(CDROM_CONFIG_FLAGS(drive)->ram ||
+			CDROM_CONFIG_FLAGS(drive)->mo_drive));
+	blk_queue_hardsect_size(drive->queue, CD_FRAMESIZE);
 
 #if 0
 	drive->dsc_overlap = (HWIF(drive)->no_dsc) ? 0 : 1;
@@ -3335,39 +3403,39 @@
 	.complete_power_step	= ide_cdrom_complete_power_step,
 };
 
-static int idecd_open(struct inode * inode, struct file * file)
+static int idecd_open(struct block_device *bdev, struct file * file)
 {
-	ide_drive_t *drive = inode->i_bdev->bd_disk->private_data;
+	ide_drive_t *drive = bdev->bd_disk->private_data;
 	struct cdrom_info *info = drive->driver_data;
 	int rc = -ENOMEM;
 	drive->usage++;
 
 	if (!info->buffer)
-		info->buffer = (char *) kmalloc(SECTOR_BUFFER_SIZE, GFP_KERNEL);
-        if (!info->buffer || (rc = cdrom_open(&info->devinfo, inode, file)))
+		info->buffer = kmalloc(SECTOR_BUFFER_SIZE,
+					GFP_KERNEL|__GFP_REPEAT);
+        if (!info->buffer || (rc = cdrom_open(&info->devinfo, bdev, file)))
 		drive->usage--;
 	return rc;
 }
 
-static int idecd_release(struct inode * inode, struct file * file)
+static int idecd_release(struct gendisk *disk)
 {
-	ide_drive_t *drive = inode->i_bdev->bd_disk->private_data;
+	ide_drive_t *drive = disk->private_data;
 	struct cdrom_info *info = drive->driver_data;
 
-	cdrom_release (&info->devinfo, file);
+	cdrom_release(&info->devinfo);
 	drive->usage--;
 	return 0;
 }
 
-static int idecd_ioctl (struct inode *inode, struct file *file,
+static int idecd_ioctl (struct block_device *bdev, struct file *file,
 			unsigned int cmd, unsigned long arg)
 {
-	struct block_device *bdev = inode->i_bdev;
 	ide_drive_t *drive = bdev->bd_disk->private_data;
 	int err = generic_ide_ioctl(bdev, cmd, arg);
 	if (err == -EINVAL) {
 		struct cdrom_info *info = drive->driver_data;
-		err = cdrom_ioctl(&info->devinfo, inode, cmd, arg);
+		err = cdrom_ioctl(&info->devinfo, bdev, cmd, arg);
 	}
 	return err;
 }
--- diff/drivers/ide/ide-cd.h	2003-12-19 09:51:11.000000000 +0000
+++ source/drivers/ide/ide-cd.h	2003-12-29 09:30:40.000000000 +0000
@@ -35,6 +35,12 @@
 #define NO_DOOR_LOCKING 0
 #endif
 
+/*
+ * typical timeout for packet command
+ */
+#define ATAPI_WAIT_PC		(60 * HZ)
+#define ATAPI_WAIT_BUSY		(5 * HZ)
+
 /************************************************************************/
 
 #define SECTOR_BITS 		9
@@ -75,6 +81,9 @@
 	__u8 dvd		: 1; /* Drive is a DVD-ROM */
 	__u8 dvd_r		: 1; /* Drive can write DVD-R */
 	__u8 dvd_ram		: 1; /* Drive can write DVD-RAM */
+	__u8 mrw		: 1; /* drive can read mrw */
+	__u8 mrw_w		: 1; /* drive can write mrw */
+	__u8 ram		: 1; /* generic WRITE (dvd-ram/mrw) */
 	__u8 test_write		: 1; /* Drive can fake writes */
 	__u8 supp_disc_present	: 1; /* Changer can report exact contents
 					of slots. */
@@ -482,6 +491,8 @@
 
         /* Per-device info needed by cdrom.c generic driver. */
         struct cdrom_device_info devinfo;
+
+	unsigned long write_timeout;
 };
 
 /****************************************************************************
--- diff/drivers/ide/ide-disk.c	2003-09-17 12:28:05.000000000 +0100
+++ source/drivers/ide/ide-disk.c	2003-12-29 09:30:40.000000000 +0000
@@ -1734,9 +1734,9 @@
 	.complete_power_step	= idedisk_complete_power_step,
 };
 
-static int idedisk_open(struct inode *inode, struct file *filp)
+static int idedisk_open(struct block_device *bdev, struct file *filp)
 {
-	ide_drive_t *drive = inode->i_bdev->bd_disk->private_data;
+	ide_drive_t *drive = bdev->bd_disk->private_data;
 	drive->usage++;
 	if (drive->removable && drive->usage == 1) {
 		ide_task_t args;
@@ -1744,7 +1744,7 @@
 		memset(&args, 0, sizeof(ide_task_t));
 		args.tfRegister[IDE_COMMAND_OFFSET] = WIN_DOORLOCK;
 		args.command_type = ide_cmd_type_parser(&args);
-		check_disk_change(inode->i_bdev);
+		check_disk_change(bdev);
 		/*
 		 * Ignore the return code from door_lock,
 		 * since the open() has already succeeded,
@@ -1782,9 +1782,9 @@
 	return 0;
 }
 
-static int idedisk_release(struct inode *inode, struct file *filp)
+static int idedisk_release(struct gendisk *disk)
 {
-	ide_drive_t *drive = inode->i_bdev->bd_disk->private_data;
+	ide_drive_t *drive = disk->private_data;
 	if (drive->removable && drive->usage == 1) {
 		ide_task_t args;
 		memset(&args, 0, sizeof(ide_task_t));
@@ -1798,10 +1798,9 @@
 	return 0;
 }
 
-static int idedisk_ioctl(struct inode *inode, struct file *file,
+static int idedisk_ioctl(struct block_device *bdev, struct file *file,
 			unsigned int cmd, unsigned long arg)
 {
-	struct block_device *bdev = inode->i_bdev;
 	return generic_ide_ioctl(bdev, cmd, arg);
 }
 
--- diff/drivers/ide/ide-dma.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/ide/ide-dma.c	2003-12-29 09:30:40.000000000 +0000
@@ -200,8 +200,8 @@
  *	kernel provide the necessary cache management so that we can
  *	operate in a portable fashion
  */
- 
-static int ide_build_sglist (ide_drive_t *drive, struct request *rq)
+
+int ide_build_sglist(ide_drive_t *drive, struct request *rq)
 {
 	ide_hwif_t *hwif = HWIF(drive);
 	struct scatterlist *sg = hwif->sg_table;
@@ -220,6 +220,8 @@
 	return pci_map_sg(hwif->pci_dev, sg, nents, hwif->sg_dma_direction);
 }
 
+EXPORT_SYMBOL_GPL(ide_build_sglist);
+
 /**
  *	ide_raw_build_sglist	-	map IDE scatter gather for DMA
  *	@drive: the drive to build the DMA table for
@@ -230,8 +232,8 @@
  *	of the  kernel provide the necessary cache management so that we can
  *	operate in a portable fashion
  */
- 
-static int ide_raw_build_sglist (ide_drive_t *drive, struct request *rq)
+
+int ide_raw_build_sglist(ide_drive_t *drive, struct request *rq)
 {
 	ide_hwif_t *hwif = HWIF(drive);
 	struct scatterlist *sg = hwif->sg_table;
@@ -270,6 +272,8 @@
 	return pci_map_sg(hwif->pci_dev, sg, nents, hwif->sg_dma_direction);
 }
 
+EXPORT_SYMBOL_GPL(ide_raw_build_sglist);
+
 /**
  *	ide_build_dmatable	-	build IDE DMA table
  *
@@ -925,11 +929,13 @@
  */
 int ide_release_dma (ide_hwif_t *hwif)
 {
+	if (hwif->mmio == 2)
+		return 1;
 	if (hwif->chipset == ide_etrax100)
 		return 1;
 
 	ide_release_dma_engine(hwif);
-	if (hwif->mmio)
+	if (hwif->mmio == 1)
 		return ide_release_mmio_dma(hwif);
 	return ide_release_iomio_dma(hwif);
 }
@@ -986,6 +992,21 @@
 	return 1;
 }
 
+int ide_mapped_mmio_dma (ide_hwif_t *hwif, unsigned long base, unsigned int ports)
+{
+	printk(KERN_INFO "    %s: MMIO-DMA ", hwif->name);
+
+	hwif->dma_base = base;
+	if (hwif->cds->extra && hwif->channel == 0)
+		hwif->dma_extra = hwif->cds->extra;
+
+	if(hwif->mate)
+		hwif->dma_master = (hwif->channel) ? hwif->mate->dma_base : base;
+	else
+		hwif->dma_master = base;
+	return 0;
+}
+
 int ide_iomio_dma (ide_hwif_t *hwif, unsigned long base, unsigned int ports)
 {
 	printk(KERN_INFO "    %s: BM-DMA at 0x%04lx-0x%04lx",
@@ -1020,7 +1041,9 @@
  */
 int ide_dma_iobase (ide_hwif_t *hwif, unsigned long base, unsigned int ports)
 {
-	if (hwif->mmio)
+	if (hwif->mmio == 2)
+		return ide_mapped_mmio_dma(hwif, base,ports);
+	if (hwif->mmio == 1)
 		return ide_mmio_dma(hwif, base, ports);
 	return ide_iomio_dma(hwif, base, ports);
 }
--- diff/drivers/ide/ide-floppy.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/ide/ide-floppy.c	2003-12-29 09:30:40.000000000 +0000
@@ -1866,9 +1866,9 @@
 	.drives			= LIST_HEAD_INIT(idefloppy_driver.drives),
 };
 
-static int idefloppy_open(struct inode *inode, struct file *filp)
+static int idefloppy_open(struct block_device *bdev, struct file *filp)
 {
-	ide_drive_t *drive = inode->i_bdev->bd_disk->private_data;
+	ide_drive_t *drive = bdev->bd_disk->private_data;
 	idefloppy_floppy_t *floppy = drive->driver_data;
 	idefloppy_pc_t pc;
 
@@ -1908,7 +1908,7 @@
 			idefloppy_create_prevent_cmd(&pc, 1);
 			(void) idefloppy_queue_pc_tail(drive, &pc);
 		}
-		check_disk_change(inode->i_bdev);
+		check_disk_change(bdev);
 	} else if (test_bit(IDEFLOPPY_FORMAT_IN_PROGRESS, &floppy->flags)) {
 		drive->usage--;
 		return -EBUSY;
@@ -1916,9 +1916,9 @@
 	return 0;
 }
 
-static int idefloppy_release(struct inode *inode, struct file *filp)
+static int idefloppy_release(struct gendisk *disk)
 {
-	ide_drive_t *drive = inode->i_bdev->bd_disk->private_data;
+	ide_drive_t *drive = disk->private_data;
 	idefloppy_pc_t pc;
 	
 	debug_log(KERN_INFO "Reached idefloppy_release\n");
@@ -1938,10 +1938,9 @@
 	return 0;
 }
 
-static int idefloppy_ioctl(struct inode *inode, struct file *file,
+static int idefloppy_ioctl(struct block_device *bdev, struct file *file,
 			unsigned int cmd, unsigned long arg)
 {
-	struct block_device *bdev = inode->i_bdev;
 	ide_drive_t *drive = bdev->bd_disk->private_data;
 	idefloppy_floppy_t *floppy = drive->driver_data;
 	int err = generic_ide_ioctl(bdev, cmd, arg);
--- diff/drivers/ide/ide-io.c	2003-09-30 15:46:14.000000000 +0100
+++ source/drivers/ide/ide-io.c	2003-12-29 09:30:40.000000000 +0000
@@ -54,37 +54,6 @@
 #include <asm/io.h>
 #include <asm/bitops.h>
 
-#if (DISK_RECOVERY_TIME > 0)
-
-#error So the User Has To Fix the Compilation And Stop Hacking Port 0x43. Does anyone ever use this anyway ??
-
-/*
- * For really screwy hardware (hey, at least it *can* be used with Linux)
- * we can enforce a minimum delay time between successive operations.
- */
-static unsigned long read_timer (ide_hwif_t *hwif)
-{
-	unsigned long t, flags;
-	int i;
-	
-	/* FIXME this is completely unsafe! */
-	local_irq_save(flags);
-	t = jiffies * 11932;
-	outb_p(0, 0x43);
-	i = inb_p(0x40);
-	i |= inb_p(0x40) << 8;
-	local_irq_restore(flags);
-	return (t - i);
-}
-#endif /* DISK_RECOVERY_TIME */
-
-static inline void set_recovery_timer (ide_hwif_t *hwif)
-{
-#if (DISK_RECOVERY_TIME > 0)
-	hwif->last_time = read_timer(hwif);
-#endif /* DISK_RECOVERY_TIME */
-}
-
 /**
  *	ide_end_request		-	complete an IDE I/O
  *	@drive: IDE device for the I/O
@@ -653,10 +622,6 @@
 	if (block == 0 && drive->remap_0_to_1 == 1)
 		block = 1;  /* redirect MBR access to EZ-Drive partn table */
 
-#if (DISK_RECOVERY_TIME > 0)
-	while ((read_timer() - HWIF(drive)->last_time) < DISK_RECOVERY_TIME);
-#endif
-
 	if (blk_pm_suspend_request(rq) &&
 	    rq->pm->pm_step == ide_pm_state_start_suspend)
 		/* Mark drive blocked when starting the suspend sequence. */
@@ -1116,7 +1081,6 @@
 					startstop =
 					DRIVER(drive)->error(drive, "irq timeout", hwif->INB(IDE_STATUS_REG));
 			}
-			set_recovery_timer(hwif);
 			drive->service_time = jiffies - drive->service_start;
 			spin_lock_irq(&ide_lock);
 			enable_irq(hwif->irq);
@@ -1313,7 +1277,6 @@
 	 * same irq as is currently being serviced here, and Linux
 	 * won't allow another of the same (on any CPU) until we return.
 	 */
-	set_recovery_timer(HWIF(drive));
 	drive->service_time = jiffies - drive->service_start;
 	if (startstop == ide_stopped) {
 		if (hwgroup->handler == NULL) {	/* paranoia */
--- diff/drivers/ide/ide-tape.c	2003-11-25 15:24:57.000000000 +0000
+++ source/drivers/ide/ide-tape.c	2003-12-29 09:30:40.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * linux/drivers/ide/ide-tape.c		Version 1.17b	Oct, 2002
+ * linux/drivers/ide/ide-tape.c		Version 1.19	Nov, 2003
  *
  * Copyright (C) 1995 - 1999 Gadi Oxman <gadio@netvision.net.il>
  *
@@ -422,7 +422,7 @@
  *		sharing a (fast) ATA-2 disk with any (slow) new ATAPI device.
  */
 
-#define IDETAPE_VERSION "1.17b-ac1"
+#define IDETAPE_VERSION "1.19"
 
 #include <linux/config.h>
 #include <linux/module.h>
@@ -450,9 +450,6 @@
 #include <asm/unaligned.h>
 #include <asm/bitops.h>
 
-
-#define NO_LONGER_REQUIRED	(1)
-
 /*
  *	OnStream support
  */
@@ -652,9 +649,11 @@
 #define IDETAPE_PC_STACK		(10 + IDETAPE_MAX_PC_RETRIES)
 
 /*
- *	Some tape drives require a long irq timeout
+ * Some drives (for example, Seagate STT3401A Travan) require a very long
+ * timeout, because they don't return an interrupt or clear their busy bit
+ * until after the command completes (even retension commands).
  */
-#define IDETAPE_WAIT_CMD		(60*HZ)
+#define IDETAPE_WAIT_CMD		(900*HZ)
 
 /*
  *	The following parameter is used to select the point in the internal
@@ -1032,6 +1031,10 @@
 
 	/* the door is currently locked */
 	int door_locked;
+	/* the tape hardware is write protected */
+	char drv_write_prot;
+	/* the tape is write protected (hardware or opened as read-only) */
+	char write_prot;
 
 	/*
 	 * OnStream flags
@@ -1164,6 +1167,8 @@
 #define IDETAPE_DRQ_INTERRUPT		6	/* DRQ interrupt device */
 #define IDETAPE_READ_ERROR		7
 #define IDETAPE_PIPELINE_ACTIVE		8	/* pipeline active */
+/* 0 = no tape is loaded, so we don't rewind after ejecting */
+#define IDETAPE_MEDIUM_PRESENT		9
 
 /*
  *	Supported ATAPI tape drives packet commands
@@ -1211,10 +1216,14 @@
  *	requests to the tail of our block device request queue and wait
  *	for their completion.
  */
-#define idetape_request(rq) \
-	((rq)->flags & (REQ_IDETAPE_PC1 | REQ_IDETAPE_PC2 | \
-			REQ_IDETAPE_READ | REQ_IDETAPE_WRITE | \
-			REQ_IDETAPE_READ_BUFFER))
+
+enum {
+	REQ_IDETAPE_PC1		= (1 << 0), /* packet command (first stage) */
+	REQ_IDETAPE_PC2		= (1 << 1), /* packet command (second stage) */
+	REQ_IDETAPE_READ	= (1 << 2),
+	REQ_IDETAPE_WRITE	= (1 << 3),
+	REQ_IDETAPE_READ_BUFFER	= (1 << 4),
+};
 
 /*
  *	Error codes which are returned in rq->errors to the higher part
@@ -1665,6 +1674,20 @@
 		idetape_update_buffers(pc);
 	}
 
+	/*
+	 * If error was the result of a zero-length read or write command,
+	 * with sense key=5, asc=0x22, ascq=0, let it slide.  Some drives
+	 * (i.e. Seagate STT3401A Travan) don't support 0-length read/writes.
+	 */
+	if ((pc->c[0] == IDETAPE_READ_CMD || pc->c[0] == IDETAPE_WRITE_CMD)
+	    && pc->c[4] == 0 && pc->c[3] == 0 && pc->c[2] == 0) { /* length==0 */
+		if (result->sense_key == 5) {
+			/* don't report an error, everything's ok */
+			pc->error = 0;
+			/* don't retry read/write */
+			set_bit(PC_ABORT, &pc->flags);
+		}
+	}
 	if (pc->c[0] == IDETAPE_READ_CMD && result->filemark) {
 		pc->error = IDETAPE_ERROR_FILEMARK;
 		set_bit(PC_ABORT, &pc->flags);
@@ -1805,10 +1828,15 @@
 	}
 }
 
-static void idetape_abort_pipeline (ide_drive_t *drive, idetape_stage_t *last_stage)
+/*
+ * This will free all the pipeline stages starting from new_last_stage->next
+ * to the end of the list, and point tape->last_stage to new_last_stage.
+ */
+static void idetape_abort_pipeline(ide_drive_t *drive,
+				   idetape_stage_t *new_last_stage)
 {
 	idetape_tape_t *tape = drive->driver_data;
-	idetape_stage_t *stage = tape->next_stage;
+	idetape_stage_t *stage = new_last_stage->next;
 	idetape_stage_t *nstage;
 
 #if IDETAPE_DEBUG_LOG
@@ -1822,9 +1850,9 @@
 		--tape->nr_pending_stages;
 		stage = nstage;
 	}
-	tape->last_stage = last_stage;
-	if (last_stage)
-		last_stage->next = NULL;
+	if (new_last_stage)
+		new_last_stage->next = NULL;
+	tape->last_stage = new_last_stage;
 	tape->next_stage = NULL;
 }
 
@@ -1868,7 +1896,7 @@
 		tape->active_stage = NULL;
 		tape->active_data_request = NULL;
 		tape->nr_pending_stages--;
-		if (rq->flags & REQ_IDETAPE_WRITE) {
+		if (rq->cmd[0] & REQ_IDETAPE_WRITE) {
 #if ONSTREAM_DEBUG
 			if (tape->debug_level >= 2) {
 				if (tape->onstream) {
@@ -1914,7 +1942,7 @@
 					}
 				}
 			}
-		} else if (rq->flags & REQ_IDETAPE_READ) {
+		} else if (rq->cmd[0] & REQ_IDETAPE_READ) {
 			if (error == IDETAPE_ERROR_EOD) {
 				set_bit(IDETAPE_PIPELINE_ERROR, &tape->flags);
 				idetape_abort_pipeline(drive, active_stage);
@@ -1972,6 +2000,13 @@
 	pc->callback = &idetape_request_sense_callback;
 }
 
+static void idetape_init_rq(struct request *rq, u8 cmd)
+{
+	memset(rq, 0, sizeof(*rq));
+	rq->flags = REQ_SPECIAL;
+	rq->cmd[0] = cmd;
+}
+
 /*
  *	idetape_queue_pc_head generates a new packet command request in front
  *	of the request queue, before the current request, so that it will be
@@ -1993,8 +2028,7 @@
  */
 static void idetape_queue_pc_head (ide_drive_t *drive, idetape_pc_t *pc,struct request *rq)
 {
-	memset(rq, 0, sizeof(*rq));
-	rq->flags = REQ_IDETAPE_PC1;
+	idetape_init_rq(rq, REQ_IDETAPE_PC1);
 	rq->buffer = (char *) pc;
 	(void) ide_do_drive_cmd(drive, rq, ide_preempt);
 }
@@ -2430,7 +2464,14 @@
 	if (page_code != IDETAPE_BLOCK_DESCRIPTOR)
 		pc->c[1] = 8;	/* DBD = 1 - Don't return block descriptors */
 	pc->c[2] = page_code;
-	pc->c[3] = 255;		/* Don't limit the returned information */
+	/*
+	 * Changed pc->c[3] to 0 (255 will at best return unused info).
+	 *
+	 * For SCSI this byte is defined as subpage instead of high byte
+	 * of length and some IDE drives seem to interpret it this way
+	 * and return an error when 255 is used.
+	 */
+	pc->c[3] = 0;
 	pc->c[4] = 255;		/* (We will just discard data in that case) */
 	if (page_code == IDETAPE_BLOCK_DESCRIPTOR)
 		pc->request_transfer = 12;
@@ -2544,8 +2585,9 @@
 	if (status.b.dsc) {
 		if (status.b.check) {
 			/* Error detected */
-			printk(KERN_ERR "ide-tape: %s: I/O error, ",tape->name);
-
+			if (pc->c[0] != IDETAPE_TEST_UNIT_READY_CMD)
+				printk(KERN_ERR "ide-tape: %s: I/O error, ",
+						tape->name);
 			/* Retry operation */
 			return idetape_retry_pc(drive);
 		}
@@ -2697,7 +2739,7 @@
 	if (tape->debug_level >= 5)
 		printk(KERN_INFO "ide-tape: rq_status: %d, "
 			"dev: %s, cmd: %ld, errors: %d\n", rq->rq_status,
-			 rq->rq_disk->disk_name, rq->flags, rq->errors);
+			 rq->rq_disk->disk_name, rq->cmd[0], rq->errors);
 #endif
 	if (tape->debug_level >= 2)
 		printk(KERN_INFO "ide-tape: sector: %ld, "
@@ -2705,11 +2747,11 @@
 			rq->sector, rq->nr_sectors, rq->current_nr_sectors);
 #endif /* IDETAPE_DEBUG_LOG */
 
-	if (!idetape_request(rq)) {
+	if ((rq->flags & REQ_SPECIAL) == 0) {
 		/*
 		 * We do not support buffer cache originated requests.
 		 */
-		printk(KERN_NOTICE "ide-tape: %s: Unsupported command in "
+		printk(KERN_NOTICE "ide-tape: %s: Unsupported request in "
 			"request queue (%ld)\n", drive->name, rq->flags);
 		ide_end_request(drive, 0, 0);
 		return ide_stopped;
@@ -2746,7 +2788,7 @@
 	 */
 	if (tape->onstream)
 		status.b.dsc = 1;
-	if (!drive->dsc_overlap && !(rq->flags & REQ_IDETAPE_PC2))
+	if (!drive->dsc_overlap && !(rq->cmd[0] & REQ_IDETAPE_PC2))
 		set_bit(IDETAPE_IGNORE_DSC, &tape->flags);
 
 	/*
@@ -2760,7 +2802,7 @@
 	if (tape->tape_still_time > 100 && tape->tape_still_time < 200)
 		tape->measure_insert_time = 1;
 	if (tape->req_buffer_fill &&
-	    (rq->flags & (REQ_IDETAPE_WRITE | REQ_IDETAPE_READ))) {
+	    (rq->cmd[0] & (REQ_IDETAPE_WRITE | REQ_IDETAPE_READ))) {
 		tape->req_buffer_fill = 0;
 		tape->writes_since_buffer_fill = 0;
 		tape->reads_since_buffer_fill = 0;
@@ -2774,12 +2816,12 @@
 		tape->insert_speed = tape->insert_size / 1024 * HZ / (jiffies - tape->insert_time);
 	calculate_speeds(drive);
 	if (tape->onstream && tape->max_frames &&
-	    (((rq->flags & REQ_IDETAPE_WRITE) &&
+	    (((rq->cmd[0] & REQ_IDETAPE_WRITE) &&
               ( tape->cur_frames == tape->max_frames ||
                 ( tape->speed_control && tape->cur_frames > 5 &&
                        (tape->insert_speed > tape->max_insert_speed ||
                         (0 /* tape->cur_frames > 30 && tape->tape_still_time > 200 */) ) ) ) ) ||
-	     ((rq->flags & REQ_IDETAPE_READ) &&
+	     ((rq->cmd[0] & REQ_IDETAPE_READ) &&
 	      ( tape->cur_frames == 0 ||
 		( tape->speed_control && (tape->cur_frames < tape->max_frames - 5) &&
 			tape->insert_speed > tape->max_insert_speed ) ) && rq->nr_sectors) ) ) {
@@ -2787,7 +2829,7 @@
 		if (tape->debug_level >= 4)
 			printk(KERN_INFO "ide-tape: postponing request, "
 					"cmd %ld, cur %d, max %d\n",
-				rq->flags, tape->cur_frames, tape->max_frames);
+				rq->cmd[0], tape->cur_frames, tape->max_frames);
 #endif
 		if (tape->postpone_cnt++ < 500) {
 			status.b.dsc = 0;
@@ -2808,7 +2850,7 @@
 		} else if ((signed long) (jiffies - tape->dsc_timeout) > 0) {
 			printk(KERN_ERR "ide-tape: %s: DSC timeout\n",
 				tape->name);
-			if (rq->flags & REQ_IDETAPE_PC2) {
+			if (rq->cmd[0] & REQ_IDETAPE_PC2) {
 				idetape_media_access_finished(drive);
 				return ide_stopped;
 			} else {
@@ -2819,7 +2861,7 @@
 		idetape_postpone_request(drive);
 		return ide_stopped;
 	}
-	if (rq->flags & REQ_IDETAPE_READ) {
+	if (rq->cmd[0] & REQ_IDETAPE_READ) {
 		tape->buffer_head++;
 #if USE_IOTRACE
 		IO_trace(IO_IDETAPE_FIFO, tape->pipeline_head, tape->buffer_head, tape->tape_head, tape->minor);
@@ -2836,7 +2878,7 @@
 		idetape_create_read_cmd(tape, pc, rq->current_nr_sectors, (struct idetape_bh *)rq->special);
 		goto out;
 	}
-	if (rq->flags & REQ_IDETAPE_WRITE) {
+	if (rq->cmd[0] & REQ_IDETAPE_WRITE) {
 		tape->buffer_head++;
 #if USE_IOTRACE
 		IO_trace(IO_IDETAPE_FIFO, tape->pipeline_head, tape->buffer_head, tape->tape_head, tape->minor);
@@ -2854,19 +2896,19 @@
 		idetape_create_write_cmd(tape, pc, rq->current_nr_sectors, (struct idetape_bh *)rq->special);
 		goto out;
 	}
-	if (rq->flags & REQ_IDETAPE_READ_BUFFER) {
+	if (rq->cmd[0] & REQ_IDETAPE_READ_BUFFER) {
 		tape->postpone_cnt = 0;
 		pc = idetape_next_pc_storage(drive);
 		idetape_create_read_buffer_cmd(tape, pc, rq->current_nr_sectors, (struct idetape_bh *)rq->special);
 		goto out;
 	}
-	if (rq->flags & REQ_IDETAPE_PC1) {
+	if (rq->cmd[0] & REQ_IDETAPE_PC1) {
 		pc = (idetape_pc_t *) rq->buffer;
-		rq->flags &= ~(REQ_IDETAPE_PC1);
-		rq->flags |= REQ_IDETAPE_PC2;
+		rq->cmd[0] &= ~(REQ_IDETAPE_PC1);
+		rq->cmd[0] |= REQ_IDETAPE_PC2;
 		goto out;
 	}
-	if (rq->flags & REQ_IDETAPE_PC2) {
+	if (rq->cmd[0] & REQ_IDETAPE_PC2) {
 		idetape_media_access_finished(drive);
 		return ide_stopped;
 	}
@@ -3163,7 +3205,7 @@
 	idetape_tape_t *tape = drive->driver_data;
 
 #if IDETAPE_DEBUG_BUGS
-	if (rq == NULL || !idetape_request(rq)) {
+	if (rq == NULL || (rq->flags & REQ_SPECIAL) == 0) {
 		printk (KERN_ERR "ide-tape: bug: Trying to sleep on non-valid request\n");
 		return;
 	}
@@ -3269,8 +3311,7 @@
 {
 	struct request rq;
 
-	memset(&rq, 0, sizeof(rq));
-	rq.flags = REQ_IDETAPE_PC1;
+	idetape_init_rq(&rq, REQ_IDETAPE_PC1);
 	rq.buffer = (char *) pc;
 	return ide_do_drive_cmd(drive, &rq, ide_wait);
 }
@@ -3295,25 +3336,28 @@
 {
 	idetape_tape_t *tape = drive->driver_data;
 	idetape_pc_t pc;
+	int load_attempted = 0;
 
 	/*
 	 * Wait for the tape to become ready
 	 */
+	set_bit(IDETAPE_MEDIUM_PRESENT, &tape->flags);
 	timeout += jiffies;
 	while (time_before(jiffies, timeout)) {
 		idetape_create_test_unit_ready_cmd(&pc);
 		if (!__idetape_queue_pc_tail(drive, &pc))
 			return 0;
-		if (tape->sense_key == 2 && tape->asc == 4 && tape->ascq == 2) {
+		if ((tape->sense_key == 2 && tape->asc == 4 && tape->ascq == 2)
+		    || (tape->asc == 0x3A)) {	/* no media */
+			if (load_attempted)
+				return -ENOMEDIUM;
 			idetape_create_load_unload_cmd(drive, &pc, IDETAPE_LU_LOAD_MASK);
 			__idetape_queue_pc_tail(drive, &pc);
-			idetape_create_test_unit_ready_cmd(&pc);
-			if (!__idetape_queue_pc_tail(drive, &pc))
-				return 0;
-		}
-		if (!(tape->sense_key == 2 && tape->asc == 4 &&
-		      (tape->ascq == 1 || tape->ascq == 8)))
-			break;
+			load_attempted = 1;
+		/* not about to be ready */
+		} else if (!(tape->sense_key == 2 && tape->asc == 4 &&
+			     (tape->ascq == 1 || tape->ascq == 8)))
+			return -EIO;
 		current->state = TASK_INTERRUPTIBLE;
   		schedule_timeout(HZ / 10);
 	}
@@ -3369,25 +3413,10 @@
 		printk(KERN_INFO "ide-tape: Reached idetape_read_position\n");
 #endif /* IDETAPE_DEBUG_LOG */
 
-#ifdef NO_LONGER_REQUIRED
-	idetape_flush_tape_buffers(drive);
-#endif
 	idetape_create_read_position_cmd(&pc);
 	if (idetape_queue_pc_tail(drive, &pc))
 		return -1;
 	position = tape->first_frame_position;
-#ifdef NO_LONGER_REQUIRED
-	if (tape->onstream) {
-		if ((position != tape->last_frame_position - tape->blocks_in_buffer) &&
-		    (position != tape->last_frame_position + tape->blocks_in_buffer)) {
-			if (tape->blocks_in_buffer == 0) {
-				printk("ide-tape: %s: correcting read position %d, %d, %d\n", tape->name, position, tape->last_frame_position, tape->blocks_in_buffer);
-				position = tape->last_frame_position;
-				tape->first_frame_position = position;
-			}
-		}
-	}
-#endif
 	return position;
 }
 
@@ -3436,6 +3465,8 @@
 
 	if (tape->chrdev_direction != idetape_direction_read)
 		return 0;
+
+	/* Remove merge stage. */
 	cnt = tape->merge_stage_size / tape->tape_block_size;
 	if (test_and_clear_bit(IDETAPE_FILEMARK, &tape->flags))
 		++cnt;		/* Filemarks count as 1 sector */
@@ -3444,9 +3475,12 @@
 		__idetape_kfree_stage(tape->merge_stage);
 		tape->merge_stage = NULL;
 	}
+
+	/* Clear pipeline flags. */
 	clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags);
 	tape->chrdev_direction = idetape_direction_none;
-	
+
+	/* Remove pipeline stages. */
 	if (tape->first_stage == NULL)
 		return 0;
 
@@ -3546,8 +3580,7 @@
 	}
 #endif /* IDETAPE_DEBUG_BUGS */	
 
-	memset(&rq, 0, sizeof(rq));
-	rq.flags = cmd;
+	idetape_init_rq(&rq, cmd);
 	rq.special = (void *)bh;
 	rq.sector = tape->first_frame_position;
 	rq.nr_sectors = rq.current_nr_sectors = blocks;
@@ -3596,8 +3629,7 @@
 			printk(KERN_INFO "ide-tape: %s: read back logical block %d, data %x %x %x %x\n", tape->name, logical_blk_num, *p++, *p++, *p++, *p++);
 #endif
 		rq = &stage->rq;
-		memset(rq, 0, sizeof(*rq));
-		rq->flags = REQ_IDETAPE_WRITE;
+		idetape_init_rq(rq, REQ_IDETAPE_WRITE);
 		rq->sector = tape->first_frame_position;
 		rq->nr_sectors = rq->current_nr_sectors = tape->capabilities.ctl;
 		idetape_init_stage(drive, stage, OS_FRAME_TYPE_DATA, logical_blk_num++);
@@ -3871,8 +3903,7 @@
 		}
 	}
 	rq = &new_stage->rq;
-	memset(rq, 0, sizeof(*rq));
-	rq->flags = REQ_IDETAPE_WRITE;
+	idetape_init_rq(rq, REQ_IDETAPE_WRITE);
 	/* Doesn't actually matter - We always assume sequential access */
 	rq->sector = tape->first_frame_position;
 	rq->nr_sectors = rq->current_nr_sectors = blocks;
@@ -4059,19 +4090,22 @@
 		 *	Issue a read 0 command to ensure that DSC handshake
 		 *	is switched from completion mode to buffer available
 		 *	mode.
+		 *	No point in issuing this if DSC overlap isn't supported,
+		 *	some drives (Seagate STT3401A) will return an error.
 		 */
-		bytes_read = idetape_queue_rw_tail(drive, REQ_IDETAPE_READ, 0, tape->merge_stage->bh);
-		if (bytes_read < 0) {
-			__idetape_kfree_stage(tape->merge_stage);
-			tape->merge_stage = NULL;
-			tape->chrdev_direction = idetape_direction_none;
-			return bytes_read;
+		if (drive->dsc_overlap) {
+			bytes_read = idetape_queue_rw_tail(drive, REQ_IDETAPE_READ, 0, tape->merge_stage->bh);
+			if (bytes_read < 0) {
+				__idetape_kfree_stage(tape->merge_stage);
+				tape->merge_stage = NULL;
+				tape->chrdev_direction = idetape_direction_none;
+				return bytes_read;
+			}
 		}
 	}
 	if (tape->restart_speed_control_req)
 		idetape_restart_speed_control(drive);
-	memset(&rq, 0, sizeof(rq));
-	rq.flags = REQ_IDETAPE_READ;
+	idetape_init_rq(&rq, REQ_IDETAPE_READ);
 	rq.sector = tape->first_frame_position;
 	rq.nr_sectors = rq.current_nr_sectors = blocks;
 	if (!test_bit(IDETAPE_PIPELINE_ERROR, &tape->flags) &&
@@ -4898,6 +4932,10 @@
 		return -ENXIO;
 	}
 
+	/* The drive is write protected. */
+	if (tape->write_prot)
+		return -EACCES;
+
 #if IDETAPE_DEBUG_LOG
 	if (tape->debug_level >= 3)
 		printk(KERN_INFO "ide-tape: Reached idetape_chrdev_write, "
@@ -4979,13 +5017,17 @@
 		 *	Issue a write 0 command to ensure that DSC handshake
 		 *	is switched from completion mode to buffer available
 		 *	mode.
+		 *	No point in issuing this if DSC overlap isn't supported,
+		 *	some drives (Seagate STT3401A) will return an error.
 		 */
-		retval = idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE, 0, tape->merge_stage->bh);
-		if (retval < 0) {
-			__idetape_kfree_stage(tape->merge_stage);
-			tape->merge_stage = NULL;
-			tape->chrdev_direction = idetape_direction_none;
-			return retval;
+		if (drive->dsc_overlap) {
+			retval = idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE, 0, tape->merge_stage->bh);
+			if (retval < 0) {
+				__idetape_kfree_stage(tape->merge_stage);
+				tape->merge_stage = NULL;
+				tape->chrdev_direction = idetape_direction_none;
+				return retval;
+			}
 		}
 #if ONSTREAM_DEBUG
 		if (tape->debug_level >= 2)
@@ -5141,7 +5183,7 @@
  *	Note:
  *
  *		MTBSF and MTBSFM are not supported when the tape doesn't
- *		supports spacing over filemarks in the reverse direction.
+ *		support spacing over filemarks in the reverse direction.
  *		In this case, MTFSFM is also usually not supported (it is
  *		supported in the rare case in which we crossed the filemark
  *		during our read-ahead pipelined operation mode).
@@ -5211,6 +5253,8 @@
 	}
 	switch (mt_op) {
 		case MTWEOF:
+			if (tape->write_prot)
+				return -EACCES;
 			idetape_discard_read_pipeline(drive, 1);
 			for (i = 0; i < mt_count; i++) {
 				retval = idetape_write_filemark(drive);
@@ -5231,9 +5275,21 @@
 			return (idetape_queue_pc_tail(drive, &pc));
 		case MTUNLOAD:
 		case MTOFFL:
+			/*
+			 * If door is locked, attempt to unlock before
+			 * attempting to eject.
+			 */
+			if (tape->door_locked) {
+				if (idetape_create_prevent_cmd(drive, &pc, 0))
+					if (!idetape_queue_pc_tail(drive, &pc))
+						tape->door_locked = DOOR_UNLOCKED;
+			}
 			idetape_discard_read_pipeline(drive, 0);
 			idetape_create_load_unload_cmd(drive, &pc,!IDETAPE_LU_LOAD_MASK);
-			return (idetape_queue_pc_tail(drive, &pc));
+			retval = idetape_queue_pc_tail(drive, &pc);
+			if (!retval)
+				clear_bit(IDETAPE_MEDIUM_PRESENT, &tape->flags);
+			return retval;
 		case MTNOP:
 			idetape_discard_read_pipeline(drive, 0);
 			return (idetape_flush_tape_buffers(drive));
@@ -5409,6 +5465,8 @@
 					mtget.mt_gstat |= GMT_EOD(0xffffffff);
 				if (position <= OS_DATA_STARTFRAME1)
 					mtget.mt_gstat |= GMT_BOT(0xffffffff);
+			} else if (tape->drv_write_prot) {
+				mtget.mt_gstat |= GMT_WR_PROT(0xffffffff);
 			}
 			if (copy_to_user((char *) arg,(char *) &mtget, sizeof(struct mtget)))
 				return -EFAULT;
@@ -5530,6 +5588,8 @@
 	return 1;
 }
 
+static void idetape_get_blocksize_from_block_descriptor(ide_drive_t *drive);
+
 /*
  *	Our character device open function.
  */
@@ -5539,7 +5599,8 @@
 	ide_drive_t *drive;
 	idetape_tape_t *tape;
 	idetape_pc_t pc;
-			
+	int retval;
+
 #if IDETAPE_DEBUG_LOG
 	printk(KERN_INFO "ide-tape: Reached idetape_chrdev_open\n");
 #endif /* IDETAPE_DEBUG_LOG */
@@ -5552,11 +5613,7 @@
 
 	if (test_and_set_bit(IDETAPE_BUSY, &tape->flags))
 		return -EBUSY;
-	if (!tape->onstream) {	
-		idetape_read_position(drive);
-		if (!test_bit(IDETAPE_ADDRESS_VALID, &tape->flags))
-			(void) idetape_rewind_tape(drive);
-	} else {
+	if (tape->onstream) {
 		if (minor & 64) {
 			tape->tape_block_size = tape->stage_size = 32768 + 512;
 			tape->raw = 1;
@@ -5566,16 +5623,42 @@
 		}
                 idetape_onstream_mode_sense_tape_parameter_page(drive, tape->debug_level);
 	}
-	if (idetape_wait_ready(drive, 60 * HZ)) {
+	retval = idetape_wait_ready(drive, 60 * HZ);
+	if (retval) {
 		clear_bit(IDETAPE_BUSY, &tape->flags);
 		printk(KERN_ERR "ide-tape: %s: drive not ready\n", tape->name);
-		return -EBUSY;
+		return retval;
 	}
-	if (tape->onstream)
-		idetape_read_position(drive);
+
+	idetape_read_position(drive);
+	if (!test_bit(IDETAPE_ADDRESS_VALID, &tape->flags))
+		(void)idetape_rewind_tape(drive);
+
 	if (tape->chrdev_direction != idetape_direction_read)
 		clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags);
 
+	/* Read block size and write protect status from drive. */
+	idetape_get_blocksize_from_block_descriptor(drive);
+
+	/* Set write protect flag if device is opened as read-only. */
+	if ((filp->f_flags & O_ACCMODE) == O_RDONLY)
+		tape->write_prot = 1;
+	else
+		tape->write_prot = tape->drv_write_prot;
+
+	/* Make sure drive isn't write protected if user wants to write. */
+	if (tape->write_prot) {
+		if ((filp->f_flags & O_ACCMODE) == O_WRONLY ||
+		    (filp->f_flags & O_ACCMODE) == O_RDWR) {
+			clear_bit(IDETAPE_BUSY, &tape->flags);
+			return -EROFS;
+		}
+	}
+
+	/*
+	 * Lock the tape drive door so user can't eject.
+	 * Analyze headers for OnStream drives.
+	 */
 	if (tape->chrdev_direction == idetape_direction_none) {
 		if (idetape_create_prevent_cmd(drive, &pc, 1)) {
 			if (!idetape_queue_pc_tail(drive, &pc)) {
@@ -5638,7 +5721,7 @@
 		__idetape_kfree_stage(tape->cache_stage);
 		tape->cache_stage = NULL;
 	}
-	if (minor < 128)
+	if (minor < 128 && test_bit(IDETAPE_MEDIUM_PRESENT, &tape->flags))
 		(void) idetape_rewind_tape(drive);
 	if (tape->chrdev_direction == idetape_direction_none) {
 		if (tape->door_locked == DOOR_LOCKED) {
@@ -6059,6 +6142,8 @@
 	header = (idetape_mode_parameter_header_t *) pc.buffer;
 	block_descrp = (idetape_parameter_block_descriptor_t *) (pc.buffer + sizeof(idetape_mode_parameter_header_t));
 	tape->tape_block_size =( block_descrp->length[0]<<16) + (block_descrp->length[1]<<8) + block_descrp->length[2];
+	tape->drv_write_prot = (header->dsp & 0x80) >> 7;
+
 #if IDETAPE_DEBUG_INFO
 	printk(KERN_INFO "ide-tape: Adjusted block size - %d\n", tape->tape_block_size);
 #endif /* IDETAPE_DEBUG_INFO */
@@ -6139,6 +6224,9 @@
 		}
 	}
 #endif /* CONFIG_BLK_DEV_IDEPCI */
+	/* Seagate Travan drives do not support DSC overlap. */
+	if (strstr(drive->id->model, "Seagate STT3401"))
+		drive->dsc_overlap = 0;
 	tape->drive = drive;
 	tape->minor = minor;
 	tape->name[0] = 'h';
@@ -6306,24 +6394,23 @@
 	.release	= idetape_chrdev_release,
 };
 
-static int idetape_open(struct inode *inode, struct file *filp)
+static int idetape_open(struct block_device *bdev, struct file *filp)
 {
-	ide_drive_t *drive = inode->i_bdev->bd_disk->private_data;
+	ide_drive_t *drive = bdev->bd_disk->private_data;
 	drive->usage++;
 	return 0;
 }
 
-static int idetape_release(struct inode *inode, struct file *filp)
+static int idetape_release(struct gendisk *disk)
 {
-	ide_drive_t *drive = inode->i_bdev->bd_disk->private_data;
+	ide_drive_t *drive = disk->private_data;
 	drive->usage--;
 	return 0;
 }
 
-static int idetape_ioctl(struct inode *inode, struct file *file,
+static int idetape_ioctl(struct block_device *bdev, struct file *file,
 			unsigned int cmd, unsigned long arg)
 {
-	struct block_device *bdev = inode->i_bdev;
 	ide_drive_t *drive = bdev->bd_disk->private_data;
 	int err = generic_ide_ioctl(bdev, cmd, arg);
 	if (err == -EINVAL)
--- diff/drivers/ide/ide.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/ide/ide.c	2003-12-29 09:30:40.000000000 +0000
@@ -458,7 +458,7 @@
 
 EXPORT_SYMBOL(ide_probe_module);
 
-static int ide_open (struct inode * inode, struct file * filp)
+static int ide_open (struct block_device *bdev, struct file * filp)
 {
 	return -ENXIO;
 }
@@ -1632,12 +1632,12 @@
 #endif /* CONFIG_IDE_TASK_IOCTL */
 
 		case HDIO_DRIVE_CMD:
-			if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
+			if (!capable(CAP_SYS_RAWIO))
 				return -EACCES;
 			return ide_cmd_ioctl(drive, cmd, arg);
 
 		case HDIO_DRIVE_TASK:
-			if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
+			if (!capable(CAP_SYS_RAWIO))
 				return -EACCES;
 			return ide_task_ioctl(drive, cmd, arg);
 
--- diff/drivers/ide/legacy/hd.c	2003-08-26 10:00:52.000000000 +0100
+++ source/drivers/ide/legacy/hd.c	2003-12-29 09:30:40.000000000 +0000
@@ -656,10 +656,10 @@
 	enable_irq(HD_IRQ);
 }
 
-static int hd_ioctl(struct inode * inode, struct file * file,
+static int hd_ioctl(struct block_device *bdev, struct file *file,
 	unsigned int cmd, unsigned long arg)
 {
-	struct hd_i_struct *disk = inode->i_bdev->bd_disk->private_data;
+	struct hd_i_struct *disk = bdev->bd_disk->private_data;
 	struct hd_geometry *loc = (struct hd_geometry *) arg;
 	struct hd_geometry g; 
 
@@ -670,7 +670,7 @@
 	g.heads = disk->head;
 	g.sectors = disk->sect;
 	g.cylinders = disk->cyl;
-	g.start = get_start_sect(inode->i_bdev);
+	g.start = get_start_sect(bdev);
 	return copy_to_user(loc, &g, sizeof g) ? -EFAULT : 0; 
 }
 
--- diff/drivers/ide/legacy/hd98.c	2003-08-20 14:16:28.000000000 +0100
+++ source/drivers/ide/legacy/hd98.c	2003-12-29 09:30:40.000000000 +0000
@@ -652,10 +652,10 @@
 	enable_irq(HD_IRQ);
 }
 
-static int hd_ioctl(struct inode * inode, struct file * file,
+static int hd_ioctl(struct block_device *bdev, struct file *file,
 	unsigned int cmd, unsigned long arg)
 {
-	struct hd_i_struct *disk = inode->i_bdev->bd_disk->private_data;
+	struct hd_i_struct *disk = bdev->bd_disk->private_data;
 	struct hd_geometry *loc = (struct hd_geometry *) arg;
 	struct hd_geometry g; 
 
@@ -666,7 +666,7 @@
 	g.heads = disk->head;
 	g.sectors = disk->sect;
 	g.cylinders = disk->cyl;
-	g.start = get_start_sect(inode->i_bdev);
+	g.start = get_start_sect(bdev);
 	return copy_to_user(loc, &g, sizeof g) ? -EFAULT : 0; 
 }
 
--- diff/drivers/ide/pci/Makefile	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/ide/pci/Makefile	2003-12-29 09:30:40.000000000 +0000
@@ -21,6 +21,7 @@
 obj-$(CONFIG_BLK_DEV_PIIX)		+= piix.o
 obj-$(CONFIG_BLK_DEV_RZ1000)		+= rz1000.o
 obj-$(CONFIG_BLK_DEV_SVWKS)		+= serverworks.o
+obj-$(CONFIG_BLK_DEV_SGIIOC4)		+= sgiioc4.o
 obj-$(CONFIG_BLK_DEV_SIIMAGE)		+= siimage.o
 obj-$(CONFIG_BLK_DEV_SIS5513)		+= sis5513.o
 obj-$(CONFIG_BLK_DEV_SL82C105)		+= sl82c105.o
--- diff/drivers/ide/pci/cmd640.c	2003-09-17 12:28:05.000000000 +0100
+++ source/drivers/ide/pci/cmd640.c	2003-12-29 09:30:40.000000000 +0000
@@ -213,13 +213,13 @@
 
 static void put_cmd640_reg_pci1 (u16 reg, u8 val)
 {
-	outb_p((reg & 0xfc) | cmd640_key, 0xcf8);
+	outl_p((reg & 0xfc) | cmd640_key, 0xcf8);
 	outb_p(val, (reg & 3) | 0xcfc);
 }
 
 static u8 get_cmd640_reg_pci1 (u16 reg)
 {
-	outb_p((reg & 0xfc) | cmd640_key, 0xcf8);
+	outl_p((reg & 0xfc) | cmd640_key, 0xcf8);
 	return inb_p((reg & 3) | 0xcfc);
 }
 
--- diff/drivers/ide/pci/pdc202xx_new.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/ide/pci/pdc202xx_new.c	2003-12-29 09:30:40.000000000 +0000
@@ -36,60 +36,20 @@
 
 #define PDC202_DEBUG_CABLE	0
 
-#if defined(DISPLAY_PDC202XX_TIMINGS) && defined(CONFIG_PROC_FS)
-#include <linux/stat.h>
-#include <linux/proc_fs.h>
-
-static u8 pdcnew_proc = 0;
-#define PDC202_MAX_DEVS		5
-static struct pci_dev *pdc202_devs[PDC202_MAX_DEVS];
-static int n_pdc202_devs;
-
-static char * pdcnew_info(char *buf, struct pci_dev *dev)
-{
-	char *p = buf;
-
-	p += sprintf(p, "\n                                ");
-	switch(dev->device) {
-		case PCI_DEVICE_ID_PROMISE_20277:
-			p += sprintf(p, "SBFastTrak 133 Lite"); break;
-		case PCI_DEVICE_ID_PROMISE_20276:
-			p += sprintf(p, "MBFastTrak 133 Lite"); break;
-		case PCI_DEVICE_ID_PROMISE_20275:
-			p += sprintf(p, "MBUltra133"); break;
-		case PCI_DEVICE_ID_PROMISE_20271:
-			p += sprintf(p, "FastTrak TX2000"); break;
-		case PCI_DEVICE_ID_PROMISE_20270:
-			p += sprintf(p, "FastTrak LP/TX2/TX4"); break;
-		case PCI_DEVICE_ID_PROMISE_20269:
-			p += sprintf(p, "Ultra133 TX2"); break;
-		case PCI_DEVICE_ID_PROMISE_20268:
-			p += sprintf(p, "Ultra100 TX2"); break;
-		default:
-			p += sprintf(p, "Ultra series"); break;
-			break;
-	}
-	p += sprintf(p, " Chipset.\n");
-	return (char *)p;
-}
-
-static int pdcnew_get_info (char *buffer, char **addr, off_t offset, int count)
-{
-	char *p = buffer;
-	int i, len;
-
-	for (i = 0; i < n_pdc202_devs; i++) {
-		struct pci_dev *dev	= pdc202_devs[i];
-		p = pdcnew_info(buffer, dev);
-	}
-	/* p - buffer must be less than 4k! */
-	len = (p - buffer) - offset;
-	*addr = buffer + offset;
-	
-	return len > count ? count : len;
-}
-#endif  /* defined(DISPLAY_PDC202XX_TIMINGS) && defined(CONFIG_PROC_FS) */
+struct pdcnew_name {
+	u16 dev_id;
+	const char *name;
+};
 
+static struct pdcnew_name __initdata pdcnew_names[] = {
+	{ PCI_DEVICE_ID_PROMISE_20277, "SBFastTrak 133 Lite" },
+	{ PCI_DEVICE_ID_PROMISE_20276, "MBFastTrak 133 Lite" },
+	{ PCI_DEVICE_ID_PROMISE_20275, "MBUltra133", },
+	{ PCI_DEVICE_ID_PROMISE_20271, "FastTrak TX2000", },
+	{ PCI_DEVICE_ID_PROMISE_20270, "FastTrak LP/TX2/TX4", },
+	{ PCI_DEVICE_ID_PROMISE_20269, "Ultra133 TX2" },
+	{ PCI_DEVICE_ID_PROMISE_20268, "Ultra100 TX2" },
+};
 
 static u8 pdcnew_ratemask (ide_drive_t *drive)
 {
@@ -515,6 +475,15 @@
 
 static unsigned int __init init_chipset_pdcnew (struct pci_dev *dev, const char *name)
 {
+	unsigned int i;
+
+	for (i = 0; i < ARRAY_SIZE(pdcnew_names); i++)
+		if (pdcnew_names[i].dev_id == dev->device) {
+			printk(KERN_INFO "%s: %s on pci%s\n", name,
+					 pdcnew_names[i].name, pci_name(dev));
+			break;
+		}
+
 	if (dev->resource[PCI_ROM_RESOURCE].start) {
 		pci_write_config_dword(dev, PCI_ROM_ADDRESS,
 			dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE);
@@ -522,15 +491,6 @@
 			name, dev->resource[PCI_ROM_RESOURCE].start);
 	}
 
-#if defined(DISPLAY_PDC202XX_TIMINGS) && defined(CONFIG_PROC_FS)
-	pdc202_devs[n_pdc202_devs++] = dev;
-
-	if (!pdcnew_proc) {
-		pdcnew_proc = 1;
-		ide_pci_register_host_proc(&pdcnew_procs[0]);
-	}
-#endif /* DISPLAY_PDC202XX_TIMINGS && CONFIG_PROC_FS */
-
 	return dev->irq;
 }
 
--- diff/drivers/ide/pci/pdc202xx_new.h	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/ide/pci/pdc202xx_new.h	2003-12-29 09:30:40.000000000 +0000
@@ -5,8 +5,6 @@
 #include <linux/pci.h>
 #include <linux/ide.h>
 
-#define DISPLAY_PDC202XX_TIMINGS
-
 #ifndef SPLIT_BYTE
 #define SPLIT_BYTE(B,H,L)	((H)=(B>>4), (L)=(B-((B>>4)<<4)))
 #endif
@@ -162,27 +160,6 @@
 		set_2regs(0x13,(c));			\
 	} while(0)
 
-#define DISPLAY_PDC202XX_TIMINGS
-
-#if defined(DISPLAY_PDC202XX_TIMINGS) && defined(CONFIG_PROC_FS)
-#include <linux/stat.h>
-#include <linux/proc_fs.h>
-
-static u8 pdcnew_proc;
-
-static int pdcnew_get_info(char *, char **, off_t, int);
-
-static ide_pci_host_proc_t pdcnew_procs[] __initdata = {
-	{
-		.name		= "pdcnew",
-		.set		= 1,
-		.get_info	= pdcnew_get_info,
-		.parent		= NULL,
-	},
-};
-#endif /* DISPLAY_PDC202XX_TIMINGS && CONFIG_PROC_FS */
-
-
 static void init_setup_pdcnew(struct pci_dev *, ide_pci_device_t *);
 static void init_setup_pdc20270(struct pci_dev *, ide_pci_device_t *);
 static void init_setup_pdc20276(struct pci_dev *dev, ide_pci_device_t *d);
--- diff/drivers/ide/pci/pdc202xx_old.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/ide/pci/pdc202xx_old.c	2003-12-29 09:30:40.000000000 +0000
@@ -361,16 +361,38 @@
 	return ((u8)(CIS & mask));
 }
 
+/*
+ * Set the control register to use the 66MHz system
+ * clock for UDMA 3/4/5 mode operation when necessary.
+ *
+ * It may also be possible to leave the 66MHz clock on
+ * and readjust the timing parameters.
+ */
+static void pdc_old_enable_66MHz_clock(ide_hwif_t *hwif)
+{
+	unsigned long clock_reg = hwif->dma_master + 0x11;
+	u8 clock = hwif->INB(clock_reg);
+
+	hwif->OUTB(clock | (hwif->channel ? 0x08 : 0x02), clock_reg);
+}
+
+static void pdc_old_disable_66MHz_clock(ide_hwif_t *hwif)
+{
+	unsigned long clock_reg = hwif->dma_master + 0x11;
+	u8 clock = hwif->INB(clock_reg);
+
+	hwif->OUTB(clock & ~(hwif->channel ? 0x08 : 0x02), clock_reg);
+}
+
 static int config_chipset_for_dma (ide_drive_t *drive)
 {
 	struct hd_driveid *id	= drive->id;
 	ide_hwif_t *hwif	= HWIF(drive);
 	struct pci_dev *dev	= hwif->pci_dev;
 	u32 drive_conf		= 0;
-	u8 mask			= hwif->channel ? 0x08 : 0x02;
 	u8 drive_pci		= 0x60 + (drive->dn << 2);
 	u8 test1 = 0, test2 = 0, speed = -1;
-	u8 AP = 0, CLKSPD = 0, cable = 0;
+	u8 AP = 0, cable = 0;
 
 	u8 ultra_66		= ((id->dma_ultra & 0x0010) ||
 				   (id->dma_ultra & 0x0008)) ? 1 : 0;
@@ -394,21 +416,6 @@
 			BUG();
 	}
 
-	CLKSPD = hwif->INB(hwif->dma_master + 0x11);
-
-	/*
-	 * Set the control register to use the 66Mhz system
-	 * clock for UDMA 3/4 mode operation. If one drive on
-	 * a channel is U66 capable but the other isn't we
-	 * fall back to U33 mode. The BIOS INT 13 hooks turn
-	 * the clock on then off for each read/write issued. I don't
-	 * do that here because it would require modifying the
-	 * kernel, separating the fop routines from the kernel or
-	 * somehow hooking the fops calls. It may also be possible to
-	 * leave the 66Mhz clock on and readjust the timing
-	 * parameters.
-	 */
-
 	if ((ultra_66) && (cable)) {
 #ifdef DEBUG
 		printk(KERN_DEBUG "ULTRA 66/100/133: %s channel of Ultra 66/100/133 "
@@ -416,29 +423,12 @@
 			hwif->channel ? "Secondary" : "Primary");
 		printk(KERN_DEBUG "         Switching to Ultra33 mode.\n");
 #endif /* DEBUG */
-		/* Primary   : zero out second bit */
-		/* Secondary : zero out fourth bit */
-		hwif->OUTB(CLKSPD & ~mask, (hwif->dma_master + 0x11));
 		printk(KERN_WARNING "Warning: %s channel requires an 80-pin cable for operation.\n", hwif->channel ? "Secondary":"Primary");
 		printk(KERN_WARNING "%s reduced to Ultra33 mode.\n", drive->name);
-	} else {
-		if (ultra_66) {
-			/*
-			 * check to make sure drive on same channel
-			 * is u66 capable
-			 */
-			if (hwif->drives[!(drive->dn%2)].id) {
-				if (hwif->drives[!(drive->dn%2)].id->dma_ultra & 0x0078) {
-					hwif->OUTB(CLKSPD | mask, (hwif->dma_master + 0x11));
-				} else {
-					hwif->OUTB(CLKSPD & ~mask, (hwif->dma_master + 0x11));
-				}
-			} else { /* udma4 drive by itself */
-				hwif->OUTB(CLKSPD | mask, (hwif->dma_master + 0x11));
-			}
-		}
 	}
 
+	pdc_old_disable_66MHz_clock(drive->hwif);
+
 	drive_pci = 0x60 + (drive->dn << 2);
 	pci_read_config_dword(dev, drive_pci, &drive_conf);
 	if ((drive_conf != 0x004ff304) && (drive_conf != 0x004ff3c4))
@@ -536,6 +526,8 @@
 
 static int pdc202xx_old_ide_dma_begin(ide_drive_t *drive)
 {
+	if (drive->current_speed > XFER_UDMA_2)
+		pdc_old_enable_66MHz_clock(drive->hwif);
 	if (drive->addressing == 1) {
 		struct request *rq	= HWGROUP(drive)->rq;
 		ide_hwif_t *hwif	= HWIF(drive);
@@ -569,6 +561,8 @@
 		clock = hwif->INB(high_16 + 0x11);
 		hwif->OUTB(clock & ~(hwif->channel ? 0x08:0x02), high_16+0x11);
 	}
+	if (drive->current_speed > XFER_UDMA_2)
+		pdc_old_disable_66MHz_clock(drive->hwif);
 	return __ide_dma_end(drive);
 }
 
@@ -757,10 +751,7 @@
 
 	hwif->speedproc = &pdc202xx_tune_chipset;
 
-	if (!hwif->dma_base) {
-		hwif->drives[0].autotune = hwif->drives[1].autotune = 1;
-		return;
-	}
+	hwif->drives[0].autotune = hwif->drives[1].autotune = 1;
 
 	hwif->ultra_mask = 0x3f;
 	hwif->mwdma_mask = 0x07;
--- diff/drivers/ide/pci/piix.c	2003-10-27 09:20:43.000000000 +0000
+++ source/drivers/ide/pci/piix.c	2003-12-29 09:30:40.000000000 +0000
@@ -768,8 +768,8 @@
 		/* Only on the original revision: IDE DMA can hang */
 		if(rev == 0x00)
 			no_piix_dma = 1;
-		/* On all revisions PXB bus lock must be disabled for IDE */
-		else if(cfg & (1<<14))
+		/* On all revisions below 5 PXB bus lock must be disabled for IDE */
+		else if(cfg & (1<<14) && rev < 5)
 			no_piix_dma = 2;
 	}
 	if(no_piix_dma)
--- diff/drivers/ide/pci/siimage.c	2003-10-27 09:20:43.000000000 +0000
+++ source/drivers/ide/pci/siimage.c	2003-12-29 09:30:40.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * linux/drivers/ide/pci/siimage.c		Version 1.06	June 11, 2003
+ * linux/drivers/ide/pci/siimage.c		Version 1.09	Dec 7, 2003
  *
  * Copyright (C) 2001-2002	Andre Hedrick <andre@linux-ide.org>
  * Copyright (C) 2003		Red Hat <alan@redhat.com>
@@ -56,6 +56,7 @@
 	{
 		case PCI_DEVICE_ID_SII_3112:
 		case PCI_DEVICE_ID_SII_1210SA:
+		case PCI_DEVICE_ID_SII_3114:
 			return 1;
 		case PCI_DEVICE_ID_SII_680:
 			return 0;
@@ -266,7 +267,7 @@
 static void siimage_tuneproc (ide_drive_t *drive, byte mode_wanted)
 {
 	ide_hwif_t *hwif	= HWIF(drive);
-	u32 speedt		= 0;
+	u16 speedt		= 0;
 	u16 speedp		= 0;
 	unsigned long addr	= siimage_seldev(drive, 0x04);
 	unsigned long tfaddr	= siimage_selreg(hwif, 0x02);
@@ -1047,6 +1048,27 @@
 	hwif->mmio			= 2;
 }
 
+static int is_dev_seagate_sata(ide_drive_t *drive)
+{
+	const char *s = &drive->id->model[0];
+	unsigned len;
+
+	if (!drive->present)
+		return 0;
+
+	len = strnlen(s, sizeof(drive->id->model));
+
+	if ((len > 4) && (!memcmp(s, "ST", 2))) {
+		if ((!memcmp(s + len - 2, "AS", 2)) ||
+		    (!memcmp(s + len - 3, "ASL", 3))) {
+			printk(KERN_INFO "%s: applying pessimistic Seagate "
+					 "errata fix\n", drive->name);
+			return 1;
+		}
+	}
+	return 0;
+}
+
 /**
  *	init_iops_siimage	-	set up iops
  *	@hwif: interface to set up
@@ -1068,7 +1090,7 @@
 	hwif->hwif_data = 0;
 
 	hwif->rqsize = 128;
-	if (is_sata(hwif))
+	if (is_sata(hwif) && is_dev_seagate_sata(&hwif->drives[0]))
 		hwif->rqsize = 15;
 
 	if (pci_get_drvdata(dev) == NULL)
@@ -1179,6 +1201,7 @@
 	{ PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_680,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
 	{ PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_3112, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1},
 	{ PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_1210SA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2},
+	{ PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_3114, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3},
 	{ 0, },
 };
 
--- diff/drivers/ide/pci/siimage.h	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/ide/pci/siimage.h	2003-12-29 09:30:40.000000000 +0000
@@ -82,6 +82,16 @@
 		.enablebits	= {{0x00,0x00,0x00}, {0x00,0x00,0x00}},
 		.bootable	= ON_BOARD,
 		.extra		= 0,
+	},{	/* 3 */
+		.vendor		= PCI_VENDOR_ID_CMD,
+		.device		= PCI_DEVICE_ID_SII_3114,
+		.name		= "SiI3114 Serial ATA",
+		.init_chipset	= init_chipset_siimage,
+		.init_iops	= init_iops_siimage,
+		.init_hwif	= init_hwif_siimage,
+		.channels	= 2,
+		.autodma	= AUTODMA,
+		.bootable	= ON_BOARD,
 	},{
 		.vendor		= 0,
 		.device		= 0,
--- diff/drivers/ide/setup-pci.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/ide/setup-pci.c	2003-12-29 09:30:40.000000000 +0000
@@ -474,6 +474,11 @@
  *	state
  */
  
+#ifndef CONFIG_BLK_DEV_IDEDMA_PCI
+static void ide_hwif_setup_dma(struct pci_dev *dev, ide_pci_device_t *d, ide_hwif_t *hwif)
+{
+}
+#else
 static void ide_hwif_setup_dma(struct pci_dev *dev, ide_pci_device_t *d, ide_hwif_t *hwif)
 {
 	u16 pcicmd;
@@ -516,6 +521,7 @@
 		}
 	}
 }
+#endif /* CONFIG_BLK_DEV_IDEDMA_PCI*/
 
 /**
  *	ide_setup_pci_controller	-	set up IDE PCI
--- diff/drivers/ieee1394/dma.c	2003-08-20 14:16:09.000000000 +0100
+++ source/drivers/ieee1394/dma.c	2003-12-29 09:30:40.000000000 +0000
@@ -187,7 +187,7 @@
 /* nopage() handler for mmap access */
 
 static struct page*
-dma_region_pagefault(struct vm_area_struct *area, unsigned long address, int write_access)
+dma_region_pagefault(struct vm_area_struct *area, unsigned long address, int *type)
 {
 	unsigned long offset;
 	unsigned long kernel_virt_addr;
@@ -202,6 +202,8 @@
 	    (address > (unsigned long) area->vm_start + (PAGE_SIZE * dma->n_pages)) )
 		goto out;
 
+	if (type)
+		*type = VM_FAULT_MINOR;
 	offset = address - area->vm_start;
 	kernel_virt_addr = (unsigned long) dma->kvirt + offset;
 	ret = vmalloc_to_page((void*) kernel_virt_addr);
--- diff/drivers/input/input.c	2003-09-30 15:46:14.000000000 +0100
+++ source/drivers/input/input.c	2003-12-29 09:30:40.000000000 +0000
@@ -447,9 +447,10 @@
 	list_add_tail(&dev->node, &input_dev_list);
 
 	list_for_each_entry(handler, &input_handler_list, node)
-		if ((id = input_match_device(handler->id_table, dev)))
-			if ((handle = handler->connect(handler, dev, id)))
-				input_link_handle(handle);
+		if (!handler->blacklist || !input_match_device(handler->blacklist, dev))
+			if ((id = input_match_device(handler->id_table, dev)))
+				if ((handle = handler->connect(handler, dev, id)))
+					input_link_handle(handle);
 
 #ifdef CONFIG_HOTPLUG
 	input_call_hotplug("add", dev);
@@ -507,9 +508,10 @@
 	list_add_tail(&handler->node, &input_handler_list);
 	
 	list_for_each_entry(dev, &input_dev_list, node)
-		if ((id = input_match_device(handler->id_table, dev)))
-			if ((handle = handler->connect(handler, dev, id)))
-				input_link_handle(handle);
+		if (!handler->blacklist || !input_match_device(handler->blacklist, dev))
+			if ((id = input_match_device(handler->id_table, dev)))
+				if ((handle = handler->connect(handler, dev, id)))
+					input_link_handle(handle);
 
 #ifdef CONFIG_PROC_FS
 	input_devices_state++;
--- diff/drivers/input/joydev.c	2003-09-30 15:45:46.000000000 +0100
+++ source/drivers/input/joydev.c	2003-12-29 09:30:40.000000000 +0000
@@ -380,10 +380,6 @@
 	struct joydev *joydev;
 	int i, j, t, minor;
 
-	/* Avoid tablets */
-        if (test_bit(EV_KEY, dev->evbit) && test_bit(BTN_TOUCH, dev->keybit))
-		return NULL;
-
 	for (minor = 0; minor < JOYDEV_MINORS && joydev_table[minor]; minor++);
 	if (minor == JOYDEV_MINORS) {
 		printk(KERN_ERR "joydev: no more free joydev devices\n");
@@ -464,6 +460,15 @@
 		joydev_free(joydev);
 }
 
+static struct input_device_id joydev_blacklist[] = {
+	{
+		.flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_KEYBIT,
+		.evbit = { BIT(EV_KEY) },
+		.keybit = { [LONG(BTN_TOUCH)] = BIT(BTN_TOUCH) },
+	}, 	/* Avoid itouchpads, touchscreens and tablets */
+	{ }, 	/* Terminating entry */
+};
+
 static struct input_device_id joydev_ids[] = {
 	{
 		.flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_ABSBIT,
@@ -493,6 +498,7 @@
 	.minor =	JOYDEV_MINOR_BASE,
 	.name =		"joydev",
 	.id_table =	joydev_ids,
+	.blacklist = 	joydev_blacklist,
 };
 
 static int __init joydev_init(void)
--- diff/drivers/input/keyboard/atkbd.c	2003-11-25 15:24:57.000000000 +0000
+++ source/drivers/input/keyboard/atkbd.c	2003-12-29 09:30:40.000000000 +0000
@@ -48,33 +48,30 @@
  */
 
 static unsigned char atkbd_set2_keycode[512] = {
-	  0, 67, 65, 63, 61, 59, 60, 88,  0, 68, 66, 64, 62, 15, 41, 85,
-	  0, 56, 42,182, 29, 16,  2, 89,  0,  0, 44, 31, 30, 17,  3, 90,
-	  0, 46, 45, 32, 18,  5,  4, 91, 90, 57, 47, 33, 20, 19,  6,  0,
-	 91, 49, 48, 35, 34, 21,  7,  0,  0,  0, 50, 36, 22,  8,  9,  0,
+
+	  0, 67, 65, 63, 61, 59, 60, 88,  0, 68, 66, 64, 62, 15, 41,117,
+	  0, 56, 42,182, 29, 16,  2,  0,  0,  0, 44, 31, 30, 17,  3,  0,
+	  0, 46, 45, 32, 18,  5,  4,186,  0, 57, 47, 33, 20, 19,  6, 85,
+	  0, 49, 48, 35, 34, 21,  7, 89,  0,  0, 50, 36, 22,  8,  9, 90,
 	  0, 51, 37, 23, 24, 11, 10,  0,  0, 52, 53, 38, 39, 25, 12,  0,
-	122, 89, 40,120, 26, 13,  0,  0, 58, 54, 28, 27,  0, 43,  0,  0,
-	 85, 86, 90, 91, 92, 93, 14, 94, 95, 79,183, 75, 71,121,  0,123,
+	  0,181, 40,  0, 26, 13,  0,  0, 58, 54, 28, 27,  0, 43,  0,194,
+	  0, 86,193,192,184,  0, 14,185,  0, 79,182, 75, 71,124,  0,  0,
 	 82, 83, 80, 76, 77, 72,  1, 69, 87, 78, 81, 74, 55, 73, 70, 99,
-	  0,  0,  0, 65, 99,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+
 	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,
-	  0,  0, 92, 90, 85,  0,137,  0,  0,  0,  0, 91, 89,144,115,  0,
-	217,100,255,  0, 97,165,164,  0,156,  0,  0,140,115,  0,  0,125,
-	173,114,  0,113,152,163,151,126,128,166,  0,140,  0,147,  0,127,
-	159,167,115,160,164,  0,  0,116,158,  0,150,166,  0,  0,  0,142,
-	157,  0,114,166,168,  0,  0,213,155,  0, 98,113,  0,163,  0,138,
-	226,  0,  0,  0,  0,  0,153,140,  0,255, 96,  0,  0,  0,143,  0,
-	133,  0,116,  0,143,  0,174,133,  0,107,  0,105,102,  0,  0,112,
-	110,111,108,112,106,103,  0,119,  0,118,109,  0, 99,104,119
+	217,100,255,  0, 97,165,  0,  0,156,  0,  0,  0,  0,  0,  0,125,
+	173,114,  0,113,  0,  0,  0,126,128,  0,  0,140,  0,  0,  0,127,
+	159,  0,115,  0,164,  0,  0,116,158,  0,150,166,  0,  0,  0,142,
+	157,  0,  0,  0,  0,  0,  0,  0,155,  0, 98,  0,  0,163,  0,  0,
+	226,  0,  0,  0,  0,  0,  0,  0,  0,255, 96,  0,  0,  0,143,  0,
+	  0,  0,  0,  0,  0,  0,  0,  0,  0,107,  0,105,102,  0,  0,112,
+	110,111,108,112,106,103,  0,119,  0,118,109,  0, 99,104,119,  0,
+
+	  0,  0,  0, 65, 99,
 };
 
 static unsigned char atkbd_set3_keycode[512] = {
+
 	  0,  0,  0,  0,  0,  0,  0, 59,  1,138,128,129,130, 15, 41, 60,
 	131, 29, 42, 86, 58, 16,  2, 61,133, 56, 44, 31, 30, 17,  3, 62,
 	134, 46, 45, 32, 18,  5,  4, 63,135, 57, 47, 33, 20, 19,  6, 64,
@@ -83,25 +80,21 @@
 	113,114, 40, 84, 26, 13, 87, 99, 97, 54, 28, 27, 43, 84, 88, 70,
 	108,105,119,103,111,107, 14,110,  0, 79,106, 75, 71,109,102,104,
 	 82, 83, 80, 76, 77, 72, 69, 98,  0, 96, 81,  0, 78, 73, 55, 85,
+
 	 89, 90, 91, 92, 74,185,184,182,  0,  0,  0,125,126,127,112,  0,
 	  0,139,150,163,165,115,152,150,166,140,160,154,113,114,167,168,
-	148,149,147,140,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255
+	148,149,147,140
 };
 
 static unsigned char atkbd_unxlate_table[128] = {
-	  0,118, 22, 30, 38, 37, 46, 54, 61, 62, 70, 69, 78, 85,102, 13,
-	 21, 29, 36, 45, 44, 53, 60, 67, 68, 77, 84, 91, 90, 20, 28, 27,
-	 35, 43, 52, 51, 59, 66, 75, 76, 82, 14, 18, 93, 26, 34, 33, 42,
-	 50, 49, 58, 65, 73, 74, 89,124, 17, 41, 88,  5,  6,  4, 12,  3,
-	 11,  2, 10,  1,  9,119,126,108,117,125,123,107,115,116,121,105,
-	114,122,112,113,127, 96, 97,120,  7, 15, 23, 31, 39, 47, 55, 63,
-	 71, 79, 86, 94,  8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 87,111,
-	 19, 25, 57, 81, 83, 92, 95, 98, 99,100,101,103,104,106,109,110
+          0,118, 22, 30, 38, 37, 46, 54, 61, 62, 70, 69, 78, 85,102, 13,
+         21, 29, 36, 45, 44, 53, 60, 67, 68, 77, 84, 91, 90, 20, 28, 27,
+         35, 43, 52, 51, 59, 66, 75, 76, 82, 14, 18, 93, 26, 34, 33, 42,
+         50, 49, 58, 65, 73, 74, 89,124, 17, 41, 88,  5,  6,  4, 12,  3,
+         11,  2, 10,  1,  9,119,126,108,117,125,123,107,115,116,121,105,
+        114,122,112,113,127, 96, 97,120,  7, 15, 23, 31, 39, 47, 55, 63,
+         71, 79, 86, 94,  8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 87,111,
+         19, 25, 57, 81, 83, 92, 95, 98, 99,100,101,103,104,106,109,110
 };
 
 #define ATKBD_CMD_SETLEDS	0x10ed
@@ -125,6 +118,9 @@
 #define ATKBD_RET_EMULX		0x80
 #define ATKBD_RET_EMUL1		0xe1
 #define ATKBD_RET_RELEASE	0xf0
+#define ATKBD_RET_HANGUEL	0xf1
+#define ATKBD_RET_HANJA		0xf2
+#define ATKBD_RET_ERR		0xff
 
 #define ATKBD_KEY_UNKNOWN	  0
 #define ATKBD_KEY_NULL		255
@@ -156,6 +152,17 @@
 	unsigned long time;
 };
 
+static void atkbd_report_key(struct input_dev *dev, struct pt_regs *regs, int code, int value)
+{
+	input_regs(dev, regs);
+	if (value == 3) {
+		input_report_key(dev, code, 1);
+		input_report_key(dev, code, 0);
+	} else
+		input_event(dev, EV_KEY, code, value);
+	input_sync(dev);
+}
+
 /*
  * atkbd_interrupt(). Here takes place processing of data received from
  * the keyboard into events.
@@ -184,47 +191,37 @@
 		atkbd->resend = 0;
 #endif
 
-	switch (code) {
-		case ATKBD_RET_ACK:
-			atkbd->ack = 1;
-			goto out;
-		case ATKBD_RET_NAK:
-			atkbd->ack = -1;
-			goto out;
-	}
-
-	if (atkbd->translated) do {
-
-		if (atkbd->emul != 1) {
-			if (code == ATKBD_RET_EMUL0 || code == ATKBD_RET_EMUL1)
-				break;
-			if (code == ATKBD_RET_BAT) {
-				if (!atkbd->bat_xl)
-					break;
-				atkbd->bat_xl = 0;
-			}
-			if (code == (ATKBD_RET_BAT & 0x7f))
-				atkbd->bat_xl = 1;
+	if (!atkbd->ack)
+		switch (code) {
+			case ATKBD_RET_ACK:
+				atkbd->ack = 1;
+				goto out;
+			case ATKBD_RET_NAK:
+				atkbd->ack = -1;
+				goto out;
 		}
 
-		if (code < 0x80) {
-			code = atkbd_unxlate_table[code];
-			break;
-		}
-
-		if (atkbd->cmdcnt)
-			break;
-
-		code = atkbd_unxlate_table[code & 0x7f];
-		atkbd->release = 1;
-
-	} while (0);
-
 	if (atkbd->cmdcnt) {
 		atkbd->cmdbuf[--atkbd->cmdcnt] = code;
 		goto out;
 	}
 
+	if (atkbd->translated) {
+
+		if (atkbd->emul ||
+		    !(code == ATKBD_RET_EMUL0 || code == ATKBD_RET_EMUL1 ||
+		      code == ATKBD_RET_HANGUEL || code == ATKBD_RET_HANJA ||
+		      code == ATKBD_RET_ERR ||
+	             (code == ATKBD_RET_BAT && !atkbd->bat_xl))) {
+			atkbd->release = code >> 7;
+			code &= 0x7f;
+		}
+
+		if (!atkbd->emul &&
+		     (code & 0x7f) == (ATKBD_RET_BAT & 0x7f))
+			atkbd->bat_xl = !atkbd->release;
+	}
+
 	switch (code) {
 		case ATKBD_RET_BAT:
 			serio_rescan(atkbd->serio);
@@ -238,22 +235,33 @@
 		case ATKBD_RET_RELEASE:
 			atkbd->release = 1;
 			goto out;
+		case ATKBD_RET_HANGUEL:
+			atkbd_report_key(&atkbd->dev, regs, KEY_LANG1, 3);
+			goto out;
+		case ATKBD_RET_HANJA:
+			atkbd_report_key(&atkbd->dev, regs, KEY_LANG2, 3);
+			goto out;
+		case ATKBD_RET_ERR:
+			printk(KERN_WARNING "atkbd.c: Keyboard on %s reports too many keys pressed.\n", serio->phys);
+			goto out;
 	}
 
+	if (atkbd->set != 3)
+		code = (code & 0x7f) | ((code & 0x80) << 1);
 	if (atkbd->emul) {
 		if (--atkbd->emul)
 			goto out;
-		code |= 0x100;
+		code |= (atkbd->set != 3) ? 0x80 : 0x100;
 	}
 
 	switch (atkbd->keycode[code]) {
 		case ATKBD_KEY_NULL:
 			break;
 		case ATKBD_KEY_UNKNOWN:
-			printk(KERN_WARNING "atkbd.c: Unknown key %s (%s set %d, code %#x, data %#x, on %s).\n",
+			printk(KERN_WARNING "atkbd.c: Unknown key %s (%s set %d, code %#x on %s).\n",
 				atkbd->release ? "released" : "pressed",
 				atkbd->translated ? "translated" : "raw", 
-				atkbd->set, code, data, serio->phys);
+				atkbd->set, code, serio->phys);
 			break;
 		default:
 			value = atkbd->release ? 0 :
@@ -273,9 +281,7 @@
 					break;
 			}
 
-			input_regs(&atkbd->dev, regs);
-			input_event(&atkbd->dev, EV_KEY, atkbd->keycode[code], value);
-			input_sync(&atkbd->dev);
+			atkbd_report_key(&atkbd->dev, regs, atkbd->keycode[code], value);
 	}
 
 	atkbd->release = 0;
@@ -369,10 +375,11 @@
 static int atkbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
 {
 	struct atkbd *atkbd = dev->private;
-	struct { int p; u8 v; } period[] =	
-		{ {30, 0x00}, {25, 0x02}, {20, 0x04}, {15, 0x08}, {10, 0x0c}, {7, 0x10}, {5, 0x14}, {0, 0x14} };
-	struct { int d; u8 v; } delay[] =
-        	{ {1000, 0x60}, {750, 0x40}, {500, 0x20}, {250, 0x00}, {0, 0x00} };
+	const short period[32] =
+		{ 33,  37,  42,  46,  50,  54,  58,  63,  67,  75,  83,  92, 100, 109, 116, 125,
+		 133, 149, 167, 182, 200, 217, 232, 250, 270, 303, 333, 370, 400, 435, 470, 500 };
+	const short delay[4] =
+		{ 250, 500, 750, 1000 };
 	char param[2];
 	int i, j;
 
@@ -406,11 +413,11 @@
 			if (atkbd_softrepeat) return 0;
 
 			i = j = 0;
-			while (period[i].p > dev->rep[REP_PERIOD]) i++;
-			while (delay[j].d > dev->rep[REP_DELAY]) j++;
-			dev->rep[REP_PERIOD] = period[i].p;
-			dev->rep[REP_DELAY] = delay[j].d;
-			param[0] = period[i].v | delay[j].v;
+			while (i < 32 && period[i] < dev->rep[REP_PERIOD]) i++;
+			while (j < 4 && delay[j] < dev->rep[REP_DELAY]) j++;
+			dev->rep[REP_PERIOD] = period[i];
+			dev->rep[REP_DELAY] = delay[j];
+			param[0] = i | (j << 5);
 			atkbd_command(atkbd, param, ATKBD_CMD_SETREP);
 
 			return 0;
@@ -578,6 +585,7 @@
 	struct atkbd *atkbd = serio->private;
 	input_unregister_device(&atkbd->dev);
 	serio_close(serio);
+	serio->private = NULL;
 	kfree(atkbd);
 }
 
@@ -623,6 +631,7 @@
 		atkbd->dev.rep[REP_PERIOD] = 33;
 	}
 
+	atkbd->ack = 1;
 	atkbd->serio = serio;
 
 	init_input_dev(&atkbd->dev);
@@ -636,6 +645,7 @@
 	serio->private = atkbd;
 
 	if (serio_open(serio, dev)) {
+		serio->private = NULL;
 		kfree(atkbd);
 		return;
 	}
@@ -644,6 +654,7 @@
 
 		if (atkbd_probe(atkbd)) {
 			serio_close(serio);
+			serio->private = NULL;
 			kfree(atkbd);
 			return;
 		}
@@ -665,16 +676,22 @@
 
 	sprintf(atkbd->phys, "%s/input0", serio->phys);
 
-	if (atkbd->set == 3)
-		memcpy(atkbd->keycode, atkbd_set3_keycode, sizeof(atkbd->keycode));
-	else
+	if (atkbd->translated) {
+		for (i = 0; i < 128; i++) {
+			atkbd->keycode[i] = atkbd_set2_keycode[atkbd_unxlate_table[i]];
+			atkbd->keycode[i | 0x80] = atkbd_set2_keycode[atkbd_unxlate_table[i] | 0x80];
+		}
+	} else if (atkbd->set == 2) {
 		memcpy(atkbd->keycode, atkbd_set2_keycode, sizeof(atkbd->keycode));
+	} else {
+		memcpy(atkbd->keycode, atkbd_set3_keycode, sizeof(atkbd->keycode));
+	}
 
 	atkbd->dev.name = atkbd->name;
 	atkbd->dev.phys = atkbd->phys;
 	atkbd->dev.id.bustype = BUS_I8042;
 	atkbd->dev.id.vendor = 0x0001;
-	atkbd->dev.id.product = atkbd->set;
+	atkbd->dev.id.product = atkbd->translated ? 1 : atkbd->set;
 	atkbd->dev.id.version = atkbd->id;
 
 	for (i = 0; i < 512; i++)
@@ -686,10 +703,62 @@
 	printk(KERN_INFO "input: %s on %s\n", atkbd->name, serio->phys);
 }
 
+/*
+ * atkbd_reconnect() tries to restore keyboard into a sane state and is
+ * most likely called on resume.
+ */
+
+static int atkbd_reconnect(struct serio *serio)
+{
+	struct atkbd *atkbd = serio->private;
+	struct serio_dev *dev = serio->dev;
+	int i;
+
+        if (!dev) {
+                printk(KERN_DEBUG "atkbd: reconnect request, but serio is disconnected, ignoring...\n");
+                return -1;
+        }
+
+	if (atkbd->write) {
+		if (atkbd_probe(atkbd))
+			return -1;
+
+		atkbd->set = atkbd_set_3(atkbd);
+		atkbd_enable(atkbd);
+	} else {
+		atkbd->set = 2;
+		atkbd->id = 0xab00;
+	}
+
+	/*
+	 * Here we probably should check if the keyboard has the same set that
+         * it had before and bail out if it's different. But this will most likely
+         * cause new keyboard device be created... and for the user it will look
+         * like keyboard is lost
+	 */
+
+	if (atkbd->translated) {
+		for (i = 0; i < 128; i++) {
+			atkbd->keycode[i] = atkbd_set2_keycode[atkbd_unxlate_table[i]];
+			atkbd->keycode[i | 0x80] = atkbd_set2_keycode[atkbd_unxlate_table[i] | 0x80];
+		}
+	} else if (atkbd->set == 2) {
+		memcpy(atkbd->keycode, atkbd_set2_keycode, sizeof(atkbd->keycode));
+	} else {
+		memcpy(atkbd->keycode, atkbd_set3_keycode, sizeof(atkbd->keycode));
+	}
+
+	for (i = 0; i < 512; i++)
+		if (atkbd->keycode[i] && atkbd->keycode[i] < 255)
+			set_bit(atkbd->keycode[i], atkbd->dev.keybit);
+
+	return 0;
+}
 
 static struct serio_dev atkbd_dev = {
 	.interrupt =	atkbd_interrupt,
 	.connect =	atkbd_connect,
+	.reconnect = 	atkbd_reconnect,
 	.disconnect =	atkbd_disconnect,
 	.cleanup =	atkbd_cleanup,
 };
@@ -709,9 +778,17 @@
         if (ints[0] > 0) atkbd_reset = ints[1];
         return 1;
 }
+static int __init atkbd_setup_softrepeat(char *str)
+{
+        int ints[4];
+        str = get_options(str, ARRAY_SIZE(ints), ints);
+        if (ints[0] > 0) atkbd_softrepeat = ints[1];
+        return 1;
+}
 
 __setup("atkbd_set=", atkbd_setup_set);
 __setup("atkbd_reset", atkbd_setup_reset);
+__setup("atkbd_softrepeat=", atkbd_setup_softrepeat);
 #endif
 
 int __init atkbd_init(void)
--- diff/drivers/input/mouse/Kconfig	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/input/mouse/Kconfig	2003-12-29 09:30:40.000000000 +0000
@@ -23,27 +23,18 @@
 	  mice with wheels and extra buttons, Microsoft, Logitech or Genius
 	  compatible.
 
+	  Synaptics TouchPad users might be interested in a specialized
+	  XFree86 driver at:
+		http://w1.894.telia.com/~u89404340/touchpad/index.html
+	  and a new verion of GPM at:
+		http://www.geocities.com/dt_or/gpm/gpm.html
+	  to take advantage of the advanced features of the touchpad.
+
 	  If unsure, say Y.
 
 	  To compile this driver as a module, choose M here: the
 	  module will be called psmouse.
 
-config MOUSE_PS2_SYNAPTICS
-	bool "Synaptics TouchPad"
-	default n
-	depends on INPUT && INPUT_MOUSE && MOUSE_PS2
-	---help---
-	  Say Y here if you have a Synaptics TouchPad connected to your system.
-	  This touchpad is found on many modern laptop computers.
-
-	  Note that you also need a user space driver to interpret the data
-	  generated by the kernel. A compatible driver for XFree86 is available
-	  from http://w1.894.telia.com/~u89404340/touchpad/index.html
-
-	  The gpm program is not yet able to interpret the data from this
-	  driver, so if you need to use the touchpad in the console, you have to
-	  say N for now.
-
 config MOUSE_SERIAL
 	tristate "Serial mouse"
 	depends on INPUT && INPUT_MOUSE
--- diff/drivers/input/mouse/logips2pp.c	2003-10-09 09:47:16.000000000 +0100
+++ source/drivers/input/mouse/logips2pp.c	2003-12-29 09:30:40.000000000 +0000
@@ -10,6 +10,7 @@
  */
 
 #include <linux/input.h>
+#include <linux/serio.h>
 #include "psmouse.h"
 #include "logips2pp.h"
 
@@ -142,7 +143,7 @@
  * touchpad.
  */
 
-int ps2pp_detect_model(struct psmouse *psmouse, unsigned char *param)
+static int ps2pp_detect_model(struct psmouse *psmouse, unsigned char *param)
 {
 	int i;
 	static int logitech_4btn[] = { 12, 40, 41, 42, 43, 52, 73, 80, -1 };
@@ -226,3 +227,22 @@
 
 	return 0;
 }
+
+/*
+ * Logitech magic init.
+ */
+int ps2pp_detect(struct psmouse *psmouse)
+{
+	unsigned char param[4];
+
+	param[0] = 0;
+	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
+	psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE11);
+	psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE11);
+	psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE11);
+	param[1] = 0;
+	psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO);
+
+	return param[1] != 0 ? ps2pp_detect_model(psmouse, param) : 0;
+}
+
--- diff/drivers/input/mouse/logips2pp.h	2003-06-30 10:07:33.000000000 +0100
+++ source/drivers/input/mouse/logips2pp.h	2003-12-29 09:30:40.000000000 +0000
@@ -13,5 +13,5 @@
 struct psmouse;
 void ps2pp_process_packet(struct psmouse *psmouse);
 void ps2pp_set_800dpi(struct psmouse *psmouse);
-int ps2pp_detect_model(struct psmouse *psmouse, unsigned char *param);
+int ps2pp_detect(struct psmouse *psmouse);
 #endif
--- diff/drivers/input/mouse/psmouse-base.c	2003-11-25 15:24:57.000000000 +0000
+++ source/drivers/input/mouse/psmouse-base.c	2003-12-29 09:30:40.000000000 +0000
@@ -12,35 +12,44 @@
 
 #include <linux/delay.h>
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/slab.h>
 #include <linux/interrupt.h>
 #include <linux/input.h>
 #include <linux/serio.h>
 #include <linux/init.h>
-#include <linux/pm.h>
 #include "psmouse.h"
 #include "synaptics.h"
 #include "logips2pp.h"
 
 MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
 MODULE_DESCRIPTION("PS/2 mouse driver");
-MODULE_PARM(psmouse_noext, "1i");
-MODULE_PARM_DESC(psmouse_noext, "Disable any protocol extensions. Useful for KVM switches.");
-MODULE_PARM(psmouse_resolution, "i");
-MODULE_PARM_DESC(psmouse_resolution, "Resolution, in dpi.");
-MODULE_PARM(psmouse_rate, "i");
-MODULE_PARM_DESC(psmouse_rate, "Report rate, in reports per second.");
-MODULE_PARM(psmouse_smartscroll, "i");
-MODULE_PARM_DESC(psmouse_smartscroll, "Logitech Smartscroll autorepeat, 1 = enabled (default), 0 = disabled.");
-MODULE_PARM(psmouse_resetafter, "i");
-MODULE_PARM_DESC(psmouse_resetafter, "Reset Synaptics Touchpad after so many bad packets (0 = never).");
 MODULE_LICENSE("GPL");
 
 static int psmouse_noext;
+module_param(psmouse_noext, int, 0);
+MODULE_PARM_DESC(psmouse_noext, "[DEPRECATED] Disable any protocol extensions. Useful for KVM switches.");
+
+static char *psmouse_proto;
+static unsigned int psmouse_max_proto = -1UL;
+module_param(psmouse_proto, charp, 0);
+MODULE_PARM_DESC(psmouse_proto, "Highest protocol extension to probe (bare, imps, exps). Useful for KVM switches.");
+
 int psmouse_resolution = 200;
+module_param(psmouse_resolution, uint, 0);
+MODULE_PARM_DESC(psmouse_resolution, "Resolution, in dpi.");
+
 unsigned int psmouse_rate = 100;
+module_param(psmouse_rate, uint, 0);
+MODULE_PARM_DESC(psmouse_rate, "Report rate, in reports per second.");
+
 int psmouse_smartscroll = 1;
+module_param(psmouse_smartscroll, bool, 0);
+MODULE_PARM_DESC(psmouse_smartscroll, "Logitech Smartscroll autorepeat, 1 = enabled (default), 0 = disabled.");
+
 unsigned int psmouse_resetafter;
+module_param(psmouse_resetafter, uint, 0);
+MODULE_PARM_DESC(psmouse_resetafter, "Reset Synaptics Touchpad after so many bad packets (0 = never).");
 
 static char *psmouse_protocols[] = { "None", "PS/2", "PS2++", "PS2T++", "GenPS/2", "ImPS/2", "ImExPS/2", "SynPS/2"};
 
@@ -139,7 +148,8 @@
 		goto out;
 	}
 
-	if (psmouse->pktcnt && time_after(jiffies, psmouse->last + HZ/2)) {
+	if (psmouse->state == PSMOUSE_ACTIVATED &&
+	    psmouse->pktcnt && time_after(jiffies, psmouse->last + HZ/2)) {
 		printk(KERN_WARNING "psmouse.c: %s at %s lost synchronization, throwing %d bytes away.\n",
 		       psmouse->name, psmouse->phys, psmouse->pktcnt);
 		psmouse->pktcnt = 0;
@@ -257,46 +267,12 @@
 }
 
 /*
- * psmouse_extensions() probes for any extensions to the basic PS/2 protocol
- * the mouse may have.
+ * Genius NetMouse magic init.
  */
-
-static int psmouse_extensions(struct psmouse *psmouse)
+static int genius_detect(struct psmouse *psmouse)
 {
 	unsigned char param[4];
 
-	param[0] = 0;
-	psmouse->vendor = "Generic";
-	psmouse->name = "Mouse";
-	psmouse->model = 0;
-
-	if (psmouse_noext)
-		return PSMOUSE_PS2;
-
-/*
- * Try Synaptics TouchPad magic ID
- */
-
-       param[0] = 0;
-       psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
-       psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
-       psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
-       psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
-       psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO);
-
-       if (param[1] == 0x47) {
-		psmouse->vendor = "Synaptics";
-		psmouse->name = "TouchPad";
-		if (!synaptics_init(psmouse))
-			return PSMOUSE_SYNAPTICS;
-		else
-			return PSMOUSE_PS2;
-       }
-
-/*
- * Try Genius NetMouse magic init.
- */
-
 	param[0] = 3;
 	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
 	psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE11);
@@ -304,65 +280,99 @@
 	psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE11);
 	psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO);
 
-	if (param[0] == 0x00 && param[1] == 0x33 && param[2] == 0x55) {
-
-		set_bit(BTN_EXTRA, psmouse->dev.keybit);
-		set_bit(BTN_SIDE, psmouse->dev.keybit);
-		set_bit(REL_WHEEL, psmouse->dev.relbit);
-
-		psmouse->vendor = "Genius";
-		psmouse->name = "Wheel Mouse";
-		return PSMOUSE_GENPS;
-	}
+	return param[0] == 0x00 && param[1] == 0x33 && param[2] == 0x55;
+}
 
 /*
- * Try Logitech magic ID.
+ * IntelliMouse magic init.
  */
+static int intellimouse_detect(struct psmouse *psmouse)
+{
+	unsigned char param[2];
 
-	param[0] = 0;
-	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
-	psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE11);
-	psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE11);
-	psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE11);
-	param[1] = 0;
-	psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO);
+	param[0] = 200;
+	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
+	param[0] = 100;
+	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
+	param[0] =  80;
+	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
+	psmouse_command(psmouse, param, PSMOUSE_CMD_GETID);
 
-	if (param[1]) {
-		int type = ps2pp_detect_model(psmouse, param);
-		if (type)
-			return type;
-	}
+	return param[0] == 3;
+}
 
 /*
- * Try IntelliMouse magic init.
+ * Try IntelliMouse/Explorer magic init.
  */
+static int im_explorer_detect(struct psmouse *psmouse)
+{
+	unsigned char param[2];
 
 	param[0] = 200;
 	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
-	param[0] = 100;
+	param[0] = 200;
 	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
 	param[0] =  80;
 	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
 	psmouse_command(psmouse, param, PSMOUSE_CMD_GETID);
-	
-	if (param[0] == 3) {
 
-		set_bit(REL_WHEEL, psmouse->dev.relbit);
+	return param[0] == 4;
+}
 
 /*
- * Try IntelliMouse/Explorer magic init.
+ * psmouse_extensions() probes for any extensions to the basic PS/2 protocol
+ * the mouse may have.
+ */
+
+static int psmouse_extensions(struct psmouse *psmouse)
+{
+	int synaptics_hardware = 0;
+
+	psmouse->vendor = "Generic";
+	psmouse->name = "Mouse";
+	psmouse->model = 0;
+
+/*
+ * Try Synaptics TouchPad
  */
+	if (psmouse_max_proto > PSMOUSE_PS2 && synaptics_detect(psmouse)) {
+		synaptics_hardware = 1;
+		psmouse->vendor = "Synaptics";
+		psmouse->name = "TouchPad";
 
-		param[0] = 200;
-		psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
-		param[0] = 200;
-		psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
-		param[0] =  80;
-		psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
-		psmouse_command(psmouse, param, PSMOUSE_CMD_GETID);
+		if (psmouse_max_proto > PSMOUSE_IMEX) {
+			if (synaptics_init(psmouse) == 0)
+				return PSMOUSE_SYNAPTICS;
+/*
+ * Some Synaptics touchpads can emulate extended protocols (like IMPS/2).
+ * Unfortunately Logitech/Genius probes confuse some firmware versions so
+ * we'll have to skip them.
+ */
+			psmouse_max_proto = PSMOUSE_IMEX;
+		}
+	}
 
-		if (param[0] == 4) {
+	if (psmouse_max_proto > PSMOUSE_IMEX && genius_detect(psmouse)) {
+		set_bit(BTN_EXTRA, psmouse->dev.keybit);
+		set_bit(BTN_SIDE, psmouse->dev.keybit);
+		set_bit(REL_WHEEL, psmouse->dev.relbit);
 
+		psmouse->vendor = "Genius";
+		psmouse->name = "Wheel Mouse";
+		return PSMOUSE_GENPS;
+	}
+
+	if (psmouse_max_proto > PSMOUSE_IMEX) {
+		int type = ps2pp_detect(psmouse);
+		if (type)
+			return type;
+	}
+
+	if (psmouse_max_proto >= PSMOUSE_IMPS && intellimouse_detect(psmouse)) {
+		set_bit(REL_WHEEL, psmouse->dev.relbit);
+
+		if (psmouse_max_proto >= PSMOUSE_IMEX &&
+					im_explorer_detect(psmouse)) {
 			set_bit(BTN_SIDE, psmouse->dev.keybit);
 			set_bit(BTN_EXTRA, psmouse->dev.keybit);
 
@@ -378,6 +388,15 @@
  * Okay, all failed, we have a standard mouse here. The number of the buttons
  * is still a question, though. We assume 3.
  */
+	if (synaptics_hardware) {
+/*
+ * We detected Synaptics hardware but it did not respond to IMPS/2 probes.
+ * We need to reset the touchpad because if there is a track point on the
+ * pass through port it could get disabled while probing for protocol
+ * extensions.
+ */
+		psmouse_command(psmouse, NULL, PSMOUSE_CMD_RESET_DIS);
+	}
 
 	return PSMOUSE_PS2;
 }
@@ -468,7 +487,7 @@
  * We set the mouse report rate, resolution and scaling.
  */
 
-	if (!psmouse_noext) {
+	if (psmouse_max_proto != PSMOUSE_PS2) {
 		psmouse_set_rate(psmouse);
 		psmouse_set_resolution(psmouse);
 		psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE11);
@@ -513,45 +532,30 @@
 	struct psmouse *psmouse = serio->private;
 
 	psmouse->state = PSMOUSE_IGNORE;
-	synaptics_disconnect(psmouse);
-	input_unregister_device(&psmouse->dev);
-	serio_close(serio);
-	kfree(psmouse);
-}
-
-/*
- * Reinitialize mouse hardware after software suspend.
- */
-
-static int psmouse_pm_callback(struct pm_dev *dev, pm_request_t request, void *data)
-{
-	struct psmouse *psmouse = dev->data;
-	struct serio_dev *ser_dev = psmouse->serio->dev;
-
-	synaptics_disconnect(psmouse);
 
-	/* We need to reopen the serio port to reinitialize the i8042 controller */
-	serio_close(psmouse->serio);
-	serio_open(psmouse->serio, ser_dev);
+	if (psmouse->ptport) {
+		if (psmouse->ptport->deactivate)
+			psmouse->ptport->deactivate(psmouse);
+		__serio_unregister_port(&psmouse->ptport->serio); /* we have serio_sem */
+		kfree(psmouse->ptport);
+		psmouse->ptport = NULL;
+	}
 
-	/* Probe and re-initialize the mouse */
-	psmouse_probe(psmouse);
-	psmouse_initialize(psmouse);
-	synaptics_pt_init(psmouse);
-	psmouse_activate(psmouse);
+	if (psmouse->disconnect)
+		psmouse->disconnect(psmouse);
 
-	return 0;
+	input_unregister_device(&psmouse->dev);
+	serio_close(serio);
+	kfree(psmouse);
 }
 
 /*
  * psmouse_connect() is a callback from the serio module when
  * an unhandled serio port is found.
  */
-
 static void psmouse_connect(struct serio *serio, struct serio_dev *dev)
 {
 	struct psmouse *psmouse;
-	struct pm_dev *pmdev;
 	
 	if ((serio->type & SERIO_TYPE) != SERIO_8042 &&
 	    (serio->type & SERIO_TYPE) != SERIO_PS_PSTHRU)
@@ -572,7 +576,6 @@
 	psmouse->dev.private = psmouse;
 
 	serio->private = psmouse;
-
 	if (serio_open(serio, dev)) {
 		kfree(psmouse);
 		return;
@@ -584,12 +587,6 @@
 		return;
 	}
 	
-	pmdev = pm_register(PM_SYS_DEV, PM_SYS_UNKNOWN, psmouse_pm_callback);
-	if (pmdev) {
-		psmouse->dev.pm_dev = pmdev;
-		pmdev->data = psmouse;
-	}
-
 	sprintf(psmouse->devname, "%s %s %s",
 		psmouse_protocols[psmouse->type], psmouse->vendor, psmouse->name);
 	sprintf(psmouse->phys, "%s/input0",
@@ -608,59 +605,87 @@
 
 	psmouse_initialize(psmouse);
 
-	synaptics_pt_init(psmouse);
+	if (psmouse->ptport) {
+		printk(KERN_INFO "serio: %s port at %s\n", psmouse->ptport->serio.name, psmouse->phys);
+		__serio_register_port(&psmouse->ptport->serio); /* we have serio_sem */
+		if (psmouse->ptport->activate)
+			psmouse->ptport->activate(psmouse);
+	}
+
+	psmouse_activate(psmouse);
+}
+
+
+static int psmouse_reconnect(struct serio *serio)
+{
+	struct psmouse *psmouse = serio->private;
+	struct serio_dev *dev = serio->dev;
+	int old_type = psmouse->type;
+
+	if (!dev) {
+		printk(KERN_DEBUG "psmouse: reconnect request, but serio is disconnected, ignoring...\n");
+		return -1;
+	}
+
+	psmouse->state = PSMOUSE_NEW_DEVICE;
+	psmouse->type = psmouse->acking = psmouse->cmdcnt = psmouse->pktcnt = 0;
+	if (psmouse->reconnect) {
+	       if (psmouse->reconnect(psmouse))
+			return -1;
+	} else if (psmouse_probe(psmouse) != old_type)
+		return -1;
+
+	/* ok, the device type (and capabilities) match the old one,
+	 * we can continue using it, complete intialization
+	 */
+	psmouse->type = old_type;
+	psmouse_initialize(psmouse);
+
+	if (psmouse->ptport) {
+       		if (psmouse_reconnect(&psmouse->ptport->serio)) {
+			__serio_unregister_port(&psmouse->ptport->serio);
+			__serio_register_port(&psmouse->ptport->serio);
+			if (psmouse->ptport->activate)
+				psmouse->ptport->activate(psmouse);
+		}
+	}
 
 	psmouse_activate(psmouse);
+	return 0;
 }
 
+
 static struct serio_dev psmouse_dev = {
 	.interrupt =	psmouse_interrupt,
 	.connect =	psmouse_connect,
+	.reconnect =	psmouse_reconnect,
 	.disconnect =	psmouse_disconnect,
 	.cleanup =	psmouse_cleanup,
 };
 
-#ifndef MODULE
-static int __init psmouse_noext_setup(char *str)
-{
-	psmouse_noext = 1;
-	return 1;
-}
-
-static int __init psmouse_resolution_setup(char *str)
-{
-	get_option(&str, &psmouse_resolution);
-	return 1;
-}
-
-static int __init psmouse_smartscroll_setup(char *str)
+static inline void psmouse_parse_proto(void)
 {
-	get_option(&str, &psmouse_smartscroll);
-	return 1;
-}
-
-static int __init psmouse_resetafter_setup(char *str)
-{
-	get_option(&str, &psmouse_resetafter);
-	return 1;
-}
+	if (psmouse_noext) {
+		printk(KERN_WARNING "psmouse: 'psmouse_noext' option is deprecated, please use 'psmouse_proto'\n");
+		psmouse_max_proto = PSMOUSE_PS2;
+	}
 
-static int __init psmouse_rate_setup(char *str)
-{
-	get_option(&str, &psmouse_rate);
-	return 1;
+	/* even is psmouse_noext is present psmouse_proto overrides it */
+	if (psmouse_proto) {
+		if (!strcmp(psmouse_proto, "bare"))
+			psmouse_max_proto = PSMOUSE_PS2;
+		else if (!strcmp(psmouse_proto, "imps"))
+			psmouse_max_proto = PSMOUSE_IMPS;
+		else if (!strcmp(psmouse_proto, "exps"))
+			psmouse_max_proto = PSMOUSE_IMEX;
+		else
+			printk(KERN_ERR "psmouse: unknown protocol type '%s'\n", psmouse_proto);
+	}
 }
 
-__setup("psmouse_noext", psmouse_noext_setup);
-__setup("psmouse_resolution=", psmouse_resolution_setup);
-__setup("psmouse_smartscroll=", psmouse_smartscroll_setup);
-__setup("psmouse_resetafter=", psmouse_resetafter_setup);
-__setup("psmouse_rate=", psmouse_rate_setup);
-
-#endif
-
 int __init psmouse_init(void)
 {
+	psmouse_parse_proto();
 	serio_register_device(&psmouse_dev);
 	return 0;
 }
--- diff/drivers/input/mouse/psmouse.h	2003-10-09 09:47:16.000000000 +0100
+++ source/drivers/input/mouse/psmouse.h	2003-12-29 09:30:40.000000000 +0000
@@ -22,10 +22,20 @@
 #define PSMOUSE_ACTIVATED	1
 #define PSMOUSE_IGNORE		2
 
+struct psmouse;
+
+struct psmouse_ptport {
+	struct serio serio;
+
+	void (*activate)(struct psmouse *parent);
+	void (*deactivate)(struct psmouse *parent);
+};
+
 struct psmouse {
 	void *private;
 	struct input_dev dev;
 	struct serio *serio;
+	struct psmouse_ptport *ptport;
 	char *vendor;
 	char *name;
 	unsigned char cmdbuf[8];
@@ -41,6 +51,9 @@
 	char error;
 	char devname[64];
 	char phys[32];
+
+	int (*reconnect)(struct psmouse *psmouse);
+	void (*disconnect)(struct psmouse *psmouse);
 };
 
 #define PSMOUSE_PS2		1
--- diff/drivers/input/mouse/synaptics.c	2003-10-09 09:47:16.000000000 +0100
+++ source/drivers/input/mouse/synaptics.c	2003-12-29 09:30:40.000000000 +0000
@@ -2,7 +2,8 @@
  * Synaptics TouchPad PS/2 mouse driver
  *
  *   2003 Dmitry Torokhov <dtor@mail.ru>
- *     Added support for pass-through port
+ *     Added support for pass-through port. Special thanks to Peter Berg Larsen
+ *     for explaining various Synaptics quirks.
  *
  *   2003 Peter Osterlund <petero2@telia.com>
  *     Ported to 2.5 input device infrastructure.
@@ -194,9 +195,7 @@
 
 static int synaptics_query_hardware(struct psmouse *psmouse)
 {
-	struct synaptics_data *priv = psmouse->private;
 	int retries = 0;
-	int mode;
 
 	while ((retries++ < 3) && synaptics_reset(psmouse))
 		printk(KERN_ERR "synaptics reset failed\n");
@@ -208,7 +207,14 @@
 	if (synaptics_capability(psmouse))
 		return -1;
 
-	mode = SYN_BIT_ABSOLUTE_MODE | SYN_BIT_HIGH_RATE;
+	return 0;
+}
+
+static int synaptics_set_mode(struct psmouse *psmouse, int mode)
+{
+	struct synaptics_data *priv = psmouse->private;
+
+	mode |= SYN_BIT_ABSOLUTE_MODE | SYN_BIT_HIGH_RATE;
 	if (SYN_ID_MAJOR(priv->identity) >= 4)
 		mode |= SYN_BIT_DISABLE_GESTURE;
 	if (SYN_CAP_EXTENDED(priv->capabilities))
@@ -265,49 +271,38 @@
 	}
 }
 
-int synaptics_pt_init(struct psmouse *psmouse)
+static void synaptics_pt_activate(struct psmouse *psmouse)
 {
-	struct synaptics_data *priv = psmouse->private;
-	struct serio *port;
-	struct psmouse *child;
+	struct psmouse *child = psmouse->ptport->serio.private;
 
-	if (psmouse->type != PSMOUSE_SYNAPTICS)
-		return -1;
-	if (!SYN_CAP_EXTENDED(priv->capabilities))
-		return -1;
-	if (!SYN_CAP_PASS_THROUGH(priv->capabilities))
-		return -1;
+	/* adjust the touchpad to child's choice of protocol */
+	if (child && child->type >= PSMOUSE_GENPS) {
+		if (synaptics_set_mode(psmouse, SYN_BIT_FOUR_BYTE_CLIENT))
+			printk(KERN_INFO "synaptics: failed to enable 4-byte guest protocol\n");
+	}
+}
+
+static void synaptics_pt_create(struct psmouse *psmouse)
+{
+	struct psmouse_ptport *port;
 
-	priv->ptport = port = kmalloc(sizeof(struct serio), GFP_KERNEL);
+	psmouse->ptport = port = kmalloc(sizeof(struct psmouse_ptport), GFP_KERNEL);
 	if (!port) {
-		printk(KERN_ERR "synaptics: not enough memory to allocate serio port\n");
-		return -1;
+		printk(KERN_ERR "synaptics: not enough memory to allocate pass-through port\n");
+		return;
 	}
 
-	memset(port, 0, sizeof(struct serio));
-	port->type = SERIO_PS_PSTHRU;
-	port->name = "Synaptics pass-through";
-	port->phys = "synaptics-pt/serio0";
-	port->write = synaptics_pt_write;
-	port->open = synaptics_pt_open;
-	port->close = synaptics_pt_close;
-	port->driver = psmouse;
-
-	printk(KERN_INFO "serio: %s port at %s\n", port->name, psmouse->phys);
-	serio_register_slave_port(port);
+	memset(port, 0, sizeof(struct psmouse_ptport));
 
-	/* adjust the touchpad to child's choice of protocol */
-	child = port->private;
-	if (child && child->type >= PSMOUSE_GENPS) {
-		if (synaptics_mode_cmd(psmouse, (SYN_BIT_ABSOLUTE_MODE |
-					 	 SYN_BIT_HIGH_RATE |
-					 	 SYN_BIT_DISABLE_GESTURE |
-						 SYN_BIT_FOUR_BYTE_CLIENT |
-					 	 SYN_BIT_W_MODE)))
-			printk(KERN_INFO "synaptics: failed to enable 4-byte guest protocol\n");
-	}
+	port->serio.type = SERIO_PS_PSTHRU;
+	port->serio.name = "Synaptics pass-through";
+	port->serio.phys = "synaptics-pt/serio0";
+	port->serio.write = synaptics_pt_write;
+	port->serio.open = synaptics_pt_open;
+	port->serio.close = synaptics_pt_close;
+	port->serio.driver = psmouse;
 
-	return 0;
+	port->activate = synaptics_pt_activate;
 }
 
 /*****************************************************************************
@@ -371,27 +366,82 @@
 	clear_bit(REL_Y, dev->relbit);
 }
 
+static void synaptics_disconnect(struct psmouse *psmouse)
+{
+	synaptics_mode_cmd(psmouse, 0);
+	kfree(psmouse->private);
+}
+
+static int synaptics_reconnect(struct psmouse *psmouse)
+{
+	struct synaptics_data *priv = psmouse->private;
+	struct synaptics_data old_priv = *priv;
+
+	if (!synaptics_detect(psmouse))
+		return -1;
+
+	if (synaptics_query_hardware(psmouse)) {
+		printk(KERN_ERR "Unable to query Synaptics hardware.\n");
+		return -1;
+	}
+
+	if (old_priv.identity != priv->identity ||
+	    old_priv.model_id != priv->model_id ||
+	    old_priv.capabilities != priv->capabilities ||
+    	    old_priv.ext_cap != priv->ext_cap)
+    		return -1;
+
+	if (synaptics_set_mode(psmouse, 0)) {
+		printk(KERN_ERR "Unable to initialize Synaptics hardware.\n");
+		return -1;
+	}
+
+	return 0;
+}
+
+int synaptics_detect(struct psmouse *psmouse)
+{
+	unsigned char param[4];
+
+	param[0] = 0;
+
+	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
+	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
+	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
+	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
+	psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO);
+
+	return param[1] == 0x47;
+}
+
 int synaptics_init(struct psmouse *psmouse)
 {
 	struct synaptics_data *priv;
 
-#ifndef CONFIG_MOUSE_PS2_SYNAPTICS
-	return -1;
-#endif
-
 	psmouse->private = priv = kmalloc(sizeof(struct synaptics_data), GFP_KERNEL);
 	if (!priv)
 		return -1;
 	memset(priv, 0, sizeof(struct synaptics_data));
 
 	if (synaptics_query_hardware(psmouse)) {
-		printk(KERN_ERR "Unable to query/initialize Synaptics hardware.\n");
+		printk(KERN_ERR "Unable to query Synaptics hardware.\n");
+		goto init_fail;
+	}
+
+	if (synaptics_set_mode(psmouse, 0)) {
+		printk(KERN_ERR "Unable to initialize Synaptics hardware.\n");
 		goto init_fail;
 	}
 
+	if (SYN_CAP_EXTENDED(priv->capabilities) && SYN_CAP_PASS_THROUGH(priv->capabilities))
+       		synaptics_pt_create(psmouse);
+
 	print_ident(priv);
 	set_input_params(&psmouse->dev, priv);
 
+	psmouse->disconnect = synaptics_disconnect;
+	psmouse->reconnect = synaptics_reconnect;
+
 	return 0;
 
  init_fail:
@@ -399,36 +449,13 @@
 	return -1;
 }
 
-void synaptics_disconnect(struct psmouse *psmouse)
-{
-	struct synaptics_data *priv = psmouse->private;
-
-	if (psmouse->type == PSMOUSE_SYNAPTICS && priv) {
-		synaptics_mode_cmd(psmouse, 0);
-		if (priv->ptport) {
-			serio_unregister_slave_port(priv->ptport);
-			kfree(priv->ptport);
-		}
-		kfree(priv);
-	}
-}
-
 /*****************************************************************************
  *	Functions to interpret the absolute mode packets
  ****************************************************************************/
 
 static void synaptics_parse_hw_state(unsigned char buf[], struct synaptics_data *priv, struct synaptics_hw_state *hw)
 {
-	hw->up    = 0;
-	hw->down  = 0;
-	hw->b0    = 0;
-	hw->b1    = 0;
-	hw->b2    = 0;
-	hw->b3    = 0;
-	hw->b4    = 0;
-	hw->b5    = 0;
-	hw->b6    = 0;
-	hw->b7    = 0;
+	memset(hw, 0, sizeof(struct synaptics_hw_state));
 
 	if (SYN_MODEL_NEWABS(priv->model_id)) {
 		hw->x = (((buf[3] & 0x10) << 8) |
@@ -570,64 +597,47 @@
 	input_sync(dev);
 }
 
+static int synaptics_validate_byte(struct psmouse *psmouse)
+{
+	static unsigned char newabs_mask[] = { 0xC0, 0x00, 0x00, 0xC0, 0x00 };
+	static unsigned char newabs_rslt[] = { 0x80, 0x00, 0x00, 0xC0, 0x00 };
+	static unsigned char oldabs_mask[] = { 0xC0, 0x60, 0x00, 0xC0, 0x60 };
+	static unsigned char oldabs_rslt[] = { 0xC0, 0x00, 0x00, 0x80, 0x00 };
+	struct synaptics_data *priv = psmouse->private;
+	int idx = psmouse->pktcnt - 1;
+
+	if (SYN_MODEL_NEWABS(priv->model_id))
+		return (psmouse->packet[idx] & newabs_mask[idx]) == newabs_rslt[idx];
+	else
+		return (psmouse->packet[idx] & oldabs_mask[idx]) == oldabs_rslt[idx];
+}
+
 void synaptics_process_byte(struct psmouse *psmouse, struct pt_regs *regs)
 {
 	struct input_dev *dev = &psmouse->dev;
 	struct synaptics_data *priv = psmouse->private;
-	unsigned char data = psmouse->packet[psmouse->pktcnt - 1];
-	int newabs = SYN_MODEL_NEWABS(priv->model_id);
 
 	input_regs(dev, regs);
 
-	switch (psmouse->pktcnt) {
-	case 1:
-		if (newabs ? ((data & 0xC8) != 0x80) : ((data & 0xC0) != 0xC0)) {
-			printk(KERN_WARNING "Synaptics driver lost sync at 1st byte\n");
-			goto bad_sync;
-		}
-		break;
-	case 2:
-		if (!newabs && ((data & 0x60) != 0x00)) {
-			printk(KERN_WARNING "Synaptics driver lost sync at 2nd byte\n");
-			goto bad_sync;
-		}
-		break;
-	case 4:
-		if (newabs ? ((data & 0xC8) != 0xC0) : ((data & 0xC0) != 0x80)) {
-			printk(KERN_WARNING "Synaptics driver lost sync at 4th byte\n");
-			goto bad_sync;
-		}
-		break;
-	case 5:
-		if (!newabs && ((data & 0x60) != 0x00)) {
-			printk(KERN_WARNING "Synaptics driver lost sync at 5th byte\n");
-			goto bad_sync;
-		}
-		break;
-	default:
-		if (psmouse->pktcnt < 6)
-			break;		    /* Wait for full packet */
-
+	if (psmouse->pktcnt >= 6) { /* Full packet received */
 		if (priv->out_of_sync) {
 			priv->out_of_sync = 0;
 			printk(KERN_NOTICE "Synaptics driver resynced.\n");
 		}
 
-		if (priv->ptport && synaptics_is_pt_packet(psmouse->packet))
-			synaptics_pass_pt_packet(priv->ptport, psmouse->packet);
+		if (psmouse->ptport && psmouse->ptport->serio.dev && synaptics_is_pt_packet(psmouse->packet))
+			synaptics_pass_pt_packet(&psmouse->ptport->serio, psmouse->packet);
 		else
 			synaptics_process_packet(psmouse);
-
 		psmouse->pktcnt = 0;
-		break;
-	}
-	return;
 
- bad_sync:
-	priv->out_of_sync++;
-	psmouse->pktcnt = 0;
-	if (psmouse_resetafter > 0 && priv->out_of_sync	== psmouse_resetafter) {
-		psmouse->state = PSMOUSE_IGNORE;
-		serio_rescan(psmouse->serio);
+	} else if (psmouse->pktcnt && !synaptics_validate_byte(psmouse)) {
+		printk(KERN_WARNING "Synaptics driver lost sync at byte %d\n", psmouse->pktcnt);
+		psmouse->pktcnt = 0;
+		if (++priv->out_of_sync == psmouse_resetafter) {
+			psmouse->state = PSMOUSE_IGNORE;
+			printk(KERN_NOTICE "synaptics: issuing reconnect request\n");
+			serio_reconnect(psmouse->serio);
+		}
 	}
 }
--- diff/drivers/input/mouse/synaptics.h	2003-10-09 09:47:16.000000000 +0100
+++ source/drivers/input/mouse/synaptics.h	2003-12-29 09:30:40.000000000 +0000
@@ -9,11 +9,9 @@
 #ifndef _SYNAPTICS_H
 #define _SYNAPTICS_H
 
-
 extern void synaptics_process_byte(struct psmouse *psmouse, struct pt_regs *regs);
+extern int synaptics_detect(struct psmouse *psmouse);
 extern int synaptics_init(struct psmouse *psmouse);
-extern int synaptics_pt_init(struct psmouse *psmouse);
-extern void synaptics_disconnect(struct psmouse *psmouse);
 
 /* synaptics queries */
 #define SYN_QUE_IDENTIFY		0x00
@@ -105,8 +103,6 @@
 	/* Data for normal processing */
 	unsigned int out_of_sync;		/* # of packets out of sync */
 	int old_w;				/* Previous w value */
-	
-	struct serio *ptport;			/* pass-through port */
 };
 
 #endif /* _SYNAPTICS_H */
--- diff/drivers/input/serio/i8042.c	2003-09-30 15:46:14.000000000 +0100
+++ source/drivers/input/serio/i8042.c	2003-12-29 09:30:40.000000000 +0000
@@ -12,11 +12,14 @@
 
 #include <linux/delay.h>
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/interrupt.h>
 #include <linux/ioport.h>
 #include <linux/config.h>
 #include <linux/reboot.h>
 #include <linux/init.h>
+#include <linux/sysdev.h>
+#include <linux/pm.h>
 #include <linux/serio.h>
 
 #include <asm/io.h>
@@ -25,19 +28,23 @@
 MODULE_DESCRIPTION("i8042 keyboard and mouse controller driver");
 MODULE_LICENSE("GPL");
 
-MODULE_PARM(i8042_noaux, "1i");
-MODULE_PARM(i8042_nomux, "1i");
-MODULE_PARM(i8042_unlock, "1i");
-MODULE_PARM(i8042_reset, "1i");
-MODULE_PARM(i8042_direct, "1i");
-MODULE_PARM(i8042_dumbkbd, "1i");
-
-static int i8042_reset;
-static int i8042_noaux;
-static int i8042_nomux;
-static int i8042_unlock;
-static int i8042_direct;
-static int i8042_dumbkbd;
+static unsigned int i8042_noaux;
+module_param(i8042_noaux, bool, 0);
+
+static unsigned int i8042_nomux;
+module_param(i8042_nomux, bool, 0);
+
+static unsigned int i8042_unlock;
+module_param(i8042_unlock, bool, 0);
+
+static unsigned int i8042_reset;
+module_param(i8042_reset, bool, 0);
+
+static unsigned int i8042_direct;
+module_param(i8042_direct, bool, 0);
+
+static unsigned int i8042_dumbkbd;
+module_param(i8042_dumbkbd, bool, 0);
 
 #undef DEBUG
 #include "i8042.h"
@@ -59,6 +66,9 @@
 static unsigned char i8042_initial_ctr;
 static unsigned char i8042_ctr;
 static unsigned char i8042_mux_open;
+static unsigned char i8042_mux_present;
+static unsigned char i8042_sysdev_initialized;
+static struct pm_dev *i8042_pm_dev;
 struct timer_list i8042_timer;
 
 /*
@@ -214,16 +224,41 @@
 }
 
 /*
- * i8042_open() is called when a port is open by the higher layer.
- * It allocates the interrupt and enables it in the chip.
+ * i8042_activate_port() enables port on a chip.
  */
 
-static int i8042_open(struct serio *port)
+static int i8042_activate_port(struct serio *port)
 {
 	struct i8042_values *values = port->driver;
 
 	i8042_flush();
 
+	/*
+	 * Enable port again here because it is disabled if we are
+	 * resuming (normally it is enabled already).
+	 */
+	i8042_ctr &= ~values->disable;
+
+	i8042_ctr |= values->irqen;
+
+	if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) {
+		i8042_ctr &= ~values->irqen;
+		return -1;
+	}
+
+	return 0;
+}
+
+
+/*
+ * i8042_open() is called when a port is open by the higher layer.
+ * It allocates the interrupt and calls i8042_enable_port.
+ */
+
+static int i8042_open(struct serio *port)
+{
+	struct i8042_values *values = port->driver;
+
 	if (values->mux != -1)
 		if (i8042_mux_open++)
 			return 0;
@@ -231,21 +266,26 @@
 	if (request_irq(values->irq, i8042_interrupt,
 			SA_SHIRQ, "i8042", i8042_request_irq_cookie)) {
 		printk(KERN_ERR "i8042.c: Can't get irq %d for %s, unregistering the port.\n", values->irq, values->name);
-		values->exists = 0;
-		serio_unregister_port(port);
-		return -1;
+		goto irq_fail;
 	}
 
-	i8042_ctr |= values->irqen;
-
-	if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) {
-		printk(KERN_ERR "i8042.c: Can't write CTR while opening %s.\n", values->name);
-		return -1;
+	if (i8042_activate_port(port)) {
+		printk(KERN_ERR "i8042.c: Can't activate %s, unregistering the port\n", values->name);
+		goto activate_fail;
 	}
 
 	i8042_interrupt(0, NULL, NULL);
 
 	return 0;
+
+activate_fail:
+	free_irq(values->irq, i8042_request_irq_cookie);
+
+irq_fail:
+	values->exists = 0;
+	serio_unregister_port_delayed(port);
+
+	return -1;
 }
 
 /*
@@ -393,145 +433,78 @@
 }
 
 /*
- * i8042_controller init initializes the i8042 controller, and,
- * most importantly, sets it into non-xlated mode if that's
- * desired.
+ * i8042_enable_mux_mode checks whether the controller has an active
+ * multiplexor and puts the chip into Multiplexed (as opposed to
+ * Legacy) mode.
  */
-	
-static int __init i8042_controller_init(void)
+
+static int i8042_enable_mux_mode(struct i8042_values *values, unsigned char *mux_version)
 {
 
+	unsigned char param;
 /*
- * Test the i8042. We need to know if it thinks it's working correctly
- * before doing anything else.
+ * Get rid of bytes in the queue.
  */
 
 	i8042_flush();
 
-	if (i8042_reset) {
-
-		unsigned char param;
-
-		if (i8042_command(&param, I8042_CMD_CTL_TEST)) {
-			printk(KERN_ERR "i8042.c: i8042 controller self test timeout.\n");
-			return -1;
-		}
-
-		if (param != I8042_RET_CTL_TEST) {
-			printk(KERN_ERR "i8042.c: i8042 controller selftest failed. (%#x != %#x)\n",
-				 param, I8042_RET_CTL_TEST);
-			return -1;
-		}
-	}
-
 /*
- * Save the CTR for restoral on unload / reboot.
+ * Internal loopback test - send three bytes, they should come back from the
+ * mouse interface, the last should be version. Note that we negate mouseport
+ * command responses for the i8042_check_aux() routine.
  */
 
-	if (i8042_command(&i8042_ctr, I8042_CMD_CTL_RCTR)) {
-		printk(KERN_ERR "i8042.c: Can't read CTR while initializing i8042.\n");
+	param = 0xf0;
+	if (i8042_command(&param, I8042_CMD_AUX_LOOP) || param != 0x0f)
 		return -1;
-	}
-
-	i8042_initial_ctr = i8042_ctr;
-
-/*
- * Disable the keyboard interface and interrupt. 
- */
-
-	i8042_ctr |= I8042_CTR_KBDDIS;
-	i8042_ctr &= ~I8042_CTR_KBDINT;
-
-/*
- * Handle keylock.
- */
-
-	if (~i8042_read_status() & I8042_STR_KEYLOCK) {
-		if (i8042_unlock)
-			i8042_ctr |= I8042_CTR_IGNKEYLOCK;
-		 else
-			printk(KERN_WARNING "i8042.c: Warning: Keylock active.\n");
-	}
-
-/*
- * If the chip is configured into nontranslated mode by the BIOS, don't
- * bother enabling translating and be happy.
- */
-
-	if (~i8042_ctr & I8042_CTR_XLATE)
-		i8042_direct = 1;
-
-/*
- * Set nontranslated mode for the kbd interface if requested by an option.
- * After this the kbd interface becomes a simple serial in/out, like the aux
- * interface is. We don't do this by default, since it can confuse notebook
- * BIOSes.
- */
-
-	if (i8042_direct) {
-		i8042_ctr &= ~I8042_CTR_XLATE;
-		i8042_kbd_port.type = SERIO_8042;
-	}
-
-/*
- * Write CTR back.
- */
-
-	if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) {
-		printk(KERN_ERR "i8042.c: Can't write CTR while initializing i8042.\n");
+	param = 0x56;
+	if (i8042_command(&param, I8042_CMD_AUX_LOOP) || param != 0xa9)
 		return -1;
-	}
+	param = 0xa4;
+	if (i8042_command(&param, I8042_CMD_AUX_LOOP) || param == 0x5b)
+		return -1;
+
+	if (mux_version)
+		*mux_version = ~param;
 
 	return 0;
 }
 
+
 /*
- * Here we try to reset everything back to a state in which the BIOS will be
- * able to talk to the hardware when rebooting.
+ * i8042_enable_mux_ports enables 4 individual AUX ports after
+ * the controller has been switched into Multiplexed mode
  */
 
-void i8042_controller_cleanup(void)
+static int i8042_enable_mux_ports(struct i8042_values *values)
 {
+	unsigned char param;
 	int i;
-
-	i8042_flush();
-
 /*
- * Reset anything that is connected to the ports.
- */
-
-	if (i8042_kbd_values.exists)
-		serio_cleanup(&i8042_kbd_port);
-
-	if (i8042_aux_values.exists)
-		serio_cleanup(&i8042_aux_port);
-
-	for (i = 0; i < 4; i++)
-		if (i8042_mux_values[i].exists)
-			serio_cleanup(i8042_mux_port + i);
-
-/*
- * Reset the controller.
+ * Disable all muxed ports by disabling AUX.
  */
 
-	if (i8042_reset) {
-		unsigned char param;
+	i8042_ctr |= I8042_CTR_AUXDIS;
+	i8042_ctr &= ~I8042_CTR_AUXINT;
 
-		if (i8042_command(&param, I8042_CMD_CTL_TEST))
-			printk(KERN_ERR "i8042.c: i8042 controller reset timeout.\n");
+	if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) {
+		printk(KERN_ERR "i8042.c: Failed to disable AUX port, can't use MUX.\n");
+		return -1;
 	}
 
 /*
- * Restore the original control register setting.
+ * Enable all muxed ports.
  */
 
-	i8042_ctr = i8042_initial_ctr;
-
-	if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR))
-		printk(KERN_WARNING "i8042.c: Can't restore CTR.\n");
+	for (i = 0; i < 4; i++) {
+		i8042_command(&param, I8042_CMD_MUX_PFX + i);
+		i8042_command(&param, I8042_CMD_AUX_ENABLE);
+	}
 
+	return 0;
 }
 
+
 /*
  * i8042_check_mux() checks whether the controller supports the PS/2 Active
  * Multiplexing specification by Synaptics, Phoenix, Insyde and
@@ -540,66 +513,31 @@
 
 static int __init i8042_check_mux(struct i8042_values *values)
 {
-	unsigned char param;
 	static int i8042_check_mux_cookie;
-	int i;
+	unsigned char mux_version;
 
 /*
  * Check if AUX irq is available.
  */
-
 	if (request_irq(values->irq, i8042_interrupt, SA_SHIRQ,
 				"i8042", &i8042_check_mux_cookie))
                 return -1;
 	free_irq(values->irq, &i8042_check_mux_cookie);
 
-/*
- * Get rid of bytes in the queue.
- */
-
-	i8042_flush();
-
-/*
- * Internal loopback test - send three bytes, they should come back from the
- * mouse interface, the last should be version. Note that we negate mouseport
- * command responses for the i8042_check_aux() routine.
- */
-
-	param = 0xf0;
-	if (i8042_command(&param, I8042_CMD_AUX_LOOP) || param != 0x0f)
-		return -1;
-	param = 0x56;
-	if (i8042_command(&param, I8042_CMD_AUX_LOOP) || param != 0xa9)
-		return -1;
-	param = 0xa4;
-	if (i8042_command(&param, I8042_CMD_AUX_LOOP) || param == 0x5b)
+	if (i8042_enable_mux_mode(values, &mux_version))
 		return -1;
 
 	printk(KERN_INFO "i8042.c: Detected active multiplexing controller, rev %d.%d.\n",
-		(~param >> 4) & 0xf, ~param & 0xf);
-
-/*
- * Disable all muxed ports by disabling AUX.
- */
-
-	i8042_ctr |= I8042_CTR_AUXDIS;
-	i8042_ctr &= ~I8042_CTR_AUXINT;
+		(mux_version >> 4) & 0xf, mux_version & 0xf);
 
-	if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR))
+	if (i8042_enable_mux_ports(values))
 		return -1;
 
-/*
- * Enable all muxed ports.
- */
-
-	for (i = 0; i < 4; i++) {
-		i8042_command(&param, I8042_CMD_MUX_PFX + i);
-		i8042_command(&param, I8042_CMD_AUX_ENABLE);
-	}
-
+	i8042_mux_present = 1;
 	return 0;
 }
 
+
 /*
  * i8042_check_aux() applies as much paranoia as it can at detecting
  * the presence of an AUX interface.
@@ -675,6 +613,7 @@
 	return 0;
 }
 
+
 /*
  * i8042_port_register() marks the device as existing,
  * registers it, and reports to the user.
@@ -691,63 +630,205 @@
 		return -1; 
 	}
 
-	serio_register_port(port);
-
 	printk(KERN_INFO "serio: i8042 %s port at %#lx,%#lx irq %d\n",
 	       values->name,
 	       (unsigned long) I8042_DATA_REG,
 	       (unsigned long) I8042_COMMAND_REG,
 	       values->irq);
 
+	serio_register_port(port);
+
 	return 0;
 }
 
+
 static void i8042_timer_func(unsigned long data)
 {
 	i8042_interrupt(0, NULL, NULL);
 	mod_timer(&i8042_timer, jiffies + I8042_POLL_PERIOD);
 }
 
-#ifndef MODULE
-static int __init i8042_setup_reset(char *str)
-{
-	i8042_reset = 1;
-	return 1;
-}
-static int __init i8042_setup_noaux(char *str)
-{
-	i8042_noaux = 1;
-	i8042_nomux = 1;
-	return 1;
-}
-static int __init i8042_setup_nomux(char *str)
-{
-	i8042_nomux = 1;
-	return 1;
-}
-static int __init i8042_setup_unlock(char *str)
+
+/*
+ * i8042_controller init initializes the i8042 controller, and,
+ * most importantly, sets it into non-xlated mode if that's
+ * desired.
+ */
+
+static int i8042_controller_init(void)
 {
-	i8042_unlock = 1;
-	return 1;
+
+	if (i8042_noaux)
+		i8042_nomux = 1;
+/*
+ * Test the i8042. We need to know if it thinks it's working correctly
+ * before doing anything else.
+ */
+
+	i8042_flush();
+
+	if (i8042_reset) {
+
+		unsigned char param;
+
+		if (i8042_command(&param, I8042_CMD_CTL_TEST)) {
+			printk(KERN_ERR "i8042.c: i8042 controller self test timeout.\n");
+			return -1;
+		}
+
+		if (param != I8042_RET_CTL_TEST) {
+			printk(KERN_ERR "i8042.c: i8042 controller selftest failed. (%#x != %#x)\n",
+				 param, I8042_RET_CTL_TEST);
+			return -1;
+		}
+	}
+
+/*
+ * Save the CTR for restoral on unload / reboot.
+ */
+
+	if (i8042_command(&i8042_ctr, I8042_CMD_CTL_RCTR)) {
+		printk(KERN_ERR "i8042.c: Can't read CTR while initializing i8042.\n");
+		return -1;
+	}
+
+	i8042_initial_ctr = i8042_ctr;
+
+/*
+ * Disable the keyboard interface and interrupt.
+ */
+
+	i8042_ctr |= I8042_CTR_KBDDIS;
+	i8042_ctr &= ~I8042_CTR_KBDINT;
+
+/*
+ * Handle keylock.
+ */
+
+	if (~i8042_read_status() & I8042_STR_KEYLOCK) {
+		if (i8042_unlock)
+			i8042_ctr |= I8042_CTR_IGNKEYLOCK;
+		 else
+			printk(KERN_WARNING "i8042.c: Warning: Keylock active.\n");
+	}
+
+/*
+ * If the chip is configured into nontranslated mode by the BIOS, don't
+ * bother enabling translating and be happy.
+ */
+
+	if (~i8042_ctr & I8042_CTR_XLATE)
+		i8042_direct = 1;
+
+/*
+ * Set nontranslated mode for the kbd interface if requested by an option.
+ * After this the kbd interface becomes a simple serial in/out, like the aux
+ * interface is. We don't do this by default, since it can confuse notebook
+ * BIOSes.
+ */
+
+	if (i8042_direct) {
+		i8042_ctr &= ~I8042_CTR_XLATE;
+		i8042_kbd_port.type = SERIO_8042;
+	}
+
+/*
+ * Write CTR back.
+ */
+
+	if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) {
+		printk(KERN_ERR "i8042.c: Can't write CTR while initializing i8042.\n");
+		return -1;
+	}
+
+	return 0;
 }
-static int __init i8042_setup_direct(char *str)
+
+
+/*
+ * Here we try to reset everything back to a state in which the BIOS will be
+ * able to talk to the hardware when rebooting.
+ */
+
+void i8042_controller_cleanup(void)
 {
-	i8042_direct = 1;
-	return 1;
+	int i;
+
+	i8042_flush();
+
+/*
+ * Reset anything that is connected to the ports.
+ */
+
+	if (i8042_kbd_values.exists)
+		serio_cleanup(&i8042_kbd_port);
+
+	if (i8042_aux_values.exists)
+		serio_cleanup(&i8042_aux_port);
+
+	for (i = 0; i < 4; i++)
+		if (i8042_mux_values[i].exists)
+			serio_cleanup(i8042_mux_port + i);
+
+/*
+ * Reset the controller.
+ */
+
+	if (i8042_reset) {
+		unsigned char param;
+
+		if (i8042_command(&param, I8042_CMD_CTL_TEST))
+			printk(KERN_ERR "i8042.c: i8042 controller reset timeout.\n");
+	}
+
+/*
+ * Restore the original control register setting.
+ */
+
+	i8042_ctr = i8042_initial_ctr;
+
+	if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR))
+		printk(KERN_WARNING "i8042.c: Can't restore CTR.\n");
+
 }
-static int __init i8042_setup_dumbkbd(char *str)
+
+
+/*
+ * Here we try to reset everything back to a state in which suspended
+ */
+
+static int i8042_controller_resume(void)
 {
-	i8042_dumbkbd = 1;
-	return 1;
+	int i;
+
+	if (i8042_controller_init()) {
+		printk(KERN_ERR "i8042: resume failed\n");
+		return -1;
+	}
+
+	if (i8042_mux_present)
+		if (i8042_enable_mux_mode(&i8042_aux_values, NULL) ||
+		    i8042_enable_mux_ports(&i8042_aux_values)) {
+			printk(KERN_WARNING "i8042: failed to resume active multiplexor, mouse won't wotk.\n");
+		}
+
+/*
+ * Reconnect anything that was connected to the ports.
+ */
+
+	if (i8042_kbd_values.exists && i8042_activate_port(&i8042_kbd_port) == 0)
+		serio_reconnect(&i8042_kbd_port);
+
+	if (i8042_aux_values.exists && i8042_activate_port(&i8042_aux_port) == 0)
+		serio_reconnect(&i8042_aux_port);
+
+	for (i = 0; i < 4; i++)
+		if (i8042_mux_values[i].exists && i8042_activate_port(i8042_mux_port + i) == 0)
+			serio_reconnect(i8042_mux_port + i);
+
+	return 0;
 }
 
-__setup("i8042_reset", i8042_setup_reset);
-__setup("i8042_noaux", i8042_setup_noaux);
-__setup("i8042_nomux", i8042_setup_nomux);
-__setup("i8042_unlock", i8042_setup_unlock);
-__setup("i8042_direct", i8042_setup_direct);
-__setup("i8042_dumbkbd", i8042_setup_dumbkbd);
-#endif
 
 /*
  * We need to reset the 8042 back to original mode on system shutdown,
@@ -769,6 +850,35 @@
         0
 };
 
+/*
+ * Resume handler for the new PM scheme (driver model)
+ */
+static int i8042_resume(struct sys_device *dev)
+{
+	return i8042_controller_resume();
+}
+
+static struct sysdev_class kbc_sysclass = {
+       set_kset_name("i8042"),
+       .resume = i8042_resume,
+};
+
+static struct sys_device device_i8042 = {
+       .id     = 0,
+       .cls    = &kbc_sysclass,
+};
+
+/*
+ * Resume handler for the old PM scheme (APM)
+ */
+static int i8042_pm_callback(struct pm_dev *dev, pm_request_t request, void *dummy)
+{
+	if (request == PM_RESUME)
+		return i8042_controller_resume();
+
+	return 0;
+}
+
 static void __init i8042_init_mux_values(struct i8042_values *values, struct serio *port, int index)
 {
 	memcpy(port, &i8042_aux_port, sizeof(struct serio));
@@ -817,6 +927,15 @@
 	i8042_timer.function = i8042_timer_func;
 	mod_timer(&i8042_timer, jiffies + I8042_POLL_PERIOD);
 
+        if (sysdev_class_register(&kbc_sysclass) == 0) {
+                if (sys_device_register(&device_i8042) == 0)
+			i8042_sysdev_initialized = 1;
+		else
+			sysdev_class_unregister(&kbc_sysclass);
+        }
+
+	i8042_pm_dev = pm_register(PM_SYS_DEV, PM_SYS_UNKNOWN, i8042_pm_callback);
+
 	register_reboot_notifier(&i8042_notifier);
 
 	return 0;
@@ -828,6 +947,14 @@
 
 	unregister_reboot_notifier(&i8042_notifier);
 
+	if (i8042_pm_dev)
+		pm_unregister(i8042_pm_dev);
+
+	if (i8042_sysdev_initialized) {
+		sys_device_unregister(&device_i8042);
+		sysdev_class_unregister(&kbc_sysclass);
+	}
+
 	del_timer(&i8042_timer);
 
 	i8042_controller_cleanup();
--- diff/drivers/input/serio/serio.c	2003-10-09 09:47:16.000000000 +0100
+++ source/drivers/input/serio/serio.c	2003-12-29 09:30:40.000000000 +0000
@@ -49,14 +49,17 @@
 
 EXPORT_SYMBOL(serio_interrupt);
 EXPORT_SYMBOL(serio_register_port);
-EXPORT_SYMBOL(serio_register_slave_port);
+EXPORT_SYMBOL(serio_register_port_delayed);
+EXPORT_SYMBOL(__serio_register_port);
 EXPORT_SYMBOL(serio_unregister_port);
-EXPORT_SYMBOL(serio_unregister_slave_port);
+EXPORT_SYMBOL(serio_unregister_port_delayed);
+EXPORT_SYMBOL(__serio_unregister_port);
 EXPORT_SYMBOL(serio_register_device);
 EXPORT_SYMBOL(serio_unregister_device);
 EXPORT_SYMBOL(serio_open);
 EXPORT_SYMBOL(serio_close);
 EXPORT_SYMBOL(serio_rescan);
+EXPORT_SYMBOL(serio_reconnect);
 
 struct serio_event {
 	int type;
@@ -82,11 +85,23 @@
 	}
 }
 
-#define SERIO_RESCAN	1
+#define SERIO_RESCAN		1
+#define SERIO_RECONNECT		2
+#define SERIO_REGISTER_PORT	3
+#define SERIO_UNREGISTER_PORT	4
 
 static DECLARE_WAIT_QUEUE_HEAD(serio_wait);
 static DECLARE_COMPLETION(serio_exited);
 
+static void serio_invalidate_pending_events(struct serio *serio)
+{
+	struct serio_event *event;
+
+	list_for_each_entry(event, &serio_event_list, node)
+		if (event->serio == serio)
+			event->serio = NULL;
+}
+
 void serio_handle_events(void)
 {
 	struct list_head *node, *next;
@@ -95,17 +110,35 @@
 	list_for_each_safe(node, next, &serio_event_list) {
 		event = container_of(node, struct serio_event, node);	
 
+		down(&serio_sem);
+		if (event->serio == NULL)
+			goto event_done;
+
 		switch (event->type) {
+			case SERIO_REGISTER_PORT :
+				__serio_register_port(event->serio);
+				break;
+
+			case SERIO_UNREGISTER_PORT :
+				__serio_unregister_port(event->serio);
+				break;
+
+			case SERIO_RECONNECT :
+				if (event->serio->dev && event->serio->dev->reconnect)
+					if (event->serio->dev->reconnect(event->serio) == 0)
+						break;
+				/* reconnect failed - fall through to rescan */
+
 			case SERIO_RESCAN :
-				down(&serio_sem);
 				if (event->serio->dev && event->serio->dev->disconnect)
 					event->serio->dev->disconnect(event->serio);
 				serio_find_dev(event->serio);
-				up(&serio_sem);
 				break;
 			default:
 				break;
 		}
+event_done:
+		up(&serio_sem);
 		list_del_init(node);
 		kfree(event);
 	}
@@ -130,18 +163,27 @@
 	complete_and_exit(&serio_exited, 0);
 }
 
-void serio_rescan(struct serio *serio)
+static void serio_queue_event(struct serio *serio, int event_type)
 {
 	struct serio_event *event;
 
-	if (!(event = kmalloc(sizeof(struct serio_event), GFP_ATOMIC)))
-		return;
+	if ((event = kmalloc(sizeof(struct serio_event), GFP_ATOMIC))) {
+		event->type = event_type;
+		event->serio = serio;
+
+		list_add_tail(&event->node, &serio_event_list);
+		wake_up(&serio_wait);
+	}
+}
 
-	event->type = SERIO_RESCAN;
-	event->serio = serio;
+void serio_rescan(struct serio *serio)
+{
+	serio_queue_event(serio, SERIO_RESCAN);
+}
 
-	list_add_tail(&event->node, &serio_event_list);
-	wake_up(&serio_wait);
+void serio_reconnect(struct serio *serio)
+{
+	serio_queue_event(serio, SERIO_RECONNECT);
 }
 
 irqreturn_t serio_interrupt(struct serio *serio,
@@ -163,17 +205,26 @@
 void serio_register_port(struct serio *serio)
 {
 	down(&serio_sem);
-	list_add_tail(&serio->node, &serio_list);
-	serio_find_dev(serio);
+	__serio_register_port(serio);
 	up(&serio_sem);
 }
 
 /*
- * Same as serio_register_port but does not try to acquire serio_sem.
- * Should be used when registering a serio from other input device's
+ * Submits register request to kseriod for subsequent execution.
+ * Can be used when it is not obvious whether the serio_sem is
+ * taken or not and when delayed execution is feasible.
+ */
+void serio_register_port_delayed(struct serio *serio)
+{
+	serio_queue_event(serio, SERIO_REGISTER_PORT);
+}
+
+/*
+ * Should only be called directly if serio_sem has already been taken,
+ * for example when unregistering a serio from other input device's
  * connect() function.
  */
-void serio_register_slave_port(struct serio *serio)
+void __serio_register_port(struct serio *serio)
 {
 	list_add_tail(&serio->node, &serio_list);
 	serio_find_dev(serio);
@@ -182,19 +233,28 @@
 void serio_unregister_port(struct serio *serio)
 {
 	down(&serio_sem);
-	list_del_init(&serio->node);
-	if (serio->dev && serio->dev->disconnect)
-		serio->dev->disconnect(serio);
+	__serio_unregister_port(serio);
 	up(&serio_sem);
 }
 
 /*
- * Same as serio_unregister_port but does not try to acquire serio_sem.
- * Should be used when unregistering a serio from other input device's
+ * Submits unregister request to kseriod for subsequent execution.
+ * Can be used when it is not obvious whether the serio_sem is
+ * taken or not and when delayed execution is feasible.
+ */
+void serio_unregister_port_delayed(struct serio *serio)
+{
+	serio_queue_event(serio, SERIO_UNREGISTER_PORT);
+}
+
+/*
+ * Should only be called directly if serio_sem has already been taken,
+ * for example when unregistering a serio from other input device's
  * disconnect() function.
  */
-void serio_unregister_slave_port(struct serio *serio)
+void __serio_unregister_port(struct serio *serio)
 {
+	serio_invalidate_pending_events(serio);
 	list_del_init(&serio->node);
 	if (serio->dev && serio->dev->disconnect)
 		serio->dev->disconnect(serio);
--- diff/drivers/isdn/eicon/Kconfig	2002-11-11 11:09:36.000000000 +0000
+++ source/drivers/isdn/eicon/Kconfig	2003-12-29 09:30:40.000000000 +0000
@@ -13,7 +13,7 @@
 choice
 	prompt "Eicon active card support"
 	optional
-	depends on ISDN_DRV_EICON && ISDN
+	depends on ISDN_DRV_EICON && ISDN && m
 
 config ISDN_DRV_EICON_DIVAS
 	tristate "Eicon driver"
--- diff/drivers/isdn/eicon/eicon_mod.c	2003-06-09 14:18:18.000000000 +0100
+++ source/drivers/isdn/eicon/eicon_mod.c	2003-12-29 09:30:40.000000000 +0000
@@ -29,6 +29,7 @@
 #include <linux/init.h>
 #ifdef CONFIG_MCA
 #include <linux/mca.h>
+#include <linux/mca-legacy.h>
 #endif /* CONFIG_MCA */
 
 #include "eicon.h"
--- diff/drivers/isdn/i4l/isdn_ppp_ccp.c	2003-06-30 10:07:33.000000000 +0100
+++ source/drivers/isdn/i4l/isdn_ppp_ccp.c	2003-12-29 09:30:40.000000000 +0000
@@ -557,7 +557,7 @@
 }
 
 static LIST_HEAD(ipc_head);
-static spinlock_t ipc_head_lock;
+static spinlock_t ipc_head_lock = SPIN_LOCK_UNLOCKED;
 
 int
 ippp_ccp_set_compressor(struct ippp_ccp *ccp, int unit,
--- diff/drivers/md/Kconfig	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/md/Kconfig	2003-12-29 09:30:40.000000000 +0000
@@ -138,6 +138,7 @@
 config DM_IOCTL_V4
 	bool "ioctl interface version 4"
 	depends on BLK_DEV_DM
+	default y
 	---help---
 	  Recent tools use a new version of the ioctl interface, only
           select this option if you intend using such tools.
--- diff/drivers/md/dm-ioctl-v1.c	2003-09-30 15:46:14.000000000 +0100
+++ source/drivers/md/dm-ioctl-v1.c	2003-12-29 09:30:40.000000000 +0000
@@ -566,7 +566,7 @@
 	if (r)
 		return r;
 
-	r = dm_table_create(&t, get_mode(param));
+	r = dm_table_create(&t, get_mode(param), param->target_count);
 	if (r)
 		return r;
 
@@ -894,7 +894,7 @@
 	struct mapped_device *md;
 	struct dm_table *t;
 
-	r = dm_table_create(&t, get_mode(param));
+	r = dm_table_create(&t, get_mode(param), param->target_count);
 	if (r)
 		return r;
 
--- diff/drivers/md/dm-ioctl-v4.c	2003-09-30 15:46:14.000000000 +0100
+++ source/drivers/md/dm-ioctl-v4.c	2003-12-29 09:30:40.000000000 +0000
@@ -872,7 +872,7 @@
 	struct hash_cell *hc;
 	struct dm_table *t;
 
-	r = dm_table_create(&t, get_mode(param));
+	r = dm_table_create(&t, get_mode(param), param->target_count);
 	if (r)
 		return r;
 
--- diff/drivers/md/dm-table.c	2003-11-25 15:24:57.000000000 +0000
+++ source/drivers/md/dm-table.c	2003-12-29 09:30:40.000000000 +0000
@@ -12,6 +12,7 @@
 #include <linux/namei.h>
 #include <linux/ctype.h>
 #include <linux/slab.h>
+#include <linux/interrupt.h>
 #include <asm/atomic.h>
 
 #define MAX_DEPTH 16
@@ -202,7 +203,7 @@
 	return 0;
 }
 
-int dm_table_create(struct dm_table **result, int mode)
+int dm_table_create(struct dm_table **result, int mode, unsigned num_targets)
 {
 	struct dm_table *t = kmalloc(sizeof(*t), GFP_NOIO);
 
@@ -213,8 +214,12 @@
 	INIT_LIST_HEAD(&t->devices);
 	atomic_set(&t->holders, 1);
 
-	/* allocate a single nodes worth of targets to begin with */
-	if (alloc_targets(t, KEYS_PER_NODE)) {
+	if (!num_targets)
+		num_targets = KEYS_PER_NODE;
+
+	num_targets = dm_round_up(num_targets, KEYS_PER_NODE);
+
+	if (alloc_targets(t, num_targets)) {
 		kfree(t);
 		t = NULL;
 		return -ENOMEM;
@@ -626,6 +631,16 @@
 	return 0;
 }
 
+static void set_default_limits(struct io_restrictions *rs)
+{
+	rs->max_sectors = MAX_SECTORS;
+	rs->max_phys_segments = MAX_PHYS_SEGMENTS;
+	rs->max_hw_segments = MAX_HW_SEGMENTS;
+	rs->hardsect_size = 1 << SECTOR_SHIFT;
+	rs->max_segment_size = MAX_SEGMENT_SIZE;
+	rs->seg_boundary_mask = -1;
+}
+
 int dm_table_add_target(struct dm_table *t, const char *type,
 			sector_t start, sector_t len, char *params)
 {
@@ -638,6 +653,7 @@
 
 	tgt = t->targets + t->num_targets;
 	memset(tgt, 0, sizeof(*tgt));
+	set_default_limits(&tgt->limits);
 
 	tgt->type = dm_get_target_type(type);
 	if (!tgt->type) {
@@ -731,22 +747,28 @@
 	return r;
 }
 
-static spinlock_t _event_lock = SPIN_LOCK_UNLOCKED;
+static DECLARE_MUTEX(_event_lock);
 void dm_table_event_callback(struct dm_table *t,
 			     void (*fn)(void *), void *context)
 {
-	spin_lock_irq(&_event_lock);
+	down(&_event_lock);
 	t->event_fn = fn;
 	t->event_context = context;
-	spin_unlock_irq(&_event_lock);
+	up(&_event_lock);
 }
 
 void dm_table_event(struct dm_table *t)
 {
-	spin_lock(&_event_lock);
+	/*
+	 * You can no longer call dm_table_event() from interrupt
+	 * context, use a bottom half instead.
+	 */
+	BUG_ON(in_interrupt());
+
+	down(&_event_lock);
 	if (t->event_fn)
 		t->event_fn(t->event_context);
-	spin_unlock(&_event_lock);
+	up(&_event_lock);
 }
 
 sector_t dm_table_get_size(struct dm_table *t)
--- diff/drivers/md/dm.c	2003-09-30 15:46:14.000000000 +0100
+++ source/drivers/md/dm.c	2003-12-29 09:30:40.000000000 +0000
@@ -160,20 +160,16 @@
 /*
  * Block device functions
  */
-static int dm_blk_open(struct inode *inode, struct file *file)
+static int dm_blk_open(struct block_device *bdev, struct file *file)
 {
-	struct mapped_device *md;
-
-	md = inode->i_bdev->bd_disk->private_data;
+	struct mapped_device *md = bdev->bd_disk->private_data;
 	dm_get(md);
 	return 0;
 }
 
-static int dm_blk_close(struct inode *inode, struct file *file)
+static int dm_blk_close(struct gendisk *disk)
 {
-	struct mapped_device *md;
-
-	md = inode->i_bdev->bd_disk->private_data;
+	struct mapped_device *md = disk->private_data;
 	dm_put(md);
 	return 0;
 }
@@ -666,6 +662,20 @@
 	up_write(&md->lock);
 }
 
+static void __set_size(struct gendisk *disk, sector_t size)
+{
+	struct block_device *bdev;
+
+	set_capacity(disk, size);
+	bdev = bdget_disk(disk, 0);
+	if (bdev) {
+		down(&bdev->bd_inode->i_sem);
+		i_size_write(bdev->bd_inode, size << SECTOR_SHIFT);
+		up(&bdev->bd_inode->i_sem);
+		bdput(bdev);
+	}
+}
+
 static int __bind(struct mapped_device *md, struct dm_table *t)
 {
 	request_queue_t *q = md->queue;
@@ -673,7 +683,7 @@
 	md->map = t;
 
 	size = dm_table_get_size(t);
-	set_capacity(md->disk, size);
+	__set_size(md->disk, size);
 	if (size == 0)
 		return 0;
 
@@ -692,7 +702,6 @@
 	dm_table_event_callback(md->map, NULL, NULL);
 	dm_table_put(md->map);
 	md->map = NULL;
-	set_capacity(md->disk, 0);
 }
 
 /*
--- diff/drivers/md/dm.h	2003-08-20 14:16:09.000000000 +0100
+++ source/drivers/md/dm.h	2003-12-29 09:30:40.000000000 +0000
@@ -95,7 +95,7 @@
  * Functions for manipulating a table.  Tables are also reference
  * counted.
  *---------------------------------------------------------------*/
-int dm_table_create(struct dm_table **result, int mode);
+int dm_table_create(struct dm_table **result, int mode, unsigned num_targets);
 
 void dm_table_get(struct dm_table *t);
 void dm_table_put(struct dm_table *t);
--- diff/drivers/md/linear.c	2003-09-30 15:46:14.000000000 +0100
+++ source/drivers/md/linear.c	2003-12-29 09:30:40.000000000 +0000
@@ -113,8 +113,17 @@
 		}
 
 		disk->rdev = rdev;
+
 		blk_queue_stack_limits(mddev->queue,
 				       rdev->bdev->bd_disk->queue);
+		/* as we don't honour merge_bvec_fn, we must never risk
+		 * violating it, so limit ->max_sector to one PAGE, as
+		 * a one page request is never in violation.
+		 */
+		if (rdev->bdev->bd_disk->queue->merge_bvec_fn &&
+		    mddev->queue->max_sectors > (PAGE_SIZE>>9))
+			mddev->queue->max_sectors = (PAGE_SIZE>>9);
+
 		disk->size = rdev->size;
 		mddev->array_size += rdev->size;
 
--- diff/drivers/md/md.c	2003-09-30 15:46:14.000000000 +0100
+++ source/drivers/md/md.c	2003-12-29 09:30:40.000000000 +0000
@@ -2360,11 +2360,10 @@
 	return 1;
 }
 
-static int md_ioctl(struct inode *inode, struct file *file,
+static int md_ioctl(struct block_device *bdev, struct file *file,
 			unsigned int cmd, unsigned long arg)
 {
 	char b[BDEVNAME_SIZE];
-	unsigned int minor = iminor(inode);
 	int err = 0;
 	struct hd_geometry *loc = (struct hd_geometry *) arg;
 	mddev_t *mddev = NULL;
@@ -2372,11 +2371,6 @@
 	if (!capable(CAP_SYS_ADMIN))
 		return -EACCES;
 
-	if (minor >= MAX_MD_DEVS) {
-		MD_BUG();
-		return -EINVAL;
-	}
-
 	/*
 	 * Commands dealing with the RAID driver but not any
 	 * particular array:
@@ -2405,7 +2399,7 @@
 	 * Commands creating/starting a new array:
 	 */
 
-	mddev = inode->i_bdev->bd_inode->u.generic_ip;
+	mddev = bdev->bd_inode->u.generic_ip;
 
 	if (!mddev) {
 		BUG();
@@ -2527,7 +2521,7 @@
 						(short *) &loc->cylinders);
 			if (err)
 				goto abort_unlock;
-			err = put_user (get_start_sect(inode->i_bdev),
+			err = put_user (get_start_sect(bdev),
 						(long *) &loc->start);
 			goto done_unlock;
 	}
@@ -2605,12 +2599,12 @@
 	return err;
 }
 
-static int md_open(struct inode *inode, struct file *file)
+static int md_open(struct block_device *bdev, struct file *file)
 {
 	/*
 	 * Succeed if we can find or allocate a mddev structure.
 	 */
-	mddev_t *mddev = mddev_find(iminor(inode));
+	mddev_t *mddev = mddev_find(MINOR(bdev->bd_dev));
 	int err = -ENOMEM;
 
 	if (!mddev)
@@ -2621,16 +2615,16 @@
 
 	err = 0;
 	mddev_unlock(mddev);
-	inode->i_bdev->bd_inode->u.generic_ip = mddev_get(mddev);
+	bdev->bd_inode->u.generic_ip = mddev_get(mddev);
  put:
 	mddev_put(mddev);
  out:
 	return err;
 }
 
-static int md_release(struct inode *inode, struct file * file)
+static int md_release(struct gendisk *disk)
 {
- 	mddev_t *mddev = inode->i_bdev->bd_inode->u.generic_ip;
+ 	mddev_t *mddev = disk->private_data;
 
 	if (!mddev)
 		BUG();
--- diff/drivers/md/multipath.c	2003-09-30 15:46:14.000000000 +0100
+++ source/drivers/md/multipath.c	2003-12-29 09:30:40.000000000 +0000
@@ -273,6 +273,17 @@
 			p->rdev = rdev;
 			blk_queue_stack_limits(mddev->queue,
 					       rdev->bdev->bd_disk->queue);
+
+		/* as we don't honour merge_bvec_fn, we must never risk
+		 * violating it, so limit ->max_sector to one PAGE, as
+		 * a one page request is never in violation.
+		 * (Note: it is very unlikely that a device with
+		 * merge_bvec_fn will be involved in multipath.)
+		 */
+			if (rdev->bdev->bd_disk->queue->merge_bvec_fn &&
+			    mddev->queue->max_sectors > (PAGE_SIZE>>9))
+				mddev->queue->max_sectors = (PAGE_SIZE>>9);
+
 			conf->working_disks++;
 			rdev->raid_disk = path;
 			rdev->in_sync = 1;
@@ -410,8 +421,16 @@
 
 		disk = conf->multipaths + disk_idx;
 		disk->rdev = rdev;
+
 		blk_queue_stack_limits(mddev->queue,
 				       rdev->bdev->bd_disk->queue);
+		/* as we don't honour merge_bvec_fn, we must never risk
+		 * violating it, not that we ever expect a device with
+		 * a merge_bvec_fn to be involved in multipath */
+		if (rdev->bdev->bd_disk->queue->merge_bvec_fn &&
+		    mddev->queue->max_sectors > (PAGE_SIZE>>9))
+			mddev->queue->max_sectors = (PAGE_SIZE>>9);
+
 		if (!rdev->faulty) 
 			conf->working_disks++;
 	}
--- diff/drivers/md/raid0.c	2003-10-27 09:20:43.000000000 +0000
+++ source/drivers/md/raid0.c	2003-12-29 09:30:40.000000000 +0000
@@ -112,8 +112,18 @@
 			goto abort;
 		}
 		zone->dev[j] = rdev1;
+
 		blk_queue_stack_limits(mddev->queue,
 				       rdev1->bdev->bd_disk->queue);
+		/* as we don't honour merge_bvec_fn, we must never risk
+		 * violating it, so limit ->max_sector to one PAGE, as
+		 * a one page request is never in violation.
+		 */
+
+		if (rdev1->bdev->bd_disk->queue->merge_bvec_fn &&
+		    mddev->queue->max_sectors > (PAGE_SIZE>>9))
+			mddev->queue->max_sectors = (PAGE_SIZE>>9);
+
 		if (!smallest || (rdev1->size <smallest->size))
 			smallest = rdev1;
 		cnt++;
@@ -301,6 +311,22 @@
 		conf->hash_spacing++;
 	}
 
+	/* calculate the max read-ahead size.
+	 * For read-ahead of large files to be effective, we need to
+	 * readahead at least a whole stripe. i.e. number of devices
+	 * multiplied by chunk size.
+	 * If an individual device has an ra_pages greater than the
+	 * chunk size, then we will not drive that device as hard as it
+	 * wants.  We consider this a configuration error: a larger
+	 * chunksize should be used in that case.
+	 */
+	{
+		int stripe = mddev->raid_disks * mddev->chunk_size / PAGE_CACHE_SIZE;
+		if (mddev->queue->backing_dev_info.ra_pages < stripe)
+			mddev->queue->backing_dev_info.ra_pages = stripe;
+	}
+
+
 	blk_queue_merge_bvec(mddev->queue, raid0_mergeable_bvec);
 	return 0;
 
--- diff/drivers/md/raid1.c	2003-11-25 15:24:57.000000000 +0000
+++ source/drivers/md/raid1.c	2003-12-29 09:30:40.000000000 +0000
@@ -677,8 +677,17 @@
 	for (mirror=0; mirror < mddev->raid_disks; mirror++)
 		if ( !(p=conf->mirrors+mirror)->rdev) {
 			p->rdev = rdev;
+
 			blk_queue_stack_limits(mddev->queue,
 					       rdev->bdev->bd_disk->queue);
+			/* as we don't honour merge_bvec_fn, we must never risk
+			 * violating it, so limit ->max_sector to one PAGE, as
+			 * a one page request is never in violation.
+			 */
+			if (rdev->bdev->bd_disk->queue->merge_bvec_fn &&
+			    mddev->queue->max_sectors > (PAGE_SIZE>>9))
+				mddev->queue->max_sectors = (PAGE_SIZE>>9);
+
 			p->head_position = 0;
 			rdev->raid_disk = mirror;
 			found = 1;
@@ -1077,8 +1086,17 @@
 		disk = conf->mirrors + disk_idx;
 
 		disk->rdev = rdev;
+
 		blk_queue_stack_limits(mddev->queue,
 				       rdev->bdev->bd_disk->queue);
+		/* as we don't honour merge_bvec_fn, we must never risk
+		 * violating it, so limit ->max_sector to one PAGE, as
+		 * a one page request is never in violation.
+		 */
+		if (rdev->bdev->bd_disk->queue->merge_bvec_fn &&
+		    mddev->queue->max_sectors > (PAGE_SIZE>>9))
+			mddev->queue->max_sectors = (PAGE_SIZE>>9);
+
 		disk->head_position = 0;
 		if (!rdev->faulty && rdev->in_sync)
 			conf->working_disks++;
--- diff/drivers/md/raid5.c	2003-12-19 09:51:11.000000000 +0000
+++ source/drivers/md/raid5.c	2003-12-29 09:30:40.000000000 +0000
@@ -1587,6 +1587,16 @@
 
 	print_raid5_conf(conf);
 
+	/* read-ahead size must cover a whole stripe, which is
+	 * (n-1) * chunksize where 'n' is the number of raid devices
+	 */
+	{
+		int stripe = (mddev->raid_disks-1) * mddev->chunk_size
+			/ PAGE_CACHE_SIZE;
+		if (mddev->queue->backing_dev_info.ra_pages < stripe)
+			mddev->queue->backing_dev_info.ra_pages = stripe;
+	}
+
 	/* Ok, everything is just fine now */
 	mddev->array_size =  mddev->size * (mddev->raid_disks - 1);
 	return 0;
--- diff/drivers/media/common/saa7146_core.c	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/media/common/saa7146_core.c	2003-12-29 09:30:40.000000000 +0000
@@ -45,10 +45,65 @@
 #endif
 
 /****************************************************************************
+ * gpio and debi helper functions
+ ****************************************************************************/
+
+/* write "data" to the gpio-pin "pin" */
+void saa7146_set_gpio(struct saa7146_dev *dev, u8 pin, u8 data)
+{
+	u32 value = 0;
+
+	/* sanity check */
+	if(pin > 3)
+		return;
+
+	/* read old register contents */
+	value = saa7146_read(dev, GPIO_CTRL );
+	
+	value &= ~(0xff << (8*pin));
+	value |= (data << (8*pin));
+
+	saa7146_write(dev, GPIO_CTRL, value);
+}
+
+/* This DEBI code is based on the saa7146 Stradis driver by Nathan Laredo */
+int saa7146_wait_for_debi_done(struct saa7146_dev *dev)
+{
+	int start;
+
+	/* wait for registers to be programmed */
+	start = jiffies;
+	while (1) {
+                if (saa7146_read(dev, MC2) & 2)
+                        break;
+		if (jiffies-start > HZ/20) {
+			DEB_S(("timed out while waiting for registers getting programmed\n"));
+			return -ETIMEDOUT;
+		}
+	}
+
+	/* wait for transfer to complete */
+	start = jiffies;
+	while (1) {
+		if (!(saa7146_read(dev, PSR) & SPCI_DEBI_S))
+			break;
+		saa7146_read(dev, MC2);
+		if (jiffies-start > HZ/4) {
+			DEB_S(("timed out while waiting for transfer completion\n"));
+			return -ETIMEDOUT;
+		}
+	}
+
+	return 0;
+}
+
+/****************************************************************************
  * general helper functions
  ****************************************************************************/
 
-/* this is videobuf_vmalloc_to_sg() from video-buf.c */
+/* this is videobuf_vmalloc_to_sg() from video-buf.c 
+   make sure virt has been allocated with vmalloc_32(), otherwise the BUG()
+   may be triggered on highmem machines */
 static struct scatterlist* vmalloc_to_sg(unsigned char *virt, int nr_pages)
 {
 	struct scatterlist *sglist;
@@ -84,7 +139,7 @@
 {
 	struct scatterlist *slist = NULL;
 	int pages = (length+PAGE_SIZE-1)/PAGE_SIZE;
-	char *mem = vmalloc(length);
+	char *mem = vmalloc_32(length);
 	int slen = 0;
 
 	if (NULL == mem) {
@@ -103,7 +158,9 @@
 	}
 	
 	slen = pci_map_sg(pci,slist,pages,PCI_DMA_FROMDEVICE);
-	saa7146_pgtable_build_single(pci, pt, slist, slen);
+	if (0 != saa7146_pgtable_build_single(pci, pt, slist, slen)) {
+		return NULL;
+	}
 
 	/* fixme: here's a memory leak: slist never gets freed by any other
 	   function ...*/
@@ -139,7 +196,7 @@
 	return 0;
 }
 
-void saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt,
+int saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt,
 	struct scatterlist *list, int sglen  )
 {
 	u32   *ptr, fill;
@@ -148,6 +205,11 @@
 
 	BUG_ON( 0 == sglen);
 
+	if (list->offset > PAGE_SIZE) {
+		DEB_D(("offset > PAGE_SIZE. this should not happen."));
+		return -EINVAL;
+	}
+	
 	/* if we have a user buffer, the first page may not be
 	   aligned to a page boundary. */
 	pt->offset = list->offset;
@@ -177,6 +239,7 @@
 		printk("ptr1 %d: 0x%08x\n",i,ptr[i]);
 	}
 */
+	return 0;
 }
 
 /********************************************************************************/
@@ -322,7 +385,7 @@
 	saa7146_write(dev, MC1, MASK_31);
 */
 
-	/* disable alle irqs */
+	/* disable all irqs */
 	saa7146_write(dev, IER, 0);
 
 	/* shut down all dma transfers */
@@ -381,8 +444,8 @@
 	dev->module = THIS_MODULE;
 	init_waitqueue_head(&dev->i2c_wq);
 
-	/* set some default values */
-	saa7146_write(dev, BCS_CTRL, 0x80400040);
+	/* set some sane pci arbitrition values */
+	saa7146_write(dev, PCI_BT_V1, 0x1c00101f); 
 
 	if( 0 != ext->probe) {
 		if( 0 != ext->probe(dev) ) {
@@ -508,6 +571,7 @@
 EXPORT_SYMBOL_GPL(saa7146_pgtable_free);
 EXPORT_SYMBOL_GPL(saa7146_pgtable_build_single);
 EXPORT_SYMBOL_GPL(saa7146_vmalloc_build_pgtable);
+EXPORT_SYMBOL_GPL(saa7146_wait_for_debi_done);
 
 EXPORT_SYMBOL_GPL(saa7146_setgpio);
 
--- diff/drivers/media/common/saa7146_fops.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/media/common/saa7146_fops.c	2003-12-29 09:30:40.000000000 +0000
@@ -86,7 +86,7 @@
 		return;
 	}
 
-	DEB_EE(("dev:%p, dmaq:%p, vbi:%d\n", dev, q, vbi));
+	DEB_INT(("dev:%p, dmaq:%p, vbi:%d\n", dev, q, vbi));
 
 #if DEBUG_SPINLOCKS
 	BUG_ON(!spin_is_locked(&dev->slock));
@@ -98,10 +98,10 @@
 		if (!list_empty(&q->queue))
 			next = list_entry(q->queue.next,struct saa7146_buf, vb.queue);
 		q->curr = buf;
-		DEB_D(("next buffer: buf:%p, prev:%p, next:%p\n", buf, q->queue.prev,q->queue.next));
+		DEB_INT(("next buffer: buf:%p, prev:%p, next:%p\n", buf, q->queue.prev,q->queue.next));
 		buf->activate(dev,buf,next);
 	} else {
-		DEB_D(("no next buffer. stopping.\n"));
+		DEB_INT(("no next buffer. stopping.\n"));
 		if( 0 != vbi ) {
 			/* turn off video-dma3 */
 			saa7146_write(dev,MC1, MASK_20);
@@ -229,10 +229,10 @@
 
 	if( fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
 		DEB_S(("initializing vbi...\n"));
-		saa7146_vbi_uops.open(dev,fh);
+		saa7146_vbi_uops.open(dev,file);
 	} else {
 		DEB_S(("initializing video...\n"));
-		saa7146_video_uops.open(dev,fh);
+		saa7146_video_uops.open(dev,file);
 	}
 
 	result = 0;
@@ -255,9 +255,9 @@
 		return -ERESTARTSYS;
 
 	if( fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
-		saa7146_vbi_uops.release(dev,fh,file);
+		saa7146_vbi_uops.release(dev,file);
 	} else {
-		saa7146_video_uops.release(dev,fh,file);
+		saa7146_video_uops.release(dev,file);
 	}
 
 	module_put(dev->ext->module);
@@ -372,7 +372,7 @@
 {
 	u32 isr = status;
 	
-	DEB_EE(("dev:%p, isr:0x%08x\n",dev,(u32)status));
+	DEB_INT(("dev:%p, isr:0x%08x\n",dev,(u32)status));
 
 	if (0 != (isr & (MASK_27))) {
 		DEB_INT(("irq: RPS0 (0x%08x).\n",isr));
@@ -410,6 +410,12 @@
 
 	DEB_EE(("dev:%p\n",dev));
 	
+	/* set default values for video parts of the saa7146 */
+	saa7146_write(dev, BCS_CTRL, 0x80400040);
+
+	/* enable video-port pins */
+	saa7146_write(dev, MC1, (MASK_10 | MASK_26));
+
 	/* save per-device extension data (one extension can
 	   handle different devices that might need different
 	   configuration data) */
--- diff/drivers/media/common/saa7146_hlp.c	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/media/common/saa7146_hlp.c	2003-12-29 09:30:40.000000000 +0000
@@ -660,24 +660,6 @@
 	vv->current_hps_sync = sync;
 } 
 
-/* write "data" to the gpio-pin "pin" */
-void saa7146_set_gpio(struct saa7146_dev *dev, u8 pin, u8 data)
-{
-	u32 value = 0;
-
-	/* sanity check */
-	if(pin > 3)
-		return;
-
-	/* read old register contents */
-	value = saa7146_read(dev, GPIO_CTRL );
-	
-	value &= ~(0xff << (8*pin));
-	value |= (data << (8*pin));
-
-	saa7146_write(dev, GPIO_CTRL, value);
-}
-
 /* reprogram hps, enable(1) / disable(0) video */
 void saa7146_set_overlay(struct saa7146_dev *dev, struct saa7146_fh *fh, int v)
 {
@@ -710,13 +692,15 @@
 	/* calculate starting address */
 	where  = (which-1)*0x18;
 
+/*
 	if( 0 != (dev->ext_vv_data->flags & SAA7146_EXT_SWAP_ODD_EVEN)) {
 		saa7146_write(dev, where, 	vdma->base_even);
 		saa7146_write(dev, where+0x04, 	vdma->base_odd);
 	} else {
+*/
 		saa7146_write(dev, where, 	vdma->base_odd);
 		saa7146_write(dev, where+0x04, 	vdma->base_even);
-	}
+//	}
 	saa7146_write(dev, where+0x08, 	vdma->prot_addr);
 	saa7146_write(dev, where+0x0c, 	vdma->pitch);
 	saa7146_write(dev, where+0x10, 	vdma->base_page);
@@ -971,12 +955,13 @@
 	unsigned long e_wait = vv->current_hps_sync == SAA7146_HPS_SYNC_PORT_A ? CMD_E_FID_A : CMD_E_FID_B;
 	unsigned long o_wait = vv->current_hps_sync == SAA7146_HPS_SYNC_PORT_A ? CMD_O_FID_A : CMD_O_FID_B;
 
+/*
 	if( 0 != (dev->ext_vv_data->flags & SAA7146_EXT_SWAP_ODD_EVEN)) {
 		unsigned long tmp = e_wait;
 		e_wait = o_wait;
 		o_wait = tmp;
 	}
-
+*/
 	/* wait for o_fid_a/b / e_fid_a/b toggle only if rps register 0 is not set*/
 	WRITE_RPS0(CMD_PAUSE | CMD_OAN | CMD_SIG0 | o_wait);
 	WRITE_RPS0(CMD_PAUSE | CMD_OAN | CMD_SIG0 | e_wait);
--- diff/drivers/media/common/saa7146_i2c.c	2003-10-27 09:20:43.000000000 +0000
+++ source/drivers/media/common/saa7146_i2c.c	2003-12-29 09:30:40.000000000 +0000
@@ -186,7 +186,7 @@
 {
 	u32 status = 0, mc2 = 0;
 	int trial = 0;
-	int timeout;
+	unsigned long timeout;
 
 	/* write out i2c-command */
 	DEB_I2C(("before: 0x%08x (status: 0x%08x), %d\n",*dword,saa7146_read(dev, I2C_STATUS), dev->i2c_op));
@@ -218,7 +218,7 @@
 			if( 0 != mc2 ) {
 				break;
 			}
-			if (jiffies > timeout) {
+			if (time_after(jiffies,timeout)) {
 				printk(KERN_WARNING "saa7146_i2c_writeout: timed out waiting for MC2\n");
 				return -EIO;
 			}
@@ -233,7 +233,7 @@
 			status = saa7146_i2c_status(dev);
 			if ((status & 0x3) != 1)
 				break;
-			if (jiffies > timeout) {
+			if (time_after(jiffies,timeout)) {
 				/* this is normal when probing the bus
 				 * (no answer from nonexisistant device...)
 				 */
@@ -301,7 +301,8 @@
 		goto out;
 	}
 
-        if (count > 3) short_delay = 1;
+	if ( count > 3 || 0 != (SAA7146_I2C_SHORT_DELAY & dev->ext->flags) )
+		short_delay = 1;
   
 	do {
 		/* reset the i2c-device if necessary */
@@ -403,19 +404,29 @@
 {
 	DEB_EE(("bitrate: 0x%08x\n",bitrate));
 	
+	/* enable i2c-port pins */
+	saa7146_write(dev, MC1, (MASK_08 | MASK_24));
+
 	dev->i2c_bitrate = bitrate;
 	saa7146_i2c_reset(dev);
 
 	if( NULL != i2c_adapter ) {
 		memset(i2c_adapter,0,sizeof(struct i2c_adapter));
 		strcpy(i2c_adapter->name, dev->name);	
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+		i2c_adapter->data = dev;
+#else
 		i2c_set_adapdata(i2c_adapter,dev);
-		i2c_adapter->class	   = I2C_ADAP_CLASS_TV_ANALOG;
+#endif
 		i2c_adapter->algo	   = &saa7146_algo;
 		i2c_adapter->algo_data     = NULL;
 		i2c_adapter->id 	   = I2C_ALGO_SAA7146;
 		i2c_adapter->timeout = SAA7146_I2C_TIMEOUT;
 		i2c_adapter->retries = SAA7146_I2C_RETRIES;
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+#else
+		i2c_adapter->class = I2C_ADAP_CLASS_TV_ANALOG;
+#endif
 	}
 	
 	return 0;
--- diff/drivers/media/common/saa7146_vbi.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/media/common/saa7146_vbi.c	2003-12-29 09:30:40.000000000 +0000
@@ -41,7 +41,11 @@
 	/* wait for vbi_a or vbi_b*/
 	if ( 0 != (SAA7146_USE_PORT_B_FOR_VBI & dev->ext_vv_data->flags)) {
 		DEB_D(("...using port b\n"));
+		WRITE_RPS1(CMD_PAUSE | CMD_OAN | CMD_SIG1 | CMD_E_FID_B);
+		WRITE_RPS1(CMD_PAUSE | CMD_OAN | CMD_SIG1 | CMD_O_FID_B);
+/*
 		WRITE_RPS1(CMD_PAUSE | MASK_09);
+*/
 	} else {
 		DEB_D(("...using port a\n"));
 		WRITE_RPS1(CMD_PAUSE | MASK_10);
@@ -137,10 +141,10 @@
 	unsigned long o_wait = vv->current_hps_sync == SAA7146_HPS_SYNC_PORT_A ? CMD_O_FID_A : CMD_O_FID_B;
 
 /*
-	vdma3.base_even	= (u32)dev->ov_fb.base+2048*70;
-	vdma3.base_odd	= (u32)dev->ov_fb.base;
-	vdma3.prot_addr	= (u32)dev->ov_fb.base+2048*164;
-	vdma3.pitch	= 2048;
+	vdma3.base_even	= 0xc8000000+2560*70;
+	vdma3.base_odd	= 0xc8000000;
+	vdma3.prot_addr	= 0xc8000000+2560*164;
+	vdma3.pitch	= 2560;
 	vdma3.base_page	= 0;
 	vdma3.num_line_byte = (64<<16)|((vbi_pixel_to_capture)<<0); // set above!
 */
@@ -244,7 +248,9 @@
 		err = videobuf_iolock(dev->pci,&buf->vb,NULL);
 		if (err)
 			goto oops;
-		saa7146_pgtable_build_single(dev->pci, &buf->pt[2], buf->vb.dma.sglist, buf->vb.dma.sglen);
+		err = saa7146_pgtable_build_single(dev->pci, &buf->pt[2], buf->vb.dma.sglist, buf->vb.dma.sglen);
+		if (0 != err)
+			return err;
 	}
 	buf->vb.state = STATE_PREPARED;
 	buf->activate = buffer_activate;
@@ -303,7 +309,7 @@
 
 /* ------------------------------------------------------------------ */
 
-static void vbi_stop(struct saa7146_fh *fh)
+static void vbi_stop(struct saa7146_fh *fh, struct file *file)
 {
 	struct saa7146_dev *dev = fh->dev;
 	struct saa7146_vv *vv = dev->vv_data;
@@ -321,23 +327,29 @@
 	/* shut down dma 3 transfers */
 	saa7146_write(dev, MC1, MASK_20);
 
+	if (vv->vbi_q.curr) {
+		saa7146_buffer_finish(dev,&vv->vbi_q,STATE_DONE);
+	}
+
+	videobuf_queue_cancel(file,&fh->vbi_q);
+
 	vv->vbi_streaming = NULL;
 
 	del_timer(&vv->vbi_q.timeout);
 	del_timer(&fh->vbi_read_timeout);
 
-	DEB_VBI(("out\n"));
 	spin_unlock_irqrestore(&dev->slock, flags);
 }
 
 static void vbi_read_timeout(unsigned long data)
 {
-	struct saa7146_fh *fh = (struct saa7146_fh *)data;
+	struct file *file = (struct file*)data;
+	struct saa7146_fh *fh = file->private_data;
 	struct saa7146_dev *dev = fh->dev;
 	
 	DEB_VBI(("dev:%p, fh:%p\n",dev, fh));
 
-	vbi_stop(fh);
+	vbi_stop(fh, file);
 }
 
 static void vbi_init(struct saa7146_dev *dev, struct saa7146_vv *vv)
@@ -354,10 +366,21 @@
 	init_waitqueue_head(&vv->vbi_wq);
 }
 
-static void vbi_open(struct saa7146_dev *dev, struct saa7146_fh *fh)
+static void vbi_open(struct saa7146_dev *dev, struct file *file)
 {
+	struct saa7146_fh *fh = (struct saa7146_fh *)file->private_data;
+	
+	u32 arbtr_ctrl	= saa7146_read(dev, PCI_BT_V1);
+	int ret = 0;
+	
 	DEB_VBI(("dev:%p, fh:%p\n",dev,fh));
 
+	/* adjust arbitrition control for video dma 3 */
+	arbtr_ctrl &= ~0x1f0000;
+	arbtr_ctrl |=  0x1d0000;
+	saa7146_write(dev, PCI_BT_V1, arbtr_ctrl);
+	saa7146_write(dev, MC2, (MASK_04|MASK_20));		
+	
 	memset(&fh->vbi_fmt,0,sizeof(fh->vbi_fmt));
 
 	fh->vbi_fmt.sampling_rate	= 27000000;
@@ -380,21 +403,32 @@
 
 	init_timer(&fh->vbi_read_timeout);
 	fh->vbi_read_timeout.function = vbi_read_timeout;
-	fh->vbi_read_timeout.data = (unsigned long)fh;
+	fh->vbi_read_timeout.data = (unsigned long)file;
 
-	/* fixme: enable this again, if the dvb-c w/ analog module work properly */
-/*
-	vbi_workaround(dev);
-*/
+	/* initialize the brs */
+	if ( 0 != (SAA7146_USE_PORT_B_FOR_VBI & dev->ext_vv_data->flags)) {
+		saa7146_write(dev, BRS_CTRL, MASK_30|MASK_29 | (7 << 19));
+	} else {
+		saa7146_write(dev, BRS_CTRL, 0x00000001);
+
+		if (0 != (ret = vbi_workaround(dev))) {
+			DEB_VBI(("vbi workaround failed!\n"));
+			/* return ret;*/
+		}
+	}
+
+	/* upload brs register */
+	saa7146_write(dev, MC2, (MASK_08|MASK_24));		
 }
 
-static void vbi_close(struct saa7146_dev *dev, struct saa7146_fh *fh, struct file *file)
+static void vbi_close(struct saa7146_dev *dev, struct file *file)
 {
+	struct saa7146_fh *fh = (struct saa7146_fh *)file->private_data;
 	struct saa7146_vv *vv = dev->vv_data;
 	DEB_VBI(("dev:%p, fh:%p\n",dev,fh));
 
 	if( fh == vv->vbi_streaming ) {
-		vbi_stop(fh);
+		vbi_stop(fh, file);
 	}
 }
 
--- diff/drivers/media/common/saa7146_video.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/media/common/saa7146_video.c	2003-12-29 09:30:40.000000000 +0000
@@ -116,7 +116,7 @@
 		DEB_D(("no fb fmt set.\n"));
 		return -EINVAL;
 	}
-	if (win->w.width < 64 || win->w.height <  64) {
+	if (win->w.width < 48 || win->w.height <  32) {
 		DEB_D(("min width/height. (%d,%d)\n",win->w.width,win->w.height));
 		return -EINVAL;
 	}
@@ -661,7 +661,7 @@
 */				
 	} else {
 		struct saa7146_pgtable *pt = &buf->pt[0];
-		saa7146_pgtable_build_single(pci, pt, list, length);
+		return saa7146_pgtable_build_single(pci, pt, list, length);
 	}
 
 	return 0;
@@ -704,7 +704,7 @@
 	return 0;
 }
 
-static int video_end(struct saa7146_fh *fh)
+static int video_end(struct saa7146_fh *fh, struct file *file)
 {
 	struct saa7146_dev *dev = fh->dev;
 	struct saa7146_vv *vv = dev->vv_data;
@@ -735,82 +735,9 @@
 	saa7146_write(dev, MC1, 0x00700000);
 
 	vv->streaming = NULL;
-	spin_unlock_irqrestore(&dev->slock, flags);
-	
-	return 0;
-}
-
-/* capturing to framebuffer */
-
-int overlay_reqbufs(struct saa7146_dev *dev, struct v4l2_requestbuffers *req)
-{
-/*	struct saa7146_fh *fh = file->private_data;
-
-	if (req->count > VIDEO_MAX_FRAME)
-		req->count = VIDEO_MAX_FRAME;
-
-	*size = fh->video_fmt.sizeimage;
-
-*/
-	return 0;
-}
-int overlay_querybuf(struct saa7146_dev *dev, struct v4l2_buffer *buf)
-{
-	return 0;
-}
-int overlay_qbuf(struct saa7146_dev *dev, struct v4l2_buffer *b)
-{
-/*	if (b->index < 0 || b->index >= VIDEO_MAX_FRAME) {
-		DEB_D(("index %d out of bounds.\n",b->index));
-		goto -EINVAL;
-	}
-	
-	buf = q->bufs[b->index];
-	if (NULL == buf) {
-		printk("videobuf_qbuf: NULL == buf\n");
-		goto done;
-	}
-	if (0 == buf->baddr) {
-		printk("videobuf_qbuf: 0 == buf->baddr\n");
-		goto done;
-	}
-	if (buf->state == STATE_QUEUED ||
-	    buf->state == STATE_ACTIVE) {
-		printk("videobuf_qbuf: already queued or activated.\n");
-		goto done;
-	}
 
-	field = videobuf_next_field(q);
-	retval = q->ops->buf_prepare(file,buf,field);
-	if (0 != retval) {
-		printk("videobuf_qbuf: buf_prepare() failed.\n");
-		goto done;
-	}
-	
-	list_add_tail(&buf->stream,&q->stream);
-	if (q->streaming) {
-		spin_lock_irqsave(q->irqlock,flags);
-		q->ops->buf_queue(file,buf);
-		spin_unlock_irqrestore(q->irqlock,flags);
-	}
-	retval = 0;
+	spin_unlock_irqrestore(&dev->slock, flags);
 	
- done:
-	up(&q->lock);
-	return retval;
-*/
-	return 0;
-}
-int overlay_dqbuf(struct saa7146_dev *dev, struct v4l2_buffer *buf)
-{
-	return 0;
-}
-int overlay_streamon(struct saa7146_dev *dev)
-{
-	return 0;
-}
-int overlay_streamoff(struct saa7146_dev *dev)
-{
 	return 0;
 }
 
@@ -818,7 +745,7 @@
 /*
  * This function is _not_ called directly, but from
  * video_generic_ioctl (and maybe others).  userspace
- * copying is done already, arg is a kernel fhinter.
+ * copying is done already, arg is a kernel pointer.
  */
 
 int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int cmd, void *arg)
@@ -1141,38 +1068,24 @@
 	case VIDIOC_REQBUFS: {
 		struct v4l2_requestbuffers *req = arg;
 		DEB_D(("VIDIOC_REQBUFS, type:%d\n",req->type));
-/*
-		if( req->type == V4L2_BUF_TYPE_VIDEO_OVERLAY ) {
-			return overlay_reqbufs(dev,req);
-		} 
-*/
 		return videobuf_reqbufs(file,q,req);
 	}
 	case VIDIOC_QUERYBUF: {
 		struct v4l2_buffer *buf = arg;
 		DEB_D(("VIDIOC_QUERYBUF, type:%d, offset:%d\n",buf->type,buf->m.offset));
-/* 		if( buf->type == V4L2_BUF_TYPE_VIDEO_OVERLAY ) {
-			return overlay_querybuf(dev,buf);
-		} 
- */		return videobuf_querybuf(q,buf);
+		return videobuf_querybuf(q,buf);
 	}
 	case VIDIOC_QBUF: {
 		struct v4l2_buffer *buf = arg;
 		int ret = 0;
-/* 		if( buf->type == V4L2_BUF_TYPE_VIDEO_OVERLAY ) {
-			return overlay_qbuf(dev,buf);
-		} 
- */		ret = videobuf_qbuf(file,q,buf);
+		ret = videobuf_qbuf(file,q,buf);
 		DEB_D(("VIDIOC_QBUF: ret:%d, index:%d\n",ret,buf->index));
 		return ret;
 	}
 	case VIDIOC_DQBUF: {
 		struct v4l2_buffer *buf = arg;
 		int ret = 0;
-/* 		if( buf->type == V4L2_BUF_TYPE_VIDEO_OVERLAY ) {
-			return overlay_dqbuf(dev,buf);
-		} 
- */		ret = videobuf_dqbuf(file,q,buf);
+		ret = videobuf_dqbuf(file,q,buf);
 		DEB_D(("VIDIOC_DQBUF: ret:%d, index:%d\n",ret,buf->index));
 		return ret;
 	}
@@ -1180,29 +1093,18 @@
 		int *type = arg;
 		DEB_D(("VIDIOC_STREAMON, type:%d\n",*type));
 
-		if( 0 != ops->capture_begin ) {
-			if( 0 != (err = ops->capture_begin(fh))) {
+		if( 0 != (err = video_begin(fh))) {
 				return err;
 			}
-		}
-/* 		if( *type == V4L2_BUF_TYPE_VIDEO_OVERLAY ) {
-			err = overlay_streamon(dev);
-		} else { */
 		err = videobuf_streamon(file,q);
-/* 		} */
 		return err;
 	}
 	case VIDIOC_STREAMOFF: {
 		int *type = arg;
 
 		DEB_D(("VIDIOC_STREAMOFF, type:%d\n",*type));
-		if( 0 != ops->capture_end ) {
-			ops->capture_end(fh);
-		}
-/* 		if( *type == V4L2_BUF_TYPE_VIDEO_OVERLAY ) {
-			return overlay_streamoff(dev);
-		} 
- */		err = videobuf_streamoff(file,q);
+		err = videobuf_streamoff(file,q);
+		video_end(fh, file);
 		return err;
 	}
 	case VIDIOCGMBUF:
@@ -1267,8 +1169,8 @@
 	DEB_CAP(("vbuf:%p\n",vb));
 
 	/* sanity checks */
-	if (fh->video_fmt.width  < 64 ||
-	    fh->video_fmt.height < 64 ||
+	if (fh->video_fmt.width  < 48 ||
+	    fh->video_fmt.height < 32 ||
 	    fh->video_fmt.width  > vv->standard->h_max_out ||
 	    fh->video_fmt.height > vv->standard->v_max_out) {
 		DEB_D(("w (%d) / h (%d) out of bounds.\n",fh->video_fmt.width,fh->video_fmt.height));
@@ -1407,8 +1309,9 @@
 }
 
 
-static void video_open(struct saa7146_dev *dev, struct saa7146_fh *fh)
+static void video_open(struct saa7146_dev *dev, struct file *file)
 {
+	struct saa7146_fh *fh = (struct saa7146_fh *)file->private_data;
 	struct saa7146_format *sfmt;
 
 	fh->video_fmt.width = 384;
@@ -1429,8 +1332,9 @@
 }
 
 
-static void video_close(struct saa7146_dev *dev, struct saa7146_fh *fh, struct file *file)
+static void video_close(struct saa7146_dev *dev, struct file *file)
 {
+	struct saa7146_fh *fh = (struct saa7146_fh *)file->private_data;
 	struct saa7146_vv *vv = dev->vv_data;
 	unsigned long flags;
 	
@@ -1443,10 +1347,8 @@
 	}
 	
 	if( fh == vv->streaming ) {
-		video_end(fh);		
+		video_end(fh, file);		
 	}
-
-	videobuf_queue_cancel(file,&fh->video_q);
 }
 
 
@@ -1489,7 +1391,7 @@
 		return -EAGAIN;
 	}
 	ret = videobuf_read_one(file,&fh->video_q , data, count, ppos);
-	video_end(fh);
+	video_end(fh, file);
 
 	/* restart overlay if it was active before */
 	if( 0 != restart_overlay ) {
@@ -1505,6 +1407,4 @@
 	.release = video_close,
 	.irq_done = video_irq_done,
 	.read = video_read,
-	.capture_begin = video_begin,
-	.capture_end = video_end,
 };
--- diff/drivers/media/dvb/Kconfig	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/media/dvb/Kconfig	2003-12-29 09:30:40.000000000 +0000
@@ -45,5 +45,9 @@
 	depends on DVB_CORE && PCI
 source "drivers/media/dvb/b2c2/Kconfig"
 
+comment "Supported BT878 Adapters"
+	depends on DVB_CORE && PCI
+source "drivers/media/dvb/bt8xx/Kconfig"
+
 endmenu
 
--- diff/drivers/media/dvb/Makefile	2003-08-20 14:16:09.000000000 +0100
+++ source/drivers/media/dvb/Makefile	2003-12-29 09:30:40.000000000 +0000
@@ -2,5 +2,5 @@
 # Makefile for the kernel multimedia device drivers.
 #
 
-obj-y        := dvb-core/ frontends/ ttpci/ ttusb-dec/ ttusb-budget/ b2c2/
+obj-y        := dvb-core/ frontends/ ttpci/ ttusb-dec/ ttusb-budget/ b2c2/ bt8xx/
 
--- diff/drivers/media/dvb/b2c2/skystar2.c	2003-08-20 14:16:28.000000000 +0100
+++ source/drivers/media/dvb/b2c2/skystar2.c	2003-12-29 09:30:40.000000000 +0000
@@ -2,7 +2,19 @@
  * skystar2.c - driver for the Technisat SkyStar2 PCI DVB card
  *              based on the FlexCopII by B2C2,Inc.
  *
- * Copyright (C) 2003  V.C. , skystar@moldova.cc
+ * Copyright (C) 2003  Vadim Catana, skystar@moldova.cc
+ *
+ * FIX: DISEQC Tone Burst in flexcop_diseqc_ioctl()
+ * FIX: FULL soft DiSEqC for skystar2 (FlexCopII rev 130) VP310 equipped 
+ *     Vincenzo Di Massa, hawk.it at tiscalinet.it
+ * 	
+ * Converted to Linux coding style
+ * Misc reorganization, polishing, restyling
+ *     Roberto Ragusa, r.ragusa at libero.it
+ *       
+ * Added hardware filtering support, 
+ *     Niklas Peinecke, peinecke at gdv.uni-hannover.de
+ *
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public License
@@ -27,7 +39,6 @@
 
 #include "dvb_i2c.h"
 #include "dvb_frontend.h"
-#include "dvb_functions.h"
 
 #include <linux/dvb/frontend.h>
 #include <linux/dvb/dmx.h>
@@ -38,14 +49,20 @@
 #include "demux.h"
 #include "dvb_net.h"
 
+#include "dvb_functions.h"
+
 static int debug = 0;
-#define dprintk(x...) do { if (debug) printk(x); } while (0)
+#define dprintk(x...)	do { if (debug>=1) printk(x); } while (0)
+#define ddprintk(x...)	do { if (debug>=2) printk(x); } while (0)
+static int enable_hw_filters = 2;
 
-#define SizeOfBufDMA1	0x3AC00
-#define SizeOfBufDMA2	0x758
+#define SIZE_OF_BUF_DMA1	0x3ac00
+#define SIZE_OF_BUF_DMA2	0x758
 
-struct dmaq {
+#define MAX_N_HW_FILTERS	(6+32)
+#define N_PID_SLOTS		256
 
+struct dmaq {
 	u32 bus_addr;
 	u32 head;
 	u32 tail;
@@ -53,31 +70,19 @@
 	u8 *buffer;
 };
 
-struct packet_header {
-
-	u32 sync_byte;
-	u32 transport_error_indicator;
-	u32 payload_unit_start_indicator;
-	u32 transport_priority;
-	u32 pid;
-	u32 transport_scrambling_control;
-	u32 adaptation_field_control;
-	u32 continuity_counter;
-};
 
 struct adapter {
-
 	struct pci_dev *pdev;
 
 	u8 card_revision;
 	u32 b2c2_revision;
-	u32 PidFilterMax;
-	u32 MacFilterMax;
+	u32 pid_filter_max;
+	u32 mac_filter_max;
 	u32 irq;
 	unsigned long io_mem;
 	unsigned long io_port;
 	u8 mac_addr[8];
-	u32 dwSramType;
+	u32 dw_sram_type;
 
 	struct dvb_adapter *dvb_adapter;
 	struct dvb_demux demux;
@@ -95,44 +100,42 @@
 	u32 dma_ctrl;
 	u32 dma_status;
 
-	u32 capturing;
+	int capturing;
 
 	spinlock_t lock;
 
-	u16 pids[0x27];
+	int useable_hw_filters;
+	u16 hw_pids[MAX_N_HW_FILTERS];
+	u16 pid_list[N_PID_SLOTS];
+	int pid_rc[N_PID_SLOTS];	// ref counters for the pids
+	int pid_count;
+	int whole_bandwidth_count;
 	u32 mac_filter;
 };
 
-#define WriteRegDW(adapter,reg,value) writel(value, adapter->io_mem + reg)
-#define ReadRegDW(adapter,reg) readl(adapter->io_mem + reg)
+#define write_reg_dw(adapter,reg,value) writel(value, adapter->io_mem + reg)
+#define read_reg_dw(adapter,reg) readl(adapter->io_mem + reg)
 
-static void WriteRegOp(struct adapter *adapter, u32 reg, u32 operation, u32 andvalue, u32 orvalue)
+static void write_reg_bitfield(struct adapter *adapter, u32 reg, u32 zeromask, u32 orvalue)
 {
 	u32 tmp;
 
-	tmp = ReadRegDW(adapter, reg);
-
-	if (operation == 1)
-		tmp = tmp | orvalue;
-	if (operation == 2)
-		tmp = tmp & andvalue;
-	if (operation == 3)
-		tmp = (tmp & andvalue) | orvalue;
-
-	WriteRegDW(adapter, reg, tmp);
+	tmp = read_reg_dw(adapter, reg);
+	tmp = (tmp & ~zeromask) | orvalue;
+	write_reg_dw(adapter, reg, tmp);
 }
 
 /* i2c functions */
-static int i2cMainWriteForFlex2(struct adapter * adapter, u32 command, u8 * buf, u32 retries)
+static int i2c_main_write_for_flex2(struct adapter *adapter, u32 command, u8 *buf, int retries)
 {
-	u32 i;
+	int i;
 	u32 value;
 
-	WriteRegDW(adapter, 0x100, 0);
-	WriteRegDW(adapter, 0x100, command);
+	write_reg_dw(adapter, 0x100, 0);
+	write_reg_dw(adapter, 0x100, command);
 
 	for (i = 0; i < retries; i++) {
-		value = ReadRegDW(adapter, 0x100);
+		value = read_reg_dw(adapter, 0x100);
 
 		if ((value & 0x40000000) == 0) {
 			if ((value & 0x81000000) == 0x80000000) {
@@ -141,11 +144,9 @@
 
 				return 1;
 			}
-
 		} else {
-
-			WriteRegDW(adapter, 0x100, 0);
-			WriteRegDW(adapter, 0x100, command);
+			write_reg_dw(adapter, 0x100, 0);
+			write_reg_dw(adapter, 0x100, command);
 		}
 	}
 
@@ -153,7 +154,7 @@
 }
 
 /* device = 0x10000000 for tuner, 0x20000000 for eeprom */
-static void i2cMainSetup(u32 device, u32 chip_addr, u8 op, u8 addr, u32 value, u32 len, u32 *command)
+static void i2c_main_setup(u32 device, u32 chip_addr, u8 op, u8 addr, u32 value, u32 len, u32 *command)
 {
 	*command = device | ((len - 1) << 26) | (value << 16) | (addr << 8) | chip_addr;
 
@@ -163,20 +164,20 @@
 		*command = *command | 0x01000000;
 }
 
-static int FlexI2cRead4(struct adapter * adapter, u32 device, u32 chip_addr, u16 addr, u8 * buf, u8 len)
+static int flex_i2c_read4(struct adapter *adapter, u32 device, u32 chip_addr, u16 addr, u8 *buf, u8 len)
 {
 	u32 command;
 	u32 value;
 
 	int result, i;
 
-	i2cMainSetup(device, chip_addr, 1, addr, 0, len, &command);
+	i2c_main_setup(device, chip_addr, 1, addr, 0, len, &command);
 
-	result = i2cMainWriteForFlex2(adapter, command, buf, 100000);
+	result = i2c_main_write_for_flex2(adapter, command, buf, 100000);
 
 	if ((result & 0xff) != 0) {
 		if (len > 1) {
-			value = ReadRegDW(adapter, 0x104);
+			value = read_reg_dw(adapter, 0x104);
 
 			for (i = 1; i < len; i++) {
 				buf[i] = value & 0xff;
@@ -188,7 +189,7 @@
 	return result;
 }
 
-static int FlexI2cWrite4(struct adapter * adapter, u32 device, u32 chip_addr, u32 addr, u8 * buf, u8 len)
+static int flex_i2c_write4(struct adapter *adapter, u32 device, u32 chip_addr, u32 addr, u8 *buf, u8 len)
 {
 	u32 command;
 	u32 value;
@@ -202,12 +203,12 @@
 			value = value | buf[i - 1];
 		}
 
-		WriteRegDW(adapter, 0x104, value);
+		write_reg_dw(adapter, 0x104, value);
 	}
 
-	i2cMainSetup(device, chip_addr, 0, addr, buf[0], len, &command);
+	i2c_main_setup(device, chip_addr, 0, addr, buf[0], len, &command);
 
-	return i2cMainWriteForFlex2(adapter, command, 0, 100000);
+	return i2c_main_write_for_flex2(adapter, command, 0, 100000);
 }
 
 static void fixchipaddr(u32 device, u32 bus, u32 addr, u32 *ret)
@@ -218,13 +219,13 @@
 	*ret = bus;
 }
 
-static u32 FLEXI2C_read(struct adapter * adapter, u32 device, u32 bus, u32 addr, u8 * buf, u32 len)
+static u32 flex_i2c_read(struct adapter *adapter, u32 device, u32 bus, u32 addr, u8 *buf, u32 len)
 {
 	u32 chipaddr;
 	u32 bytes_to_transfer;
 	u8 *start;
 
-//  dprintk("%s:\n", __FUNCTION__);
+	ddprintk("%s:\n", __FUNCTION__);
 
 	start = buf;
 
@@ -236,7 +237,7 @@
 
 		fixchipaddr(device, bus, addr, &chipaddr);
 
-		if (FlexI2cRead4(adapter, device, chipaddr, addr, buf, bytes_to_transfer) == 0)
+		if (flex_i2c_read4(adapter, device, chipaddr, addr, buf, bytes_to_transfer) == 0)
 			return buf - start;
 
 		buf = buf + bytes_to_transfer;
@@ -247,13 +248,13 @@
 	return buf - start;
 }
 
-static u32 FLEXI2C_write(struct adapter * adapter, u32 device, u32 bus, u32 addr, u8 * buf, u32 len)
+static u32 flex_i2c_write(struct adapter *adapter, u32 device, u32 bus, u32 addr, u8 *buf, u32 len)
 {
 	u32 chipaddr;
 	u32 bytes_to_transfer;
 	u8 *start;
 
-//  dprintk("%s:\n", __FUNCTION__);
+	ddprintk("%s:\n", __FUNCTION__);
 
 	start = buf;
 
@@ -265,7 +266,7 @@
 
 		fixchipaddr(device, bus, addr, &chipaddr);
 
-		if (FlexI2cWrite4(adapter, device, chipaddr, addr, buf, bytes_to_transfer) == 0)
+		if (flex_i2c_write4(adapter, device, chipaddr, addr, buf, bytes_to_transfer) == 0)
 			return buf - start;
 
 		buf = buf + bytes_to_transfer;
@@ -284,75 +285,81 @@
 	if (down_interruptible(&tmp->i2c_sem))
 		return -ERESTARTSYS;
 
-	if (0) {
-		dprintk("%s:\n", __FUNCTION__);
+	ddprintk("%s: %d messages to transfer\n", __FUNCTION__, num);
 
 		for (i = 0; i < num; i++) {
-			printk("message %d: flags=%x, addr=0x%04x, buf=%p, len=%d \n", i, msgs[i].flags, msgs[i].addr, msgs[i].buf, msgs[i].len);
-		}
-	}
+		ddprintk("message %d: flags=0x%x, addr=0x%x, buf=0x%x, len=%d \n", i,
+			 msgs[i].flags, msgs[i].addr, msgs[i].buf[0], msgs[i].len);
 	
-	/* allow only the vp310 frontend to access the bus */
-	if ((msgs[0].addr != 0x0E) && (msgs[0].addr != 0x61)) {
+		/* allow only the mt312 and stv0299 frontends to access the bus */
+		if ((msgs[i].addr != 0x0e) && (msgs[i].addr != 0x68) && (msgs[i].addr != 0x61)) {
 		up(&tmp->i2c_sem);
 
 		return -EREMOTEIO;
 	}
+	}
 
-	if ((num == 1) && (msgs[0].buf != NULL)) {
-		if (msgs[0].flags == I2C_M_RD) {
-			ret = -EINVAL;
+	// read command
+	if ((num == 2) && (msgs[0].flags == 0) && (msgs[1].flags == I2C_M_RD) && (msgs[0].buf != NULL) && (msgs[1].buf != NULL)) {
 
-		} else {
+		ret = flex_i2c_read(tmp, 0x10000000, msgs[0].addr, msgs[0].buf[0], msgs[1].buf, msgs[1].len);
 
-			// single writes do have the reg addr in buf[0] and data in buf[1] to buf[n]
-			ret = FLEXI2C_write(tmp, 0x10000000, msgs[0].addr, msgs[0].buf[0], &msgs[0].buf[1], msgs[0].len - 1);
+		up(&tmp->i2c_sem);
+
+		if (ret != msgs[1].len) {
+			printk("%s: read error !\n", __FUNCTION__);
+
+			for (i = 0; i < 2; i++) {
+				printk("message %d: flags=0x%x, addr=0x%x, buf=0x%x, len=%d \n", i,
+				       msgs[i].flags, msgs[i].addr, msgs[i].buf[0], msgs[i].len);
+		}
 
-			if (ret != msgs[0].len - 1)
-				ret = -EREMOTEIO;
-			else
-				ret = num;
+			return -EREMOTEIO;
 		}
 
-	} else if ((num == 2) && (msgs[1].buf != NULL)) {
+		return num;
+	}
+	// write command
+	for (i = 0; i < num; i++) {
 
-		// i2c reads consist of a reg addr _write_ followed by a data read, so msg[1].flags has to be examined
-		if (msgs[1].flags == I2C_M_RD) {
-			ret = FLEXI2C_read(tmp, 0x10000000, msgs[0].addr, msgs[0].buf[0], msgs[1].buf, msgs[1].len);
+		if ((msgs[i].flags != 0) || (msgs[i].buf == NULL) || (msgs[i].len < 2))
+			return -EINVAL;
 
-		} else {
+		ret = flex_i2c_write(tmp, 0x10000000, msgs[i].addr, msgs[i].buf[0], &msgs[i].buf[1], msgs[i].len - 1);
 
-			ret = FLEXI2C_write(tmp, 0x10000000, msgs[0].addr, msgs[0].buf[0], msgs[1].buf, msgs[1].len);
+		up(&tmp->i2c_sem);
+
+		if (ret != msgs[0].len - 1) {
+			printk("%s: write error %i !\n", __FUNCTION__, ret);
+
+			printk("message %d: flags=0x%x, addr=0x%x, buf[0]=0x%x, len=%d \n", i,
+			       msgs[i].flags, msgs[i].addr, msgs[i].buf[0], msgs[i].len);
+
+			return -EREMOTEIO;
 		}
 
-		if (ret != msgs[1].len)
-			ret = -EREMOTEIO;
-		else
-			ret = num;
+		return num;
 	}
 
-	up(&tmp->i2c_sem);
+	printk("%s: unknown command format !\n", __FUNCTION__);
 
-	/* master xfer functions always return the number of successfully
-	   transmitted messages, not the number of transmitted bytes.
-	   return -EREMOTEIO in case of failure. */
-	return ret;
+	return -EINVAL;
 }
 
 /* SRAM (Skystar2 rev2.3 has one "ISSI IS61LV256" chip on board,
    but it seems that FlexCopII can work with more than one chip) */
-static void SRAMSetNetDest(struct adapter * adapter, u8 dest)
+static void sram_set_net_dest(struct adapter *adapter, u8 dest)
 {
 	u32 tmp;
 
 	udelay(1000);
 
-	tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFFFC) | (dest & 3);
+	tmp = (read_reg_dw(adapter, 0x714) & 0xfffffffc) | (dest & 3);
 
 	udelay(1000);
 
-	WriteRegDW(adapter, 0x714, tmp);
-	WriteRegDW(adapter, 0x714, tmp);
+	write_reg_dw(adapter, 0x714, tmp);
+	write_reg_dw(adapter, 0x714, tmp);
 
 	udelay(1000);
 
@@ -360,19 +367,19 @@
 /*	return tmp; */
 }
 
-static void SRAMSetCaiDest(struct adapter * adapter, u8 dest)
+static void sram_set_cai_dest(struct adapter *adapter, u8 dest)
 {
 	u32 tmp;
 
 	udelay(1000);
 
-	tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFFF3) | ((dest & 3) << 2);
+	tmp = (read_reg_dw(adapter, 0x714) & 0xfffffff3) | ((dest & 3) << 2);
 
 	udelay(1000);
 	udelay(1000);
 
-	WriteRegDW(adapter, 0x714, tmp);
-	WriteRegDW(adapter, 0x714, tmp);
+	write_reg_dw(adapter, 0x714, tmp);
+	write_reg_dw(adapter, 0x714, tmp);
 
 	udelay(1000);
 
@@ -380,19 +387,19 @@
 /*	return tmp; */
 }
 
-static void SRAMSetCaoDest(struct adapter * adapter, u8 dest)
+static void sram_set_cao_dest(struct adapter *adapter, u8 dest)
 {
 	u32 tmp;
 
 	udelay(1000);
 
-	tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFFCF) | ((dest & 3) << 4);
+	tmp = (read_reg_dw(adapter, 0x714) & 0xffffffcf) | ((dest & 3) << 4);
 
 	udelay(1000);
 	udelay(1000);
 
-	WriteRegDW(adapter, 0x714, tmp);
-	WriteRegDW(adapter, 0x714, tmp);
+	write_reg_dw(adapter, 0x714, tmp);
+	write_reg_dw(adapter, 0x714, tmp);
 
 	udelay(1000);
 
@@ -400,19 +407,19 @@
 /*	return tmp; */
 }
 
-static void SRAMSetMediaDest(struct adapter * adapter, u8 dest)
+static void sram_set_media_dest(struct adapter *adapter, u8 dest)
 {
 	u32 tmp;
 
 	udelay(1000);
 
-	tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFF3F) | ((dest & 3) << 6);
+	tmp = (read_reg_dw(adapter, 0x714) & 0xffffff3f) | ((dest & 3) << 6);
 
 	udelay(1000);
 	udelay(1000);
 
-	WriteRegDW(adapter, 0x714, tmp);
-	WriteRegDW(adapter, 0x714, tmp);
+	write_reg_dw(adapter, 0x714, tmp);
+	write_reg_dw(adapter, 0x714, tmp);
 
 	udelay(1000);
 
@@ -429,16 +436,17 @@
     bits 28-29 : memory bank selector
     bit  31    : busy flag
 */
-static void FlexSramWrite(struct adapter *adapter, u32 bank, u32 addr, u8 * buf, u32 len)
+static void flex_sram_write(struct adapter *adapter, u32 bank, u32 addr, u8 *buf, u32 len)
 {
-	u32 i, command, retries;
+	int i, retries;
+	u32 command;
 
 	for (i = 0; i < len; i++) {
 		command = bank | addr | 0x04000000 | (*buf << 0x10);
 
 		retries = 2;
 
-		while (((ReadRegDW(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
+		while (((read_reg_dw(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
 			mdelay(1);
 			retries--;
 		};
@@ -446,23 +454,24 @@
 		if (retries == 0)
 			printk("%s: SRAM timeout\n", __FUNCTION__);
 
-		WriteRegDW(adapter, 0x700, command);
+		write_reg_dw(adapter, 0x700, command);
 
 		buf++;
 		addr++;
 	}
 }
 
-static void FlexSramRead(struct adapter *adapter, u32 bank, u32 addr, u8 * buf, u32 len)
+static void flex_sram_read(struct adapter *adapter, u32 bank, u32 addr, u8 *buf, u32 len)
 {
-	u32 i, command, value, retries;
+	int i, retries;
+	u32 command, value;
 
 	for (i = 0; i < len; i++) {
 		command = bank | addr | 0x04008000;
 
 		retries = 10000;
 
-		while (((ReadRegDW(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
+		while (((read_reg_dw(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
 			mdelay(1);
 			retries--;
 		};
@@ -470,11 +479,11 @@
 		if (retries == 0)
 			printk("%s: SRAM timeout\n", __FUNCTION__);
 
-		WriteRegDW(adapter, 0x700, command);
+		write_reg_dw(adapter, 0x700, command);
 
 		retries = 10000;
 
-		while (((ReadRegDW(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
+		while (((read_reg_dw(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
 			mdelay(1);
 			retries--;
 		};
@@ -482,7 +491,7 @@
 		if (retries == 0)
 			printk("%s: SRAM timeout\n", __FUNCTION__);
 
-		value = ReadRegDW(adapter, 0x700) >> 0x10;
+		value = read_reg_dw(adapter, 0x700) >> 0x10;
 
 		*buf = (value & 0xff);
 
@@ -491,47 +500,47 @@
 	}
 }
 
-static void SRAM_writeChunk(struct adapter *adapter, u32 addr, u8 * buf, u16 len)
+static void sram_writeChunk(struct adapter *adapter, u32 addr, u8 *buf, u16 len)
 {
 	u32 bank;
 
 	bank = 0;
 
-	if (adapter->dwSramType == 0x20000) {
-		bank = (addr & 0x18000) << 0x0D;
+	if (adapter->dw_sram_type == 0x20000) {
+		bank = (addr & 0x18000) << 0x0d;
 	}
 
-	if (adapter->dwSramType == 0x00000) {
-		if ((addr >> 0x0F) == 0)
+	if (adapter->dw_sram_type == 0x00000) {
+		if ((addr >> 0x0f) == 0)
 			bank = 0x20000000;
 		else
 			bank = 0x10000000;
 	}
 
-	FlexSramWrite(adapter, bank, addr & 0x7FFF, buf, len);
+	flex_sram_write(adapter, bank, addr & 0x7fff, buf, len);
 }
 
-static void SRAM_readChunk(struct adapter *adapter, u32 addr, u8 * buf, u16 len)
+static void sram_readChunk(struct adapter *adapter, u32 addr, u8 *buf, u16 len)
 {
 	u32 bank;
 
 	bank = 0;
 
-	if (adapter->dwSramType == 0x20000) {
-		bank = (addr & 0x18000) << 0x0D;
+	if (adapter->dw_sram_type == 0x20000) {
+		bank = (addr & 0x18000) << 0x0d;
 	}
 
-	if (adapter->dwSramType == 0x00000) {
-		if ((addr >> 0x0F) == 0)
+	if (adapter->dw_sram_type == 0x00000) {
+		if ((addr >> 0x0f) == 0)
 			bank = 0x20000000;
 		else
 			bank = 0x10000000;
 	}
 
-	FlexSramRead(adapter, bank, addr & 0x7FFF, buf, len);
+	flex_sram_read(adapter, bank, addr & 0x7fff, buf, len);
 }
 
-static void SRAM_read(struct adapter *adapter, u32 addr, u8 * buf, u32 len)
+static void sram_read(struct adapter *adapter, u32 addr, u8 *buf, u32 len)
 {
 	u32 length;
 
@@ -541,11 +550,11 @@
 		// check if the address range belongs to the same 
 		// 32K memory chip. If not, the data is read from 
 		// one chip at a time.
-		if ((addr >> 0x0F) != ((addr + len - 1) >> 0x0F)) {
-			length = (((addr >> 0x0F) + 1) << 0x0F) - addr;
+		if ((addr >> 0x0f) != ((addr + len - 1) >> 0x0f)) {
+			length = (((addr >> 0x0f) + 1) << 0x0f) - addr;
 		}
 
-		SRAM_readChunk(adapter, addr, buf, length);
+		sram_readChunk(adapter, addr, buf, length);
 
 		addr = addr + length;
 		buf = buf + length;
@@ -553,7 +562,7 @@
 	}
 }
 
-static void SRAM_write(struct adapter *adapter, u32 addr, u8 * buf, u32 len)
+static void sram_write(struct adapter *adapter, u32 addr, u8 *buf, u32 len)
 {
 	u32 length;
 
@@ -563,11 +572,11 @@
 		// check if the address range belongs to the same 
 		// 32K memory chip. If not, the data is written to
 		// one chip at a time.
-		if ((addr >> 0x0F) != ((addr + len - 1) >> 0x0F)) {
-			length = (((addr >> 0x0F) + 1) << 0x0F) - addr;
+		if ((addr >> 0x0f) != ((addr + len - 1) >> 0x0f)) {
+			length = (((addr >> 0x0f) + 1) << 0x0f) - addr;
 		}
 
-		SRAM_writeChunk(adapter, addr, buf, length);
+		sram_writeChunk(adapter, addr, buf, length);
 
 		addr = addr + length;
 		buf = buf + length;
@@ -575,92 +584,92 @@
 	}
 }
 
-static void SRAM_setSize(struct adapter *adapter, u32 mask)
+static void sram_set_size(struct adapter *adapter, u32 mask)
 {
-	WriteRegDW(adapter, 0x71C, (mask | (~0x30000 & ReadRegDW(adapter, 0x71C))));
+	write_reg_dw(adapter, 0x71c, (mask | (~0x30000 & read_reg_dw(adapter, 0x71c))));
 }
 
-static void SRAM_init(struct adapter *adapter)
+static void sram_init(struct adapter *adapter)
 {
 	u32 tmp;
 
-	tmp = ReadRegDW(adapter, 0x71C);
+	tmp = read_reg_dw(adapter, 0x71c);
 
-	WriteRegDW(adapter, 0x71C, 1);
+	write_reg_dw(adapter, 0x71c, 1);
 
-	if (ReadRegDW(adapter, 0x71C) != 0) {
-		WriteRegDW(adapter, 0x71C, tmp);
+	if (read_reg_dw(adapter, 0x71c) != 0) {
+		write_reg_dw(adapter, 0x71c, tmp);
 
-		adapter->dwSramType = tmp & 0x30000;
+		adapter->dw_sram_type = tmp & 0x30000;
 
-		dprintk("%s: dwSramType = %x\n", __FUNCTION__, adapter->dwSramType);
+		ddprintk("%s: dw_sram_type = %x\n", __FUNCTION__, adapter->dw_sram_type);
 
 	} else {
 
-		adapter->dwSramType = 0x10000;
+		adapter->dw_sram_type = 0x10000;
 
-		dprintk("%s: dwSramType = %x\n", __FUNCTION__, adapter->dwSramType);
+		ddprintk("%s: dw_sram_type = %x\n", __FUNCTION__, adapter->dw_sram_type);
 	}
 
 	/* return value is never used? */
-/*	return adapter->dwSramType; */
+/*	return adapter->dw_sram_type; */
 }
 
-static int SRAM_testLocation(struct adapter *adapter, u32 mask, u32 addr)
+static int sram_test_location(struct adapter *adapter, u32 mask, u32 addr)
 {
 	u8 tmp1, tmp2;
 
 	dprintk("%s: mask = %x, addr = %x\n", __FUNCTION__, mask, addr);
 
-	SRAM_setSize(adapter, mask);
-	SRAM_init(adapter);
+	sram_set_size(adapter, mask);
+	sram_init(adapter);
 
-	tmp2 = 0xA5;
-	tmp1 = 0x4F;
+	tmp2 = 0xa5;
+	tmp1 = 0x4f;
 
-	SRAM_write(adapter, addr, &tmp2, 1);
-	SRAM_write(adapter, addr + 4, &tmp1, 1);
+	sram_write(adapter, addr, &tmp2, 1);
+	sram_write(adapter, addr + 4, &tmp1, 1);
 
 	tmp2 = 0;
 
 	mdelay(20);
 
-	SRAM_read(adapter, addr, &tmp2, 1);
-	SRAM_read(adapter, addr, &tmp2, 1);
+	sram_read(adapter, addr, &tmp2, 1);
+	sram_read(adapter, addr, &tmp2, 1);
 
-	dprintk("%s: wrote 0xA5, read 0x%2x\n", __FUNCTION__, tmp2);
+	dprintk("%s: wrote 0xa5, read 0x%2x\n", __FUNCTION__, tmp2);
 
-	if (tmp2 != 0xA5)
+	if (tmp2 != 0xa5)
 		return 0;
 
-	tmp2 = 0x5A;
-	tmp1 = 0xF4;
+	tmp2 = 0x5a;
+	tmp1 = 0xf4;
 
-	SRAM_write(adapter, addr, &tmp2, 1);
-	SRAM_write(adapter, addr + 4, &tmp1, 1);
+	sram_write(adapter, addr, &tmp2, 1);
+	sram_write(adapter, addr + 4, &tmp1, 1);
 
 	tmp2 = 0;
 
 	mdelay(20);
 
-	SRAM_read(adapter, addr, &tmp2, 1);
-	SRAM_read(adapter, addr, &tmp2, 1);
+	sram_read(adapter, addr, &tmp2, 1);
+	sram_read(adapter, addr, &tmp2, 1);
 
-	dprintk("%s: wrote 0x5A, read 0x%2x\n", __FUNCTION__, tmp2);
+	dprintk("%s: wrote 0x5a, read 0x%2x\n", __FUNCTION__, tmp2);
 
-	if (tmp2 != 0x5A)
+	if (tmp2 != 0x5a)
 		return 0;
 
 	return 1;
 }
 
-static u32 SRAM_length(struct adapter * adapter)
+static u32 sram_length(struct adapter *adapter)
 {
-	if (adapter->dwSramType == 0x10000)
+	if (adapter->dw_sram_type == 0x10000)
 		return 32768;	//  32K
-	if (adapter->dwSramType == 0x00000)
+	if (adapter->dw_sram_type == 0x00000)
 		return 65536;	//  64K        
-	if (adapter->dwSramType == 0x20000)
+	if (adapter->dw_sram_type == 0x20000)
 		return 131072;	// 128K
 
 	return 32768;		// 32K
@@ -674,103 +683,104 @@
    FlexCop works only with one bank at a time. The bank is selected
    by bits 28-29 of the 0x700 register.
   
-   bank 0 covers addresses 0x00000-0x07FFF
-   bank 1 covers addresses 0x08000-0x0FFFF
-   bank 2 covers addresses 0x10000-0x17FFF
-   bank 3 covers addresses 0x18000-0x1FFFF
+   bank 0 covers addresses 0x00000-0x07fff
+   bank 1 covers addresses 0x08000-0x0ffff
+   bank 2 covers addresses 0x10000-0x17fff
+   bank 3 covers addresses 0x18000-0x1ffff
 */
-static int SramDetectForFlex2(struct adapter *adapter)
+static int sram_detect_for_flex2(struct adapter *adapter)
 {
 	u32 tmp, tmp2, tmp3;
 
 	dprintk("%s:\n", __FUNCTION__);
 
-	tmp = ReadRegDW(adapter, 0x208);
-	WriteRegDW(adapter, 0x208, 0);
+	tmp = read_reg_dw(adapter, 0x208);
+	write_reg_dw(adapter, 0x208, 0);
 
-	tmp2 = ReadRegDW(adapter, 0x71C);
+	tmp2 = read_reg_dw(adapter, 0x71c);
 
 	dprintk("%s: tmp2 = %x\n", __FUNCTION__, tmp2);
 
-	WriteRegDW(adapter, 0x71C, 1);
+	write_reg_dw(adapter, 0x71c, 1);
 
-	tmp3 = ReadRegDW(adapter, 0x71C);
+	tmp3 = read_reg_dw(adapter, 0x71c);
 
 	dprintk("%s: tmp3 = %x\n", __FUNCTION__, tmp3);
 
-	WriteRegDW(adapter, 0x71C, tmp2);
+	write_reg_dw(adapter, 0x71c, tmp2);
 
 	// check for internal SRAM ???
 	tmp3--;
 	if (tmp3 != 0) {
-		SRAM_setSize(adapter, 0x10000);
-		SRAM_init(adapter);
-		WriteRegDW(adapter, 0x208, tmp);
+		sram_set_size(adapter, 0x10000);
+		sram_init(adapter);
+		write_reg_dw(adapter, 0x208, tmp);
 
 		dprintk("%s: sram size = 32K\n", __FUNCTION__);
 
 		return 32;
 	}
 
-	if (SRAM_testLocation(adapter, 0x20000, 0x18000) != 0) {
-		SRAM_setSize(adapter, 0x20000);
-		SRAM_init(adapter);
-		WriteRegDW(adapter, 0x208, tmp);
+	if (sram_test_location(adapter, 0x20000, 0x18000) != 0) {
+		sram_set_size(adapter, 0x20000);
+		sram_init(adapter);
+		write_reg_dw(adapter, 0x208, tmp);
 
 		dprintk("%s: sram size = 128K\n", __FUNCTION__);
 
 		return 128;
 	}
 
-	if (SRAM_testLocation(adapter, 0x00000, 0x10000) != 0) {
-		SRAM_setSize(adapter, 0x00000);
-		SRAM_init(adapter);
-		WriteRegDW(adapter, 0x208, tmp);
+	if (sram_test_location(adapter, 0x00000, 0x10000) != 0) {
+		sram_set_size(adapter, 0x00000);
+		sram_init(adapter);
+		write_reg_dw(adapter, 0x208, tmp);
 
 		dprintk("%s: sram size = 64K\n", __FUNCTION__);
 
 		return 64;
 	}
 
-	if (SRAM_testLocation(adapter, 0x10000, 0x00000) != 0) {
-		SRAM_setSize(adapter, 0x10000);
-		SRAM_init(adapter);
-		WriteRegDW(adapter, 0x208, tmp);
+	if (sram_test_location(adapter, 0x10000, 0x00000) != 0) {
+		sram_set_size(adapter, 0x10000);
+		sram_init(adapter);
+		write_reg_dw(adapter, 0x208, tmp);
 
 		dprintk("%s: sram size = 32K\n", __FUNCTION__);
 
 		return 32;
 	}
 
-	SRAM_setSize(adapter, 0x10000);
-	SRAM_init(adapter);
-	WriteRegDW(adapter, 0x208, tmp);
+	sram_set_size(adapter, 0x10000);
+	sram_init(adapter);
+	write_reg_dw(adapter, 0x208, tmp);
 
 	dprintk("%s: SRAM detection failed. Set to 32K \n", __FUNCTION__);
 
 	return 0;
 }
 
-static void SLL_detectSramSize(struct adapter *adapter)
+static void sll_detect_sram_size(struct adapter *adapter)
 {
-	SramDetectForFlex2(adapter);
+	sram_detect_for_flex2(adapter);
 }
+
 /* EEPROM (Skystar2 has one "24LC08B" chip on board) */
 /*
-static int EEPROM_write(struct adapter *adapter, u16 addr, u8 * buf, u16 len)
+static int eeprom_write(struct adapter *adapter, u16 addr, u8 *buf, u16 len)
 {
-	return FLEXI2C_write(adapter, 0x20000000, 0x50, addr, buf, len);
+	return flex_i2c_write(adapter, 0x20000000, 0x50, addr, buf, len);
 }
 */
 
-static int EEPROM_read(struct adapter *adapter, u16 addr, u8 * buf, u16 len)
+static int eeprom_read(struct adapter *adapter, u16 addr, u8 *buf, u16 len)
 {
-	return FLEXI2C_read(adapter, 0x20000000, 0x50, addr, buf, len);
+	return flex_i2c_read(adapter, 0x20000000, 0x50, addr, buf, len);
 }
 
-u8 calc_LRC(u8 * buf, u32 len)
+u8 calc_lrc(u8 *buf, int len)
 {
-	u32 i;
+	int i;
 	u8 sum;
 
 	sum = 0;
@@ -781,13 +791,13 @@
 	return sum;
 }
 
-static int EEPROM_LRC_read(struct adapter *adapter, u32 addr, u32 len, u8 * buf, u32 retries)
+static int eeprom_lrc_read(struct adapter *adapter, u32 addr, u32 len, u8 *buf, int retries)
 {
 	int i;
 
 	for (i = 0; i < retries; i++) {
-		if (EEPROM_read(adapter, addr, buf, len) == len) {
-			if (calc_LRC(buf, len - 1) == buf[len - 1])
+		if (eeprom_read(adapter, addr, buf, len) == len) {
+			if (calc_lrc(buf, len - 1) == buf[len - 1])
 				return 1;
 		}
 	}
@@ -796,13 +806,13 @@
 }
 
 /*
-static int EEPROM_LRC_write(struct adapter *adapter, u32 addr, u32 len, u8 * wbuf, u8 * rbuf, u32 retries)
+static int eeprom_lrc_write(struct adapter *adapter, u32 addr, u32 len, u8 *wbuf, u8 *rbuf, int retries)
 {
 	int i;
 
 	for (i = 0; i < retries; i++) {
-		if (EEPROM_write(adapter, addr, wbuf, len) == len) {
-			if (EEPROM_LRC_read(adapter, addr, len, rbuf, retries) == 1)
+		if (eeprom_write(adapter, addr, wbuf, len) == len) {
+			if (eeprom_lrc_read(adapter, addr, len, rbuf, retries) == 1)
 				return 1;
 		}
 	}
@@ -811,33 +821,11 @@
 }
 */
 
-/* These functions could be called from the initialization routine 
-   to unlock SkyStar2 cards, locked by "Europe On Line".
-        
-   in cards from "Europe On Line" the key is:
-
-       u8 key[20] = {
- 	    0xB2, 0x01, 0x00, 0x00,
- 	    0x00, 0x00, 0x00, 0x00,
- 	    0x00, 0x00, 0x00, 0x00,
- 	    0x00, 0x00, 0x00, 0x00,
-       };
-
-       LRC = 0xB3;
-
-  in unlocked cards the key is:
-
-       u8 key[20] = {
- 	    0xB2, 0x00, 0x00, 0x00,
- 	    0x00, 0x00, 0x00, 0x00,
- 	    0x00, 0x00, 0x00, 0x00,
- 	    0x00, 0x00, 0x00, 0x00,
-       };
 
-      LRC = 0xB2;
-*/
+/* These functions could be used to unlock SkyStar2 cards. */
+
 /*
-static int EEPROM_writeKey(struct adapter *adapter, u8 * key, u32 len)
+static int eeprom_writeKey(struct adapter *adapter, u8 *key, u32 len)
 {
 	u8 rbuf[20];
 	u8 wbuf[20];
@@ -850,37 +838,38 @@
 	wbuf[16] = 0;
 	wbuf[17] = 0;
 	wbuf[18] = 0;
-	wbuf[19] = calc_LRC(wbuf, 19);
+	wbuf[19] = calc_lrc(wbuf, 19);
 
-	return EEPROM_LRC_write(adapter, 0x3E4, 20, wbuf, rbuf, 4);
+	return eeprom_lrc_write(adapter, 0x3e4, 20, wbuf, rbuf, 4);
 }
-*/
-static int EEPROM_readKey(struct adapter *adapter, u8 * key, u32 len)
+
+static int eeprom_readKey(struct adapter *adapter, u8 *key, u32 len)
 {
 	u8 buf[20];
 
 	if (len != 16)
 		return 0;
 
-	if (EEPROM_LRC_read(adapter, 0x3E4, 20, buf, 4) == 0)
+	if (eeprom_lrc_read(adapter, 0x3e4, 20, buf, 4) == 0)
 		return 0;
 
 	memcpy(key, buf, len);
 
 	return 1;
 }
+*/
 
-static int EEPROM_getMacAddr(struct adapter *adapter, char type, u8 * mac)
+static int eeprom_get_mac_addr(struct adapter *adapter, char type, u8 *mac)
 {
 	u8 tmp[8];
 
-	if (EEPROM_LRC_read(adapter, 0x3F8, 8, tmp, 4) != 0) {
+	if (eeprom_lrc_read(adapter, 0x3f8, 8, tmp, 4) != 0) {
 		if (type != 0) {
 			mac[0] = tmp[0];
 			mac[1] = tmp[1];
 			mac[2] = tmp[2];
-			mac[3] = 0xFE;
-			mac[4] = 0xFF;
+			mac[3] = 0xfe;
+			mac[4] = 0xff;
 			mac[5] = tmp[3];
 			mac[6] = tmp[4];
 			mac[7] = tmp[5];
@@ -912,7 +901,7 @@
 }
 
 /*
-static char EEPROM_setMacAddr(struct adapter *adapter, char type, u8 * mac)
+static char eeprom_set_mac_addr(struct adapter *adapter, char type, u8 *mac)
 {
 	u8 tmp[8];
 
@@ -935,9 +924,9 @@
 	}
 
 	tmp[6] = 0;
-	tmp[7] = calc_LRC(tmp, 7);
+	tmp[7] = calc_lrc(tmp, 7);
 
-	if (EEPROM_write(adapter, 0x3F8, tmp, 8) == 8)
+	if (eeprom_write(adapter, 0x3f8, tmp, 8) == 8)
 		return 1;
 
 	return 0;
@@ -945,529 +934,319 @@
 */
 
 /* PID filter */
-static void FilterEnableStream1Filter(struct adapter *adapter, u32 op)
-{
-	dprintk("%s: op=%x\n", __FUNCTION__, op);
-
-	if (op == 0) {
-		WriteRegOp(adapter, 0x208, 2, ~0x00000001, 0);
-
-	} else {
 
-		WriteRegOp(adapter, 0x208, 1, 0, 0x00000001);
+/* every flexcop has 6 "lower" hw PID filters     */
+/* these are enabled by setting bits 0-5 of 0x208 */
+/* for the 32 additional filters we have to select one */
+/* of them through 0x310 and modify through 0x314 */
+/* op: 0=disable, 1=enable */
+static void filter_enable_hw_filter(struct adapter *adapter, int id, u8 op)
+{
+	dprintk("%s: id=%d op=%d\n", __FUNCTION__, id, op);
+	if (id <= 5) {
+		u32 mask = (0x00000001 << id);
+		write_reg_bitfield(adapter, 0x208, mask, op ? mask : 0);
+	} else {
+		/* select */
+		write_reg_bitfield(adapter, 0x310, 0x1f, (id - 6) & 0x1f);
+		/* modify */
+		write_reg_bitfield(adapter, 0x314, 0x00006000, op ? 0x00004000 : 0);
 	}
 }
 
-static void FilterEnableStream2Filter(struct adapter *adapter, u32 op)
-{
-	dprintk("%s: op=%x\n", __FUNCTION__, op);
-
-	if (op == 0) {
-		WriteRegOp(adapter, 0x208, 2, ~0x00000002, 0);
-
-	} else {
-
-		WriteRegOp(adapter, 0x208, 1, 0, 0x00000002);
+/* this sets the PID that should pass the specified filter */
+static void pid_set_hw_pid(struct adapter *adapter, int id, u16 pid)
+{
+	dprintk("%s: id=%d  pid=%d\n", __FUNCTION__, id, pid);
+	if (id <= 5) {
+		u32 adr = 0x300 + ((id & 6) << 1);
+		int shift = (id & 1) ? 16 : 0;
+		dprintk("%s: id=%d  addr=%x %c  pid=%d\n", __FUNCTION__, id, adr, (id & 1) ? 'h' : 'l', pid);
+		write_reg_bitfield(adapter, adr, (0x7fff) << shift, (pid & 0x1fff) << shift);
+	} else {
+		/* select */
+		write_reg_bitfield(adapter, 0x310, 0x1f, (id - 6) & 0x1f);
+		/* modify */
+		write_reg_bitfield(adapter, 0x314, 0x1fff, pid & 0x1fff);
 	}
 }
 
-static void FilterEnablePcrFilter(struct adapter *adapter, u32 op)
-{
-	dprintk("%s: op=%x\n", __FUNCTION__, op);
-
-	if (op == 0) {
-		WriteRegOp(adapter, 0x208, 2, ~0x00000004, 0);
-
-	} else {
-
-		WriteRegOp(adapter, 0x208, 1, 0, 0x00000004);
-	}
-}
-
-static void FilterEnablePmtFilter(struct adapter *adapter, u32 op)
-{
-	dprintk("%s: op=%x\n", __FUNCTION__, op);
-
-	if (op == 0) {
-		WriteRegOp(adapter, 0x208, 2, ~0x00000008, 0);
-
-	} else {
-
-		WriteRegOp(adapter, 0x208, 1, 0, 0x00000008);
-	}
-}
-
-static void FilterEnableEmmFilter(struct adapter *adapter, u32 op)
-{
-	dprintk("%s: op=%x\n", __FUNCTION__, op);
-
-	if (op == 0) {
-		WriteRegOp(adapter, 0x208, 2, ~0x00000010, 0);
-
-	} else {
-
-		WriteRegOp(adapter, 0x208, 1, 0, 0x00000010);
-	}
-}
-
-static void FilterEnableEcmFilter(struct adapter *adapter, u32 op)
-{
-	dprintk("%s: op=%x\n", __FUNCTION__, op);
-
-	if (op == 0) {
-		WriteRegOp(adapter, 0x208, 2, ~0x00000020, 0);
-
-	} else {
-
-		WriteRegOp(adapter, 0x208, 1, 0, 0x00000020);
-	}
-}
 
 /*
-static void FilterEnableNullFilter(struct adapter *adapter, u32 op)
+static void filter_enable_null_filter(struct adapter *adapter, u32 op)
 {
 	dprintk("%s: op=%x\n", __FUNCTION__, op);
 
-	if (op == 0) {
-		WriteRegOp(adapter, 0x208, 2, ~0x00000040, 0);
-
-	} else {
-
-		WriteRegOp(adapter, 0x208, 1, 0, 0x00000040);
-	}
+	write_reg_bitfield(adapter, 0x208, 0x00000040, op?0x00000040:0);
 }
 */
 
-static void FilterEnableMaskFilter(struct adapter *adapter, u32 op)
+static void filter_enable_mask_filter(struct adapter *adapter, u32 op)
 {
 	dprintk("%s: op=%x\n", __FUNCTION__, op);
 
-	if (op == 0) {
-		WriteRegOp(adapter, 0x208, 2, ~0x00000080, 0);
-
-	} else {
-
-		WriteRegOp(adapter, 0x208, 1, 0, 0x00000080);
-	}
+	write_reg_bitfield(adapter, 0x208, 0x00000080, op ? 0x00000080 : 0);
 }
 
 
-static void CtrlEnableMAC(struct adapter *adapter, u32 op)
+static void ctrl_enable_mac(struct adapter *adapter, u32 op)
 {
-	if (op == 0) {
-		WriteRegOp(adapter, 0x208, 2, ~0x00004000, 0);
-
-	} else {
-
-		WriteRegOp(adapter, 0x208, 1, 0, 0x00004000);
-	}
+	write_reg_bitfield(adapter, 0x208, 0x00004000, op ? 0x00004000 : 0);
 }
 
-static int CASetMacDstAddrFilter(struct adapter *adapter, u8 * mac)
+static int ca_set_mac_dst_addr_filter(struct adapter *adapter, u8 *mac)
 {
 	u32 tmp1, tmp2;
 
 	tmp1 = (mac[3] << 0x18) | (mac[2] << 0x10) | (mac[1] << 0x08) | mac[0];
 	tmp2 = (mac[5] << 0x08) | mac[4];
 
-	WriteRegDW(adapter, 0x418, tmp1);
-	WriteRegDW(adapter, 0x41C, tmp2);
+	write_reg_dw(adapter, 0x418, tmp1);
+	write_reg_dw(adapter, 0x41c, tmp2);
 
 	return 0;
 }
 
 /*
-static void SetIgnoreMACFilter(struct adapter *adapter, u8 op)
+static void set_ignore_mac_filter(struct adapter *adapter, u8 op)
 {
 	if (op != 0) {
-		WriteRegOp(adapter, 0x208, 2, ~0x00004000, 0);
-
+		write_reg_bitfield(adapter, 0x208, 0x00004000, 0);
 		adapter->mac_filter = 1;
-
 	} else {
-
 		if (adapter->mac_filter != 0) {
 			adapter->mac_filter = 0;
-
-			WriteRegOp(adapter, 0x208, 1, 0, 0x00004000);
+			write_reg_bitfield(adapter, 0x208, 0x00004000, 0x00004000);
 		}
 	}
 }
 */
 
 /*
-static void CheckNullFilterEnable(struct adapter *adapter)
+static void check_null_filter_enable(struct adapter *adapter)
 {
-	FilterEnableNullFilter(adapter, 1);
-	FilterEnableMaskFilter(adapter, 1);
+	filter_enable_null_filter(adapter, 1);
+	filter_enable_mask_filter(adapter, 1);
 }
 */
 
-static void InitPIDsInfo(struct adapter *adapter)
-{
-	int i;
-
-	for (i = 0; i < 0x27; i++)
-		adapter->pids[i] = 0x1FFF;
-}
-
-static int CheckPID(struct adapter *adapter, u16 pid)
-{
-	u32 i;
-
-	if (pid == 0x1FFF)
-		return 0;
-
-	for (i = 0; i < 0x27; i++) {
-		if (adapter->pids[i] == pid)
-			return 1;
-	}
-
-	return 0;
-}
-
-static void PidSetGroupPID(struct adapter * adapter, u32 pid)
+static void pid_set_group_pid(struct adapter *adapter, u16 pid)
 {
 	u32 value;
 
 	dprintk("%s: pid=%x\n", __FUNCTION__, pid);
-
-	value = (pid & 0x3FFF) | (ReadRegDW(adapter, 0x30C) & 0xFFFF0000);
-
-	WriteRegDW(adapter, 0x30C, value);
-
-	/* return value is never used? */
-/*	return value; */
+	value = (pid & 0x3fff) | (read_reg_dw(adapter, 0x30c) & 0xffff0000);
+	write_reg_dw(adapter, 0x30c, value);
 }
 
-static void PidSetGroupMASK(struct adapter * adapter, u32 pid)
+static void pid_set_group_mask(struct adapter *adapter, u16 pid)
 {
 	u32 value;
 
 	dprintk("%s: pid=%x\n", __FUNCTION__, pid);
-
-	value = ((pid & 0x3FFF) << 0x10) | (ReadRegDW(adapter, 0x30C) & 0xFFFF);
-
-	WriteRegDW(adapter, 0x30C, value);
-
-	/* return value is never used? */
-/*	return value; */
+	value = ((pid & 0x3fff) << 0x10) | (read_reg_dw(adapter, 0x30c) & 0xffff);
+	write_reg_dw(adapter, 0x30c, value);
 }
 
-static void PidSetStream1PID(struct adapter * adapter, u32 pid)
-{
-	u32 value;
-
-	dprintk("%s: pid=%x\n", __FUNCTION__, pid);
-
-	value = (pid & 0x3FFF) | (ReadRegDW(adapter, 0x300) & 0xFFFFC000);
-
-	WriteRegDW(adapter, 0x300, value);
-
-	/* return value is never used? */
-/*	return value; */
-}
-
-static void PidSetStream2PID(struct adapter * adapter, u32 pid)
-{
-	u32 value;
-
-	dprintk("%s: pid=%x\n", __FUNCTION__, pid);
-
-	value = ((pid & 0x3FFF) << 0x10) | (ReadRegDW(adapter, 0x300) & 0xFFFF);
-
-	WriteRegDW(adapter, 0x300, value);
-
-	/* return value is never used? */
-/*	return value; */
-}
-
-static void PidSetPcrPID(struct adapter * adapter, u32 pid)
+/*
+static int pid_get_group_pid(struct adapter *adapter)
 {
-	u32 value;
-
-	dprintk("%s: pid=%x\n", __FUNCTION__, pid);
-
-	value = (pid & 0x3FFF) | (ReadRegDW(adapter, 0x304) & 0xFFFFC000);
-
-	WriteRegDW(adapter, 0x304, value);
-
-	/* return value is never used? */
-/*	return value; */
+	return read_reg_dw(adapter, 0x30c) & 0x00001fff;
 }
 
-static void PidSetPmtPID(struct adapter * adapter, u32 pid)
+static int pid_get_group_mask(struct adapter *adapter)
 {
-	u32 value;
-
-	dprintk("%s: pid=%x\n", __FUNCTION__, pid);
-
-	value = ((pid & 0x3FFF) << 0x10) | (ReadRegDW(adapter, 0x304) & 0x3FFF);
-
-	WriteRegDW(adapter, 0x304, value);
-
-	/* return value is never used? */
-/*	return value; */
-}
-
-static void PidSetEmmPID(struct adapter * adapter, u32 pid)
-{
-	u32 value;
-
-	dprintk("%s: pid=%x\n", __FUNCTION__, pid);
-
-	value = (pid & 0xFFFF) | (ReadRegDW(adapter, 0x308) & 0xFFFF0000);
-
-	WriteRegDW(adapter, 0x308, value);
-
-	/* return value is never used? */
-/*	return value; */
+	return (read_reg_dw(adapter, 0x30c) >> 0x10)& 0x00001fff;
 }
+*/
 
-static void PidSetEcmPID(struct adapter * adapter, u32 pid)
+/*
+static void reset_hardware_pid_filter(struct adapter *adapter)
 {
-	u32 value;
+	pid_set_stream1_pid(adapter, 0x1fff);
 
-	dprintk("%s: pid=%x\n", __FUNCTION__, pid);
+	pid_set_stream2_pid(adapter, 0x1fff);
+	filter_enable_stream2_filter(adapter, 0);
 
-	value = (pid << 0x10) | (ReadRegDW(adapter, 0x308) & 0xFFFF);
+	pid_set_pcr_pid(adapter, 0x1fff);
+	filter_enable_pcr_filter(adapter, 0);
 
-	WriteRegDW(adapter, 0x308, value);
+	pid_set_pmt_pid(adapter, 0x1fff);
+	filter_enable_pmt_filter(adapter, 0);
 
-	/* return value is never used? */
-/*	return value; */
-}
+	pid_set_ecm_pid(adapter, 0x1fff);
+	filter_enable_ecm_filter(adapter, 0);
 
-static int PidGetStream1PID(struct adapter * adapter)
-{
-	return ReadRegDW(adapter, 0x300) & 0x00001FFF;
+	pid_set_emm_pid(adapter, 0x1fff);
+	filter_enable_emm_filter(adapter, 0);
 }
+*/
 
-static int PidGetStream2PID(struct adapter * adapter)
+static void init_pids(struct adapter *adapter)
 {
-	return (ReadRegDW(adapter, 0x300) >> 0x10)& 0x00001FFF;
-}
+	int i;
 
-static int PidGetPcrPID(struct adapter * adapter)
-{
-	return ReadRegDW(adapter, 0x304) & 0x00001FFF;
+	adapter->pid_count = 0;
+	adapter->whole_bandwidth_count = 0;
+	for (i = 0; i < adapter->useable_hw_filters; i++) {
+		dprintk("%s: setting filter %d to 0x1fff\n", __FUNCTION__, i);
+		adapter->hw_pids[i] = 0x1fff;
+		pid_set_hw_pid(adapter, i, 0x1fff);
 }
 
-static int PidGetPmtPID(struct adapter * adapter)
-{
-	return (ReadRegDW(adapter, 0x304) >> 0x10)& 0x00001FFF;
+	pid_set_group_pid(adapter, 0);
+	pid_set_group_mask(adapter, 0x1fe0);
 }
 
-static int PidGetEmmPID(struct adapter * adapter)
+static void open_whole_bandwidth(struct adapter *adapter)
 {
-	return ReadRegDW(adapter, 0x308) & 0x00001FFF;
+	dprintk("%s:\n", __FUNCTION__);
+	pid_set_group_pid(adapter, 0);
+	pid_set_group_mask(adapter, 0);
+/*
+	filter_enable_mask_filter(adapter, 1);
+*/
 }
 
-static int PidGetEcmPID(struct adapter * adapter)
+static void close_whole_bandwidth(struct adapter *adapter)
 {
-	return (ReadRegDW(adapter, 0x308) >> 0x10)& 0x00001FFF;
+	dprintk("%s:\n", __FUNCTION__);
+	pid_set_group_pid(adapter, 0);
+	pid_set_group_mask(adapter, 0x1fe0);
+/*
+	filter_enable_mask_filter(adapter, 1);
+*/
 }
 
-static int PidGetGroupPID(struct adapter * adapter)
+static void whole_bandwidth_inc(struct adapter *adapter)
 {
-	return ReadRegDW(adapter, 0x30C) & 0x00001FFF;
+	if (adapter->whole_bandwidth_count++ == 0)
+		open_whole_bandwidth(adapter);
 }
 
-static int PidGetGroupMASK(struct adapter * adapter)
+static void whole_bandwidth_dec(struct adapter *adapter)
 {
-	return (ReadRegDW(adapter, 0x30C) >> 0x10)& 0x00001FFF;
+	if (--adapter->whole_bandwidth_count <= 0)
+		close_whole_bandwidth(adapter);
 }
 
-/*
-static void ResetHardwarePIDFilter(struct adapter *adapter)
+/* The specified PID has to be let through the
+   hw filters.
+   We try to allocate an hardware filter and open whole
+   bandwidth when allocation is impossible.
+   All pids<=0x1f pass through the group filter.
+   Returns 1 on success, -1 on error */
+static int add_hw_pid(struct adapter *adapter, u16 pid)
 {
-	PidSetStream1PID(adapter, 0x1FFF);
-
-	PidSetStream2PID(adapter, 0x1FFF);
-	FilterEnableStream2Filter(adapter, 0);
-
-	PidSetPcrPID(adapter, 0x1FFF);
-	FilterEnablePcrFilter(adapter, 0);
-
-	PidSetPmtPID(adapter, 0x1FFF);
-	FilterEnablePmtFilter(adapter, 0);
-
-	PidSetEcmPID(adapter, 0x1FFF);
-	FilterEnableEcmFilter(adapter, 0);
-
-	PidSetEmmPID(adapter, 0x1FFF);
-	FilterEnableEmmFilter(adapter, 0);
-}
-*/
-
-static void OpenWholeBandwidth(struct adapter *adapter)
-{
-	PidSetGroupPID(adapter, 0);
-
-	PidSetGroupMASK(adapter, 0);
-
-	FilterEnableMaskFilter(adapter, 1);
-}
+	int i;
 
-static int AddHwPID(struct adapter *adapter, u32 pid)
-{
 	dprintk("%s: pid=%d\n", __FUNCTION__, pid);
 
-	if (pid <= 0x1F)
+	if (pid <= 0x1f)
 		return 1;
 
-	if ((PidGetGroupMASK(adapter) == 0) && (PidGetGroupPID(adapter) == 0))
-		return 0;
-
-	if (PidGetStream1PID(adapter) == 0x1FFF) {
-		PidSetStream1PID(adapter, pid & 0xFFFF);
-
-		FilterEnableStream1Filter(adapter, 1);
-
-		return 1;
-	}
-
-	if (PidGetStream2PID(adapter) == 0x1FFF) {
-		PidSetStream2PID(adapter, (pid & 0xFFFF));
-
-		FilterEnableStream2Filter(adapter, 1);
-
-		return 1;
-	}
-
-	if (PidGetPcrPID(adapter) == 0x1FFF) {
-		PidSetPcrPID(adapter, (pid & 0xFFFF));
-
-		FilterEnablePcrFilter(adapter, 1);
-
+	/* we can't use a filter for 0x2000, so no search */
+	if (pid != 0x2000) {
+		/* find an unused hardware filter */
+		for (i = 0; i < adapter->useable_hw_filters; i++) {
+			dprintk("%s: pid=%d searching slot=%d\n", __FUNCTION__, pid, i);
+			if (adapter->hw_pids[i] == 0x1fff) {
+				dprintk("%s: pid=%d slot=%d\n", __FUNCTION__, pid, i);
+				adapter->hw_pids[i] = pid;
+				pid_set_hw_pid(adapter, i, pid);
+				filter_enable_hw_filter(adapter, i, 1);
 		return 1;
 	}
-
-	if ((PidGetPmtPID(adapter) & 0x1FFF) == 0x1FFF) {
-		PidSetPmtPID(adapter, (pid & 0xFFFF));
-
-		FilterEnablePmtFilter(adapter, 1);
-
-		return 1;
 	}
-
-	if ((PidGetEmmPID(adapter) & 0x1FFF) == 0x1FFF) {
-		PidSetEmmPID(adapter, (pid & 0xFFFF));
-
-		FilterEnableEmmFilter(adapter, 1);
-
-		return 1;
 	}
-
-	if ((PidGetEcmPID(adapter) & 0x1FFF) == 0x1FFF) {
-		PidSetEcmPID(adapter, (pid & 0xFFFF));
-
-		FilterEnableEcmFilter(adapter, 1);
-
+	/* if we have not used a filter, this pid depends on whole bandwidth */
+	dprintk("%s: pid=%d whole_bandwidth\n", __FUNCTION__, pid);
+	whole_bandwidth_inc(adapter);
 		return 1;
 	}
 
-	return -1;
-}
-
-static int RemoveHwPID(struct adapter *adapter, u32 pid)
+/* returns -1 if the pid was not present in the filters */
+static int remove_hw_pid(struct adapter *adapter, u16 pid)
 {
+	int i;
+
 	dprintk("%s: pid=%d\n", __FUNCTION__, pid);
 
-	if (pid <= 0x1F)
+	if (pid <= 0x1f)
 		return 1;
 
-	if (PidGetStream1PID(adapter) == pid) {
-		PidSetStream1PID(adapter, 0x1FFF);
-
+	/* we can't use a filter for 0x2000, so no search */
+	if (pid != 0x2000) {
+		for (i = 0; i < adapter->useable_hw_filters; i++) {
+			dprintk("%s: pid=%d searching slot=%d\n", __FUNCTION__, pid, i);
+			if (adapter->hw_pids[i] == pid) {	// find the pid slot
+				dprintk("%s: pid=%d slot=%d\n", __FUNCTION__, pid, i);
+				adapter->hw_pids[i] = 0x1fff;
+				pid_set_hw_pid(adapter, i, 0x1fff);
+				filter_enable_hw_filter(adapter, i, 0);
 		return 1;
 	}
-
-	if (PidGetStream2PID(adapter) == pid) {
-		PidSetStream2PID(adapter, 0x1FFF);
-
-		FilterEnableStream2Filter(adapter, 0);
-
-		return 1;
 	}
-
-	if (PidGetPcrPID(adapter) == pid) {
-		PidSetPcrPID(adapter, 0x1FFF);
-
-		FilterEnablePcrFilter(adapter, 0);
-
-		return 1;
 	}
-
-	if (PidGetPmtPID(adapter) == pid) {
-		PidSetPmtPID(adapter, 0x1FFF);
-
-		FilterEnablePmtFilter(adapter, 0);
-
+	/* if we have not used a filter, this pid depended on whole bandwith */
+	dprintk("%s: pid=%d whole_bandwidth\n", __FUNCTION__, pid);
+	whole_bandwidth_dec(adapter);
 		return 1;
 	}
 
-	if (PidGetEmmPID(adapter) == pid) {
-		PidSetEmmPID(adapter, 0x1FFF);
-
-		FilterEnableEmmFilter(adapter, 0);
-
-		return 1;
-	}
-
-	if (PidGetEcmPID(adapter) == pid) {
-		PidSetEcmPID(adapter, 0x1FFF);
-
-		FilterEnableEcmFilter(adapter, 0);
-
-		return 1;
-	}
-
-	return -1;
-}
-
-static int AddPID(struct adapter *adapter, u32 pid)
+/* Adds a PID to the filters.
+   Adding a pid more than once is possible, we keep reference counts.
+   Whole stream available through pid==0x2000.
+   Returns 1 on success, -1 on error */
+static int add_pid(struct adapter *adapter, u16 pid)
 {
 	int i;
 
 	dprintk("%s: pid=%d\n", __FUNCTION__, pid);
 
-	if (pid > 0x1FFE)
+	if (pid > 0x1ffe && pid != 0x2000)
 		return -1;
 
-	if (CheckPID(adapter, pid) == 1)
+	// check if the pid is already present
+	for (i = 0; i < adapter->pid_count; i++)
+		if (adapter->pid_list[i] == pid) {
+			adapter->pid_rc[i]++;	// increment ref counter
 		return 1;
+		}
 
-	for (i = 0; i < 0x27; i++) {
-		if (adapter->pids[i] == 0x1FFF)	// find free pid filter
-		{
-			adapter->pids[i] = pid;
-
-			if (AddHwPID(adapter, pid) < 0)
-				OpenWholeBandwidth(adapter);
+	if (adapter->pid_count == N_PID_SLOTS)
+		return -1;	// no more pids can be added
+	adapter->pid_list[adapter->pid_count] = pid;	// register pid
+	adapter->pid_rc[adapter->pid_count] = 1;
+	adapter->pid_count++;
+	// hardware setting
+	add_hw_pid(adapter, pid);
 
 			return 1;
 		}
-	}
-
-	return -1;
-}
 
-static int RemovePID(struct adapter *adapter, u32 pid)
+/* Removes a PID from the filters. */
+static int remove_pid(struct adapter *adapter, u16 pid)
 {
-	u32 i;
+	int i, j;
 
 	dprintk("%s: pid=%d\n", __FUNCTION__, pid);
 
-	if (pid > 0x1FFE)
+	if (pid > 0x1ffe && pid != 0x2000)
 		return -1;
 
-	for (i = 0; i < 0x27; i++) {
-		if (adapter->pids[i] == pid) {
-			adapter->pids[i] = 0x1FFF;
-
-			RemoveHwPID(adapter, pid);
-
+	// check if the pid is present (it must be!)
+	for (i = 0; i < adapter->pid_count; i++) {
+		if (adapter->pid_list[i] == pid) {
+			adapter->pid_rc[i]--;
+			if (adapter->pid_rc[i] <= 0) {
+				// remove from the list
+				adapter->pid_count--;
+				adapter->pid_list[i]=adapter->pid_list[adapter->pid_count];
+				adapter->pid_rc[i] = adapter->pid_rc[adapter->pid_count];
+				// hardware setting
+				remove_hw_pid(adapter, pid);
+			}
 			return 1;
 		}
 	}
@@ -1475,21 +1254,16 @@
 	return -1;
 }
 
+
 /* dma & irq */
-static void CtrlEnableSmc(struct adapter *adapter, u32 op)
+static void ctrl_enable_smc(struct adapter *adapter, u32 op)
 {
-	if (op == 0) {
-		WriteRegOp(adapter, 0x208, 2, ~0x00000800, 0);
-
-	} else {
-
-		WriteRegOp(adapter, 0x208, 1, 0, 0x00000800);
-	}
+	write_reg_bitfield(adapter, 0x208, 0x00000800, op ? 0x00000800 : 0);
 }
 
-static void DmaEnableDisableIrq(struct adapter *adapter, u32 flag1, u32 flag2, u32 flag3)
+static void dma_enable_disable_irq(struct adapter *adapter, u32 flag1, u32 flag2, u32 flag3)
 {
-	adapter->dma_ctrl = adapter->dma_ctrl & 0x000F0000;
+	adapter->dma_ctrl = adapter->dma_ctrl & 0x000f0000;
 
 	if (flag1 == 0) {
 		if (flag2 == 0)
@@ -1516,16 +1290,16 @@
 	}
 }
 
-static void IrqDmaEnableDisableIrq(struct adapter * adapter, u32 op)
+static void irq_dma_enable_disable_irq(struct adapter *adapter, u32 op)
 {
 	u32 value;
 
-	value = ReadRegDW(adapter, 0x208) & 0xFFF0FFFF;
+	value = read_reg_dw(adapter, 0x208) & 0xfff0ffff;
 
 	if (op != 0)
-		value = value | (adapter->dma_ctrl & 0x000F0000);
+		value = value | (adapter->dma_ctrl & 0x000f0000);
 
-	WriteRegDW(adapter, 0x208, value);
+	write_reg_dw(adapter, 0x208, value);
 }
 
 /* FlexCopII has 2 dma channels. DMA1 is used to transfer TS data to
@@ -1544,7 +1318,7 @@
        subbuffer. The last 2 bits contain 0, when dma1 is disabled and 1,
        when dma1 is enabled.
 
-       the first 30 bits of register 0x00C contain the address of the second
+       the first 30 bits of register 0x00c contain the address of the second
        subbuffer. the last 2 bits contain 1.
 
        register 0x008 will contain the address of the subbuffer that was filled
@@ -1559,13 +1333,13 @@
        subbuffer.  The last 2 bits contain 0, when dma1 is disabled and 1,
        when dma1 is enabled.
 
-       the first 30 bits of register 0x01C contain the address of the second
+       the first 30 bits of register 0x01c contain the address of the second
        subbuffer. the last 2 bits contain 1.
 
        register 0x018 contains the address of the subbuffer that was filled
        with TS data, when FlexCopII generates an interrupt.
 */
-static int DmaInitDMA(struct adapter *adapter, u32 dma_channel)
+static int dma_init_dma(struct adapter *adapter, u32 dma_channel)
 {
 	u32 subbuffers, subbufsize, subbuf0, subbuf1;
 
@@ -1576,37 +1350,37 @@
 
 		subbufsize = (((adapter->dmaq1.buffer_size / 2) / 4) << 8) | subbuffers;
 
-		subbuf0 = adapter->dmaq1.bus_addr & 0xFFFFFFFC;
+		subbuf0 = adapter->dmaq1.bus_addr & 0xfffffffc;
 
-		subbuf1 = ((adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) & 0xFFFFFFFC) | 1;
+		subbuf1 = ((adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) & 0xfffffffc) | 1;
 
 		dprintk("%s: first subbuffer address = 0x%x\n", __FUNCTION__, subbuf0);
 		udelay(1000);
-		WriteRegDW(adapter, 0x000, subbuf0);
+		write_reg_dw(adapter, 0x000, subbuf0);
 
 		dprintk("%s: subbuffer size = 0x%x\n", __FUNCTION__, (subbufsize >> 8) * 4);
 		udelay(1000);
-		WriteRegDW(adapter, 0x004, subbufsize);
+		write_reg_dw(adapter, 0x004, subbufsize);
 
 		dprintk("%s: second subbuffer address = 0x%x\n", __FUNCTION__, subbuf1);
 		udelay(1000);
-		WriteRegDW(adapter, 0x00C, subbuf1);
+		write_reg_dw(adapter, 0x00c, subbuf1);
 
-		dprintk("%s: counter = 0x%x\n", __FUNCTION__, adapter->dmaq1.bus_addr & 0xFFFFFFFC);
-		WriteRegDW(adapter, 0x008, adapter->dmaq1.bus_addr & 0xFFFFFFFC);
+		dprintk("%s: counter = 0x%x\n", __FUNCTION__, adapter->dmaq1.bus_addr & 0xfffffffc);
+		write_reg_dw(adapter, 0x008, adapter->dmaq1.bus_addr & 0xfffffffc);
 		udelay(1000);
 
 		if (subbuffers == 0)
-			DmaEnableDisableIrq(adapter, 0, 1, 0);
+			dma_enable_disable_irq(adapter, 0, 1, 0);
 		else
-			DmaEnableDisableIrq(adapter, 0, 1, 1);
+			dma_enable_disable_irq(adapter, 0, 1, 1);
 
-		IrqDmaEnableDisableIrq(adapter, 1);
+		irq_dma_enable_disable_irq(adapter, 1);
 
-		SRAMSetMediaDest(adapter, 1);
-		SRAMSetNetDest(adapter, 1);
-		SRAMSetCaiDest(adapter, 2);
-		SRAMSetCaoDest(adapter, 2);
+		sram_set_media_dest(adapter, 1);
+		sram_set_net_dest(adapter, 1);
+		sram_set_cai_dest(adapter, 2);
+		sram_set_cao_dest(adapter, 2);
 	}
 
 	if (dma_channel == 1) {
@@ -1616,39 +1390,35 @@
 
 		subbufsize = (((adapter->dmaq2.buffer_size / 2) / 4) << 8) | subbuffers;
 
-		subbuf0 = adapter->dmaq2.bus_addr & 0xFFFFFFFC;
+		subbuf0 = adapter->dmaq2.bus_addr & 0xfffffffc;
 
-		subbuf1 = ((adapter->dmaq2.bus_addr + adapter->dmaq2.buffer_size / 2) & 0xFFFFFFFC) | 1;
+		subbuf1 = ((adapter->dmaq2.bus_addr + adapter->dmaq2.buffer_size / 2) & 0xfffffffc) | 1;
 
 		dprintk("%s: first subbuffer address = 0x%x\n", __FUNCTION__, subbuf0);
 		udelay(1000);
-		WriteRegDW(adapter, 0x010, subbuf0);
+		write_reg_dw(adapter, 0x010, subbuf0);
 
 		dprintk("%s: subbuffer size = 0x%x\n", __FUNCTION__, (subbufsize >> 8) * 4);
 		udelay(1000);
-		WriteRegDW(adapter, 0x014, subbufsize);
+		write_reg_dw(adapter, 0x014, subbufsize);
 
 		dprintk("%s: second buffer address = 0x%x\n", __FUNCTION__, subbuf1);
 		udelay(1000);
-		WriteRegDW(adapter, 0x01C, subbuf1);
+		write_reg_dw(adapter, 0x01c, subbuf1);
 
-		SRAMSetCaiDest(adapter, 2);
+		sram_set_cai_dest(adapter, 2);
 	}
 
 	return 0;
 }
 
-static void CtrlEnableReceiveData(struct adapter *adapter, u32 op)
+static void ctrl_enable_receive_data(struct adapter *adapter, u32 op)
 {
 	if (op == 0) {
-		WriteRegOp(adapter, 0x208, 2, ~0x00008000, 0);
-
+		write_reg_bitfield(adapter, 0x208, 0x00008000, 0);
 		adapter->dma_status = adapter->dma_status & ~0x00000004;
-
 	} else {
-
-		WriteRegOp(adapter, 0x208, 1, 0, 0x00008000);
-
+		write_reg_bitfield(adapter, 0x208, 0x00008000, 0x00008000);
 		adapter->dma_status = adapter->dma_status | 0x00000004;
 	}
 }
@@ -1656,7 +1426,7 @@
 /* bit 0 of dma_mask is set to 1 if dma1 channel has to be enabled/disabled
    bit 1 of dma_mask is set to 1 if dma2 channel has to be enabled/disabled
 */
-static void DmaStartStop0x2102(struct adapter *adapter, u32 dma_mask, u32 start_stop)
+static void dma_start_stop(struct adapter *adapter, u32 dma_mask, int start_stop)
 {
 	u32 dma_enable, dma1_enable, dma2_enable;
 
@@ -1679,83 +1449,82 @@
 		}
 		// enable dma1 and dma2
 		if ((dma1_enable == 1) && (dma2_enable == 1)) {
-			WriteRegDW(adapter, 0x000, adapter->dmaq1.bus_addr | 1);
-			WriteRegDW(adapter, 0x00C, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
-			WriteRegDW(adapter, 0x010, adapter->dmaq2.bus_addr | 1);
+			write_reg_dw(adapter, 0x000, adapter->dmaq1.bus_addr | 1);
+			write_reg_dw(adapter, 0x00c, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
+			write_reg_dw(adapter, 0x010, adapter->dmaq2.bus_addr | 1);
 
-			CtrlEnableReceiveData(adapter, 1);
+			ctrl_enable_receive_data(adapter, 1);
 
 			return;
 		}
 		// enable dma1
 		if ((dma1_enable == 1) && (dma2_enable == 0)) {
-			WriteRegDW(adapter, 0x000, adapter->dmaq1.bus_addr | 1);
-			WriteRegDW(adapter, 0x00C, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
+			write_reg_dw(adapter, 0x000, adapter->dmaq1.bus_addr | 1);
+			write_reg_dw(adapter, 0x00c, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
 
-			CtrlEnableReceiveData(adapter, 1);
+			ctrl_enable_receive_data(adapter, 1);
 
 			return;
 		}
 		// enable dma2
 		if ((dma1_enable == 0) && (dma2_enable == 1)) {
-			WriteRegDW(adapter, 0x010, adapter->dmaq2.bus_addr | 1);
+			write_reg_dw(adapter, 0x010, adapter->dmaq2.bus_addr | 1);
 
-			CtrlEnableReceiveData(adapter, 1);
+			ctrl_enable_receive_data(adapter, 1);
 
 			return;
 		}
 		// start dma
 		if ((dma1_enable == 0) && (dma2_enable == 0)) {
-			CtrlEnableReceiveData(adapter, 1);
+			ctrl_enable_receive_data(adapter, 1);
 
 			return;
 		}
 
 	} else {
 
-		dprintk("%s: stoping dma\n", __FUNCTION__);
+		dprintk("%s: stopping dma\n", __FUNCTION__);
 
 		dma_enable = adapter->dma_status & 0x00000003;
 
 		if (((dma_mask & 1) != 0) && ((adapter->dma_status & 1) != 0)) {
-			dma_enable = dma_enable & 0xFFFFFFFE;
+			dma_enable = dma_enable & 0xfffffffe;
 		}
 
 		if (((dma_mask & 2) != 0) && ((adapter->dma_status & 2) != 0)) {
-			dma_enable = dma_enable & 0xFFFFFFFD;
+			dma_enable = dma_enable & 0xfffffffd;
 		}
 		//stop dma
 		if ((dma_enable == 0) && ((adapter->dma_status & 4) != 0)) {
-			CtrlEnableReceiveData(adapter, 0);
+			ctrl_enable_receive_data(adapter, 0);
 
 			udelay(3000);
 		}
 		//disable dma1
 		if (((dma_mask & 1) != 0) && ((adapter->dma_status & 1) != 0) && (adapter->dmaq1.bus_addr != 0)) {
-			WriteRegDW(adapter, 0x000, adapter->dmaq1.bus_addr);
-			WriteRegDW(adapter, 0x00C, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
+			write_reg_dw(adapter, 0x000, adapter->dmaq1.bus_addr);
+			write_reg_dw(adapter, 0x00c, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
 
 			adapter->dma_status = adapter->dma_status & ~0x00000001;
 		}
 		//disable dma2
 		if (((dma_mask & 2) != 0) && ((adapter->dma_status & 2) != 0) && (adapter->dmaq2.bus_addr != 0)) {
-			WriteRegDW(adapter, 0x010, adapter->dmaq2.bus_addr);
+			write_reg_dw(adapter, 0x010, adapter->dmaq2.bus_addr);
 
 			adapter->dma_status = adapter->dma_status & ~0x00000002;
 		}
 	}
 }
 
-static void OpenStream(struct adapter *adapter, u32 pid)
+static void open_stream(struct adapter *adapter, u16 pid)
 {
 	u32 dma_mask;
 
-	if (adapter->capturing == 0)
-		adapter->capturing = 1;
+	++adapter->capturing;
 
-	FilterEnableMaskFilter(adapter, 1);
+	filter_enable_mask_filter(adapter, 1);
 
-	AddPID(adapter, pid);
+	add_pid(adapter, pid);
 
 	dprintk("%s: adapter->dma_status=%x\n", __FUNCTION__, adapter->dma_status);
 
@@ -1779,23 +1548,22 @@
 		}
 
 		if (dma_mask != 0) {
-			IrqDmaEnableDisableIrq(adapter, 1);
+			irq_dma_enable_disable_irq(adapter, 1);
 
-			DmaStartStop0x2102(adapter, dma_mask, 1);
+			dma_start_stop(adapter, dma_mask, 1);
 		}
 	}
 }
 
-static void CloseStream(struct adapter *adapter, u32 pid)
+static void close_stream(struct adapter *adapter, u16 pid)
 {
-	u32 dma_mask;
-
-	if (adapter->capturing != 0)
-		adapter->capturing = 0;
+	if (adapter->capturing > 0)
+		--adapter->capturing;
 
 	dprintk("%s: dma_status=%x\n", __FUNCTION__, adapter->dma_status);
 
-	dma_mask = 0;
+	if (adapter->capturing == 0) {
+		u32 dma_mask = 0;
 
 	if ((adapter->dma_status & 1) != 0)
 		dma_mask = dma_mask | 0x00000001;
@@ -1803,94 +1571,76 @@
 		dma_mask = dma_mask | 0x00000002;
 
 	if (dma_mask != 0) {
-		DmaStartStop0x2102(adapter, dma_mask, 0);
+			dma_start_stop(adapter, dma_mask, 0);
 	}
-
-	RemovePID(adapter, pid);
+	}
+	remove_pid(adapter, pid);
 }
 
-static void InterruptServiceDMA1(struct adapter *adapter)
+static void interrupt_service_dma1(struct adapter *adapter)
 {
 	struct dvb_demux *dvbdmx = &adapter->demux;
-	struct packet_header packet_header;
 
-	int nCurDmaCounter;
-	u32 nNumBytesParsed;
-	u32 nNumNewBytesTransferred;
-	u32 dwDefaultPacketSize = 188;
-	u8 gbTmpBuffer[188];
-	u8 *pbDMABufCurPos;
+	int n_cur_dma_counter;
+	u32 n_num_bytes_parsed;
+	u32 n_num_new_bytes_transferred;
+	u32 dw_default_packet_size = 188;
+	u8 gb_tmp_buffer[188];
+	u8 *pb_dma_buf_cur_pos;
 
-	nCurDmaCounter = readl(adapter->io_mem + 0x008) - adapter->dmaq1.bus_addr;
-	nCurDmaCounter = (nCurDmaCounter / dwDefaultPacketSize) * dwDefaultPacketSize;
+	n_cur_dma_counter = readl(adapter->io_mem + 0x008) - adapter->dmaq1.bus_addr;
+	n_cur_dma_counter = (n_cur_dma_counter / dw_default_packet_size) * dw_default_packet_size;
 
-	if ((nCurDmaCounter < 0) || (nCurDmaCounter > adapter->dmaq1.buffer_size)) {
+	if ((n_cur_dma_counter < 0) || (n_cur_dma_counter > adapter->dmaq1.buffer_size)) {
 		dprintk("%s: dma counter outside dma buffer\n", __FUNCTION__);
 		return;
 	}
 
-	adapter->dmaq1.head = nCurDmaCounter;
+	adapter->dmaq1.head = n_cur_dma_counter;
 
-	if (adapter->dmaq1.tail <= nCurDmaCounter) {
-		nNumNewBytesTransferred = nCurDmaCounter - adapter->dmaq1.tail;
+	if (adapter->dmaq1.tail <= n_cur_dma_counter) {
+		n_num_new_bytes_transferred = n_cur_dma_counter - adapter->dmaq1.tail;
 
 	} else {
 
-		nNumNewBytesTransferred = (adapter->dmaq1.buffer_size - adapter->dmaq1.tail) + nCurDmaCounter;
+		n_num_new_bytes_transferred = (adapter->dmaq1.buffer_size - adapter->dmaq1.tail) + n_cur_dma_counter;
 	}
 
-//  dprintk("%s: nCurDmaCounter   = %d\n" , __FUNCTION__, nCurDmaCounter);
-//	dprintk("%s: dmaq1.tail       = %d\n" , __FUNCTION__, adapter->dmaq1.tail):
-//  dprintk("%s: BytesTransferred = %d\n" , __FUNCTION__, nNumNewBytesTransferred);
+	ddprintk("%s: n_cur_dma_counter = %d\n", __FUNCTION__, n_cur_dma_counter);
+	ddprintk("%s: dmaq1.tail        = %d\n", __FUNCTION__, adapter->dmaq1.tail);
+	ddprintk("%s: bytes_transferred = %d\n", __FUNCTION__, n_num_new_bytes_transferred);
 
-	if (nNumNewBytesTransferred < dwDefaultPacketSize)
+	if (n_num_new_bytes_transferred < dw_default_packet_size)
 		return;
 
-	nNumBytesParsed = 0;
+	n_num_bytes_parsed = 0;
 
-	while (nNumBytesParsed < nNumNewBytesTransferred) {
-		pbDMABufCurPos = adapter->dmaq1.buffer + adapter->dmaq1.tail;
+	while (n_num_bytes_parsed < n_num_new_bytes_transferred) {
+		pb_dma_buf_cur_pos = adapter->dmaq1.buffer + adapter->dmaq1.tail;
 
 		if (adapter->dmaq1.buffer + adapter->dmaq1.buffer_size < adapter->dmaq1.buffer + adapter->dmaq1.tail + 188) {
-			memcpy(gbTmpBuffer, adapter->dmaq1.buffer + adapter->dmaq1.tail, adapter->dmaq1.buffer_size - adapter->dmaq1.tail);
-			memcpy(gbTmpBuffer + (adapter->dmaq1.buffer_size - adapter->dmaq1.tail), adapter->dmaq1.buffer, (188 - (adapter->dmaq1.buffer_size - adapter->dmaq1.tail)));
+			memcpy(gb_tmp_buffer, adapter->dmaq1.buffer + adapter->dmaq1.tail,
+			       adapter->dmaq1.buffer_size - adapter->dmaq1.tail);
+			memcpy(gb_tmp_buffer + (adapter->dmaq1.buffer_size - adapter->dmaq1.tail), adapter->dmaq1.buffer,
+			       (188 - (adapter->dmaq1.buffer_size - adapter->dmaq1.tail)));
 
-			pbDMABufCurPos = gbTmpBuffer;
+			pb_dma_buf_cur_pos = gb_tmp_buffer;
 		}
 
 		if (adapter->capturing != 0) {
-			u32 *dq = (u32 *) pbDMABufCurPos;
-
-			packet_header.sync_byte = *dq & 0x000000FF;
-			packet_header.transport_error_indicator = *dq & 0x00008000;
-			packet_header.payload_unit_start_indicator = *dq & 0x00004000;
-			packet_header.transport_priority = *dq & 0x00002000;
-			packet_header.pid = ((*dq & 0x00FF0000) >> 0x10) | (*dq & 0x00001F00);
-			packet_header.transport_scrambling_control = *dq >> 0x1E;
-			packet_header.adaptation_field_control = (*dq & 0x30000000) >> 0x1C;
-			packet_header.continuity_counter = (*dq & 0x0F000000) >> 0x18;
-
-			if ((packet_header.sync_byte == 0x47) && (packet_header.transport_error_indicator == 0) && (packet_header.pid != 0x1FFF)) {
-				if (CheckPID(adapter, packet_header.pid & 0x0000FFFF) != 0) {
-					dvb_dmx_swfilter_packets(dvbdmx, pbDMABufCurPos, dwDefaultPacketSize / 188);
-
-				} else {
-
-//                  dprintk("%s: pid=%x\n", __FUNCTION__, packet_header.pid);
-				}
-			}
+			dvb_dmx_swfilter_packets(dvbdmx, pb_dma_buf_cur_pos, dw_default_packet_size / 188);
 		}
 
-		nNumBytesParsed = nNumBytesParsed + dwDefaultPacketSize;
+		n_num_bytes_parsed = n_num_bytes_parsed + dw_default_packet_size;
 
-		adapter->dmaq1.tail = adapter->dmaq1.tail + dwDefaultPacketSize;
+		adapter->dmaq1.tail = adapter->dmaq1.tail + dw_default_packet_size;
 
 		if (adapter->dmaq1.tail >= adapter->dmaq1.buffer_size)
 			adapter->dmaq1.tail = adapter->dmaq1.tail - adapter->dmaq1.buffer_size;
 	};
 }
 
-static void InterruptServiceDMA2(struct adapter *adapter)
+static void interrupt_service_dma2(struct adapter *adapter)
 {
 	printk("%s:\n", __FUNCTION__);
 }
@@ -1901,28 +1651,28 @@
 
 	u32 value;
 
-//  dprintk("%s:\n", __FUNCTION__);
+	ddprintk("%s:\n", __FUNCTION__);
 
 	spin_lock_irq(&tmp->lock);
 
-	if (0 == ((value = ReadRegDW(tmp, 0x20C)) & 0x0F)) {
+	if (0 == ((value = read_reg_dw(tmp, 0x20c)) & 0x0f)) {
 		spin_unlock_irq(&tmp->lock);
 		return IRQ_NONE;
 	}
 	
 	while (value != 0) {
 		if ((value & 0x03) != 0)
-			InterruptServiceDMA1(tmp);
-		if ((value & 0x0C) != 0)
-			InterruptServiceDMA2(tmp);
-		value = ReadRegDW(tmp, 0x20C) & 0x0F;
+			interrupt_service_dma1(tmp);
+		if ((value & 0x0c) != 0)
+			interrupt_service_dma2(tmp);
+		value = read_reg_dw(tmp, 0x20c) & 0x0f;
 	}
 
 	spin_unlock_irq(&tmp->lock);
 	return IRQ_HANDLED;
 }
 
-static void Initdmaqueue(struct adapter *adapter)
+static void init_dma_queue(struct adapter *adapter)
 {
 	dma_addr_t dma_addr;
 
@@ -1933,19 +1683,19 @@
 	adapter->dmaq1.tail = 0;
 	adapter->dmaq1.buffer = 0;
 
-	adapter->dmaq1.buffer = pci_alloc_consistent(adapter->pdev, SizeOfBufDMA1 + 0x80, &dma_addr);
+	adapter->dmaq1.buffer = pci_alloc_consistent(adapter->pdev, SIZE_OF_BUF_DMA1 + 0x80, &dma_addr);
 
 	if (adapter->dmaq1.buffer != 0) {
-		memset(adapter->dmaq1.buffer, 0, SizeOfBufDMA1);
+		memset(adapter->dmaq1.buffer, 0, SIZE_OF_BUF_DMA1);
 
 		adapter->dmaq1.bus_addr = dma_addr;
-		adapter->dmaq1.buffer_size = SizeOfBufDMA1;
+		adapter->dmaq1.buffer_size = SIZE_OF_BUF_DMA1;
 
-		DmaInitDMA(adapter, 0);
+		dma_init_dma(adapter, 0);
 
 		adapter->dma_status = adapter->dma_status | 0x10000000;
 
-		dprintk("%s: allocated dma buffer at 0x%p, length=%d\n", __FUNCTION__, adapter->dmaq1.buffer, SizeOfBufDMA1);
+		ddprintk("%s: allocated dma buffer at 0x%p, length=%d\n", __FUNCTION__, adapter->dmaq1.buffer, SIZE_OF_BUF_DMA1);
 
 	} else {
 
@@ -1959,19 +1709,19 @@
 	adapter->dmaq2.tail = 0;
 	adapter->dmaq2.buffer = 0;
 
-	adapter->dmaq2.buffer = pci_alloc_consistent(adapter->pdev, SizeOfBufDMA2 + 0x80, &dma_addr);
+	adapter->dmaq2.buffer = pci_alloc_consistent(adapter->pdev, SIZE_OF_BUF_DMA2 + 0x80, &dma_addr);
 
 	if (adapter->dmaq2.buffer != 0) {
-		memset(adapter->dmaq2.buffer, 0, SizeOfBufDMA2);
+		memset(adapter->dmaq2.buffer, 0, SIZE_OF_BUF_DMA2);
 
 		adapter->dmaq2.bus_addr = dma_addr;
-		adapter->dmaq2.buffer_size = SizeOfBufDMA2;
+		adapter->dmaq2.buffer_size = SIZE_OF_BUF_DMA2;
 
-		DmaInitDMA(adapter, 1);
+		dma_init_dma(adapter, 1);
 
 		adapter->dma_status = adapter->dma_status | 0x20000000;
 
-		dprintk("%s: allocated dma buffer at 0x%p, length=%d\n", __FUNCTION__, adapter->dmaq2.buffer, (int) SizeOfBufDMA2);
+		ddprintk("%s: allocated dma buffer at 0x%p, length=%d\n", __FUNCTION__, adapter->dmaq2.buffer, (int) SIZE_OF_BUF_DMA2);
 
 	} else {
 
@@ -1979,10 +1729,10 @@
 	}
 }
 
-static void Freedmaqueue(struct adapter *adapter)
+static void free_dma_queue(struct adapter *adapter)
 {
 	if (adapter->dmaq1.buffer != 0) {
-		pci_free_consistent(adapter->pdev, SizeOfBufDMA1 + 0x80, adapter->dmaq1.buffer, adapter->dmaq1.bus_addr);
+		pci_free_consistent(adapter->pdev, SIZE_OF_BUF_DMA1 + 0x80, adapter->dmaq1.buffer, adapter->dmaq1.bus_addr);
 
 		adapter->dmaq1.bus_addr = 0;
 		adapter->dmaq1.head = 0;
@@ -1992,7 +1742,7 @@
 	}
 
 	if (adapter->dmaq2.buffer != 0) {
-		pci_free_consistent(adapter->pdev, SizeOfBufDMA2 + 0x80, adapter->dmaq2.buffer, adapter->dmaq2.bus_addr);
+		pci_free_consistent(adapter->pdev, SIZE_OF_BUF_DMA2 + 0x80, adapter->dmaq2.buffer, adapter->dmaq2.bus_addr);
 
 		adapter->dmaq2.bus_addr = 0;
 		adapter->dmaq2.head = 0;
@@ -2002,16 +1752,16 @@
 	}
 }
 
-static void FreeAdapterObject(struct adapter *adapter)
+static void free_adapter_object(struct adapter *adapter)
 {
 	dprintk("%s:\n", __FUNCTION__);
 
-	CloseStream(adapter, 0);
+	close_stream(adapter, 0);
 
 	if (adapter->irq != 0)
 		free_irq(adapter->irq, adapter);
 
-	Freedmaqueue(adapter);
+	free_dma_queue(adapter);
 
 	if (adapter->io_mem != 0)
 		iounmap((void *) adapter->io_mem);
@@ -2022,7 +1772,7 @@
 
 static struct pci_driver skystar2_pci_driver;
 
-static int ClaimAdapter(struct adapter *adapter)
+static int claim_adapter(struct adapter *adapter)
 {
 	struct pci_dev *pdev = adapter->pdev;
 
@@ -2062,20 +1812,58 @@
 }
 
 /*
-static int SLL_reset_FlexCOP(struct adapter *adapter)
+static int sll_reset_flexcop(struct adapter *adapter)
 {
-	WriteRegDW(adapter, 0x208, 0);
-	WriteRegDW(adapter, 0x210, 0xB2FF);
+	write_reg_dw(adapter, 0x208, 0);
+	write_reg_dw(adapter, 0x210, 0xb2ff);
 
 	return 0;
 }
 */
 
-static int DriverInitialize(struct pci_dev * pdev)
+static void decide_how_many_hw_filters(struct adapter *adapter)
+{
+	int hw_filters;
+	int mod_option_hw_filters;
+
+	// FlexCop IIb & III have 6+32 hw filters    
+	// FlexCop II has 6 hw filters, every other should have at least 6
+	switch (adapter->b2c2_revision) {
+	case 0x82:		/* II */
+		hw_filters = 6;
+		break;
+	case 0xc3:		/* IIB */
+		hw_filters = 6 + 32;
+		break;
+	case 0xc0:		/* III */
+		hw_filters = 6 + 32;
+		break;
+	default:
+		hw_filters = 6;
+		break;
+	}
+	printk("%s: the chip has %i hardware filters", __FILE__, hw_filters);
+
+	mod_option_hw_filters = 0;
+	if (enable_hw_filters >= 1)
+		mod_option_hw_filters += 6;
+	if (enable_hw_filters >= 2)
+		mod_option_hw_filters += 32;
+
+	if (mod_option_hw_filters >= hw_filters) {
+		adapter->useable_hw_filters = hw_filters;
+	} else {
+		adapter->useable_hw_filters = mod_option_hw_filters;
+		printk(", but only %d will be used because of module option", mod_option_hw_filters);
+	}
+	printk("\n");
+	dprintk("%s: useable_hardware_filters set to %i\n", __FILE__, adapter->useable_hw_filters);
+}
+
+static int driver_initialize(struct pci_dev *pdev)
 {
 	struct adapter *adapter;
 	u32 tmp;
-	u8 key[16];
 
 	if (!(adapter = kmalloc(sizeof(struct adapter), GFP_KERNEL))) {
 		dprintk("%s: out of memory!\n", __FUNCTION__);
@@ -2090,113 +1878,114 @@
 	adapter->pdev = pdev;
 	adapter->irq = pdev->irq;
 
-	if ((ClaimAdapter(adapter)) != 1) {
-		FreeAdapterObject(adapter);
+	if ((claim_adapter(adapter)) != 1) {
+		free_adapter_object(adapter);
 
 		return -ENODEV;
 	}
 
-	IrqDmaEnableDisableIrq(adapter, 0);
+	irq_dma_enable_disable_irq(adapter, 0);
 
 	if (request_irq(pdev->irq, isr, 0x4000000, "Skystar2", adapter) != 0) {
 		dprintk("%s: unable to allocate irq=%d !\n", __FUNCTION__, pdev->irq);
 
-		FreeAdapterObject(adapter);
+		free_adapter_object(adapter);
 
 		return -ENODEV;
 	}
 
-	ReadRegDW(adapter, 0x208);
-	WriteRegDW(adapter, 0x208, 0);
-	WriteRegDW(adapter, 0x210, 0xB2FF);
-	WriteRegDW(adapter, 0x208, 0x40);
-
-	InitPIDsInfo(adapter);
-
-	PidSetGroupPID(adapter, 0);
-	PidSetGroupMASK(adapter, 0x1FE0);
-	PidSetStream1PID(adapter, 0x1FFF);
-	PidSetStream2PID(adapter, 0x1FFF);
-	PidSetPmtPID(adapter, 0x1FFF);
-	PidSetPcrPID(adapter, 0x1FFF);
-	PidSetEcmPID(adapter, 0x1FFF);
-	PidSetEmmPID(adapter, 0x1FFF);
+	read_reg_dw(adapter, 0x208);
+	write_reg_dw(adapter, 0x208, 0);
+	write_reg_dw(adapter, 0x210, 0xb2ff);
+	write_reg_dw(adapter, 0x208, 0x40);
 
-	Initdmaqueue(adapter);
+	init_dma_queue(adapter);
 
 	if ((adapter->dma_status & 0x30000000) == 0) {
-		FreeAdapterObject(adapter);
+		free_adapter_object(adapter);
 
 		return -ENODEV;
 	}
 
-	adapter->b2c2_revision = (ReadRegDW(adapter, 0x204) >> 0x18);
-
-	if ((adapter->b2c2_revision != 0x82) && (adapter->b2c2_revision != 0xC3))
-		if (adapter->b2c2_revision != 0x82) {
-			dprintk("%s: The revision of the FlexCopII chip on your card is - %d\n", __FUNCTION__, adapter->b2c2_revision);
-			dprintk("%s: This driver works now only with FlexCopII(rev.130) and FlexCopIIB(rev.195).\n", __FUNCTION__);
-
-			FreeAdapterObject(adapter);
+	adapter->b2c2_revision = (read_reg_dw(adapter, 0x204) >> 0x18);
 
+	switch (adapter->b2c2_revision) {
+	case 0x82:
+		printk("%s: FlexCopII(rev.130) chip found\n", __FILE__);
+		break;
+	case 0xc3:
+		printk("%s: FlexCopIIB(rev.195) chip found\n", __FILE__);
+		break;
+	case 0xc0:
+		printk("%s: FlexCopIII(rev.192) chip found\n", __FILE__);
+		break;
+	default:
+		printk("%s: The revision of the FlexCop chip on your card is %d\n", __FILE__, adapter->b2c2_revision);
+		printk("%s: This driver works only with FlexCopII(rev.130), FlexCopIIB(rev.195) and FlexCopIII(rev.192).\n", __FILE__);
+		free_adapter_object(adapter);
+		pci_set_drvdata(pdev, NULL);
+		release_region(pci_resource_start(pdev, 1), pci_resource_len(pdev, 1));
+		release_mem_region(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0));
 			return -ENODEV;
 		}
 
-	tmp = ReadRegDW(adapter, 0x204);
+	decide_how_many_hw_filters(adapter);
 
-	WriteRegDW(adapter, 0x204, 0);
+	init_pids(adapter);
+
+	tmp = read_reg_dw(adapter, 0x204);
+
+	write_reg_dw(adapter, 0x204, 0);
 	mdelay(20);
 
-	WriteRegDW(adapter, 0x204, tmp);
+	write_reg_dw(adapter, 0x204, tmp);
 	mdelay(10);
 
-	tmp = ReadRegDW(adapter, 0x308);
-	WriteRegDW(adapter, 0x308, 0x4000 | tmp);
+	tmp = read_reg_dw(adapter, 0x308);
+	write_reg_dw(adapter, 0x308, 0x4000 | tmp);
 
-	adapter->dwSramType = 0x10000;
+	adapter->dw_sram_type = 0x10000;
 
-	SLL_detectSramSize(adapter);
+	sll_detect_sram_size(adapter);
 
-	dprintk("%s sram length = %d, sram type= %x\n", __FUNCTION__, SRAM_length(adapter), adapter->dwSramType);
+	dprintk("%s sram length = %d, sram type= %x\n", __FUNCTION__, sram_length(adapter), adapter->dw_sram_type);
 
-	SRAMSetMediaDest(adapter, 1);
-	SRAMSetNetDest(adapter, 1);
+	sram_set_media_dest(adapter, 1);
+	sram_set_net_dest(adapter, 1);
 
-	CtrlEnableSmc(adapter, 0);
+	ctrl_enable_smc(adapter, 0);
 
-	SRAMSetCaiDest(adapter, 2);
-	SRAMSetCaoDest(adapter, 2);
+	sram_set_cai_dest(adapter, 2);
+	sram_set_cao_dest(adapter, 2);
 
-	DmaEnableDisableIrq(adapter, 1, 0, 0);
+	dma_enable_disable_irq(adapter, 1, 0, 0);
 
-	if (EEPROM_getMacAddr(adapter, 0, adapter->mac_addr) != 0) {
-		printk("%s MAC address = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x \n", __FUNCTION__, adapter->mac_addr[0], adapter->mac_addr[1], adapter->mac_addr[2], adapter->mac_addr[3], adapter->mac_addr[4], adapter->mac_addr[5], adapter->mac_addr[6], adapter->mac_addr[7]
+	if (eeprom_get_mac_addr(adapter, 0, adapter->mac_addr) != 0) {
+		printk("%s MAC address = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x \n", __FUNCTION__, adapter->mac_addr[0],
+		       adapter->mac_addr[1], adapter->mac_addr[2], adapter->mac_addr[3], adapter->mac_addr[4], adapter->mac_addr[5],
+		       adapter->mac_addr[6], adapter->mac_addr[7]
 		    );
 
-		CASetMacDstAddrFilter(adapter, adapter->mac_addr);
-		CtrlEnableMAC(adapter, 1);
+		ca_set_mac_dst_addr_filter(adapter, adapter->mac_addr);
+		ctrl_enable_mac(adapter, 1);
 	}
 
-	EEPROM_readKey(adapter, key, 16);
-
-	printk("%s key = \n %02x %02x %02x %02x \n %02x %02x %02x %02x \n %02x %02x %02x %02x \n %02x %02x %02x %02x \n", __FUNCTION__, key[0], key[1], key[2], key[3], key[4], key[5], key[6], key[7], key[8], key[9], key[10], key[11], key[12], key[13], key[14], key[15]);
-
 	adapter->lock = SPIN_LOCK_UNLOCKED;
 
 	return 0;
 }
 
-static void DriverHalt(struct pci_dev *pdev)
+static void driver_halt(struct pci_dev *pdev)
 {
 	struct adapter *adapter;
 
 	adapter = pci_get_drvdata(pdev);
 
-	IrqDmaEnableDisableIrq(adapter, 0);
+	irq_dma_enable_disable_irq(adapter, 0);
 
-	CtrlEnableReceiveData(adapter, 0);
+	ctrl_enable_receive_data(adapter, 0);
 
-	FreeAdapterObject(adapter);
+	free_adapter_object(adapter);
 
 	pci_set_drvdata(pdev, NULL);
 
@@ -2212,7 +2001,7 @@
 
 	dprintk("%s: PID=%d, type=%d\n", __FUNCTION__, dvbdmxfeed->pid, dvbdmxfeed->type);
 
-	OpenStream(adapter, dvbdmxfeed->pid);
+	open_stream(adapter, dvbdmxfeed->pid);
 
 	return 0;
 }
@@ -2224,7 +2013,7 @@
 
 	dprintk("%s: PID=%d, type=%d\n", __FUNCTION__, dvbdmxfeed->pid, dvbdmxfeed->type);
 
-	CloseStream(adapter, dvbdmxfeed->pid);
+	close_stream(adapter, dvbdmxfeed->pid);
 
 	return 0;
 }
@@ -2232,23 +2021,23 @@
 /* lnb control */
 static void set_tuner_tone(struct adapter *adapter, u8 tone)
 {
-	u16 wzHalfPeriodFor45MHz[] = { 0x01FF, 0x0154, 0x00FF, 0x00CC };
+	u16 wz_half_period_for_45_mhz[] = { 0x01ff, 0x0154, 0x00ff, 0x00cc };
 	u16 ax;
 
 	dprintk("%s: %u\n", __FUNCTION__, tone);
 
 	switch (tone) {
 	case 1:
-		ax = wzHalfPeriodFor45MHz[0];
+		ax = wz_half_period_for_45_mhz[0];
 		break;
 	case 2:
-		ax = wzHalfPeriodFor45MHz[1];
+		ax = wz_half_period_for_45_mhz[1];
 		break;
 	case 3:
-		ax = wzHalfPeriodFor45MHz[2];
+		ax = wz_half_period_for_45_mhz[2];
 		break;
 	case 4:
-		ax = wzHalfPeriodFor45MHz[3];
+		ax = wz_half_period_for_45_mhz[3];
 		break;
 
 	default:
@@ -2256,11 +2045,11 @@
 	}
 
 	if (ax != 0) {
-		WriteRegDW(adapter, 0x200, ((ax << 0x0F) + (ax & 0x7FFF)) | 0x40000000);
+		write_reg_dw(adapter, 0x200, ((ax << 0x0f) + (ax & 0x7fff)) | 0x40000000);
 
 	} else {
 
-		WriteRegDW(adapter, 0x200, 0x40FF8000);
+		write_reg_dw(adapter, 0x200, 0x40ff8000);
 	}
 }
 
@@ -2270,7 +2059,7 @@
 
 	dprintk("%s : polarity = %u \n", __FUNCTION__, polarity);
 
-	var = ReadRegDW(adapter, 0x204);
+	var = read_reg_dw(adapter, 0x204);
 
 	if (polarity == 0) {
 		dprintk("%s: LNB power off\n", __FUNCTION__);
@@ -2287,82 +2076,150 @@
 		var = var | 4;
 	}
 
-	WriteRegDW(adapter, 0x204, var);
+	write_reg_dw(adapter, 0x204, var);
 }
 
-static int flexcop_diseqc_ioctl(struct dvb_frontend *fe, unsigned int cmd, void *arg)
+static void diseqc_send_bit(struct adapter *adapter, int data)
 {
-	struct adapter *adapter = fe->before_after_data;
+	set_tuner_tone(adapter, 1);
+	udelay(data ? 500 : 1000);
+	set_tuner_tone(adapter, 0);
+	udelay(data ? 1000 : 500);
+}
 
-	switch (cmd) {
-	case FE_SLEEP:
+
+static void diseqc_send_byte(struct adapter *adapter, int data)
 		{
-			printk("%s: FE_SLEEP\n", __FUNCTION__);
+	int i, par = 1, d;
 
-			set_tuner_polarity(adapter, 0);
+	for (i = 7; i >= 0; i--) {
+		d = (data >> i) & 1;
+		par ^= d;
+		diseqc_send_bit(adapter, d);
+	}
 
-			// return -EOPNOTSUPP, to make DVB core also send "FE_SLEEP" command to frontend.
-			return -EOPNOTSUPP;
+	diseqc_send_bit(adapter, par);
 		}
 
-	case FE_SET_VOLTAGE:
-		{
-			dprintk("%s: FE_SET_VOLTAGE\n", __FUNCTION__);
 
-			switch ((fe_sec_voltage_t) arg) {
-			case SEC_VOLTAGE_13:
+static int send_diseqc_msg(struct adapter *adapter, int len, u8 *msg, unsigned long burst)
+{
+	int i;
 
-				printk("%s: SEC_VOLTAGE_13, %x\n", __FUNCTION__, SEC_VOLTAGE_13);
+	set_tuner_tone(adapter, 0);
+	mdelay(16);
 
-				set_tuner_polarity(adapter, 1);
+	for (i = 0; i < len; i++)
+		diseqc_send_byte(adapter, msg[i]);
 
-				break;
+	mdelay(16);
 
-			case SEC_VOLTAGE_18:
+	if (burst != -1) {
+		if (burst)
+			diseqc_send_byte(adapter, 0xff);
+		else {
+			set_tuner_tone(adapter, 1);
+			udelay(12500);
+			set_tuner_tone(adapter, 0);
+		}
+		dvb_delay(20);
+	}
 
-				printk("%s: SEC_VOLTAGE_18, %x\n", __FUNCTION__, SEC_VOLTAGE_18);
+	return 0;
+}
 
-				set_tuner_polarity(adapter, 2);
 
+int soft_diseqc(struct adapter *adapter, unsigned int cmd, void *arg)
+{
+	switch (cmd) {
+	case FE_SET_TONE:
+		switch ((fe_sec_tone_mode_t) arg) {
+		case SEC_TONE_ON:
+			set_tuner_tone(adapter, 1);
+			break;
+		case SEC_TONE_OFF:
+			set_tuner_tone(adapter, 0);
 				break;
-
 			default:
-
 				return -EINVAL;
 			};
+		break;
 
+	case FE_DISEQC_SEND_MASTER_CMD:
+		{
+			struct dvb_diseqc_master_cmd *cmd = arg;
+
+			send_diseqc_msg(adapter, cmd->msg_len, cmd->msg, 0);
 			break;
 		}
 
-	case FE_SET_TONE:
+	case FE_DISEQC_SEND_BURST:
+		send_diseqc_msg(adapter, 0, NULL, (unsigned long) arg);
+		break;
+
+	default:
+		return -EOPNOTSUPP;
+	};
+
+	return 0;
+}
+
+static int flexcop_diseqc_ioctl(struct dvb_frontend *fe, unsigned int cmd, void *arg)
 		{
-			dprintk("%s: FE_SET_TONE\n", __FUNCTION__);
+	struct adapter *adapter = fe->before_after_data;
 
-			switch ((fe_sec_tone_mode_t) arg) {
-			case SEC_TONE_ON:
+	struct dvb_frontend_info info;
 
-				printk("%s: SEC_TONE_ON, %x\n", __FUNCTION__, SEC_TONE_ON);
+	fe->ioctl(fe, FE_GET_INFO, &info);
 
-				set_tuner_tone(adapter, 1);
+	// we must use different DiSEqC hw
 
-				break;
+	if (strcmp(info.name, "Zarlink MT312") == 0) {
+		//VP310 using mt312 driver for tuning only: diseqc not wired
+		//use FCII instead
+		if (!soft_diseqc(adapter, cmd, arg))
+			return 0;
+	}
 
-			case SEC_TONE_OFF:
+	switch (cmd) {
+	case FE_SLEEP:
+		{
+			dprintk("%s: FE_SLEEP\n", __FUNCTION__);
 
-				printk("%s: SEC_TONE_OFF, %x\n", __FUNCTION__, SEC_TONE_OFF);
+			set_tuner_polarity(adapter, 0);
 
-				set_tuner_tone(adapter, 0);
+			// return -EOPNOTSUPP, to make DVB core also send "FE_SLEEP" command to frontend.
+			return -EOPNOTSUPP;
+		}
 
-				break;
+	case FE_SET_VOLTAGE:
+		{
+			dprintk("%s: FE_SET_VOLTAGE\n", __FUNCTION__);
+
+			switch ((fe_sec_voltage_t) arg) {
+			case SEC_VOLTAGE_13:
+
+				dprintk("%s: SEC_VOLTAGE_13, %x\n", __FUNCTION__, SEC_VOLTAGE_13);
+
+				set_tuner_polarity(adapter, 1);
+
+				return 0;
+
+			case SEC_VOLTAGE_18:
+
+				dprintk("%s: SEC_VOLTAGE_18, %x\n", __FUNCTION__, SEC_VOLTAGE_18);
+
+				set_tuner_polarity(adapter, 2);
+
+				return 0;
 
 			default:
 
 				return -EINVAL;
 			};
-
-			break;
 		}
 
+
 	default:
 
 		return -EOPNOTSUPP;
@@ -2382,7 +2239,7 @@
 	if (pdev == NULL)
 		return -ENODEV;
 
-	if (DriverInitialize(pdev) != 0)
+	if (driver_initialize(pdev) != 0)
 		return -ENODEV;
 
 	dvb_register_adapter(&dvb_adapter, skystar2_pci_driver.name);
@@ -2390,7 +2247,7 @@
 	if (dvb_adapter == NULL) {
 		printk("%s: Error registering DVB adapter\n", __FUNCTION__);
 
-		DriverHalt(pdev);
+		driver_halt(pdev);
 
 		return -ENODEV;
 	}
@@ -2411,8 +2268,8 @@
 	dvbdemux = &adapter->demux;
 
 	dvbdemux->priv = (void *) adapter;
-	dvbdemux->filternum = 32;
-	dvbdemux->feednum = 32;
+	dvbdemux->filternum = N_PID_SLOTS;
+	dvbdemux->feednum = N_PID_SLOTS;
 	dvbdemux->start_feed = dvb_start_feed;
 	dvbdemux->stop_feed = dvb_stop_feed;
 	dvbdemux->write_to_decoder = 0;
@@ -2422,7 +2279,7 @@
 
 	adapter->hw_frontend.source = DMX_FRONTEND_0;
 
-	adapter->dmxdev.filternum = 32;
+	adapter->dmxdev.filternum = N_PID_SLOTS;
 	adapter->dmxdev.demux = &dvbdemux->dmx;
 	adapter->dmxdev.capabilities = 0;
 
@@ -2475,13 +2332,13 @@
 
 			dvb_unregister_adapter(adapter->dvb_adapter);
 		}
-
-		DriverHalt(pdev);
+		driver_halt(pdev);
 	}
 }
 
 static struct pci_device_id skystar2_pci_tbl[] = {
-	{0x000013D0, 0x00002103, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000},
+	{0x000013d0, 0x00002103, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000},
+	{0x000013d0, 0x00002200, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000},	//FCIII
 	{0,},
 };
 
@@ -2505,5 +2362,10 @@
 module_init(skystar2_init);
 module_exit(skystar2_cleanup);
 
+MODULE_PARM(debug, "i");
+MODULE_PARM_DESC(debug, "enable verbose debug messages: supported values: 1 and 2");
+MODULE_PARM(enable_hw_filters, "i");
+MODULE_PARM_DESC(enable_hw_filters, "enable hardware filters: supported values: 0 (none), 1, 2");
+
 MODULE_DESCRIPTION("Technisat SkyStar2 DVB PCI Driver");
 MODULE_LICENSE("GPL");
--- diff/drivers/media/dvb/dvb-core/demux.h	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/media/dvb/dvb-core/demux.h	2003-12-29 09:30:40.000000000 +0000
@@ -44,6 +44,15 @@
 #endif 
 
 /*
+ * DMX_MAX_SECFEED_SIZE: Maximum length (in bytes) of a private section feed filter.
+ */ 
+
+#ifndef DMX_MAX_SECFEED_SIZE 
+#define DMX_MAX_SECFEED_SIZE 4096
+#endif 
+
+
+/*
  * enum dmx_success: Success codes for the Demux Callback API. 
  */ 
 
@@ -143,9 +152,9 @@
         int check_crc;
 	u32 crc_val;
 
-        u8 secbuf[4096];
-        int secbufp;
-        int seclen;
+        u8 *secbuf;
+        u8 secbuf_base[DMX_MAX_SECFEED_SIZE];
+        u16 secbufp, seclen, tsfeedp;
 
         int (*set) (struct dmx_section_feed* feed, 
 		    u16 pid, 
--- diff/drivers/media/dvb/dvb-core/dvb_demux.c	2003-10-27 09:20:43.000000000 +0000
+++ source/drivers/media/dvb/dvb-core/dvb_demux.c	2003-12-29 09:30:40.000000000 +0000
@@ -34,6 +34,11 @@
 #include "dvb_functions.h"
 
 #define NOBUFS  
+/* 
+** #define DVB_DEMUX_SECTION_LOSS_LOG to monitor payload loss in the syslog
+*/
+// #define DVB_DEMUX_SECTION_LOSS_LOG
+
 
 LIST_HEAD(dmx_muxs);
 
@@ -87,7 +92,7 @@
 }
 
 
-static inline int payload(const u8 *tsp)
+static inline u8 payload(const u8 *tsp)
 {
 	if (!(tsp[3]&0x10)) // no payload?
 		return 0;
@@ -188,9 +193,7 @@
 	struct dvb_demux_filter *f = feed->filter;
 	struct dmx_section_feed *sec = &feed->feed.sec;
 	u8 *buf = sec->secbuf;
-
-	if (sec->secbufp != sec->seclen)
-		return -1;
+	int section_syntax_indicator;
 
 	if (!sec->is_filtering)
 		return 0;
@@ -198,15 +201,19 @@
 	if (!f)
 		return 0;
 
-	if (sec->check_crc && demux->check_crc32(feed, sec->secbuf, sec->seclen))
+	if (sec->check_crc) {
+		section_syntax_indicator = ((sec->secbuf[1] & 0x80) != 0);
+		if (section_syntax_indicator &&
+		    demux->check_crc32(feed, sec->secbuf, sec->seclen))
 		return -1;
+	}
 
 	do {
 		if (dvb_dmx_swfilter_sectionfilter(feed, f) < 0)
 			return -1;
 	} while ((f = f->next) && sec->is_filtering);
 
-	sec->secbufp = sec->seclen = 0;
+	sec->seclen = 0;
 
 	memset(buf, 0, DVB_DEMUX_MASK_MAX);
  
@@ -214,128 +221,147 @@
 }
 
 
-static int dvb_dmx_swfilter_section_packet(struct dvb_demux_feed *feed, const u8 *buf) 
+static void dvb_dmx_swfilter_section_new(struct dvb_demux_feed *feed)
 {
-	struct dvb_demux *demux = feed->demux;
 	struct dmx_section_feed *sec = &feed->feed.sec;
-	int p, count;
-	int ccok, rest;
-	u8 cc;
-
-	if (!(count = payload(buf)))
-		return -1;
-
-	p = 188-count;
-
-	cc = buf[3] & 0x0f;
-	ccok = ((feed->cc+1) & 0x0f) == cc ? 1 : 0;
-	feed->cc = cc;
-
-	if (buf[1] & 0x40) { // PUSI set
-		// offset to start of first section is in buf[p] 
-		if (p+buf[p]>187) // trash if it points beyond packet
-			return -1;
-
-		if (buf[p] && ccok) { // rest of previous section?
-			// did we have enough data in last packet to calc length?
-			int tmp = 3 - sec->secbufp;
 
-			if (tmp > 0 && tmp != 3) {
-				if (p + tmp >= 187)
-					return -1;
-
-				demux->memcopy (feed, sec->secbuf+sec->secbufp,
-					       buf+p+1, tmp);
-
-				sec->seclen = section_length(sec->secbuf);
-
-				if (sec->seclen > 4096) 
-					return -1;
+#ifdef DVB_DEMUX_SECTION_LOSS_LOG
+	if(sec->secbufp < sec->tsfeedp)
+	{
+		int i, n = sec->tsfeedp - sec->secbufp;
+
+		/* section padding is done with 0xff bytes entirely.
+		** due to speed reasons, we won't check all of them
+		** but just first and last
+		*/
+		if(sec->secbuf[0] != 0xff || sec->secbuf[n-1] != 0xff)
+		{
+			printk("dvb_demux.c section ts padding loss: %d/%d\n", 
+			       n, sec->tsfeedp);
+			printk("dvb_demux.c pad data:");
+			for(i = 0; i < n; i++)
+				printk(" %02x", sec->secbuf[i]);
+			printk("\n");
 			}
-
-			rest = sec->seclen - sec->secbufp;
-
-			if (rest == buf[p] && sec->seclen) {
-				demux->memcopy (feed, sec->secbuf + sec->secbufp,
-					       buf+p+1, buf[p]);
-				sec->secbufp += buf[p];
-				dvb_dmx_swfilter_section_feed(feed);
 			}
-		}
-
-		p += buf[p] + 1; 		// skip rest of last section
-		count = 188 - p;
+#endif
 
-		while (count) {
+	sec->tsfeedp = sec->secbufp = sec->seclen = 0;
+	sec->secbuf = sec->secbuf_base;
+		}
 
-			sec->crc_val = ~0;
+/* 
+** Losless Section Demux 1.4 by Emard
+*/
+static int dvb_dmx_swfilter_section_copy_dump(struct dvb_demux_feed *feed, const u8 *buf, u8 len)
+{
+	struct dvb_demux *demux = feed->demux;
+	struct dmx_section_feed *sec = &feed->feed.sec;
+	u16 limit, seclen, n;
 
-			if ((count>2) && // enough data to determine sec length?
-			    ((sec->seclen = section_length(buf+p)) <= count)) {
-				if (sec->seclen>4096) 
-					return -1;
+	if(sec->tsfeedp >= DMX_MAX_SECFEED_SIZE)
+		return 0;
 
-				demux->memcopy (feed, sec->secbuf, buf+p,
-					       sec->seclen);
+	if(sec->tsfeedp + len > DMX_MAX_SECFEED_SIZE)
+	{
+#ifdef DVB_DEMUX_SECTION_LOSS_LOG
+		printk("dvb_demux.c section buffer full loss: %d/%d\n", 
+		       sec->tsfeedp + len - DMX_MAX_SECFEED_SIZE, DMX_MAX_SECFEED_SIZE);
+#endif
+		len = DMX_MAX_SECFEED_SIZE - sec->tsfeedp;
+	}
 
-				sec->secbufp = sec->seclen;
-				p += sec->seclen;
-				count = 188 - p;
+	if(len <= 0)
+		return 0;
 
-				dvb_dmx_swfilter_section_feed(feed);
+	demux->memcopy(feed, sec->secbuf_base + sec->tsfeedp, buf, len);
+	sec->tsfeedp += len;
 
-				// filling bytes until packet end?
-				if (count && buf[p]==0xff) 
-					count=0;
+	/* -----------------------------------------------------
+	** Dump all the sections we can find in the data (Emard)
+	*/
 
-			} else { // section continues to following TS packet
-				demux->memcopy(feed, sec->secbuf, buf+p, count);
-				sec->secbufp+=count;
-				count=0;
-			}
+	limit = sec->tsfeedp;
+	if(limit > DMX_MAX_SECFEED_SIZE)
+		return -1; /* internal error should never happen */
+
+	/* to be sure always set secbuf */
+	sec->secbuf = sec->secbuf_base + sec->secbufp;
+
+	for(n = 0; sec->secbufp + 2 < limit; n++)
+	{
+		seclen = section_length(sec->secbuf);
+		if(seclen <= 0 || seclen > DMX_MAX_SECFEED_SIZE 
+		   || seclen + sec->secbufp > limit)
+			return 0;
+		sec->seclen = seclen;
+		sec->crc_val = ~0;
+		/* dump [secbuf .. secbuf+seclen) */
+		dvb_dmx_swfilter_section_feed(feed);
+		sec->secbufp += seclen; /* secbufp and secbuf moving together is */
+		sec->secbuf += seclen; /* redundand but saves pointer arithmetic */
 		}
 
 		return 0;
 	}
 
-	// section continued below
-	if (!ccok)
-		return -1;
 
-	if (!sec->secbufp) // any data in last ts packet?
-		return -1;
+static int dvb_dmx_swfilter_section_packet(struct dvb_demux_feed *feed, const u8 *buf) 
+{
+	u8 p, count;
+	int ccok;
+	u8 cc;
 
-	// did we have enough data in last packet to calc section length?
-	if (sec->secbufp < 3) {
-		int tmp = 3 - sec->secbufp;
+	count = payload(buf);
 		
-		if (tmp>count)
+	if (count == 0)  /* count == 0 if no payload or out of range */
 			return -1;
 
-		sec->crc_val = ~0;
-
-		demux->memcopy (feed, sec->secbuf + sec->secbufp, buf+p, tmp);
+	p = 188-count; /* payload start */
 
-		sec->seclen = section_length(sec->secbuf);
-
-		if (sec->seclen > 4096) 
-			return -1;
+	cc = buf[3] & 0x0f;
+	ccok = ((feed->cc+1) & 0x0f) == cc ? 1 : 0;
+	feed->cc = cc;
+	if(ccok == 0)
+	{
+#ifdef DVB_DEMUX_SECTION_LOSS_LOG
+		printk("dvb_demux.c discontinuity detected %d bytes lost\n", count);
+		/* those bytes under sume circumstances will again be reported
+		** in the following dvb_dmx_swfilter_section_new
+		*/
+#endif
+		dvb_dmx_swfilter_section_new(feed);
+		return 0;
 	}
 
-	rest = sec->seclen - sec->secbufp;
-
-	if (rest < 0)
-		return -1;
-
-	if (rest <= count) {	// section completed in this TS packet
-		demux->memcopy (feed, sec->secbuf + sec->secbufp, buf+p, rest);
-		sec->secbufp += rest;
-		dvb_dmx_swfilter_section_feed(feed);
-	} else 	{	// section continues in following ts packet
-		demux->memcopy (feed, sec->secbuf + sec->secbufp, buf+p, count);
-		sec->secbufp += count;
+	if(buf[1] & 0x40)
+	{
+		// PUSI=1 (is set), section boundary is here
+		if(count > 1 && buf[p] < count)
+		{
+			const u8 *before = buf+p+1;
+			u8 before_len = buf[p];
+			const u8 *after = before+before_len;
+			u8 after_len = count-1-before_len;
+
+			dvb_dmx_swfilter_section_copy_dump(feed, before, before_len);
+			dvb_dmx_swfilter_section_new(feed);
+			dvb_dmx_swfilter_section_copy_dump(feed, after, after_len);
+		}
+#ifdef DVB_DEMUX_SECTION_LOSS_LOG
+		else
+			if(count > 0)
+				printk("dvb_demux.c PUSI=1 but %d bytes lost\n", count);
+#endif
 	}
+	else
+	{
+		// PUSI=0 (is not set), no section boundary
+		const u8 *entire = buf+p;
+		u8 entire_len = count;
 
+		dvb_dmx_swfilter_section_copy_dump(feed, entire, entire_len);
+	}
 	return 0;
 }
 
@@ -439,6 +465,50 @@
 	spin_unlock(&demux->lock);
 }
 
+void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf, size_t count)
+{
+	int p = 0,i, j;
+	u8 tmppack[188];
+	spin_lock(&demux->lock);
+
+	if ((i = demux->tsbufp)) {
+		if (count < (j=204-i)) {
+			memcpy(&demux->tsbuf[i], buf, count);
+			demux->tsbufp += count;
+			goto bailout;
+		}
+		memcpy(&demux->tsbuf[i], buf, j);
+		if ((demux->tsbuf[0] == 0x47)|(demux->tsbuf[0]==0xB8))  {
+			memcpy(tmppack, demux->tsbuf, 188);
+			if (tmppack[0] == 0xB8) tmppack[0] = 0x47;
+			dvb_dmx_swfilter_packet(demux, tmppack);
+		}
+		demux->tsbufp = 0;
+		p += j;
+	}
+
+	while (p < count) {
+		if ((buf[p] == 0x47)|(buf[p] == 0xB8)) {
+			if (count-p >= 204) {
+				memcpy(tmppack, buf+p, 188);
+				if (tmppack[0] == 0xB8) tmppack[0] = 0x47;
+				dvb_dmx_swfilter_packet(demux, tmppack);
+				p += 204;
+			} else {
+				i = count-p;
+				memcpy(demux->tsbuf, buf+p, i);
+				demux->tsbufp=i;
+				goto bailout;
+			}
+		} else { 
+			p++;
+		}
+	}
+
+bailout:
+	spin_unlock(&demux->lock);
+}
+
 
 static struct dvb_demux_filter * dvb_dmx_filter_alloc(struct dvb_demux *demux)
 {
@@ -848,6 +918,9 @@
 		up(&dvbdmx->mutex);
 		return -EINVAL;
 	}
+
+	dvbdmxfeed->feed.sec.tsfeedp = 0;
+	dvbdmxfeed->feed.sec.secbuf = dvbdmxfeed->feed.sec.secbuf_base;
 	dvbdmxfeed->feed.sec.secbufp=0;
 	dvbdmxfeed->feed.sec.seclen=0;
 	
@@ -946,7 +1019,9 @@
 	dvbdmxfeed->cb.sec=callback;
 	dvbdmxfeed->demux=dvbdmx;
 	dvbdmxfeed->pid=0xffff;
-	dvbdmxfeed->feed.sec.secbufp=0;
+	dvbdmxfeed->feed.sec.secbuf = dvbdmxfeed->feed.sec.secbuf_base;
+	dvbdmxfeed->feed.sec.secbufp = dvbdmxfeed->feed.sec.seclen = 0;
+	dvbdmxfeed->feed.sec.tsfeedp = 0;
 	dvbdmxfeed->filter=0;
 	dvbdmxfeed->buffer=0;
 
--- diff/drivers/media/dvb/dvb-core/dvb_demux.h	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/media/dvb/dvb-core/dvb_demux.h	2003-12-29 09:30:40.000000000 +0000
@@ -127,7 +127,7 @@
 
 #define DMX_MAX_PID 0x2000
 	struct list_head feed_list;
-        u8 tsbuf[188];
+        u8 tsbuf[204];
         int tsbufp;
 
 	struct semaphore mutex;
@@ -140,6 +140,7 @@
 void dvb_dmx_swfilter_packet(struct dvb_demux *dvbdmx, const u8 *buf);
 void dvb_dmx_swfilter_packets(struct dvb_demux *dvbdmx, const u8 *buf, size_t count);
 void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count);
+void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf, size_t count);
 
 int dvbdmx_connect_frontend(struct dmx_demux *demux, struct dmx_frontend *frontend);
 int dvbdmx_disconnect_frontend(struct dmx_demux *demux);
--- diff/drivers/media/dvb/dvb-core/dvb_filter.c	2003-07-08 09:55:18.000000000 +0100
+++ source/drivers/media/dvb/dvb-core/dvb_filter.c	2003-12-29 09:30:40.000000000 +0000
@@ -564,14 +564,18 @@
 	p2ts->priv=priv;
 }
 
-int dvb_filter_pes2ts(struct dvb_filter_pes2ts *p2ts, unsigned char *pes, int len)
+int dvb_filter_pes2ts(struct dvb_filter_pes2ts *p2ts, unsigned char *pes,
+		      int len, int payload_start)
 {
 	unsigned char *buf=p2ts->buf;
 	int ret=0, rest;
 	
 	//len=6+((pes[4]<<8)|pes[5]);
 
+	if (payload_start)
 	buf[1]|=0x40;
+	else
+		buf[1]&=~0x40;
 	while (len>=184) {
 		buf[3]=0x10|((p2ts->cc++)&0x0f);
 		memcpy(buf+4, pes, 184);
--- diff/drivers/media/dvb/dvb-core/dvb_filter.h	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/media/dvb/dvb-core/dvb_filter.h	2003-12-29 09:30:40.000000000 +0000
@@ -37,7 +37,8 @@
 void dvb_filter_pes2ts_init(struct dvb_filter_pes2ts *p2ts, unsigned short pid, 
 		 	    dvb_filter_pes2ts_cb_t *cb, void *priv);
 
-int dvb_filter_pes2ts(struct dvb_filter_pes2ts *p2ts, unsigned char *pes, int len);
+int dvb_filter_pes2ts(struct dvb_filter_pes2ts *p2ts, unsigned char *pes,
+		      int len, int payload_start);
 
 
 #define PROG_STREAM_MAP  0xBC
--- diff/drivers/media/dvb/dvb-core/dvb_i2c.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/media/dvb/dvb-core/dvb_i2c.c	2003-12-29 09:30:40.000000000 +0000
@@ -51,6 +51,7 @@
 
 	client->detach = dev->detach;
 	client->owner = dev->owner;
+	client->data = dev->data;
 
 	INIT_LIST_HEAD(&client->list_head);
 
--- diff/drivers/media/dvb/dvb-core/dvb_ksyms.c	2003-07-08 09:55:18.000000000 +0100
+++ source/drivers/media/dvb/dvb-core/dvb_ksyms.c	2003-12-29 09:30:40.000000000 +0000
@@ -18,6 +18,7 @@
 EXPORT_SYMBOL(dvb_dmx_swfilter_packet);
 EXPORT_SYMBOL(dvb_dmx_swfilter_packets);
 EXPORT_SYMBOL(dvb_dmx_swfilter);
+EXPORT_SYMBOL(dvb_dmx_swfilter_204);
 EXPORT_SYMBOL(dvbdmx_connect_frontend);
 EXPORT_SYMBOL(dvbdmx_disconnect_frontend);
 
--- diff/drivers/media/dvb/dvb-core/dvb_ringbuffer.c	2003-07-08 09:55:18.000000000 +0100
+++ source/drivers/media/dvb/dvb-core/dvb_ringbuffer.c	2003-12-29 09:30:40.000000000 +0000
@@ -9,24 +9,18 @@
  *                       & Marcus Metzler for convergence integrated media GmbH
  *
  * 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
+ * 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.
  * 
- *
  * 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.
- * 
+ * GNU Lesser General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License
+ * You should have received a copy of the GNU Lesser 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.
- * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
- * 
- *
- * the project's page is at http://www.linuxtv.org/dvb/
  */
 
 
@@ -167,11 +161,11 @@
 }
 
 
-EXPORT_SYMBOL_GPL(dvb_ringbuffer_init);
-EXPORT_SYMBOL_GPL(dvb_ringbuffer_empty);
-EXPORT_SYMBOL_GPL(dvb_ringbuffer_free);
-EXPORT_SYMBOL_GPL(dvb_ringbuffer_avail);
-EXPORT_SYMBOL_GPL(dvb_ringbuffer_flush);
-EXPORT_SYMBOL_GPL(dvb_ringbuffer_flush_spinlock_wakeup);
-EXPORT_SYMBOL_GPL(dvb_ringbuffer_read);
-EXPORT_SYMBOL_GPL(dvb_ringbuffer_write);
+EXPORT_SYMBOL(dvb_ringbuffer_init);
+EXPORT_SYMBOL(dvb_ringbuffer_empty);
+EXPORT_SYMBOL(dvb_ringbuffer_free);
+EXPORT_SYMBOL(dvb_ringbuffer_avail);
+EXPORT_SYMBOL(dvb_ringbuffer_flush);
+EXPORT_SYMBOL(dvb_ringbuffer_flush_spinlock_wakeup);
+EXPORT_SYMBOL(dvb_ringbuffer_read);
+EXPORT_SYMBOL(dvb_ringbuffer_write);
--- diff/drivers/media/dvb/dvb-core/dvb_ringbuffer.h	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/media/dvb/dvb-core/dvb_ringbuffer.h	2003-12-29 09:30:40.000000000 +0000
@@ -16,7 +16,7 @@
  * 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.
+ * GNU Lesser General Public License for more details.
  * 
  * You should have received a copy of the GNU Lesser General Public License
  * along with this program; if not, write to the Free Software
--- diff/drivers/media/dvb/frontends/Kconfig	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/media/dvb/frontends/Kconfig	2003-12-29 09:30:40.000000000 +0000
@@ -1,6 +1,17 @@
 comment "Supported Frontend Modules"
 	depends on DVB
 
+config DVB_TWINHAN_DST
+	tristate "TWINHAN DST based DVB-S frontend (QPSK)"
+	depends on DVB_CORE
+	help
+	  Used in such cards as the VP-1020/1030, Twinhan DST,
+	  VVmer TV@SAT. Say Y when you want to support frontends 
+	  using this asic.
+
+	  This module requires the dvb-bt8xx driver and dvb bt878
+	  module.
+
 config DVB_STV0299
 	tristate "STV0299 based DVB-S frontend (QPSK)"
 	depends on DVB_CORE
@@ -145,3 +156,19 @@
             wget http://www.technotrend.de/new/215/TTweb_215a_budget_20_05_2003.zip
             unzip -j TTweb_215a_budget_20_05_2003.zip Software/Oem/PCI/App/ttlcdacc.dll
             mv ttlcdacc.dll /etc/dvb/tda1004x.bin
+
+config DVB_SP887X_FIRMWARE_FILE
+        string "Full pathname of sp887x firmware file"
+        depends on DVB_SP887X
+        default "/etc/dvb/sc_main.mc"
+        help
+          This driver needs a copy of the Avermedia firmware. The version tested
+	  is part of the Avermedia DVB-T 1.3.26.3 Application. This can be downloaded
+	  from the Avermedia web site.
+	  If the software is installed in Windows the file will be in the
+	  /Program Files/AVerTV DVB-T/ directory and is called sc_main.mc.
+	  Alternatively it can "extracted" from the install cab files but this will have
+	  to be done in windows as I don't know of a linux version of extract.exe.
+	  Copy this file to /etc/dvb/sc_main.mc. With this version of the file the first
+	  10 bytes are discarded and the next 0x4000 loaded. This may change in future
+	  versions.
--- diff/drivers/media/dvb/frontends/Makefile	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/media/dvb/frontends/Makefile	2003-12-29 09:30:40.000000000 +0000
@@ -4,6 +4,7 @@
 
 EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
 
+obj-$(CONFIG_DVB_TWINHAN_DST) += dst.o
 obj-$(CONFIG_DVB_STV0299) += stv0299.o
 obj-$(CONFIG_DVB_ALPS_TDLB7) += alps_tdlb7.o
 obj-$(CONFIG_DVB_ALPS_TDMB7) += alps_tdmb7.o
--- diff/drivers/media/dvb/frontends/alps_tdmb7.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/media/dvb/frontends/alps_tdmb7.c	2003-12-29 09:30:40.000000000 +0000
@@ -159,7 +159,7 @@
 	cx22700_writereg (i2c, 0x00, 0x02);   /*  soft reset */
 	cx22700_writereg (i2c, 0x00, 0x00);
 
-	dvb_delay (HZ/100);
+	dvb_delay(10);
 	
 	for (i=0; i<sizeof(init_tab); i+=2)
 		cx22700_writereg (i2c, init_tab[i], init_tab[i+1]);
@@ -281,15 +281,15 @@
 
 	val = cx22700_readreg (i2c, 0x02);
 
-	if ((val >> 3) > 4)
+	if (((val >> 3) & 0x07) > 4)
 		p->code_rate_HP = FEC_AUTO;
 	else
-		p->code_rate_HP = fec_tab[val >> 3];
+		p->code_rate_HP = fec_tab[(val >> 3) & 0x07];
 
-	if ((val & 0x7) > 4)
+	if ((val & 0x07) > 4)
 		p->code_rate_LP = FEC_AUTO;
 	else
-		p->code_rate_LP = fec_tab[val >> 3];
+		p->code_rate_LP = fec_tab[val & 0x07];
 
 
 	val = cx22700_readreg (i2c, 0x03);
@@ -333,7 +333,7 @@
 		if (sync & 0x10)
 			*status |= FE_HAS_SYNC;
 
-		if (sync & 0x10)
+		if (*status == 0x0f)
 			*status |= FE_HAS_LOCK;
 
 		break;
--- diff/drivers/media/dvb/frontends/cx24110.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/media/dvb/frontends/cx24110.c	2003-12-29 09:30:40.000000000 +0000
@@ -248,7 +248,7 @@
         cx24108_write(i2c,pll);
         cx24110_writereg(i2c,0x56,0x7f);
 
-	dvb_delay(HZ/10); /* wait a moment for the tuner pll to lock */
+	dvb_delay(10); /* wait a moment for the tuner pll to lock */
 
 	/* tuner pll lock can be monitored on GPIO pin 4 of cx24110 */
         while (!(cx24110_readreg(i2c,0x66)&0x20)&&i<1000)
--- diff/drivers/media/dvb/frontends/mt312.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/media/dvb/frontends/mt312.c	2003-12-29 09:30:40.000000000 +0000
@@ -39,11 +39,19 @@
 #define MT312_DEBUG		0
 
 #define MT312_SYS_CLK		90000000UL	/* 90 MHz */
+#define MT312_LPOWER_SYS_CLK	60000000UL	/* 60 MHz */
 #define MT312_PLL_CLK		10000000UL	/* 10 MHz */
 
 /* number of active frontends */
 static int mt312_count = 0;
 
+#if MT312_DEBUG == 0
+#define dprintk(x...)
+#else
+static int debug = 0;
+#define dprintk if(debug == 1) printk
+#endif
+
 static struct dvb_frontend_info mt312_info = {
 	.name = "Zarlink MT312",
 	.type = FE_QPSK,
@@ -86,7 +94,7 @@
 		return -EREMOTEIO;
 	}
 #if MT312_DEBUG
-	{
+	if(debug) {
 		int i;
 		printk(KERN_INFO "R(%d):", reg & 0x7f);
 		for (i = 0; i < count; i++)
@@ -107,7 +115,7 @@
 	struct i2c_msg msg;
 
 #if MT312_DEBUG
-	{
+	if(debug) {
 		int i;
 		printk(KERN_INFO "W(%d):", reg & 0x7f);
 		for (i = 0; i < count; i++)
@@ -205,7 +213,7 @@
 	if (freq < 1550000)
 		buf[3] |= 0x10;
 
-	printk(KERN_INFO "synth dword = %02x%02x%02x%02x\n", buf[0],
+	dprintk(KERN_INFO "synth dword = %02x%02x%02x%02x\n", buf[0],
 	       buf[1], buf[2], buf[3]);
 
 	return mt312_pll_write(i2c, I2C_ADDR_SL1935, buf, sizeof(buf));
@@ -225,7 +233,7 @@
 	if (freq < 1550000)
 		buf[3] |= 0x02;
 
-	printk(KERN_INFO "synth dword = %02x%02x%02x%02x\n", buf[0],
+	dprintk(KERN_INFO "synth dword = %02x%02x%02x%02x\n", buf[0],
 	       buf[1], buf[2], buf[3]);
 
 	return mt312_pll_write(i2c, I2C_ADDR_TSA5059, buf, sizeof(buf));
@@ -236,13 +244,13 @@
 	return mt312_writereg(i2c, RESET, full ? 0x80 : 0x40);
 }
 
-static int mt312_init(struct dvb_i2c_bus *i2c, const long id)
+static int mt312_init(struct dvb_i2c_bus *i2c, const long id, u8 pll)
 {
 	int ret;
 	u8 buf[2];
 
 	/* wake up */
-	if ((ret = mt312_writereg(i2c, CONFIG, 0x8c)) < 0)
+	if ((ret = mt312_writereg(i2c, CONFIG, (pll == 60 ? 0x88 : 0x8c))) < 0)
 		return ret;
 
 	/* wait at least 150 usec */
@@ -252,8 +260,17 @@
 	if ((ret = mt312_reset(i2c, 1)) < 0)
 		return ret;
 
+// Per datasheet, write correct values. 09/28/03 ACCJr.
+// If we don't do this, we won't get FE_HAS_VITERBI in the VP310.
+	{
+		u8 buf_def[8]={0x14, 0x12, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00};
+
+		if ((ret = mt312_write(i2c, VIT_SETUP, buf_def, sizeof(buf_def))) < 0)
+			return ret;
+	}
+
 	/* SYS_CLK */
-	buf[0] = mt312_div(MT312_SYS_CLK * 2, 1000000);
+	buf[0] = mt312_div((pll == 60 ? MT312_LPOWER_SYS_CLK : MT312_SYS_CLK) * 2, 1000000);
 
 	/* DISEQC_RATIO */
 	buf[1] = mt312_div(MT312_PLL_CLK, 15000 * 4);
@@ -370,16 +387,18 @@
 	return mt312_writereg(i2c, DISEQC_MODE, volt_tab[v]);
 }
 
-static int mt312_read_status(struct dvb_i2c_bus *i2c, fe_status_t * s)
+static int mt312_read_status(struct dvb_i2c_bus *i2c, fe_status_t *s, const long id)
 {
 	int ret;
-	u8 status[3];
+	u8 status[3], vit_mode;
 
 	*s = 0;
 
 	if ((ret = mt312_read(i2c, QPSK_STAT_H, status, sizeof(status))) < 0)
 		return ret;
 
+	dprintk(KERN_DEBUG "QPSK_STAT_H: 0x%02x, QPSK_STAT_L: 0x%02x, FEC_STATUS: 0x%02x\n", status[0], status[1], status[2]);
+
 	if (status[0] & 0xc0)
 		*s |= FE_HAS_SIGNAL;	/* signal noise ratio */
 	if (status[0] & 0x04)
@@ -390,6 +409,16 @@
 		*s |= FE_HAS_SYNC;	/* byte align lock */
 	if (status[0] & 0x01)
 		*s |= FE_HAS_LOCK;	/* qpsk lock */
+	// VP310 doesn't have AUTO, so we "implement it here" ACCJr
+	if ((id == ID_VP310) && !(status[0] & 0x01)) {
+		if ((ret = mt312_readreg(i2c, VIT_MODE, &vit_mode)) < 0)
+			return ret;
+		vit_mode ^= 0x40;
+		if ((ret = mt312_writereg(i2c, VIT_MODE, vit_mode)) < 0)
+                	return ret;
+		if ((ret = mt312_writereg(i2c, GO, 0x01)) < 0)
+                	return ret;
+	}
 
 	return 0;
 }
@@ -422,7 +451,7 @@
 
 	*signal_strength = agc;
 
-	printk(KERN_DEBUG "agc=%08x err_db=%hd\n", agc, err_db);
+	dprintk(KERN_DEBUG "agc=%08x err_db=%hd\n", agc, err_db);
 
 	return 0;
 }
@@ -458,7 +487,7 @@
 			      const long id)
 {
 	int ret;
-	u8 buf[5];
+	u8 buf[5], config_val;
 	u16 sr;
 
 	const u8 fec_tab[10] =
@@ -467,6 +496,8 @@
 
 	int (*set_tv_freq)(struct dvb_i2c_bus *i2c, u32 freq, u32 sr);
 
+	dprintk("%s: Freq %d\n", __FUNCTION__, p->frequency);
+
 	if ((p->frequency < mt312_info.frequency_min)
 	    || (p->frequency > mt312_info.frequency_max))
 		return -EINVAL;
@@ -489,6 +520,22 @@
 
 	switch (id) {
 	case ID_VP310:
+	// For now we will do this only for the VP310.
+	// It should be better for the mt312 as well, but tunning will be slower. ACCJr 09/29/03
+		if ((ret = mt312_readreg(i2c, CONFIG, &config_val) < 0))
+			return ret;
+		if (p->u.qpsk.symbol_rate >= 30000000) //Note that 30MS/s should use 90MHz
+		{
+			if ((config_val & 0x0c) == 0x08) //We are running 60MHz
+				if ((ret = mt312_init(i2c, id, (u8) 90)) < 0)
+					return ret;
+		}
+		else
+		{
+			if ((config_val & 0x0c) == 0x0C) //We are running 90MHz
+				if ((ret = mt312_init(i2c, id, (u8) 60)) < 0)
+					return ret;
+		}
 		set_tv_freq = tsa5059_set_tv_freq;
 		break;
 	case ID_MT312:
@@ -562,7 +609,7 @@
 
 		monitor = (buf[0] << 8) | buf[1];
 
-		printk(KERN_DEBUG "sr(auto) = %u\n",
+		dprintk(KERN_DEBUG "sr(auto) = %u\n",
 		       mt312_div(monitor * 15625, 4));
 	} else {
 		if ((ret = mt312_writereg(i2c, MON_CTRL, 0x05)) < 0)
@@ -578,9 +625,9 @@
 
 		sym_rat_op = (buf[0] << 8) | buf[1];
 
-		printk(KERN_DEBUG "sym_rat_op=%d dec_ratio=%d\n",
+		dprintk(KERN_DEBUG "sym_rat_op=%d dec_ratio=%d\n",
 		       sym_rat_op, dec_ratio);
-		printk(KERN_DEBUG "*sr(manual) = %lu\n",
+		dprintk(KERN_DEBUG "*sr(manual) = %lu\n",
 		       (((MT312_PLL_CLK * 8192) / (sym_rat_op + 8192)) *
 			2) - dec_ratio);
 	}
@@ -675,7 +722,7 @@
 		return -EOPNOTSUPP;
 
 	case FE_READ_STATUS:
-		return mt312_read_status(i2c, arg);
+		return mt312_read_status(i2c, arg, (long) fe->data);
 
 	case FE_READ_BER:
 		return mt312_read_bercnt(i2c, arg);
@@ -702,7 +749,12 @@
 		return mt312_sleep(i2c);
 
 	case FE_INIT:
-		return mt312_init(i2c, (long) fe->data);
+	//For the VP310 we should run at 60MHz when ever possible.
+	//It should be better to run the mt312 ar lower speed when ever possible, but tunning will be slower. ACCJr 09/29/03
+		if ((long)fe->data == ID_MT312)
+			return mt312_init(i2c, (long) fe->data, (u8) 90);
+		else
+			return mt312_init(i2c, (long) fe->data, (u8) 60);
 
 	case FE_RESET:
 		return mt312_reset(i2c, 0);
@@ -755,6 +807,11 @@
 module_init(mt312_module_init);
 module_exit(mt312_module_exit);
 
+#if MT312_DEBUG != 0
+MODULE_PARM(debug,"i");
+MODULE_PARM_DESC(debug, "enable verbose debug messages");
+#endif
+
 MODULE_DESCRIPTION("MT312 Satellite Channel Decoder Driver");
 MODULE_AUTHOR("Andreas Oberritter <obi@saftware.de>");
 MODULE_LICENSE("GPL");
--- diff/drivers/media/dvb/frontends/nxt6000.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/media/dvb/frontends/nxt6000.c	2003-12-29 09:30:40.000000000 +0000
@@ -55,34 +55,21 @@
 	.symbol_rate_max = 9360000,	/* FIXME */
 	.symbol_rate_tolerance = 4000,
 	.notifier_delay = 0,
-	.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
-			FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
-			FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO |
-			FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
-			FE_CAN_TRANSMISSION_MODE_AUTO |
-			FE_CAN_GUARD_INTERVAL_AUTO |
-			FE_CAN_HIERARCHY_AUTO,
-
+	.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 | FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO | FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO,
 };
 
-#pragma pack(1)
-
 struct nxt6000_config {
-
 	u8 demod_addr;
 	u8 tuner_addr;
 	u8 tuner_type;
 	u8 clock_inversion;
-
 };
 
-#pragma pack()
-
 #define TUNER_TYPE_ALP510	0
 #define TUNER_TYPE_SP5659	1
 #define TUNER_TYPE_SP5730	2
 
-#define FE2NXT(fe) ((struct nxt6000_config *)&(fe->data))
+#define FE2NXT(fe) ((struct nxt6000_config *)((fe)->data))
 #define FREQ2DIV(freq) ((freq + 36166667) / 166667)
 
 #define dprintk if (debug) printk
@@ -116,8 +103,10 @@
 	int ret;
 	u8 b0[] = {reg};
 	u8 b1[] = {0};
-	struct i2c_msg msgs[] = {{.addr = addr >> 1, .flags = 0, .buf = b0, .len = 1},
-							{.addr = addr >> 1, .flags = I2C_M_RD, .buf = b1, .len = 1}};
+	struct i2c_msg msgs[] = {
+		{.addr = addr >> 1,.flags = 0,.buf = b0,.len = 1},
+		{.addr = addr >> 1,.flags = I2C_M_RD,.buf = b1,.len = 1}
+	};
 
 	ret = i2c->xfer(i2c, msgs, 2);
 	
@@ -394,7 +383,7 @@
 	nxt6000_writereg(fe, OFDM_ITB_FREQ_1, 0x06);
 	nxt6000_writereg(fe, OFDM_ITB_FREQ_2, 0x31);
 	nxt6000_writereg(fe, OFDM_CAS_CTL, (0x01 << 7) | (0x02 << 3) | 0x04);
-	nxt6000_writereg(fe, CAS_FREQ, 0xBB);	// CHECKME
+	nxt6000_writereg(fe, CAS_FREQ, 0xBB);	/* CHECKME */
 	nxt6000_writereg(fe, OFDM_SYR_CTL, 1 << 2);
 	nxt6000_writereg(fe, OFDM_PPM_CTL_1, PPM256);
 	nxt6000_writereg(fe, OFDM_TRL_NOMINALRATE_1, 0x49);
@@ -414,20 +403,20 @@
 
 static void nxt6000_dump_status(struct dvb_frontend *fe)
 {
-
 	u8 val;
 
-//	printk("RS_COR_STAT: 0x%02X\n", nxt6000_readreg(fe, RS_COR_STAT));
-//	printk("VIT_SYNC_STATUS: 0x%02X\n", nxt6000_readreg(fe, VIT_SYNC_STATUS));
-//	printk("OFDM_COR_STAT: 0x%02X\n", nxt6000_readreg(fe, OFDM_COR_STAT));
-//	printk("OFDM_SYR_STAT: 0x%02X\n", nxt6000_readreg(fe, OFDM_SYR_STAT));
-//	printk("OFDM_TPS_RCVD_1: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_1));
-//	printk("OFDM_TPS_RCVD_2: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_2));
-//	printk("OFDM_TPS_RCVD_3: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_3));
-//	printk("OFDM_TPS_RCVD_4: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_4));
-//	printk("OFDM_TPS_RESERVED_1: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RESERVED_1));
-//	printk("OFDM_TPS_RESERVED_2: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RESERVED_2));
-
+/*
+	printk("RS_COR_STAT: 0x%02X\n", nxt6000_readreg(fe, RS_COR_STAT));
+	printk("VIT_SYNC_STATUS: 0x%02X\n", nxt6000_readreg(fe, VIT_SYNC_STATUS));
+	printk("OFDM_COR_STAT: 0x%02X\n", nxt6000_readreg(fe, OFDM_COR_STAT));
+	printk("OFDM_SYR_STAT: 0x%02X\n", nxt6000_readreg(fe, OFDM_SYR_STAT));
+	printk("OFDM_TPS_RCVD_1: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_1));
+	printk("OFDM_TPS_RCVD_2: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_2));
+	printk("OFDM_TPS_RCVD_3: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_3));
+	printk("OFDM_TPS_RCVD_4: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_4));
+	printk("OFDM_TPS_RESERVED_1: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RESERVED_1));
+	printk("OFDM_TPS_RESERVED_2: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RESERVED_2));
+*/
 	printk("NXT6000 status:");
 
 	val = nxt6000_readreg(fe, RS_COR_STAT);
@@ -460,13 +449,11 @@
 			break;
 	
 		case 0x03: 
-		
 			printk(" VITERBI CODERATE: 5/6,");
+		break;
 
 		case 0x04: 
-		
 			printk(" VITERBI CODERATE: 7/8,");
-			
 			break;
 
 		default: 
@@ -503,13 +490,11 @@
 			break;
 	
 		case 0x04:
-		
 			printk(" CoreState: WAIT_PPM,");
+		break;
 
 		case 0x01:
-		
 			printk(" CoreState: WAIT_TRL,");
-			
 			break;
 
 		case 0x05:
@@ -586,13 +571,11 @@
 			break;
 	
 		case 0x03: 
-		
 			printk(" TPSLP: 5/6,");
+		break;
 
 		case 0x04: 
-		
 			printk(" TPSLP: 7/8,");
-			
 			break;
 
 		default: 
@@ -622,13 +605,11 @@
 			break;
 	
 		case 0x03: 
-		
 			printk(" TPSHP: 5/6,");
+		break;
 
 		case 0x04: 
-		
 			printk(" TPSHP: 7/8,");
-			
 			break;
 
 		default: 
@@ -669,7 +650,7 @@
 			
 	}
 	
-	// Strange magic required to gain access to RF_AGC_STATUS
+	/* Strange magic required to gain access to RF_AGC_STATUS */
 	nxt6000_readreg(fe, RF_AGC_VAL_1);
 	val = nxt6000_readreg(fe, RF_AGC_STATUS);
 	val = nxt6000_readreg(fe, RF_AGC_STATUS);
@@ -735,21 +716,23 @@
 	
 		case FE_READ_SIGNAL_STRENGTH:
 		{
-//			s16 *signal = (s16 *)arg;
-
-//		*signal=(((signed char)readreg(client, 0x16))+128)<<8;
-
+			s16 *signal = (s16 *) arg;
+/*
+			*signal=(((signed char)readreg(client, 0x16))+128)<<8;
+*/
+			*signal = 0;
 			return 0;
 			
 		}
 	
 		case FE_READ_SNR:
 		{
-//			s16 *snr = (s16 *)arg;
-
-//		*snr=readreg(client, 0x24)<<8;
-//		*snr|=readreg(client, 0x25);
-
+			s16 *snr = (s16 *) arg;
+/*
+			*snr=readreg(client, 0x24)<<8;
+			*snr|=readreg(client, 0x25);
+*/
+			*snr = 0;
 			break;
 		}
 	
@@ -831,70 +814,74 @@
 
 static int nxt6000_attach(struct dvb_i2c_bus *i2c, void **data)
 {
-
 	u8 addr_nr;
 	u8 fe_count = 0;
-	struct nxt6000_config nxt;
+	struct nxt6000_config *pnxt;
 
 	dprintk("nxt6000: attach\n");
 	
+	pnxt = kmalloc(sizeof(demod_addr_tbl)*sizeof(struct nxt6000_config), GFP_KERNEL);
+	if (NULL == pnxt) {
+		dprintk("nxt6000: no memory for private data.\n");
+		return -ENOMEM;
+	}
+	*data = pnxt;
+
 	for (addr_nr = 0; addr_nr < sizeof(demod_addr_tbl); addr_nr++) {
+		struct nxt6000_config *nxt = &pnxt[addr_nr];
 	
 		if (nxt6000_read(i2c, demod_addr_tbl[addr_nr], OFDM_MSC_REV) != NXT6000ASICDEVICE)
 			continue;
 
 		if (pll_write(i2c, demod_addr_tbl[addr_nr], 0xC0, NULL, 0) == 0) {
+			nxt->tuner_addr = 0xC0;
+			nxt->tuner_type = TUNER_TYPE_ALP510;
+			nxt->clock_inversion = 1;
 	
-			nxt.tuner_addr = 0xC0;
-			nxt.tuner_type = TUNER_TYPE_ALP510;
-			nxt.clock_inversion = 1;
-			
-			dprintk("nxt6000: detected TI ALP510 tuner at 0x%02X\n", nxt.tuner_addr);
+			dprintk("nxt6000: detected TI ALP510 tuner at 0x%02X\n", nxt->tuner_addr);
 		
 		} else if (pll_write(i2c, demod_addr_tbl[addr_nr], 0xC2, NULL, 0) == 0) {
+			nxt->tuner_addr = 0xC2;
+			nxt->tuner_type = TUNER_TYPE_SP5659;
+			nxt->clock_inversion = 0;
 
-			nxt.tuner_addr = 0xC2;
-			nxt.tuner_type = TUNER_TYPE_SP5659;
-			nxt.clock_inversion = 0;
-	
-			dprintk("nxt6000: detected MITEL SP5659 tuner at 0x%02X\n", nxt.tuner_addr);
+			dprintk("nxt6000: detected MITEL SP5659 tuner at 0x%02X\n", nxt->tuner_addr);
 		
 		} else if (pll_write(i2c, demod_addr_tbl[addr_nr], 0xC0, NULL, 0) == 0) {
+			nxt->tuner_addr = 0xC0;
+			nxt->tuner_type = TUNER_TYPE_SP5730;
+			nxt->clock_inversion = 0;
 
-			nxt.tuner_addr = 0xC0;
-			nxt.tuner_type = TUNER_TYPE_SP5730;
-			nxt.clock_inversion = 0;
-	
-			dprintk("nxt6000: detected SP5730 tuner at 0x%02X\n", nxt.tuner_addr);
+			dprintk("nxt6000: detected SP5730 tuner at 0x%02X\n", nxt->tuner_addr);
 		
 		} else {
-
 			printk("nxt6000: unable to detect tuner\n");
-
 			continue;	
-		
 		}
 		
-		nxt.demod_addr = demod_addr_tbl[addr_nr];
+		nxt->demod_addr = demod_addr_tbl[addr_nr];
 	  
 		dprintk("nxt6000: attached at %d:%d\n", i2c->adapter->num, i2c->id);
 	
-		dvb_register_frontend(nxt6000_ioctl, i2c, (void *)(*((u32 *)&nxt)), &nxt6000_info);
+		dvb_register_frontend(nxt6000_ioctl, i2c, (void *)nxt, &nxt6000_info);
 		
 		fe_count++;
 	}
 	
-	return (fe_count > 0) ? 0 : -ENODEV;
+	if (fe_count == 0) {
+		kfree(pnxt);
+		return -ENODEV;
+	}
 	
+	return 0;
 }
 
 static void nxt6000_detach(struct dvb_i2c_bus *i2c, void *data)
 {
-
+	struct nxt6000_config *pnxt = (struct nxt6000_config *)data;
 	dprintk("nxt6000: detach\n");
-
 	dvb_unregister_frontend(nxt6000_ioctl, i2c);
-	
+	kfree(pnxt);
 }
 
 static __init int nxt6000_init(void)
--- diff/drivers/media/dvb/frontends/nxt6000.h	2003-05-21 11:50:09.000000000 +0100
+++ source/drivers/media/dvb/frontends/nxt6000.h	2003-12-29 09:30:40.000000000 +0000
@@ -1,45 +1,10 @@
-/**********************************************************************/
- * DRV6000reg.H
+/*
  * Public Include File for DRV6000 users
+ * (ie. NxtWave Communications - NXT6000 demodulator driver)
  *
  * Copyright (C) 2001 NxtWave Communications, Inc.
  *
- * $Log: nxt6000.h,v $
- * Revision 1.2  2003/01/27 12:32:42  fschirmer
- * Lots of bugfixes and new features
- *
- * Revision 1.1  2003/01/21 18:43:09  fschirmer
- * Nxt6000 based frontend driver
- *
- * Revision 1.1  2003/01/03 02:25:45  obi
- * alps tdme7 driver
- *
- * 
- *    Rev 1.10   Jun 12 2002 11:28:02   dkoeger
- * Updated for SA in GUi work
- * 
- *    Rev 1.9   Apr 01 2002 10:38:46   dkoeger
- * Updated for 1.0.31 GUI
- * 
- *    Rev 1.8   Mar 11 2002 10:04:56   dkoeger
- * Updated for 1.0.31 GUI version
- * 
- *    Rev 1.5   Dec 07 2001 14:40:40   dkoeger
- * Updated for 1.0.28 GUI
- * 
- *    Rev 1.4   Nov 13 2001 11:09:00   dkoeger
- * No change.
- * 
- *    Rev 1.3   Aug 23 2001 14:21:02   dkoeger
- * Updated for driver version 2.1.9
- * 
- *    Rev 1.2   Jul 09 2001 09:20:04   dkoeger
- * Updated for 1.0.18
- * 
- *    Rev 1.1   Jun 13 2001 16:14:24   dkoeger
- * Updated to reflect NXT6000 GUI BETA 1.0.11 6/13/2001
- **********************************************************************/
-
+ */
 
 /*  Nxt6000 Register Addresses and Bit Masks */
 
--- diff/drivers/media/dvb/frontends/sp887x.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/media/dvb/frontends/sp887x.c	2003-12-29 09:30:40.000000000 +0000
@@ -1,11 +1,39 @@
+/*
+   Driver for the Microtune 7202D Frontend
+*/
+
+/*
+   This driver needs a copy of the Avermedia firmware. The version tested
+   is part of the Avermedia DVB-T 1.3.26.3 Application. If the software is
+   installed in Windows the file will be in the /Program Files/AVerTV DVB-T/
+   directory and is called sc_main.mc. Alternatively it can "extracted" from
+   the install cab files. Copy this file to /etc/dvb/sc_main.mc.
+   With this version of the file the first 10 bytes are discarded and the
+   next 0x4000 loaded. This may change in future versions.
+ */
 
+#define __KERNEL_SYSCALLS__
+#include <linux/kernel.h>
+#include <linux/vmalloc.h>
 #include <linux/module.h>
 #include <linux/init.h>
+#include <linux/string.h>
+#include <linux/slab.h>
+#include <linux/fs.h>
+#include <linux/unistd.h>
+#include <linux/fcntl.h>
+#include <linux/errno.h>
 #include <linux/i2c.h>
 
+
 #include "dvb_frontend.h"
 #include "dvb_functions.h"
 
+#ifndef DVB_SP887X_FIRMWARE_FILE
+#define DVB_SP887X_FIRMWARE_FILE "/etc/dvb/sc_main.mc"
+#endif
+
+static char *sp887x_firmware = DVB_SP887X_FIRMWARE_FILE;
 
 #if 0
 #define dprintk(x...) printk(x)
@@ -39,7 +67,7 @@
 		FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_RECOVER
 };
 
-
+static int errno;
 
 static
 int i2c_writebytes (struct dvb_frontend *fe, u8 addr, u8 *buf, u8 len)
@@ -112,6 +140,7 @@
 static
 void sp887x_microcontroller_stop (struct dvb_frontend *fe)
 {
+	dprintk("%s\n", __FUNCTION__);
 	sp887x_writereg(fe, 0xf08, 0x000);
 	sp887x_writereg(fe, 0xf09, 0x000);		
 
@@ -123,6 +152,7 @@
 static
 void sp887x_microcontroller_start (struct dvb_frontend *fe)
 {
+	dprintk("%s\n", __FUNCTION__);
 	sp887x_writereg(fe, 0xf08, 0x000);
 	sp887x_writereg(fe, 0xf09, 0x000);		
 
@@ -135,6 +165,7 @@
 void sp887x_setup_agc (struct dvb_frontend *fe)
 {
 	/* setup AGC parameters */
+	dprintk("%s\n", __FUNCTION__);
 	sp887x_writereg(fe, 0x33c, 0x054);
 	sp887x_writereg(fe, 0x33b, 0x04c);
 	sp887x_writereg(fe, 0x328, 0x000);
@@ -152,8 +183,6 @@
 }
 
 
-#include "sp887x_firm.h"
-
 #define BLOCKSIZE 30
 
 /**
@@ -162,14 +191,63 @@
 static
 int sp887x_initial_setup (struct dvb_frontend *fe)
 {
-	u8 buf [BLOCKSIZE];
+	u8 buf [BLOCKSIZE+2];
+	unsigned char *firmware = NULL;
 	int i;
+	int fd;
+	int filesize;
+	int fw_size;
+	mm_segment_t fs;
+
+	dprintk("%s\n", __FUNCTION__);
 
 	/* soft reset */
 	sp887x_writereg(fe, 0xf1a, 0x000);
 
 	sp887x_microcontroller_stop (fe);
 
+	fs = get_fs();
+
+	// Load the firmware
+	set_fs(get_ds());
+	fd = open(sp887x_firmware, 0, 0);
+	if (fd < 0) {
+		printk(KERN_WARNING "%s: Unable to open firmware %s\n", __FUNCTION__,
+		       sp887x_firmware);
+		return -EIO;
+	}
+	filesize = lseek(fd, 0L, 2);
+	if (filesize <= 0) {
+		printk(KERN_WARNING "%s: Firmware %s is empty\n", __FUNCTION__,
+		       sp887x_firmware);
+		sys_close(fd);
+		return -EIO;
+	}
+
+	fw_size = 0x4000;
+
+	// allocate buffer for it
+	firmware = vmalloc(fw_size);
+	if (firmware == NULL) {
+		printk(KERN_WARNING "%s: Out of memory loading firmware\n",
+		       __FUNCTION__);
+		sys_close(fd);
+		return -EIO;
+	}
+
+	// read it!
+	// read the first 16384 bytes from the file
+	// ignore the first 10 bytes
+	lseek(fd, 10, 0);
+	if (read(fd, firmware, fw_size) != fw_size) {
+		printk(KERN_WARNING "%s: Failed to read firmware\n", __FUNCTION__);
+		vfree(firmware);
+		sys_close(fd);
+		return -EIO;
+	}
+	sys_close(fd);
+	set_fs(fs);
+
 	printk ("%s: firmware upload... ", __FUNCTION__);
 
 	/* setup write pointer to -1 (end of memory) */
@@ -179,12 +257,12 @@
 	/* dummy write (wrap around to start of memory) */
 	sp887x_writereg(fe, 0x8f0a, 0x0000);
 
-	for (i=0; i<sizeof(sp887x_firm); i+=BLOCKSIZE) {
+	for (i=0; i<fw_size; i+=BLOCKSIZE) {
 		int c = BLOCKSIZE;
 		int err;
 
-		if (i+c > sizeof(sp887x_firm))
-			c = sizeof(sp887x_firm) - i;
+		if (i+c > fw_size)
+			c = fw_size - i;
 
 		/* bit 0x8000 in address is set to enable 13bit mode */
 		/* bit 0x4000 enables multibyte read/write transfers */
@@ -192,15 +270,18 @@
 		buf[0] = 0xcf;
 		buf[1] = 0x0a;
 
-		memcpy(&buf[2], &sp887x_firm[i], c);
+		memcpy(&buf[2], firmware + i, c);
 
 		if ((err = i2c_writebytes (fe, 0x70, buf, c+2)) < 0) {
 			printk ("failed.\n");
 			printk ("%s: i2c error (err == %i)\n", __FUNCTION__, err);
+			vfree(firmware);
 			return err;
 		}
 	}
 
+	vfree(firmware);
+
 	/* don't write RS bytes between packets */
 	sp887x_writereg(fe, 0xc13, 0x001);
 
--- diff/drivers/media/dvb/frontends/stv0299.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/media/dvb/frontends/stv0299.c	2003-12-29 09:30:40.000000000 +0000
@@ -9,16 +9,23 @@
 	<holger@convergence.de>,
 	<js@convergence.de>
     
+
     Philips SU1278/SH
 
-    Copyright (C) 2002 by Peter Schildmann
-        <peter.schildmann@web.de>
+    Copyright (C) 2002 by Peter Schildmann <peter.schildmann@web.de>
+
 
     LG TDQF-S001F
 
     Copyright (C) 2002 Felix Domke <tmbinc@elitedvb.net>
                      & Andreas Oberritter <andreas@oberritter.de>
 
+
+    Support for Samsung TBMU24112IMB used on Technisat SkyStar2 rev. 2.6B
+
+    Copyright (C) 2003 Vadim Catana <skystar@moldova.cc>:
+
+
     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
@@ -39,6 +46,7 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/string.h>
+#include <asm/div64.h>
 
 #include "dvb_frontend.h"
 #include "dvb_functions.h"
@@ -49,6 +57,11 @@
 #define dprintk(x...)
 #endif
 
+static int stv0299_status = 0;
+
+#define STATUS_BER 0
+#define STATUS_UCBLOCKS 1
+
 
 /* frontend types */
 #define UNKNOWN_FRONTEND  -1
@@ -56,6 +69,7 @@
 #define ALPS_BSRU6         1
 #define LG_TDQF_S001F      2
 #define PHILIPS_SU1278     3
+#define SAMSUNG_TBMU24112IMB    4
 
 /* Master Clock = 88 MHz */
 #define M_CLK (88000000UL) 
@@ -142,6 +156,51 @@
 };
 
 
+static u8 init_tab_samsung [] = {
+	0x01, 0x15,
+	0x02, 0x00,
+	0x03, 0x00,
+	0x04, 0x7D,
+	0x05, 0x35,
+	0x06, 0x02,
+	0x07, 0x00,
+	0x08, 0xC3,
+	0x0C, 0x00,
+	0x0D, 0x81,
+	0x0E, 0x23,
+	0x0F, 0x12,
+	0x10, 0x7E,
+	0x11, 0x84,
+	0x12, 0xB9,
+	0x13, 0x88,
+	0x14, 0x89,
+	0x15, 0xC9,
+	0x16, 0x00,
+	0x17, 0x5C,
+	0x18, 0x00,
+	0x19, 0x00,
+	0x1A, 0x00,
+	0x1C, 0x00,
+	0x1D, 0x00,
+	0x1E, 0x00,
+	0x1F, 0x3A,
+	0x20, 0x2E,
+	0x21, 0x80,
+	0x22, 0xFF,
+	0x23, 0xC1,
+	0x28, 0x00,
+	0x29, 0x1E,
+	0x2A, 0x14,
+	0x2B, 0x0F,
+	0x2C, 0x09,
+	0x2D, 0x05,
+	0x31, 0x1F,
+	0x32, 0x19,
+	0x33, 0xFE,
+	0x34, 0x93
+};
+
+
 static int stv0299_writereg (struct dvb_i2c_bus *i2c, u8 reg, u8 data)
 {
 	int ret;
@@ -169,7 +228,8 @@
 	ret = i2c->xfer (i2c, msg, 2);
         
 	if (ret != 2) 
-		dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret);
+		dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n",
+				__FUNCTION__, reg, ret);
 
 	return b1[0];
 }
@@ -193,18 +253,19 @@
 static int pll_write (struct dvb_i2c_bus *i2c, u8 addr, u8 *data, int len)
 {
 	int ret;
-	u8 rpt1 [] = { 0x05, 0xb5 };  /*  enable i2c repeater on stv0299  */
-	u8 rpt2 [] = { 0x05, 0x35 };  /*  disable i2c repeater on stv0299  */
-	struct i2c_msg msg [] = {{ .addr = 0x68, .flags = 0, .buf = rpt1, .len = 2 },
-			         { addr: addr, .flags = 0, .buf = data, .len = len },
-				 { .addr = 0x68, .flags = 0, .buf = rpt2, .len = 2 }};
+	struct i2c_msg msg = { addr: addr, .flags = 0, .buf = data, .len = len };
 
-	ret = i2c->xfer (i2c, msg, 3);
 
-	if (ret != 3)
-		printk("%s: i/o error (ret == %i)\n", __FUNCTION__, ret);
+	stv0299_writereg(i2c, 0x05, 0xb5);	/*  enable i2c repeater on stv0299  */
 
-	return (ret != 3) ? ret : 0;
+	ret =  i2c->xfer (i2c, &msg, 1);
+
+	stv0299_writereg(i2c, 0x05, 0x35);	/*  disable i2c repeater on stv0299  */
+
+	if (ret != 1)
+		dprintk("%s: i/o error (ret == %i)\n", __FUNCTION__, ret);
+
+	return (ret != 1) ? -1 : 0;
 }
 
 
@@ -213,23 +274,16 @@
 	u8 buf[4];
 	u32 div;
 
-	u32 ratios[] = { 2000, 1000, 500, 250, 125 };
-	u8 ratio;
-
-	for (ratio = 4; ratio > 0; ratio--)
-		if ((freq / ratios[ratio]) <= 0x3fff)
-			break;
+	div = freq / 125;
 
-	div = freq / ratios[ratio];
+	dprintk("%s : freq = %i, div = %i\n", __FUNCTION__, freq, div);
 
-	buf[0] = (freq >> 8) & 0x7f;
-	buf[1] = freq & 0xff;
-	buf[2] = 0x80 | ratio;
+	buf[0] = (div >> 8) & 0x7f;
+	buf[1] = div & 0xff;
+	buf[2] = 0x84;	// 0xC4
+	buf[3] = 0x08;
 
-	if (freq < 1531000)
-		buf[3] = 0x10;
-	else
-		buf[3] = 0x00;
+	if (freq < 1500000) buf[3] |= 0x10;
 
 	return pll_write (i2c, 0x61, buf, sizeof(buf));
 }
@@ -238,21 +292,47 @@
  *   set up the downconverter frequency divisor for a 
  *   reference clock comparision frequency of 125 kHz.
  */
-static int tsa5059_set_tv_freq	(struct dvb_i2c_bus *i2c, u32 freq, int ftype)
+static int tsa5059_set_tv_freq	(struct dvb_i2c_bus *i2c, u32 freq, int ftype, int srate)
 {
-	u8 addr = (ftype == PHILIPS_SU1278SH) ? 0x60 : 0x61;
-        u32 div = freq / 125;
-	u8 buf[4] = { (div >> 8) & 0x7f, div & 0xff, 0x84 };
+	u8 addr;
+	u32 div;
+	u8 buf[4];
 
 	dprintk ("%s: freq %i, ftype %i\n", __FUNCTION__, freq, ftype);
 
-	if (ftype == PHILIPS_SU1278SH)
-		/* activate f_xtal/f_comp signal output */
-		/* charge pump current C0/C1 = 00 */
-		buf[3] = 0x20;
-	else
-		buf[3] = freq > 1530000 ? 0xc0 : 0xc4;
+	if ((freq < 950000) || (freq > 2150000)) return -EINVAL;
+
+	// setup frequency divisor
+	div = freq / 1000;
+	buf[0] = (div >> 8) & 0x7f;
+	buf[1] = div & 0xff;
+	buf[2] = 0x81 | ((div & 0x18000) >> 10);
+	buf[3] = 0;
+
+	// tuner-specific settings
+	switch(ftype) {
+	case PHILIPS_SU1278SH:
+		addr = 0x60;
+		buf[3] |= 0x20;
+
+		if (srate < 4000000) buf[3] |= 1;
+	   
+		if (freq <= 1250000) buf[3] |= 0;
+		else if (freq <= 1550000) buf[3] |= 0x40;
+		else if (freq <= 2050000) buf[3] |= 0x80;
+		else if (freq <= 2150000) buf[3] |= 0xC0;
+		break;
+
+	case ALPS_BSRU6:
+		addr = 0x61;
+		buf[3] |= 0xC0;
+	 	break;
+
+	default:
+		return -EINVAL;
+	}
 
+	// charge pump
 	return pll_write (i2c, addr, buf, sizeof(buf));
 }
 
@@ -385,12 +465,14 @@
 
 static int pll_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq, int ftype, int srate)
 {
-	if (ftype == LG_TDQF_S001F)
+	if (ftype == SAMSUNG_TBMU24112IMB)
+		return sl1935_set_tv_freq(i2c, freq, ftype);
+	else if (ftype == LG_TDQF_S001F)
 		return sl1935_set_tv_freq(i2c, freq, ftype);
 	else if (ftype == PHILIPS_SU1278)
 		return tua6100_set_tv_freq(i2c, freq, ftype, srate);
 	else
-		return tsa5059_set_tv_freq(i2c, freq, ftype);
+		return tsa5059_set_tv_freq(i2c, freq, ftype, srate);
 }
 
 #if 0
@@ -421,6 +503,19 @@
 
 	dprintk("stv0299: init chip\n");
 
+	switch(ftype) {
+	case SAMSUNG_TBMU24112IMB:
+		dprintk("%s: init stv0299 chip for Samsung TBMU24112IMB\n", __FUNCTION__);
+
+		for (i=0; i<sizeof(init_tab_samsung); i+=2)
+		{
+			dprintk("%s: reg == 0x%02x, val == 0x%02x\n", __FUNCTION__, init_tab_samsung[i], init_tab_samsung[i+1]);
+
+			stv0299_writereg (i2c, init_tab_samsung[i], init_tab_samsung[i+1]);
+		}
+		break;
+
+	default:
 	stv0299_writereg (i2c, 0x01, 0x15);
 	stv0299_writereg (i2c, 0x02, ftype == PHILIPS_SU1278 ? 0x00 : 0x30);
 	stv0299_writereg (i2c, 0x03, 0x00);
@@ -430,11 +525,23 @@
 
         /* AGC1 reference register setup */
 	if (ftype == PHILIPS_SU1278SH)
-	  stv0299_writereg (i2c, 0x0f, 0xd2);  /* Iagc = Inverse, m1 = 18 */
+		  stv0299_writereg (i2c, 0x0f, 0x92);  /* Iagc = Inverse, m1 = 18 */
 	else if (ftype == PHILIPS_SU1278)
-	  stv0299_writereg (i2c, 0x0f, 0x94);  /* Iagc = Inverse, m1 = 18 */
+		  stv0299_writereg (i2c, 0x0f, 0x94);  /* Iagc = Inverse, m1 = 20 */
 	else
 	  stv0299_writereg (i2c, 0x0f, 0x52);  /* Iagc = Normal,  m1 = 18 */
+		break;
+	}
+	
+	switch(stv0299_status) {
+	case STATUS_BER:
+		stv0299_writereg(i2c, 0x34, 0x93);
+		break;
+	
+	case STATUS_UCBLOCKS:
+		stv0299_writereg(i2c, 0x34, 0xB3);
+		break;
+	}
 
 	return 0;
 }
@@ -448,6 +555,7 @@
 		dvb_delay(30);
 		if ((stv0299_readreg (i2c, 0x1b) & 0x98) != 0x98) {
 		u8 val = stv0299_readreg (i2c, 0x0c);
+			dprintk ("%s : changing inversion\n", __FUNCTION__);
 		return stv0299_writereg (i2c, 0x0c, val ^ 0x01);
 	}
 	}
@@ -462,21 +570,42 @@
 
 	switch (fec) {
 	case FEC_AUTO:
+	{
+		dprintk ("%s : FEC_AUTO\n", __FUNCTION__);
 		return stv0299_writereg (i2c, 0x31, 0x1f);
+	}
 	case FEC_1_2:
+	{
+		dprintk ("%s : FEC_1_2\n", __FUNCTION__);
 		return stv0299_writereg (i2c, 0x31, 0x01);
+	}
 	case FEC_2_3:
+	{
+		dprintk ("%s : FEC_2_3\n", __FUNCTION__);
 		return stv0299_writereg (i2c, 0x31, 0x02);
+	}
 	case FEC_3_4:
+	{
+		dprintk ("%s : FEC_3_4\n", __FUNCTION__);
 		return stv0299_writereg (i2c, 0x31, 0x04);
+	}
 	case FEC_5_6:
+	{
+		dprintk ("%s : FEC_5_6\n", __FUNCTION__);
 		return stv0299_writereg (i2c, 0x31, 0x08);
+	}
 	case FEC_7_8:
+	{
+		dprintk ("%s : FEC_7_8\n", __FUNCTION__);
 		return stv0299_writereg (i2c, 0x31, 0x10);
+	}
 	default:
+	{
+		dprintk ("%s : FEC invalid\n", __FUNCTION__);
 		return -EINVAL;
 	}
 }
+}
 
 
 static fe_code_rate_t stv0299_get_fec (struct dvb_i2c_bus *i2c)
@@ -606,11 +735,20 @@
 
 	switch (tone) {
 	case SEC_TONE_ON:
+	{
+	    	dprintk("%s: TONE_ON\n", __FUNCTION__);
 		return stv0299_writereg (i2c, 0x08, val | 0x3);
+	}	
 	case SEC_TONE_OFF:
+	{
+	    	dprintk("%s: TONE_OFF\n", __FUNCTION__);
 		return stv0299_writereg (i2c, 0x08, (val & ~0x3) | 0x02);
+	}
 	default:
+	{
+	    	dprintk("%s: TONE INVALID\n", __FUNCTION__);
 		return -EINVAL;
+	}
 	};
 }
 
@@ -651,39 +789,60 @@
 }
 
 
-static int stv0299_set_symbolrate (struct dvb_i2c_bus *i2c, u32 srate)
+static int stv0299_set_symbolrate (struct dvb_i2c_bus *i2c, u32 srate, int tuner_type)
 {
+	u64 big = srate;
 	u32 ratio;
-	u32 tmp;
-	u8 aclk = 0xb4, bclk = 0x51;
+	u8 aclk = 0;
+	u8 bclk = 0;
+	u8 m1;
+
+	if ((srate < 1000000) || (srate > 45000000)) return -EINVAL;
+	switch(tuner_type) {
+	case PHILIPS_SU1278SH:
+		aclk = 0xb5;
+		if (srate < 2000000) bclk = 0x86;
+		else if (srate < 5000000) bclk = 0x89;
+		else if (srate < 15000000) bclk = 0x8f;
+		else if (srate < 45000000) bclk = 0x95;
 
-	if (srate > M_CLK)
-		srate = M_CLK;
-        if (srate < 500000)
-		srate = 500000;
-
-	if (srate < 30000000) { aclk = 0xb6; bclk = 0x53; }
-	if (srate < 14000000) { aclk = 0xb7; bclk = 0x53; }
-	if (srate < 7000000) { aclk = 0xb7; bclk = 0x4f; }
-	if (srate < 3000000) { aclk = 0xb7; bclk = 0x4b; }
-	if (srate < 1500000) { aclk = 0xb7; bclk = 0x47; }
+		m1 = 0x14;
+		if (srate < 4000000) m1 = 0x10;
+		break;
 
-#define FIN (M_CLK >> 4)
+	case ALPS_BSRU6:
+	default:
+		if (srate <= 1500000) { aclk = 0xb7; bclk = 0x87; }
+		else if (srate <= 3000000) { aclk = 0xb7; bclk = 0x8b; }
+		else if (srate <= 7000000) { aclk = 0xb7; bclk = 0x8f; }
+		else if (srate <= 14000000) { aclk = 0xb7; bclk = 0x93; }
+		else if (srate <= 30000000) { aclk = 0xb6; bclk = 0x93; }
+		else if (srate <= 45000000) { aclk = 0xb4; bclk = 0x91; }
 
-	tmp = srate << 4;
-	ratio = tmp / FIN;
+		m1 = 0x12;
+		break;   
+	}
         
-	tmp = (tmp % FIN) << 8;
-	ratio = (ratio << 8) + tmp / FIN;
+	dprintk("%s : big = 0x%08x%08x\n", __FUNCTION__, (int) ((big>>32) & 0xffffffff),  (int) (big & 0xffffffff) );
         
-	tmp = (tmp % FIN) << 8;
-	ratio = (ratio << 8) + tmp / FIN;
+	big = big << 20;
+
+	dprintk("%s : big = 0x%08x%08x\n", __FUNCTION__, (int) ((big>>32) & 0xffffffff),  (int) (big & 0xffffffff) );
+
+	do_div(big, M_CLK);
+
+	dprintk("%s : big = 0x%08x%08x\n", __FUNCTION__, (int) ((big>>32) & 0xffffffff),  (int) (big & 0xffffffff) );
+
+	ratio = big << 4;
+
+	dprintk("%s : ratio = %i\n", __FUNCTION__, ratio);
   
 	stv0299_writereg (i2c, 0x13, aclk);
 	stv0299_writereg (i2c, 0x14, bclk);
 	stv0299_writereg (i2c, 0x1f, (ratio >> 16) & 0xff);
 	stv0299_writereg (i2c, 0x20, (ratio >>  8) & 0xff);
 	stv0299_writereg (i2c, 0x21, (ratio      ) & 0xf0);
+	stv0299_writereg (i2c, 0x0f, (stv0299_readreg(i2c, 0x0f) & 0xc0) | m1);
 
 	return 0;
 }
@@ -710,6 +869,9 @@
 	offset = (s32) rtf * (srate / 4096L);
 	offset /= 128;
 
+	dprintk ("%s : srate = %i\n", __FUNCTION__, srate);
+	dprintk ("%s : ofset = %i\n", __FUNCTION__, offset);
+
 	srate += offset;
 
 	srate += 1000;
@@ -725,6 +887,8 @@
         int tuner_type = (long) fe->data;
 	struct dvb_i2c_bus *i2c = fe->i2c;
 
+	dprintk ("%s\n", __FUNCTION__);
+
 	switch (cmd) {
 	case FE_GET_INFO:
 		memcpy (arg, &uni0299_info, sizeof(struct dvb_frontend_info));
@@ -736,7 +900,7 @@
 		u8 signal = 0xff - stv0299_readreg (i2c, 0x18);
 		u8 sync = stv0299_readreg (i2c, 0x1b);
 
-		dprintk ("VSTATUS: 0x%02x\n", sync);
+		dprintk ("%s : FE_READ_STATUS : VSTATUS: 0x%02x\n", __FUNCTION__, sync);
 
 		*status = 0;
 
@@ -759,8 +923,12 @@
 	}
 
         case FE_READ_BER:
+		if (stv0299_status == STATUS_BER) {
 		*((u32*) arg) = (stv0299_readreg (i2c, 0x1d) << 8)
 			       | stv0299_readreg (i2c, 0x1e);
+		} else {
+			*((u32*) arg) = 0;
+		}
 		break;
 
 	case FE_READ_SIGNAL_STRENGTH:
@@ -768,7 +936,7 @@
 		s32 signal =  0xffff - ((stv0299_readreg (i2c, 0x18) << 8)
 			               | stv0299_readreg (i2c, 0x19));
 
-		dprintk ("AGC2I: 0x%02x%02x, signal=0x%04x\n",
+		dprintk ("%s : FE_READ_SIGNAL_STRENGTH : AGC2I: 0x%02x%02x, signal=0x%04x\n", __FUNCTION__,
 			 stv0299_readreg (i2c, 0x18),
 			 stv0299_readreg (i2c, 0x19), (int) signal);
 
@@ -787,18 +955,25 @@
 		break;
 	}
 	case FE_READ_UNCORRECTED_BLOCKS: 
-		*((u32*) arg) = 0;    /* the stv0299 can't measure BER and */
-		return -EOPNOTSUPP;   /* errors at the same time.... */
+		if (stv0299_status == STATUS_UCBLOCKS) {
+			*((u32*) arg) = (stv0299_readreg (i2c, 0x1d) << 8)
+			               | stv0299_readreg (i2c, 0x1e);
+		} else {
+			*((u32*) arg) = 0;
+		}
+		break;
 
         case FE_SET_FRONTEND:
         {
 		struct dvb_frontend_parameters *p = arg;
 
+		dprintk ("%s : FE_SET_FRONTEND\n", __FUNCTION__);
+
 		pll_set_tv_freq (i2c, p->frequency, tuner_type,
 				 p->u.qpsk.symbol_rate);
 
                 stv0299_set_FEC (i2c, p->u.qpsk.fec_inner);
-                stv0299_set_symbolrate (i2c, p->u.qpsk.symbol_rate);
+                stv0299_set_symbolrate (i2c, p->u.qpsk.symbol_rate, tuner_type);
 		stv0299_writereg (i2c, 0x22, 0x00);
 		stv0299_writereg (i2c, 0x23, 0x00);
 		stv0299_readreg (i2c, 0x23);
@@ -859,6 +1034,8 @@
 
 static long probe_tuner (struct dvb_i2c_bus *i2c)
 {
+	struct dvb_adapter * adapter = (struct dvb_adapter *) i2c->adapter;
+
         /* read the status register of TSA5059 */
 	u8 rpt[] = { 0x05, 0xb5 };
         u8 stat [] = { 0 };
@@ -875,6 +1052,17 @@
 	stv0299_writereg (i2c, 0x02, 0x30);
 	stv0299_writereg (i2c, 0x03, 0x00);
 
+
+	printk ("%s: try to attach to %s\n", __FUNCTION__, adapter->name);
+
+	if ( strcmp(adapter->name, "Technisat SkyStar2 driver") == 0 )
+	{
+	    printk ("%s: setup for tuner Samsung TBMU24112IMB\n", __FILE__);
+
+    	    return SAMSUNG_TBMU24112IMB;
+	}
+
+
 	if ((ret = i2c->xfer(i2c, msg1, 2)) == 2) {
 		printk ("%s: setup for tuner SU1278/SH\n", __FILE__);
 		return PHILIPS_SU1278SH;
@@ -961,3 +1149,5 @@
 MODULE_AUTHOR("Ralph Metzler, Holger Waechtler, Peter Schildmann, Felix Domke, Andreas Oberritter");
 MODULE_LICENSE("GPL");
 
+MODULE_PARM(stv0299_status, "i");
+MODULE_PARM_DESC(stv0299_status, "Which status value to support (0: BER, 1: UCBLOCKS)");
--- diff/drivers/media/dvb/frontends/tda1004x.c	2003-10-27 09:20:43.000000000 +0000
+++ source/drivers/media/dvb/frontends/tda1004x.c	2003-12-29 09:30:40.000000000 +0000
@@ -108,7 +108,7 @@
 	.frequency_min = 51000000,
 	.frequency_max = 858000000,
 	.frequency_stepsize = 166667,
-	.caps = FE_CAN_INVERSION_AUTO |
+	.caps =
 	    FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
 	    FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
 	    FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
--- diff/drivers/media/dvb/frontends/ves1820.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/media/dvb/frontends/ves1820.c	2003-12-29 09:30:40.000000000 +0000
@@ -19,6 +19,8 @@
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */    
 
+#include <linux/config.h>
+#include <linux/delay.h>
 #include <linux/errno.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
@@ -70,7 +72,18 @@
 #define GET_TUNER(data) ((u8) (((long) data >> 16) & 0xff))
 #define GET_DEMOD_ADDR(data) ((u8) (((long) data >> 24) & 0xff))
 
+#if defined(CONFIG_DBOX2)
+#define XIN 69600000UL
+#define DISABLE_INVERSION(reg0)		do { reg0 &= ~0x20; } while (0)
+#define ENABLE_INVERSION(reg0)		do { reg0 |= 0x20; } while (0)
+#define HAS_INVERSION(reg0)		(reg0 & 0x20)
+#else	/* PCI cards */
 #define XIN 57840000UL
+#define DISABLE_INVERSION(reg0)		do { reg0 |= 0x20; } while (0)
+#define ENABLE_INVERSION(reg0)		do { reg0 &= ~0x20; } while (0)
+#define HAS_INVERSION(reg0)		(!(reg0 & 0x20))
+#endif
+
 #define FIN (XIN >> 4)
 
 
@@ -209,9 +222,9 @@
 	reg0 |= GET_REG0(fe->data) & 0x62;
 	
 	if (INVERSION_ON == inversion)
-		reg0 &= ~0x20;
+		ENABLE_INVERSION(reg0);
 	else if (INVERSION_OFF == inversion)
-		reg0 |= 0x20;
+		DISABLE_INVERSION(reg0);
 	
 	ves1820_writereg (fe, 0x00, reg0 & 0xfe);
         ves1820_writereg (fe, 0x00, reg0 | 0x01);
@@ -220,7 +233,7 @@
 	 *  check lock and toggle inversion bit if required...
 	 */
 	if (INVERSION_AUTO == inversion && !(ves1820_readreg (fe, 0x11) & 0x08)) {
-		dvb_delay(10);
+		mdelay(30);
 		if (!(ves1820_readreg (fe, 0x11) & 0x08)) {
 			reg0 ^= 0x20;
 			ves1820_writereg (fe, 0x00, reg0 & 0xfe);
@@ -242,6 +255,10 @@
 
         ves1820_writereg (fe, 0, 0);
 
+#if defined(CONFIG_DBOX2)
+	ves1820_inittab[2] &= ~0x08;
+#endif
+
 	for (i=0; i<53; i++)
                 ves1820_writereg (fe, i, ves1820_inittab[i]);
 
@@ -330,6 +347,10 @@
 
 	ves1820_setup_reg0 (fe, reg0x00[real_qam], p->inversion);
 
+	/* yes, this speeds things up: userspace reports lock in about 8 ms
+	   instead of 500 to 1200 ms after calling FE_SET_FRONTEND. */
+	mdelay(30);
+
 	return 0;
 }
 
@@ -419,14 +440,14 @@
 					fe->i2c->adapter->num, afc,
 				-((s32)(p->u.qam.symbol_rate >> 3) * afc >> 7));
 
-		p->inversion = reg0 & 0x20 ? INVERSION_OFF : INVERSION_ON;
+		p->inversion = HAS_INVERSION(reg0) ? INVERSION_ON : INVERSION_OFF;
 		p->u.qam.modulation = ((reg0 >> 2) & 7) + QAM_16;
 
 		p->u.qam.fec_inner = FEC_NONE;
 
 		p->frequency = ((p->frequency + 31250) / 62500) * 62500;
-		// To prevent overflow, shift symbol rate first a
-		// couple of bits.
+		/* To prevent overflow, shift symbol rate first a
+		   couple of bits. */
 		p->frequency -= (s32)(p->u.qam.symbol_rate >> 3) * afc >> 7;
 		break;
 	}
@@ -462,8 +483,6 @@
 		printk ("DVB: VES1820(%d): setup for tuner sp5659c\n", i2c->adapter->num);
 	} else {
 		type = -1;
-		printk ("DVB: VES1820(%d): unknown PLL, "
-			"please report to <linuxdvb@linuxtv.org>!!\n", i2c->adapter->num);
 	}
 
 	return type;
@@ -477,13 +496,11 @@
 	struct i2c_msg msg [] = { { .addr = 0x50, .flags = 0, .buf = &b, .len = 1 },
 			 { .addr = 0x50, .flags = I2C_M_RD, .buf = &pwm, .len = 1 } };
 
-	i2c->xfer (i2c, msg, 2);
+	if ((i2c->xfer(i2c, msg, 2) != 2) || (pwm == 0xff))
+		pwm = 0x48;
 
 	printk("DVB: VES1820(%d): pwm=0x%02x\n", i2c->adapter->num, pwm);
 
-	if (pwm == 0xff)
-		pwm = 0x48;
-
 	return pwm;
 }
 
@@ -516,8 +533,7 @@
 	if ((demod_addr = probe_demod_addr(i2c)) < 0)
 		return -ENODEV;
 
-	if ((tuner_type = probe_tuner(i2c)) < 0)
-		return -ENODEV;
+	tuner_type = probe_tuner(i2c);
 
 	if ((i2c->adapter->num < MAX_UNITS) && pwm[i2c->adapter->num] != -1) {
 		printk("DVB: VES1820(%d): pwm=0x%02x (user specified)\n",
--- diff/drivers/media/dvb/ttpci/av7110.c	2003-10-27 09:20:43.000000000 +0000
+++ source/drivers/media/dvb/ttpci/av7110.c	2003-12-29 09:30:40.000000000 +0000
@@ -35,7 +35,6 @@
 
 #define __KERNEL_SYSCALLS__
 #include <linux/module.h>
-#include <linux/init.h>
 #include <linux/kmod.h>
 #include <linux/delay.h>
 #include <linux/fs.h>
@@ -43,7 +42,6 @@
 #include <linux/poll.h>
 #include <linux/unistd.h>
 #include <linux/byteorder/swabb.h>
-#include <linux/slab.h>
 #include <linux/smp_lock.h>
 #include <stdarg.h>
 
@@ -55,15 +53,15 @@
 #include <linux/ptrace.h>
 #include <linux/ioport.h>
 #include <linux/in.h>
-#include <linux/slab.h>
 #include <linux/string.h>
 #include <linux/pci.h>
-#include <linux/init.h>
 #include <linux/vmalloc.h>
 #include <linux/netdevice.h>
 #include <linux/inetdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/skbuff.h>
+#include <linux/firmware.h>
+#include <linux/crc32.h>
 
 #include <asm/system.h>
 #include <asm/bitops.h>
@@ -108,6 +106,7 @@
 static int pids_off;
 static int adac=DVB_ADAC_TI;
 static int hw_sections = 1;
+static int rgb_on = 0;
 
 int av7110_num = 0;
 
@@ -118,42 +117,12 @@
  * DEBI functions
  ****************************************************************************/
 
+#define wait_for_debi_done(x) \
+       saa7146_wait_for_debi_done(x->dev) \
+
 /* This DEBI code is based on the Stradis driver 
    by Nathan Laredo <laredo@gnu.org> */
 
-static int wait_for_debi_done(struct av7110 *av7110)
-{
-	struct saa7146_dev *dev = av7110->dev;
-	int start;
-
-	/* wait for registers to be programmed */
-	start = jiffies;
-	while (1) {
-                if (saa7146_read(dev, MC2) & 2)
-                        break;
-		if (jiffies-start > HZ/20) {
-			printk ("%s: timed out while waiting for registers "
-				"getting programmed\n", __FUNCTION__);
-			return -ETIMEDOUT;
-		}
-	}
-
-	/* wait for transfer to complete */
-	start = jiffies;
-	while (1) {
-		if (!(saa7146_read(dev, PSR) & SPCI_DEBI_S))
-			break;
-		saa7146_read(dev, MC2);
-		if (jiffies-start > HZ/4) {
-			printk ("%s: timed out while waiting for transfer "
-				"completion\n", __FUNCTION__);
-			return -ETIMEDOUT;
-		}
-	}
-
-	return 0;
-}
-
 static int debiwrite(struct av7110 *av7110, u32 config, 
                      int addr, u32 val, int count)
 {
@@ -375,7 +344,7 @@
 {
         struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) p2t->priv;
 
-	DEB_EE(("struct dvb_filter_pes2ts:%p\n",p2t));
+//	DEB_EE(("struct dvb_filter_pes2ts:%p\n",p2t));
 
         if (!(dvbdmxfeed->ts_type & TS_PACKET)) 
                 return 0;
@@ -385,14 +354,14 @@
                 return dvbdmxfeed->cb.ts(buf, len, 0, 0, 
                                          &dvbdmxfeed->feed.ts, DMX_OK); 
         else
-                return dvb_filter_pes2ts(p2t, buf, len);
+                return dvb_filter_pes2ts(p2t, buf, len, 1);
 }
 
 static int dvb_filter_pes2ts_cb(void *priv, unsigned char *data)
 {
         struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) priv;
 
-	DEB_EE(("dvb_demux_feed:%p\n",dvbdmxfeed));
+//	DEB_EE(("dvb_demux_feed:%p\n",dvbdmxfeed));
         
         dvbdmxfeed->cb.ts(data, 188, 0, 0,
                           &dvbdmxfeed->feed.ts,
@@ -886,10 +855,10 @@
         txbuf=irdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
         len=(av7110->debilen+3)&(~3);
 
-        DEB_D(("GPIO0 irq %d %d\n", av7110->debitype, av7110->debilen));
+//        DEB_D(("GPIO0 irq %d %d\n", av7110->debitype, av7110->debilen));
         print_time("gpio");
 
-        DEB_D(("GPIO0 irq %02x\n", av7110->debitype&0xff));        
+//       DEB_D(("GPIO0 irq %02x\n", av7110->debitype&0xff));        
         switch (av7110->debitype&0xff) {
 
         case DATA_TS_PLAY:
@@ -2002,8 +1971,6 @@
         0x2c, 0x00, 0x03, 0xf8, 0x2c, 0x00, 0x04, 0x00,
 };
 
-#include "av7110_firm.h"
-
 static int bootarm(struct av7110 *av7110)
 {
 	struct saa7146_dev *dev= av7110->dev;
@@ -2056,7 +2023,7 @@
         
         DEB_D(("bootarm: load dram code\n"));
 
-	if (load_dram(av7110, (u32 *)Root, sizeof(Root))<0)
+	if (load_dram(av7110, (u32 *)av7110->bin_root, av7110->size_root)<0)
 		return -1;
 
 	saa7146_setgpio(dev, RESET_LINE, SAA7146_GPIO_OUTLO);
@@ -2064,7 +2031,7 @@
         
         DEB_D(("bootarm: load dpram code\n"));
 
-	mwdebi(av7110, DEBISWAB, DPRAM_BASE, Dpram, sizeof(Dpram));
+	mwdebi(av7110, DEBISWAB, DPRAM_BASE, av7110->bin_dpram, av7110->size_dpram);
 
 	wait_for_debi_done(av7110);
 
@@ -2706,9 +2673,9 @@
 	buf[1] = div & 0xff;
 	buf[2] = 0x8e;
 
-	if (freq < (u32) (16*168.25) ) 
+	if (freq < (u32) 16*168.25 )
 		config = 0xa0;
-	else if (freq < (u32) (16*447.25)) 
+	else if (freq < (u32) 16*447.25)
 		config = 0x90;
 	else
 		config = 0x30;
@@ -4294,8 +4261,10 @@
                         av7110->pids[DMX_PES_TELETEXT], 0, 
                         av7110->pids[DMX_PES_PCR]);
         	outcom(av7110, COMTYPE_PIDFILTER, Scan, 0);
-	} else 
+	} else {
 		SetPIDs(av7110, 0, 0, 0, 0, 0);
+        	outcom(av7110, COMTYPE_PIDFILTER, FlushTSQueue, 0);
+	}
 
         up(&av7110->pid_mutex);
 }
@@ -4531,29 +4500,98 @@
 
 static int av7110_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_data *pci_ext)
 {
+	const struct firmware *fw;
 	struct av7110 *av7110 = NULL;
 	int ret = 0;
-	
+	u32 crc = 0, len = 0;
+	unsigned char *ptr;
+		
+	DEB_EE(("dev: %p, av7110: %p\n",dev,av7110));
+
+	/* request the av7110 firmware, this will block until someone uploads it */
+	ret = request_firmware(&fw, "dvb-ttpci-01.fw", &dev->pci->dev);
+	if ( 0 != ret ) {
+		printk("dvb-ttpci: cannot request firmware!\n");
+		return -EINVAL;
+	}
+
+	if (fw->size <= 200000) {
+		printk("dvb-ttpci: this firmware is way too small.\n");
+		return -EINVAL;
+	}
+
+	/* prepare the av7110 device struct */
 	if (!(av7110 = kmalloc (sizeof (struct av7110), GFP_KERNEL))) {
 		printk ("%s: out of memory!\n", __FUNCTION__);
 		return -ENOMEM;
 	}
-
 	memset(av7110, 0, sizeof(struct av7110));
+	
+	/* check if the firmware is available */
+	av7110->bin_fw = (unsigned char*)vmalloc(fw->size);
+	if (NULL == av7110->bin_fw) {
+		DEB_D(("out of memory\n"));
+		kfree(av7110);
+		return -ENOMEM;
+	}
+	memcpy(av7110->bin_fw, fw->data, fw->size);
+	av7110->size_fw = fw->size;
 
+	/* check for firmware magic */
+	ptr = av7110->bin_fw;
+	if (ptr[0] != 'A' || ptr[1] != 'V' || 
+	    ptr[2] != 'F' || ptr[3] != 'W') {
+		printk("dvb-ttpci: this is not an av7110 firmware\n");
+		goto fw_error;
+	}
+	ptr += 4;
+
+	/* check dpram file */
+	crc = ntohl(*(u32*)ptr);
+	ptr += 4;
+	len = ntohl(*(u32*)ptr);
+	ptr += 4;
+	if (len >= 512) {
+		printk("dvb-ttpci: dpram file is way to big.\n");
+		goto fw_error;
+	}
+	if( crc != crc32_le(0,ptr,len)) {
+		printk("dvb-ttpci: crc32 of dpram file does not match.\n");
+		goto fw_error;
+	}
+	av7110->bin_dpram = ptr;
+	av7110->size_dpram = len;
+	ptr += len;
+	
+	/* check root file */
+	crc = ntohl(*(u32*)ptr);
+	ptr += 4;
+	len = ntohl(*(u32*)ptr);
+	ptr += 4;
+	
+	if (len <= 200000 || len >= 300000 || len > ((av7110->bin_fw+av7110->size_fw)-ptr) ) {
+		printk("dvb-ttpci: root file has strange size (%d). aborting.\n",len);
+		goto fw_error;
+	}
+	if( crc != crc32_le(0,ptr,len)) {
+		printk("dvb-ttpci: crc32 of dpram file does not match.\n");
+		goto fw_error;
+	}
+	av7110->bin_root = ptr;
+	av7110->size_root = len;
+	
+	/* go on with regular device initialization */
 	av7110->card_name = (char*)pci_ext->ext_priv;
+	av7110->dev=(struct saa7146_dev *)dev;
 	(struct av7110*)dev->ext_priv = av7110;
 
-	DEB_EE(("dev: %p, av7110: %p\n",dev,av7110));
-
-	av7110->dev=(struct saa7146_dev *)dev;
 	dvb_register_adapter(&av7110->dvb_adapter, av7110->card_name);
 
 	/* the Siemens DVB needs this if you want to have the i2c chips
 	   get recognized before the main driver is fully loaded */
 	saa7146_write(dev, GPIO_CTRL, 0x500000);
 
-	saa7146_i2c_adapter_prepare(dev, NULL, SAA7146_I2C_BUS_BIT_RATE_3200);
+	saa7146_i2c_adapter_prepare(dev, NULL, SAA7146_I2C_BUS_BIT_RATE_120); /* 275 kHz */
 
 	av7110->i2c_bus = dvb_register_i2c_bus (master_xfer, dev,
 						av7110->dvb_adapter, 0);
@@ -4571,7 +4609,7 @@
 
 	/* set dd1 stream a & b */
       	saa7146_write(dev, DD1_STREAM_B, 0x00000000);
-	saa7146_write(dev, DD1_INIT, 0x02000000);
+	saa7146_write(dev, DD1_INIT, 0x03000000);
 	saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
 
 	/* upload all */
@@ -4729,7 +4767,7 @@
 		memcpy(standard,dvb_standard,sizeof(struct saa7146_standard)*2);
 		/* set dd1 stream a & b */
       		saa7146_write(dev, DD1_STREAM_B, 0x00000000);
-		saa7146_write(dev, DD1_INIT, 0x02000700);
+		saa7146_write(dev, DD1_INIT, 0x03000700);
 		saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
 	}
 	else if (dev->pci->subsystem_vendor == 0x110a) {
@@ -4747,7 +4785,8 @@
 		// switch DVB SCART on
 		outcom(av7110, COMTYPE_AUDIODAC, MainSwitch, 1, 0);
 		outcom(av7110, COMTYPE_AUDIODAC, ADSwitch, 1, 1);
-		//saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // RGB on, SCART pin 16
+		if (rgb_on)
+			saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // RGB on, SCART pin 16
 		//saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // SCARTpin 8
 	}
 	
@@ -4786,6 +4825,7 @@
 	}	
 
 	printk(KERN_INFO "av7110: found av7110-%d.\n",av7110_num);
+	av7110->device_initialized = 1;
 	av7110_num++;
         return 0;
 
@@ -4809,12 +4849,20 @@
 	dvb_unregister_adapter (av7110->dvb_adapter);
 
 	return ret;
+fw_error:
+	vfree(av7110->bin_fw);
+	kfree(av7110);
+	return -EINVAL;
 }
 
 static int av7110_detach (struct saa7146_dev* saa)
 {
 	struct av7110 *av7110 = (struct av7110*)saa->ext_priv;
 	DEB_EE(("av7110: %p\n",av7110));
+	
+	if( 0 == av7110->device_initialized ) {
+		return 0;
+	}
 
 	saa7146_unregister_device(&av7110->v4l_dev, saa);
 	if (2 == av7110->has_analog_tuner) {
@@ -4845,11 +4893,13 @@
 	dvb_unregister_i2c_bus (master_xfer,av7110->i2c_bus->adapter, av7110->i2c_bus->id);
 	dvb_unregister_adapter (av7110->dvb_adapter);
 
+	av7110_num--;
+	if (NULL != av7110->bin_fw ) {
+		vfree(av7110->bin_fw);
+	}
 	kfree (av7110);
-
 	saa->ext_priv = NULL;
-	av7110_num--;
-	
+
 	return 0;
 }
 
@@ -4858,7 +4908,7 @@
 {
 	struct av7110 *av7110 = (struct av7110*)dev->ext_priv;
 
-	DEB_INT(("dev: %p, av7110: %p\n",dev,av7110));
+//	DEB_INT(("dev: %p, av7110: %p\n",dev,av7110));
 
 	if (*isr & MASK_19)
 		tasklet_schedule (&av7110->debi_tasklet);
@@ -4887,7 +4937,7 @@
 static struct saa7146_standard analog_standard[] = {
 	{
 		.name	= "PAL", 	.id		= V4L2_STD_PAL_BG,
-		.v_offset	= 0x18,	.v_field 	= 288,		.v_calc	= 576,
+		.v_offset	= 0x18 /* 0 */ ,	.v_field 	= 288,		.v_calc	= 576,
 		.h_offset	= 0x08,	.h_pixels 	= 708,		.h_calc	= 709,
 		.v_max_out	= 576,	.h_max_out	= 768,
 	}, {
@@ -4975,7 +5025,7 @@
 	.inputs		= 1,
 	.audios 	= 1,
 	.capabilities	= 0,
-	.flags		= SAA7146_EXT_SWAP_ODD_EVEN,
+	.flags		= 0, 
 
 	.stds		= &standard[0],
 	.num_stds	= sizeof(standard)/sizeof(struct saa7146_standard),
@@ -5002,6 +5052,7 @@
 
 static struct saa7146_extension av7110_extension = {
 	.name		= "dvb\0",
+	.flags		= SAA7146_I2C_SHORT_DELAY,
 
 	.module		= THIS_MODULE,
 	.pci_tbl	= &pci_tbl[0],
@@ -5054,4 +5105,6 @@
 MODULE_PARM_DESC(adac,"audio DAC type: 0 TI, 1 CRYSTAL, 2 MSP (use if autodetection fails)");
 MODULE_PARM(hw_sections, "i");
 MODULE_PARM_DESC(hw_sections, "0 use software section filter, 1 use hardware");
-
+MODULE_PARM(rgb_on, "i");
+MODULE_PARM_DESC(rgb_on, "For Siemens DVB-C cards only: Enable RGB control"
+		" signal on SCART pin 16 to switch SCART video mode from CVBS to RGB");
--- diff/drivers/media/dvb/ttpci/av7110.h	2003-10-27 09:20:38.000000000 +0000
+++ source/drivers/media/dvb/ttpci/av7110.h	2003-12-29 09:30:41.000000000 +0000
@@ -1,8 +1,6 @@
 #ifndef _AV7110_H_
 #define _AV7110_H_
 
-#define DVB_FIRM_PATH "/lib/DVB/"
-
 #include <linux/interrupt.h>
 #include <linux/socket.h>
 #include <linux/netdevice.h>
@@ -169,7 +167,8 @@
 	DelPIDFilter,
 	Scan,
 	SetDescr,
-        SetIR
+        SetIR,
+        FlushTSQueue
 };
 			
 enum av7110_mpeg_command {
@@ -544,6 +543,18 @@
         int                 dsp_dev;
 
         u32                 ir_config;
+	
+	/* firmware stuff */
+	unsigned int device_initialized;
+
+	unsigned char *bin_fw;
+	unsigned long size_fw;
+
+	unsigned char *bin_dpram;
+	unsigned long size_dpram;
+
+	unsigned char *bin_root;
+	unsigned long size_root;
 };
 
 
--- diff/drivers/media/dvb/ttpci/budget-ci.c	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/media/dvb/ttpci/budget-ci.c	2003-12-29 09:30:41.000000000 +0000
@@ -41,75 +41,14 @@
 	struct tasklet_struct msp430_irq_tasklet;
 };
 
-
-
-#ifndef BORROWED_FROM_AV7110_H_BUT_REALLY_BELONGS_IN_SAA7146_DEFS_H
-
-#define DEBINOSWAP 0x000e0000
-#define GPIO_IRQHI 0x10
-#define GPIO_INPUT 0x00
-
-void gpio_set(struct saa7146_dev* saa, u8 pin, u8 data)
-{
-        u32 value = 0;
-
-        /* sanity check */
-        if(pin > 3)
-                return;
-
-        /* read old register contents */
-        value = saa7146_read(saa, GPIO_CTRL );
-
-        value &= ~(0xff << (8*pin));
-        value |= (data << (8*pin));
-
-        saa7146_write(saa, GPIO_CTRL, value);
-}
-
-
-
-static int wait_for_debi_done(struct saa7146_dev *saa)
-{
-	int start = jiffies;
-
-	/* wait for registers to be programmed */
-	while (1) {
-		if (saa7146_read(saa, MC2) & 2)
-			break;
-		if (jiffies - start > HZ / 20) {
-			printk ("DVB (%s): timed out while waiting"
-				" for registers getting programmed\n",
-				__FUNCTION__);
-			return -ETIMEDOUT;
-		}
-	}
-
-	/* wait for transfer to complete */
-	start = jiffies;
-	while (1) {
-		if (!(saa7146_read(saa, PSR) & SPCI_DEBI_S))
-			break;
-		saa7146_read(saa, MC2);
-		if (jiffies - start > HZ / 4) {
-			printk ("DVB (%s): timed out while waiting"
-				" for transfer completion\n",
-				__FUNCTION__);
-			return -ETIMEDOUT;
-		}
-	}
-
-	return 0;
-}
-
-
-static u32 debiread (struct saa7146_dev *saa, u32 config, int addr, int count)
+static u32 budget_debiread4 (struct saa7146_dev *saa, u32 config, int addr, int count)
 {
 	u32 result = 0;
 
 	if (count > 4 || count <= 0)
 		return 0;
 
-	if (wait_for_debi_done(saa) < 0)
+	if (saa7146_wait_for_debi_done(saa) < 0)
 		return 0;
 
 	saa7146_write (saa, DEBI_COMMAND,
@@ -118,7 +57,7 @@
 	saa7146_write(saa, DEBI_CONFIG, config);
 	saa7146_write(saa, MC2, (2 << 16) | 2);
 
-	wait_for_debi_done(saa);
+	saa7146_wait_for_debi_done(saa);
 
 	result = saa7146_read(saa, DEBI_AD);
 	result &= (0xffffffffUL >> ((4 - count) * 8));
@@ -126,20 +65,6 @@
 	return result;
 }
 
-
-
-/* DEBI during interrupt */
-static inline u32 irdebi(struct saa7146_dev *saa, u32 config, int addr, u32 val, int count)
-{
-	u32 res;
-	res = debiread(saa, config, addr, count);
-	return res;
-}
-#endif
-
-
-
-
 /* from reading the following remotes:
    Zenith Universal 7 / TV Mode 807 / VCR Mode 837
    Hauppauge (from NOVA-CI-s box product)
@@ -150,7 +75,7 @@
 	KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8,
 	KEY_9,
 	KEY_ENTER,
-	0,
+	KEY_RED,
 	KEY_POWER,              /* RADIO on Hauppauge */
 	KEY_MUTE,
 	0,
@@ -162,11 +87,11 @@
 	0, 0, 0, 0, 0, 0, 0,
 	KEY_UP, KEY_DOWN,
 	KEY_OPTION,             /* RESERVED on Hauppauge */
-	0,
+	KEY_BREAK,
 	/* 0x2X */
 	KEY_CHANNELUP, KEY_CHANNELDOWN,
 	KEY_PREVIOUS,           /* Prev. Ch on Zenith, SOURCE on Hauppauge */
-	0, 0, 0,
+	0, KEY_RESTART, KEY_OK,
 	KEY_CYCLEWINDOWS,       /* MINIMIZE on Hauppauge */
 	0,
 	KEY_ENTER,              /* VCR mode on Zenith */
@@ -177,7 +102,7 @@
 	KEY_MENU,               /* FULL SCREEN on Hauppauge */
 	0,
 	/* 0x3X */
-	0,
+	KEY_SLOW,
 	KEY_PREVIOUS,           /* VCR mode on Zenith */
 	KEY_REWIND,
 	0,
@@ -189,7 +114,7 @@
 	KEY_C,
 	0,
 	KEY_EXIT,
-	0,
+	KEY_POWER2,
 	KEY_TUNER,              /* VCR mode on Zenith */
 	0,
 };
@@ -217,7 +142,7 @@
 	struct budget_ci *budget_ci = (struct budget_ci*) data;
 	struct saa7146_dev *saa = budget_ci->budget.dev;
 	struct input_dev *dev = &budget_ci->input_dev;
-	unsigned int code = irdebi(saa, DEBINOSWAP, 0x1234, 0, 2) >> 8;
+	unsigned int code = budget_debiread4(saa, DEBINOSWAP, 0x1234, 2) >> 8;
 
 	if (code & 0x40) {
 	        code &= 0x3f;
@@ -271,7 +196,7 @@
 
 	saa7146_write(saa, IER, saa7146_read(saa, IER) | MASK_06);
 
-	gpio_set(saa, 3, GPIO_IRQHI);
+	saa7146_setgpio(saa, 3, SAA7146_GPIO_IRQHI); 
 
 	return 0;
 }
@@ -283,8 +208,8 @@
 	struct input_dev *dev = &budget_ci->input_dev;
 
 	saa7146_write(saa, IER, saa7146_read(saa, IER) & ~MASK_06);
-	gpio_set(saa, 3, GPIO_INPUT);
-	gpio_set(saa, 2, GPIO_INPUT);
+	saa7146_setgpio(saa, 3, SAA7146_GPIO_INPUT);
+	saa7146_setgpio(saa, 2, SAA7146_GPIO_INPUT);
 
 	if (del_timer(&dev->timer))
 		input_event(dev, EV_KEY, key_map[dev->repeat_key], !!0);
--- diff/drivers/media/dvb/ttpci/budget.h	2003-07-08 09:55:18.000000000 +0100
+++ source/drivers/media/dvb/ttpci/budget.h	2003-12-29 09:30:41.000000000 +0000
@@ -64,8 +64,8 @@
 	.ext_priv = &x_var ## _info, \
 	.ext = &budget_extension };
 
-#define TS_WIDTH  (4*188)
-#define TS_HEIGHT (1024/4)
+#define TS_WIDTH  (376)
+#define TS_HEIGHT (512)
 #define TS_BUFLEN (TS_WIDTH*TS_HEIGHT)
 #define TS_MAX_PACKETS (TS_BUFLEN/TS_SIZE)
 
--- diff/drivers/media/dvb/ttpci/ttpci-eeprom.c	2003-08-20 14:16:28.000000000 +0100
+++ source/drivers/media/dvb/ttpci/ttpci-eeprom.c	2003-12-29 09:30:41.000000000 +0000
@@ -142,3 +142,9 @@
 }
 
 EXPORT_SYMBOL(ttpci_eeprom_parse_mac);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Ralph Metzler, Marcus Metzler, others");
+MODULE_DESCRIPTION("Decode dvb_net MAC address from EEPROM of PCI DVB cards "
+		"made by Siemens, Technotrend, Hauppauge");
+
--- diff/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c	2003-12-29 09:30:41.000000000 +0000
@@ -742,11 +742,7 @@
 	}
 }
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-static void ttusb_iso_irq(struct urb *urb)
-#else
 static void ttusb_iso_irq(struct urb *urb, struct pt_regs *ptregs)
-#endif
 {
 	struct ttusb *ttusb = urb->context;
 
@@ -787,9 +783,7 @@
 			ttusb_process_frame(ttusb, data, len);
 		}
 	}
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 	usb_submit_urb(urb, GFP_ATOMIC);
-#endif
 }
 
 static void ttusb_free_iso_urbs(struct ttusb *ttusb)
@@ -879,13 +873,6 @@
 		}
 	}
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	for (i = 0; i < ISO_BUF_COUNT; i++) {
-		int next = (i + 1) % ISO_BUF_COUNT;
-		ttusb->iso_urb[i]->next = ttusb->iso_urb[next];
-	}
-#endif
-
 	for (i = 0; i < ISO_BUF_COUNT; i++) {
 		if ((err = usb_submit_urb(ttusb->iso_urb[i], GFP_KERNEL))) {
 			ttusb_stop_iso_xfer(ttusb);
@@ -1076,22 +1063,6 @@
 };
 #endif
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-static void *ttusb_probe(struct usb_device *udev, unsigned int ifnum,
-		  const struct usb_device_id *id)
-{
-	struct ttusb *ttusb;
-	int result, channel;
-
-	if (ifnum != 0)
-		return NULL;
-
-	dprintk("%s: TTUSB DVB connected\n", __FUNCTION__);
-
-	if (!(ttusb = kmalloc(sizeof(struct ttusb), GFP_KERNEL)))
-		return NULL;
-
-#else
 static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *id)
 {
 	struct usb_device *udev;
@@ -1105,8 +1076,6 @@
 	if (!(ttusb = kmalloc(sizeof(struct ttusb), GFP_KERNEL)))
 		return -ENOMEM;
 
-#endif
-
 	memset(ttusb, 0, sizeof(struct ttusb));
 
 	for (channel = 0; channel < TTUSB_MAXCHANNEL; ++channel) {
@@ -1180,35 +1149,22 @@
 			   S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP
 			   | S_IROTH | S_IWOTH, &stc_fops, ttusb);
 #endif
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	return (void *) ttusb;
-#else
+
 	usb_set_intfdata(intf, (void *) ttusb);
 
 	return 0;
-#endif
 }
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-static void ttusb_disconnect(struct usb_device *udev, void *data)
-{
-	struct ttusb *ttusb = data;
-#else
 static void ttusb_disconnect(struct usb_interface *intf)
 {
 	struct ttusb *ttusb = usb_get_intfdata(intf);
 
 	usb_set_intfdata(intf, NULL);
-#endif
 
 	ttusb->disconnecting = 1;
 
 	ttusb_stop_iso_xfer(ttusb);
 
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,69))
-#undef devfs_remove
-#define devfs_remove(x)	devfs_unregister(ttusb->stc_devfs_handle);
-#endif
 #if 0
 	devfs_remove(TTUSB_BUDGET_NAME);
 #endif
--- diff/drivers/media/dvb/ttusb-dec/Kconfig	2003-09-17 12:28:07.000000000 +0100
+++ source/drivers/media/dvb/ttusb-dec/Kconfig	2003-12-29 09:30:41.000000000 +0000
@@ -1,24 +1,26 @@
 config DVB_TTUSB_DEC
-	tristate "Technotrend/Hauppauge USB DEC2000-T devices"
-	depends on DVB_CORE && USB && !STANDALONE
+	tristate "Technotrend/Hauppauge USB DEC devices"
+	depends on DVB_CORE && USB && FW_LOADER
 	help
 	  Support for external USB adapters designed by Technotrend and
-	  produced by Hauppauge, shipped under the brand name 'DEC2000-T'.
+	  produced by Hauppauge, shipped under the brand name 'DEC2000-t'
+	  and 'DEC3000-s'.
 
           Even if these devices have a MPEG decoder built in, they transmit
 	  only compressed MPEG data over the USB bus, so you need
 	  an external software decoder to watch TV on your computer.	  
 
-	  Say Y if you own such a device and want to use it.
+	  The DEC devices require firmware in order to boot into a mode in
+	  which they are slaves to the PC.  See
+	  linux/Documentation/dvb/FIRMWARE for details.
+
+	  The firmware can be obtained and put into the default
+	  locations as follows:
 
-config DVB_TTUSB_DEC_FIRMWARE_FILE
-	string "Full pathname of dec2000t.bin firmware file"
-	depends on DVB_TTUSB_DEC
-	default "/etc/dvb/dec2000t.bin"
-	help
-	  The DEC2000-T requires a firmware in order to boot into a mode in
-	  which it is a slave to the PC.  The firmware file can obtained as
-	  follows:
 	    wget http://hauppauge.lightpath.net/de/dec215a.exe
 	    unzip -j dec215a.exe Software/Oem/STB/App/Boot/STB_PC_T.bin
-	    mv STB_PC_T.bin /etc/dvb/dec2000t.bin
+	    mv STB_PC_T.bin /usr/lib/hotplug/firmware/dec2000t.bin
+	    unzip -j dec215a.exe Software/Oem/STB/App/Boot/STB_PC_S.bin
+	    mv STB_PC_S.bin /usr/lib/hotplug/firmware/dec3000s.bin
+
+	  Say Y if you own such a device and want to use it.
--- diff/drivers/media/dvb/ttusb-dec/Makefile	2003-08-20 14:16:15.000000000 +0100
+++ source/drivers/media/dvb/ttusb-dec/Makefile	2003-12-29 09:30:41.000000000 +0000
@@ -1,11 +1,3 @@
-
-obj-$(CONFIG_DVB_TTUSB_DEC) += ttusb_dec.o dec2000_frontend.o
+obj-$(CONFIG_DVB_TTUSB_DEC) += ttusb_dec.o
 
 EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
-
-host-progs	:= fdump
-
-$(obj)/ttusb_dec.o: $(obj)/dsp_dec2000.h
-
-$(obj)/dsp_dec2000.h: $(patsubst "%", %, $(CONFIG_DVB_TTUSB_DEC_FIRMWARE_FILE)) $(obj)/fdump
-	$(obj)/fdump $< dsp_dec2000 > $@
--- diff/drivers/media/dvb/ttusb-dec/ttusb_dec.c	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/media/dvb/ttusb-dec/ttusb_dec.c	2003-12-29 09:30:41.000000000 +0000
@@ -19,19 +19,135 @@
  *
  */
 
-#include <linux/version.h>
+#include <asm/semaphore.h>
+#include <linux/list.h>
 #include <linux/module.h>
 #include <linux/pci.h>
 #include <linux/slab.h>
+#include <linux/spinlock.h>
 #include <linux/usb.h>
+#include <linux/version.h>
+#include <linux/interrupt.h>
+#include <linux/firmware.h>
 
-#include "ttusb_dec.h"
+#include "dmxdev.h"
+#include "dvb_demux.h"
+#include "dvb_i2c.h"
+#include "dvb_filter.h"
 #include "dvb_frontend.h"
+#include "dvb_net.h"
 
 static int debug = 0;
 
 #define dprintk	if (debug) printk
 
+#define DRIVER_NAME		"TechnoTrend/Hauppauge DEC USB"
+
+#define COMMAND_PIPE		0x03
+#define RESULT_PIPE		0x84
+#define STREAM_PIPE		0x88
+
+#define COMMAND_PACKET_SIZE	0x3c
+#define ARM_PACKET_SIZE		0x1000
+
+#define ISO_BUF_COUNT		0x04
+#define FRAMES_PER_ISO_BUF	0x04
+#define ISO_FRAME_SIZE		0x0380
+
+#define	MAX_AV_PES_LENGTH	6144
+
+#define LOF_HI			10600000
+#define LOF_LO			9750000
+
+enum ttusb_model {
+	TTUSB_DEC2000T,
+	TTUSB_DEC3000S
+};
+
+struct ttusb_dec {
+	enum ttusb_model		model;
+	char				*model_name;
+	char				*firmware_name;
+
+	/* DVB bits */
+	struct dvb_adapter		*adapter;
+	struct dmxdev			dmxdev;
+	struct dvb_demux		demux;
+	struct dmx_frontend		frontend;
+	struct dvb_i2c_bus		i2c_bus;
+	struct dvb_net			dvb_net;
+	struct dvb_frontend_info	*frontend_info;
+	int (*frontend_ioctl) (struct dvb_frontend *, unsigned int, void *);
+
+	u16			pid[DMX_PES_OTHER];
+	int			hi_band;
+
+	/* USB bits */
+	struct usb_device	*udev;
+	u8			trans_count;
+	unsigned int		command_pipe;
+	unsigned int		result_pipe;
+	unsigned int		stream_pipe;
+	int			interface;
+	struct semaphore	usb_sem;
+
+	void			*iso_buffer;
+	dma_addr_t		iso_dma_handle;
+	struct urb		*iso_urb[ISO_BUF_COUNT];
+	int			iso_stream_count;
+	struct semaphore	iso_sem;
+
+	u8			av_pes[MAX_AV_PES_LENGTH + 4];
+	int			av_pes_state;
+	int			av_pes_length;
+	int			av_pes_payload_length;
+
+	struct dvb_filter_pes2ts	a_pes2ts;
+	struct dvb_filter_pes2ts	v_pes2ts;
+
+	u8			v_pes[16 + MAX_AV_PES_LENGTH];
+	int			v_pes_length;
+	int			v_pes_postbytes;
+
+	struct list_head	urb_frame_list;
+	struct tasklet_struct	urb_tasklet;
+	spinlock_t		urb_frame_list_lock;
+
+	int			active; /* Loaded successfully */
+};
+
+struct urb_frame {
+	u8			data[ISO_FRAME_SIZE];
+	int			length;
+	struct list_head	urb_frame_list;
+};
+
+static struct dvb_frontend_info dec2000t_frontend_info = {
+	.name			= "TechnoTrend/Hauppauge DEC2000-t Frontend",
+	.type			= FE_OFDM,
+	.frequency_min		= 51000000,
+	.frequency_max		= 858000000,
+	.frequency_stepsize	= 62500,
+	.caps =	FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
+		FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
+		FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
+		FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO |
+		FE_CAN_HIERARCHY_AUTO,
+};
+
+static struct dvb_frontend_info dec3000s_frontend_info = {
+	.name			= "TechnoTrend/Hauppauge DEC3000-s Frontend",
+	.type			= FE_QPSK,
+	.frequency_min		= 950000,
+	.frequency_max		= 2150000,
+	.frequency_stepsize	= 125,
+	.caps =	FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
+		FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
+		FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
+		FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO |
+		FE_CAN_HIERARCHY_AUTO,
+};
+
 static int ttusb_dec_send_command(struct ttusb_dec *dec, const u8 command,
 				  int param_length, const u8 params[],
 				  int *result_length, u8 cmd_result[])
@@ -129,22 +245,8 @@
 				       ttusb_dec_av_pes2ts_cb, dec->demux.feed);
 		dvb_filter_pes2ts_init(&dec->v_pes2ts, dec->pid[DMX_PES_VIDEO],
 				       ttusb_dec_av_pes2ts_cb, dec->demux.feed);
-}
-
-static int ttusb_dec_i2c_master_xfer(struct dvb_i2c_bus *i2c,
-				     const struct i2c_msg msgs[], int num)
-{
-	int result, i;
-
-	dprintk("%s\n", __FUNCTION__);
-
-	for (i = 0; i < num; i++)
-		if ((result = ttusb_dec_send_command(i2c->data, msgs[i].addr,
-						     msgs[i].len, msgs[i].buf,
-						     NULL, NULL)))
-			return result;
-
-	return 0;
+	dec->v_pes_length = 0;
+	dec->v_pes_postbytes = 0;
 }
 
 static void ttusb_dec_process_av_pes(struct ttusb_dec * dec, u8 * av_pes,
@@ -194,7 +296,8 @@
 				       &av_pes[12], prebytes);
 
 				dvb_filter_pes2ts(&dec->v_pes2ts, dec->v_pes,
-						  dec->v_pes_length + prebytes);
+						  dec->v_pes_length + prebytes,
+						  1);
 			}
 
 			if (av_pes[5] & 0x10) {
@@ -239,13 +342,14 @@
 
 			if (postbytes == 0)
 				dvb_filter_pes2ts(&dec->v_pes2ts, dec->v_pes,
-							  dec->v_pes_length);
+						  dec->v_pes_length, 1);
 
 			break;
 		}
 
 	case 0x02:		/* MainAudioStream */
-		dvb_filter_pes2ts(&dec->a_pes2ts, &av_pes[8], length - 12);
+		dvb_filter_pes2ts(&dec->a_pes2ts, &av_pes[8], length - 12,
+				  av_pes[5] & 0x10);
 		break;
 
 	default:
@@ -367,11 +471,7 @@
 	}
 }
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-static void ttusb_dec_process_urb(struct urb *urb)
-#else
 static void ttusb_dec_process_urb(struct urb *urb, struct pt_regs *ptregs)
-#endif
 {
 	struct ttusb_dec *dec = urb->context;
 
@@ -380,6 +480,7 @@
 
 		for (i = 0; i < FRAMES_PER_ISO_BUF; i++) {
 			struct usb_iso_packet_descriptor *d;
+
 			u8 *b;
 			int length;
 			struct urb_frame *frame;
@@ -412,10 +513,8 @@
 				urb->status);
 	}
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 	if (dec->iso_stream_count)
 		usb_submit_urb(urb, GFP_ATOMIC);
-#endif
 }
 
 static void ttusb_dec_setup_urbs(struct ttusb_dec *dec)
@@ -433,9 +532,8 @@
 		urb->complete = ttusb_dec_process_urb;
 		urb->pipe = dec->stream_pipe;
 		urb->transfer_flags = URB_ISO_ASAP;
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 		urb->interval = 1;
-#endif
+
 		urb->number_of_packets = FRAMES_PER_ISO_BUF;
 		urb->transfer_buffer_length = ISO_FRAME_SIZE *
 					      FRAMES_PER_ISO_BUF;
@@ -502,8 +600,8 @@
 		ttusb_dec_setup_urbs(dec);
 
 		for (i = 0; i < ISO_BUF_COUNT; i++) {
-			if ((result = usb_submit_urb(dec->iso_urb[i]
-						    , GFP_KERNEL))) {
+			if ((result = usb_submit_urb(dec->iso_urb[i],
+						     GFP_ATOMIC))) {
 				printk("%s: failed urb submission %d: "
 				       "error %d\n", __FUNCTION__, i, result);
 
@@ -525,10 +623,6 @@
 
 	up(&dec->iso_sem);
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	ttusb_dec_set_streaming_interface(dec);
-#endif
-
 	return 0;
 }
 
@@ -659,7 +753,7 @@
 	for (i = 0; i < ISO_BUF_COUNT; i++) {
 		struct urb *urb;
 
-		if (!(urb = usb_alloc_urb(FRAMES_PER_ISO_BUF, GFP_KERNEL))) {
+		if (!(urb = usb_alloc_urb(FRAMES_PER_ISO_BUF, GFP_ATOMIC))) {
 			ttusb_dec_free_iso_urbs(dec);
 			return -ENOMEM;
 		}
@@ -669,13 +763,6 @@
 
 	ttusb_dec_setup_urbs(dec);
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	for (i = 0; i < ISO_BUF_COUNT; i++) {
-		int next = (i + 1) % ISO_BUF_COUNT;
-		dec->iso_urb[i]->next = dec->iso_urb[next];
-	}
-#endif
-
 	return 0;
 }
 
@@ -711,20 +798,45 @@
 	ttusb_dec_alloc_iso_urbs(dec);
 }
 
-#include "dsp_dec2000.h"
-
 static int ttusb_dec_boot_dsp(struct ttusb_dec *dec)
 {
 	int i, j, actual_len, result, size, trans_count;
-	u8 b0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xc8, 0x61,
+	u8 b0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 		    0x00 };
 	u8 b1[] = { 0x61 };
 	u8 b[ARM_PACKET_SIZE];
-	u32 dsp_length = htonl(sizeof(dsp_dec2000));
+	u8 *firmware = NULL;
+	size_t firmware_size = 0;
+	u32 firmware_csum = 0;
+	u32 firmware_size_nl;
+	u32 firmware_csum_nl;
+	const struct firmware *fw_entry = NULL;
 
 	dprintk("%s\n", __FUNCTION__);
 
-	memcpy(b0, &dsp_length, 4);
+	if (request_firmware(&fw_entry, dec->firmware_name, &dec->udev->dev)) {
+		printk(KERN_ERR "%s: Firmware (%s) unavailable.\n",
+		       __FUNCTION__, dec->firmware_name);
+		return 1;
+	}
+
+	firmware = fw_entry->data;
+	firmware_size = fw_entry->size;
+
+	switch (dec->model) {
+		case TTUSB_DEC2000T:
+			firmware_csum = 0x1bc86100;
+			break;
+
+		case TTUSB_DEC3000S:
+			firmware_csum = 0x00000000;
+			break;
+	}
+
+	firmware_size_nl = htonl(firmware_size);
+	memcpy(b0, &firmware_size_nl, 4);
+	firmware_csum_nl = htonl(firmware_csum);
+	memcpy(&b0[6], &firmware_csum_nl, 4);
 
 	result = ttusb_dec_send_command(dec, 0x41, sizeof(b0), b0, NULL, NULL);
 
@@ -734,8 +846,8 @@
 	trans_count = 0;
 	j = 0;
 
-	for (i = 0; i < sizeof(dsp_dec2000); i += COMMAND_PACKET_SIZE) {
-		size = sizeof(dsp_dec2000) - i;
+	for (i = 0; i < firmware_size; i += COMMAND_PACKET_SIZE) {
+		size = firmware_size - i;
 		if (size > COMMAND_PACKET_SIZE)
 			size = COMMAND_PACKET_SIZE;
 
@@ -743,7 +855,7 @@
 		b[j + 1] = trans_count++;
 		b[j + 2] = 0xf0;
 		b[j + 3] = size;
-		memcpy(&b[j + 4], &dsp_dec2000[i], size);
+		memcpy(&b[j + 4], &firmware[i], size);
 
 		j += COMMAND_PACKET_SIZE + 4;
 
@@ -764,7 +876,7 @@
 	return result;
 }
 
-static void ttusb_dec_init_stb(struct ttusb_dec *dec)
+static int ttusb_dec_init_stb(struct ttusb_dec *dec)
 {
 	u8 c[COMMAND_PACKET_SIZE];
 	int c_length;
@@ -774,9 +886,14 @@
 
 	result = ttusb_dec_send_command(dec, 0x08, 0, NULL, &c_length, c);
 
-	if (!result)
+	if (!result) {
 		if (c_length != 0x0c || (c_length == 0x0c && c[9] != 0x63))
-			ttusb_dec_boot_dsp(dec);
+			return ttusb_dec_boot_dsp(dec);
+		else
+			return 0;
+	}
+	else
+		return result;
 }
 
 static int ttusb_dec_init_dvb(struct ttusb_dec *dec)
@@ -785,22 +902,13 @@
 
 	dprintk("%s\n", __FUNCTION__);
 
-	if ((result = dvb_register_adapter(&dec->adapter, "dec2000")) < 0) {
+	if ((result = dvb_register_adapter(&dec->adapter, dec->model_name)) < 0) {
 		printk("%s: dvb_register_adapter failed: error %d\n",
 		       __FUNCTION__, result);
 
 		return result;
 	}
 
-	if (!(dec->i2c_bus = dvb_register_i2c_bus(ttusb_dec_i2c_master_xfer,
-						  dec, dec->adapter, 0))) {
-		printk("%s: dvb_register_i2c_bus failed\n", __FUNCTION__);
-
-		dvb_unregister_adapter(dec->adapter);
-
-		return -ENOMEM;
-	}
-
 	dec->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING;
 
 	dec->demux.priv = (void *)dec;
@@ -814,8 +922,6 @@
 		printk("%s: dvb_dmx_init failed: error %d\n", __FUNCTION__,
 		       result);
 
-		dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter,
-				       0);
 		dvb_unregister_adapter(dec->adapter);
 
 		return result;
@@ -830,8 +936,6 @@
 		       __FUNCTION__, result);
 
 		dvb_dmx_release(&dec->demux);
-		dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter,
-				       0);
 		dvb_unregister_adapter(dec->adapter);
 
 		return result;
@@ -846,8 +950,6 @@
 
 		dvb_dmxdev_release(&dec->dmxdev);
 		dvb_dmx_release(&dec->demux);
-		dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter,
-				       0);
 		dvb_unregister_adapter(dec->adapter);
 
 		return result;
@@ -861,8 +963,6 @@
 		dec->demux.dmx.remove_frontend(&dec->demux.dmx, &dec->frontend);
 		dvb_dmxdev_release(&dec->dmxdev);
 		dvb_dmx_release(&dec->demux);
-		dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter,
-				       0);
 		dvb_unregister_adapter(dec->adapter);
 
 		return result;
@@ -882,7 +982,6 @@
 	dec->demux.dmx.remove_frontend(&dec->demux.dmx, &dec->frontend);
 	dvb_dmxdev_release(&dec->dmxdev);
 	dvb_dmx_release(&dec->demux);
-	dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter, 0);
 	dvb_unregister_adapter(dec->adapter);
 }
 
@@ -914,35 +1013,257 @@
 	}
 }
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-static void *ttusb_dec_probe(struct usb_device *udev, unsigned int ifnum,
-			     const struct usb_device_id *id)
+static int ttusb_dec_2000t_frontend_ioctl(struct dvb_frontend *fe, unsigned int cmd,
+				  void *arg)
 {
-	struct ttusb_dec *dec;
+	struct ttusb_dec *dec = fe->data;
 
 	dprintk("%s\n", __FUNCTION__);
 
-	if (ifnum != 0)
-		return NULL;
+	switch (cmd) {
+
+	case FE_GET_INFO:
+		dprintk("%s: FE_GET_INFO\n", __FUNCTION__);
+		memcpy(arg, dec->frontend_info,
+		       sizeof (struct dvb_frontend_info));
+		break;
+
+	case FE_READ_STATUS: {
+			fe_status_t *status = (fe_status_t *)arg;
+			dprintk("%s: FE_READ_STATUS\n", __FUNCTION__);
+			*status = FE_HAS_SIGNAL | FE_HAS_VITERBI |
+				  FE_HAS_SYNC | FE_HAS_CARRIER | FE_HAS_LOCK;
+			break;
+		}
+
+	case FE_READ_BER: {
+			u32 *ber = (u32 *)arg;
+			dprintk("%s: FE_READ_BER\n", __FUNCTION__);
+			*ber = 0;
+			return -ENOSYS;
+			break;
+		}
+
+	case FE_READ_SIGNAL_STRENGTH: {
+			dprintk("%s: FE_READ_SIGNAL_STRENGTH\n", __FUNCTION__);
+			*(s32 *)arg = 0xFF;
+			return -ENOSYS;
+			break;
+		}
+
+	case FE_READ_SNR:
+		dprintk("%s: FE_READ_SNR\n", __FUNCTION__);
+		*(s32 *)arg = 0;
+		return -ENOSYS;
+		break;
+
+	case FE_READ_UNCORRECTED_BLOCKS:
+		dprintk("%s: FE_READ_UNCORRECTED_BLOCKS\n", __FUNCTION__);
+		*(u32 *)arg = 0;
+		return -ENOSYS;
+		break;
+
+	case FE_SET_FRONTEND: {
+			struct dvb_frontend_parameters *p =
+				(struct dvb_frontend_parameters *)arg;
+			u8 b[] = { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+				   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+				   0x00, 0xff, 0x00, 0x00, 0x00, 0xff };
+			u32 freq;
+
+			dprintk("%s: FE_SET_FRONTEND\n", __FUNCTION__);
+
+			dprintk("            frequency->%d\n", p->frequency);
+			dprintk("            symbol_rate->%d\n",
+				p->u.qam.symbol_rate);
+			dprintk("            inversion->%d\n", p->inversion);
+
+			freq = htonl(p->frequency / 1000);
+			memcpy(&b[4], &freq, sizeof (u32));
+			ttusb_dec_send_command(dec, 0x71, sizeof(b), b, NULL, NULL);
+
+			break;
+		}
+
+	case FE_GET_FRONTEND:
+		dprintk("%s: FE_GET_FRONTEND\n", __FUNCTION__);
+		break;
+
+	case FE_SLEEP:
+		dprintk("%s: FE_SLEEP\n", __FUNCTION__);
+		return -ENOSYS;
+		break;
+
+	case FE_INIT:
+		dprintk("%s: FE_INIT\n", __FUNCTION__);
+		break;
+
+	case FE_RESET:
+		dprintk("%s: FE_RESET\n", __FUNCTION__);
+		break;
+
+	default:
+		dprintk("%s: unknown IOCTL (0x%X)\n", __FUNCTION__, cmd);
+		return -EINVAL;
 
-	if (!(dec = kmalloc(sizeof(struct ttusb_dec), GFP_KERNEL))) {
-		printk("%s: couldn't allocate memory.\n", __FUNCTION__);
-		return NULL;
 	}
 
-	memset(dec, 0, sizeof(struct ttusb_dec));
+	return 0;
+}
 
-	dec->udev = udev;
+static int ttusb_dec_3000s_frontend_ioctl(struct dvb_frontend *fe, unsigned int cmd,
+				  void *arg)
+{
+	struct ttusb_dec *dec = fe->data;
 
-	ttusb_dec_init_usb(dec);
-	ttusb_dec_init_stb(dec);
-	ttusb_dec_init_dvb(dec);
-	ttusb_dec_init_v_pes(dec);
-	ttusb_dec_init_tasklet(dec);
+	dprintk("%s\n", __FUNCTION__);
 
-	return (void *)dec;
+	switch (cmd) {
+
+	case FE_GET_INFO:
+		dprintk("%s: FE_GET_INFO\n", __FUNCTION__);
+		memcpy(arg, dec->frontend_info,
+		       sizeof (struct dvb_frontend_info));
+		break;
+
+	case FE_READ_STATUS: {
+			fe_status_t *status = (fe_status_t *)arg;
+			dprintk("%s: FE_READ_STATUS\n", __FUNCTION__);
+			*status = FE_HAS_SIGNAL | FE_HAS_VITERBI |
+				  FE_HAS_SYNC | FE_HAS_CARRIER | FE_HAS_LOCK;
+			break;
+		}
+
+	case FE_READ_BER: {
+			u32 *ber = (u32 *)arg;
+			dprintk("%s: FE_READ_BER\n", __FUNCTION__);
+			*ber = 0;
+			return -ENOSYS;
+			break;
+		}
+
+	case FE_READ_SIGNAL_STRENGTH: {
+			dprintk("%s: FE_READ_SIGNAL_STRENGTH\n", __FUNCTION__);
+			*(s32 *)arg = 0xFF;
+			return -ENOSYS;
+			break;
+		}
+
+	case FE_READ_SNR:
+		dprintk("%s: FE_READ_SNR\n", __FUNCTION__);
+		*(s32 *)arg = 0;
+		return -ENOSYS;
+		break;
+
+	case FE_READ_UNCORRECTED_BLOCKS:
+		dprintk("%s: FE_READ_UNCORRECTED_BLOCKS\n", __FUNCTION__);
+		*(u32 *)arg = 0;
+		return -ENOSYS;
+		break;
+
+	case FE_SET_FRONTEND: {
+			struct dvb_frontend_parameters *p =
+				(struct dvb_frontend_parameters *)arg;
+			u8 b[] = { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+				   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+				   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				   0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
+				   0x00, 0x00, 0x00, 0x00, 0x00 };
+			u32 freq;
+			u32 sym_rate;
+			u32 band;
+
+
+			dprintk("%s: FE_SET_FRONTEND\n", __FUNCTION__);
+
+			dprintk("            frequency->%d\n", p->frequency);
+			dprintk("            symbol_rate->%d\n",
+				p->u.qam.symbol_rate);
+			dprintk("            inversion->%d\n", p->inversion);
+
+			freq = htonl(p->frequency * 1000 + (dec->hi_band ? LOF_HI : LOF_LO));
+			memcpy(&b[4], &freq, sizeof(u32));
+			sym_rate = htonl(p->u.qam.symbol_rate);
+			memcpy(&b[12], &sym_rate, sizeof(u32));
+			band = htonl(dec->hi_band ? LOF_HI : LOF_LO);
+			memcpy(&b[24], &band, sizeof(u32));
+
+			ttusb_dec_send_command(dec, 0x71, sizeof(b), b, NULL, NULL);
+
+			break;
+		}
+
+	case FE_GET_FRONTEND:
+		dprintk("%s: FE_GET_FRONTEND\n", __FUNCTION__);
+		break;
+
+	case FE_SLEEP:
+		dprintk("%s: FE_SLEEP\n", __FUNCTION__);
+		return -ENOSYS;
+		break;
+
+	case FE_INIT:
+		dprintk("%s: FE_INIT\n", __FUNCTION__);
+		break;
+
+	case FE_RESET:
+		dprintk("%s: FE_RESET\n", __FUNCTION__);
+		break;
+
+	case FE_DISEQC_SEND_MASTER_CMD:
+		dprintk("%s: FE_DISEQC_SEND_MASTER_CMD\n", __FUNCTION__);
+		break;
+
+	case FE_DISEQC_SEND_BURST:
+		dprintk("%s: FE_DISEQC_SEND_BURST\n", __FUNCTION__);
+		break;
+
+	case FE_SET_TONE: {
+			fe_sec_tone_mode_t tone = (fe_sec_tone_mode_t)arg;
+			dprintk("%s: FE_SET_TONE\n", __FUNCTION__);
+			dec->hi_band = (SEC_TONE_ON == tone);
+			break;
+		}
+
+	case FE_SET_VOLTAGE:
+		dprintk("%s: FE_SET_VOLTAGE\n", __FUNCTION__);
+		break;
+
+	default:
+		dprintk("%s: unknown IOCTL (0x%X)\n", __FUNCTION__, cmd);
+		return -EINVAL;
+
+	}
+
+	return 0;
+}
+
+static void ttusb_dec_init_frontend(struct ttusb_dec *dec)
+{
+	dec->i2c_bus.adapter = dec->adapter;
+
+	switch (dec->model) {
+		case TTUSB_DEC2000T:
+			dec->frontend_info = &dec2000t_frontend_info;
+			dec->frontend_ioctl = ttusb_dec_2000t_frontend_ioctl;
+			break;
+
+		case TTUSB_DEC3000S:
+			dec->frontend_info = &dec3000s_frontend_info;
+			dec->frontend_ioctl = ttusb_dec_3000s_frontend_ioctl;
+			break;
+	}
+
+	dvb_register_frontend(dec->frontend_ioctl, &dec->i2c_bus, (void *)dec,
+			      dec->frontend_info);
+}
+
+static void ttusb_dec_exit_frontend(struct ttusb_dec *dec)
+{
+	dvb_unregister_frontend(dec->frontend_ioctl, &dec->i2c_bus);
 }
-#else
+
 static int ttusb_dec_probe(struct usb_interface *intf,
 			   const struct usb_device_id *id)
 {
@@ -958,48 +1279,65 @@
 		return -ENOMEM;
 	}
 
+	usb_set_intfdata(intf, (void *)dec);
+
 	memset(dec, 0, sizeof(struct ttusb_dec));
 
+	switch (id->idProduct) {
+		case 0x1006:
+			dec->model = TTUSB_DEC3000S;
+			dec->model_name = "DEC3000-s";
+			dec->firmware_name = "dec3000s.bin";
+			break;
+
+		case 0x1008:
+			dec->model = TTUSB_DEC2000T;
+			dec->model_name = "DEC2000-t";
+			dec->firmware_name = "dec2000t.bin";
+			break;
+	}
+
 	dec->udev = udev;
 
 	ttusb_dec_init_usb(dec);
-	ttusb_dec_init_stb(dec);
+	if (ttusb_dec_init_stb(dec)) {
+		ttusb_dec_exit_usb(dec);
+		return 0;
+	}
 	ttusb_dec_init_dvb(dec);
+	ttusb_dec_init_frontend(dec);
 	ttusb_dec_init_v_pes(dec);
 	ttusb_dec_init_tasklet(dec);
 
-	usb_set_intfdata(intf, (void *)dec);
+	dec->active = 1;
+
 	ttusb_dec_set_streaming_interface(dec);
 
 	return 0;
 }
-#endif
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-static void ttusb_dec_disconnect(struct usb_device *udev, void *data)
-{
-	struct ttusb_dec *dec = data;
-#else
 static void ttusb_dec_disconnect(struct usb_interface *intf)
 {
 	struct ttusb_dec *dec = usb_get_intfdata(intf);
 
 	usb_set_intfdata(intf, NULL);
-#endif
 
 	dprintk("%s\n", __FUNCTION__);
 
+	if (dec->active) {
 	ttusb_dec_exit_tasklet(dec);
 	ttusb_dec_exit_usb(dec);
+		ttusb_dec_exit_frontend(dec);
 	ttusb_dec_exit_dvb(dec);
+	}
 
 	kfree(dec);
 }
 
 static struct usb_device_id ttusb_dec_table[] = {
-	{USB_DEVICE(0x0b48, 0x1006)},	/* Unconfirmed */
-	{USB_DEVICE(0x0b48, 0x1007)},	/* Unconfirmed */
-	{USB_DEVICE(0x0b48, 0x1008)},	/* DEC 2000 t */
+	{USB_DEVICE(0x0b48, 0x1006)},	/* DEC3000-s */
+	/*{USB_DEVICE(0x0b48, 0x1007)},	   Unconfirmed */
+	{USB_DEVICE(0x0b48, 0x1008)},	/* DEC2000-t */
 	{}
 };
 
--- diff/drivers/media/video/video-buf.c	2003-11-25 15:24:57.000000000 +0000
+++ source/drivers/media/video/video-buf.c	2003-12-29 09:30:41.000000000 +0000
@@ -1078,7 +1078,7 @@
  */
 static struct page*
 videobuf_vm_nopage(struct vm_area_struct *vma, unsigned long vaddr,
-		  int write_access)
+		  int *type)
 {
 	struct page *page;
 
@@ -1090,6 +1090,8 @@
 	if (!page)
 		return NOPAGE_OOM;
 	clear_user_page(page_address(page), vaddr, page);
+	if (type)
+		*type = VM_FAULT_MINOR;
 	return page;
 }
 
--- diff/drivers/message/i2o/i2o_block.c	2003-08-20 14:16:29.000000000 +0100
+++ source/drivers/message/i2o/i2o_block.c	2003-12-29 09:30:41.000000000 +0000
@@ -885,10 +885,10 @@
  *	Issue device specific ioctl calls.
  */
 
-static int i2ob_ioctl(struct inode *inode, struct file *file,
+static int i2ob_ioctl(struct block_device *bdev, struct file *file,
 		     unsigned int cmd, unsigned long arg)
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
+	struct gendisk *disk = bdev->bd_disk;
 	struct i2ob_device *dev = disk->private_data;
 
 	/* Anyone capable of this syscall can do *real bad* things */
@@ -901,7 +901,7 @@
 			struct hd_geometry g;
 			i2o_block_biosparam(get_capacity(disk), 
 					&g.cylinders, &g.heads, &g.sectors);
-			g.start = get_start_sect(inode->i_bdev);
+			g.start = get_start_sect(bdev);
 			return copy_to_user((void *)arg,&g, sizeof(g))?-EFAULT:0;
 		}
 		
@@ -927,9 +927,8 @@
  *	Close the block device down
  */
  
-static int i2ob_release(struct inode *inode, struct file *file)
+static int i2ob_release(struct gendisk *disk)
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
 	struct i2ob_device *dev = disk->private_data;
 
 	/*
@@ -999,9 +998,9 @@
  *	Open the block device.
  */
  
-static int i2ob_open(struct inode *inode, struct file *file)
+static int i2ob_open(struct block_device *bdev, struct file *file)
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
+	struct gendisk *disk = bdev->bd_disk;
 	struct i2ob_device *dev = disk->private_data;
 
 	if(!dev->i2odev)	
--- diff/drivers/mtd/mtd_blkdevs.c	2003-09-30 15:46:15.000000000 +0100
+++ source/drivers/mtd/mtd_blkdevs.c	2003-12-29 09:30:41.000000000 +0000
@@ -141,14 +141,12 @@
 }
 
 
-int blktrans_open(struct inode *i, struct file *f)
+static int blktrans_open(struct block_device *bdev, struct file *f)
 {
-	struct mtd_blktrans_dev *dev;
-	struct mtd_blktrans_ops *tr;
+	struct mtd_blktrans_dev *dev = bdev->bd_disk->private_data;
+	struct mtd_blktrans_ops *tr = dev->tr;
 	int ret = -ENODEV;
 
-	dev = i->i_bdev->bd_disk->private_data;
-	tr = dev->tr;
 
 	if (!try_module_get(dev->mtd->owner))
 		goto out;
@@ -172,15 +170,12 @@
 	return ret;
 }
 
-int blktrans_release(struct inode *i, struct file *f)
+static int blktrans_release(struct gendisk *disk)
 {
-	struct mtd_blktrans_dev *dev;
-	struct mtd_blktrans_ops *tr;
+	struct mtd_blktrans_dev *dev = disk->private_data;
+	struct mtd_blktrans_ops *tr = dev->tr;
 	int ret = 0;
 
-	dev = i->i_bdev->bd_disk->private_data;
-	tr = dev->tr;
-
 	if (tr->release)
 		ret = tr->release(dev);
 
@@ -194,10 +189,10 @@
 }
 
 
-static int blktrans_ioctl(struct inode *inode, struct file *file, 
+static int blktrans_ioctl(struct block_device *bdev, struct file *file,
 			      unsigned int cmd, unsigned long arg)
 {
-	struct mtd_blktrans_dev *dev = inode->i_bdev->bd_disk->private_data;
+	struct mtd_blktrans_dev *dev = bdev->bd_disk->private_data;
 	struct mtd_blktrans_ops *tr = dev->tr;
 
 	switch (cmd) {
@@ -217,7 +212,7 @@
 			if (ret)
 				return ret;
 
-			g.start = get_start_sect(inode->i_bdev);
+			g.start = get_start_sect(bdev);
 			if (copy_to_user((void *)arg, &g, sizeof(g)))
 				return -EFAULT;
 			return 0;
--- diff/drivers/net/3c527.c	2003-11-25 15:24:57.000000000 +0000
+++ source/drivers/net/3c527.c	2003-12-29 09:30:41.000000000 +0000
@@ -1,9 +1,10 @@
-/* 3c527.c: 3Com Etherlink/MC32 driver for Linux 2.4
+/* 3c527.c: 3Com Etherlink/MC32 driver for Linux 2.4 and 2.6.
  *
  *	(c) Copyright 1998 Red Hat Software Inc
  *	Written by Alan Cox. 
  *	Further debugging by Carl Drougge.
- *      Modified by Richard Procter (rnp@netlink.co.nz)
+ *      Initial SMP support by Felipe W Damasio <felipewd@terra.com.br>
+ *      Heavily modified by Richard Procter <rnp@paradise.net.nz>
  *
  *	Based on skeleton.c written 1993-94 by Donald Becker and ne2.c
  *	(for the MCA stuff) written by Wim Dumon.
@@ -17,11 +18,11 @@
  */
 
 #define DRV_NAME		"3c527"
-#define DRV_VERSION		"0.6a"
-#define DRV_RELDATE		"2001/11/17"
+#define DRV_VERSION		"0.7-SMP"
+#define DRV_RELDATE		"2003/09/21"
 
 static const char *version =
-DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " Richard Proctor (rnp@netlink.co.nz)\n";
+DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " Richard Procter <rnp@paradise.net.nz>\n";
 
 /**
  * DOC: Traps for the unwary
@@ -100,7 +101,9 @@
 #include <linux/string.h>
 #include <linux/wait.h>
 #include <linux/ethtool.h>
+#include <linux/completion.h>
 
+#include <asm/semaphore.h>
 #include <asm/uaccess.h>
 #include <asm/system.h>
 #include <asm/bitops.h>
@@ -143,19 +146,19 @@
 static const int WORKAROUND_82586=1;
 
 /* Pointers to buffers and their on-card records */
-
 struct mc32_ring_desc 
 {
 	volatile struct skb_header *p;                    
 	struct sk_buff *skb;          
 };
 
-
 /* Information that needs to be kept for each board. */
 struct mc32_local 
 {
-	struct net_device_stats net_stats;
 	int slot;
+
+	u32 base;
+	struct net_device_stats net_stats;
 	volatile struct mc32_mailbox *rx_box;
 	volatile struct mc32_mailbox *tx_box;
 	volatile struct mc32_mailbox *exec_box;
@@ -165,22 +168,23 @@
         u16 tx_len;             /* Transmit list count */ 
         u16 rx_len;             /* Receive list count */
 
-	u32 base;
-	u16 exec_pending;
-	u16 mc_reload_wait;	/* a multicast load request is pending */
+	u16 xceiver_desired_state; /* HALTED or RUNNING */
+	u16 cmd_nonblocking;    /* Thread is uninterested in command result */
+	u16 mc_reload_wait;	/* A multicast load request is pending */
 	u32 mc_list_valid;	/* True when the mclist is set */
-	u16 xceiver_state;      /* Current transceiver state. bitmapped */ 
-	u16 desired_state;      /* The state we want the transceiver to be in */ 
-	atomic_t tx_count;	/* buffers left */
-	wait_queue_head_t event;
 
 	struct mc32_ring_desc tx_ring[TX_RING_LEN];	/* Host Transmit ring */
 	struct mc32_ring_desc rx_ring[RX_RING_LEN];	/* Host Receive ring */
 
+	atomic_t tx_count;	/* buffers left */
+	atomic_t tx_ring_head;  /* index to tx en-queue end */
 	u16 tx_ring_tail;       /* index to tx de-queue end */
-	u16 tx_ring_head;       /* index to tx en-queue end */
 
 	u16 rx_ring_tail;       /* index to rx de-queue end */ 
+
+	struct semaphore cmd_mutex;    /* Serialises issuing of execute commands */
+        struct completion execution_cmd; /* Card has completed an execute command */
+	struct completion xceiver_cmd;   /* Card has completed a tx or rx command */
 };
 
 /* The station (ethernet) address prefix, used for a sanity check. */
@@ -236,7 +240,6 @@
 {
 	static int current_mca_slot = -1;
 	int i;
-	int adapter_found = 0;
 
 	SET_MODULE_OWNER(dev);
 
@@ -247,11 +250,11 @@
 	   Autodetecting MCA cards is extremely simple. 
 	   Just search for the card. */
 
-	for(i = 0; (mc32_adapters[i].name != NULL) && !adapter_found; i++) {
+	for(i = 0; (mc32_adapters[i].name != NULL); i++) {
 		current_mca_slot = 
 			mca_find_unused_adapter(mc32_adapters[i].id, 0);
 
-		if((current_mca_slot != MCA_NOTFOUND) && !adapter_found) {
+		if(current_mca_slot != MCA_NOTFOUND) {
 			if(!mc32_probe1(dev, current_mca_slot))
 			{
 				mca_set_adapter_name(current_mca_slot, 
@@ -409,7 +412,7 @@
 	 *	Grab the IRQ
 	 */
 
-	i = request_irq(dev->irq, &mc32_interrupt, SA_SHIRQ, dev->name, dev);
+	i = request_irq(dev->irq, &mc32_interrupt, SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev);
 	if (i) {
 		release_region(dev->base_addr, MC32_IO_EXTENT);
 		printk(KERN_ERR "%s: unable to get IRQ %d.\n", dev->name, dev->irq);
@@ -498,7 +501,9 @@
 	lp->tx_len 		= lp->exec_box->data[9];   /* Transmit list count */ 
 	lp->rx_len 		= lp->exec_box->data[11];  /* Receive list count */
 
-	init_waitqueue_head(&lp->event);
+	init_MUTEX_LOCKED(&lp->cmd_mutex);
+	init_completion(&lp->execution_cmd);
+	init_completion(&lp->xceiver_cmd);
 	
 	printk("%s: Firmware Rev %d. %d RX buffers, %d TX buffers. Base of 0x%08X.\n",
 		dev->name, lp->exec_box->data[12], lp->rx_len, lp->tx_len, lp->base);
@@ -511,10 +516,6 @@
 	dev->tx_timeout		= mc32_timeout;
 	dev->watchdog_timeo	= HZ*5;	/* Board does all the work */
 	dev->ethtool_ops	= &netdev_ethtool_ops;
-	
-	lp->xceiver_state = HALTED; 
-	
-	lp->tx_ring_tail=lp->tx_ring_head=0;
 
 	/* Fill in the fields of the device structure with ethernet values. */
 	ether_setup(dev);
@@ -539,7 +540,7 @@
  *	status of any pending commands and takes very little time at all.
  */
  
-static void mc32_ready_poll(struct net_device *dev)
+static inline void mc32_ready_poll(struct net_device *dev)
 {
 	int ioaddr = dev->base_addr;
 	while(!(inb(ioaddr+HOST_STATUS)&HOST_STATUS_CRR));
@@ -554,31 +555,38 @@
  *	@len: Length of the data block
  *
  *	Send a command from interrupt state. If there is a command
- *	currently being executed then we return an error of -1. It simply
- *	isn't viable to wait around as commands may be slow. Providing we
- *	get in, we busy wait for the board to become ready to accept the
- *	command and issue it. We do not wait for the command to complete
- *	--- the card will interrupt us when it's done.
+ *	currently being executed then we return an error of -1. It
+ *	simply isn't viable to wait around as commands may be
+ *	slow. This can theoretically be starved on SMP, but it's hard
+ *	to see a realistic situation.  We do not wait for the command
+ *	to complete --- we rely on the interrupt handler to tidy up
+ *	after us.
  */
 
 static int mc32_command_nowait(struct net_device *dev, u16 cmd, void *data, int len)
 {
 	struct mc32_local *lp = (struct mc32_local *)dev->priv;
 	int ioaddr = dev->base_addr;
+	int ret = -1;
 
-	if(lp->exec_pending)
-		return -1;
-	
-	lp->exec_pending=3;
-	lp->exec_box->mbox=0;
-	lp->exec_box->mbox=cmd;
-	memcpy((void *)lp->exec_box->data, data, len);
-	barrier();	/* the memcpy forgot the volatile so be sure */
+	if (down_trylock(&lp->cmd_mutex) == 0)
+	{
+		lp->cmd_nonblocking=1;
+		lp->exec_box->mbox=0;
+		lp->exec_box->mbox=cmd;
+		memcpy((void *)lp->exec_box->data, data, len);
+		barrier();	/* the memcpy forgot the volatile so be sure */
+
+		/* Send the command */
+		mc32_ready_poll(dev);
+		outb(1<<6, ioaddr+HOST_CMD);
 
-	/* Send the command */
-	while(!(inb(ioaddr+HOST_STATUS)&HOST_STATUS_CRR));
-	outb(1<<6, ioaddr+HOST_CMD);	
-	return 0;
+		ret = 0;
+
+		/* Interrupt handler will signal mutex on completion */
+	}
+
+	return ret;
 }
 
 
@@ -592,76 +600,47 @@
  *	Sends exec commands in a user context. This permits us to wait around
  *	for the replies and also to wait for the command buffer to complete
  *	from a previous command before we execute our command. After our 
- *	command completes we will complete any pending multicast reload
+ *	command completes we will attempt any pending multicast reload
  *	we blocked off by hogging the exec buffer.
  *
  *	You feed the card a command, you wait, it interrupts you get a 
  *	reply. All well and good. The complication arises because you use
  *	commands for filter list changes which come in at bh level from things
  *	like IPV6 group stuff.
- *
- *	We have a simple state machine
- *
- *	0	- nothing issued
- *
- *	1	- command issued, wait reply
- *
- *	2	- reply waiting - reader then goes to state 0
- *
- *	3	- command issued, trash reply. In which case the irq
- *		  takes it back to state 0
- *
  */
   
 static int mc32_command(struct net_device *dev, u16 cmd, void *data, int len)
 {
 	struct mc32_local *lp = (struct mc32_local *)dev->priv;
 	int ioaddr = dev->base_addr;
-	unsigned long flags;
 	int ret = 0;
 	
+	down(&lp->cmd_mutex);
+
 	/*
-	 *	Wait for a command
-	 */
-	 
-	save_flags(flags);
-	cli();
-	 
-	while(lp->exec_pending)
-		sleep_on(&lp->event);
-		
-	/*
-	 *	Issue mine
+	 *     My Turn
 	 */
 
-	lp->exec_pending=1;
-	
-	restore_flags(flags);
-	
+	lp->cmd_nonblocking=0;
 	lp->exec_box->mbox=0;
 	lp->exec_box->mbox=cmd;
 	memcpy((void *)lp->exec_box->data, data, len);
 	barrier();	/* the memcpy forgot the volatile so be sure */
 
-	/* Send the command */
-	while(!(inb(ioaddr+HOST_STATUS)&HOST_STATUS_CRR));
-	outb(1<<6, ioaddr+HOST_CMD);	
-
-	save_flags(flags);
-	cli();
+	mc32_ready_poll(dev);
+	outb(1<<6, ioaddr+HOST_CMD);
 
-	while(lp->exec_pending!=2)
-		sleep_on(&lp->event);
-	lp->exec_pending=0;
-	restore_flags(flags);
+	wait_for_completion(&lp->execution_cmd);
 	
 	if(lp->exec_box->mbox&(1<<13))
 		ret = -1;
 
+	up(&lp->cmd_mutex);
+
 	/*
-	 *	A multicast set got blocked - do it now
-	 */
-		
+	 *	A multicast set got blocked - try it now
+         */
+
 	if(lp->mc_reload_wait)
 	{
 		mc32_reset_multicast_list(dev);
@@ -678,11 +657,9 @@
  *	This may be called from the interrupt state, where it is used
  *	to restart the rx ring if the card runs out of rx buffers. 
  *	
- * 	First, we check if it's ok to start the transceiver. We then show
- * 	the card where to start in the rx ring and issue the
- * 	commands to start reception and transmission. We don't wait
- * 	around for these to complete.
- */ 
+ * 	We must first check if it's ok to (re)start the transceiver. See
+ *      mc32_close for details.
+ */
 
 static void mc32_start_transceiver(struct net_device *dev) {
 
@@ -690,24 +667,20 @@
 	int ioaddr = dev->base_addr;
 
 	/* Ignore RX overflow on device closure */ 
-	if (lp->desired_state==HALTED)  
+	if (lp->xceiver_desired_state==HALTED)
 		return; 
 
+	/* Give the card the offset to the post-EOL-bit RX descriptor */
 	mc32_ready_poll(dev); 
-
-	lp->tx_box->mbox=0;
 	lp->rx_box->mbox=0;
-
-	/* Give the card the offset to the post-EOL-bit RX descriptor */ 
 	lp->rx_box->data[0]=lp->rx_ring[prev_rx(lp->rx_ring_tail)].p->next; 
-
 	outb(HOST_CMD_START_RX, ioaddr+HOST_CMD);      
 
 	mc32_ready_poll(dev); 
+	lp->tx_box->mbox=0;
 	outb(HOST_CMD_RESTRT_TX, ioaddr+HOST_CMD);   /* card ignores this on RX restart */ 
 	
 	/* We are not interrupted on start completion */ 
-	lp->xceiver_state=RUNNING; 
 }
 
 
@@ -727,25 +700,17 @@
 {
 	struct mc32_local *lp = (struct mc32_local *)dev->priv;
 	int ioaddr = dev->base_addr;
-	unsigned long flags;
 
 	mc32_ready_poll(dev);	
-
-	lp->tx_box->mbox=0;
 	lp->rx_box->mbox=0;
-
 	outb(HOST_CMD_SUSPND_RX, ioaddr+HOST_CMD);			
+	wait_for_completion(&lp->xceiver_cmd);
+
 	mc32_ready_poll(dev); 
+	lp->tx_box->mbox=0;
 	outb(HOST_CMD_SUSPND_TX, ioaddr+HOST_CMD);	
-		
-	save_flags(flags);
-	cli();
-		
-	while(lp->xceiver_state!=HALTED) 
-		sleep_on(&lp->event); 
-		
-	restore_flags(flags);	
-} 
+	wait_for_completion(&lp->xceiver_cmd);
+}
 
 
 /**
@@ -756,7 +721,7 @@
  *	the point where mc32_start_transceiver() can be called.
  *
  *	The card sets up the receive ring for us. We are required to use the
- *	ring it provides although we can change the size of the ring.
+ *	ring it provides, although the size of the ring is configurable.
  *
  * 	We allocate an sk_buff for each ring entry in turn and
  * 	initalise its house-keeping info. At the same time, we read
@@ -777,7 +742,7 @@
 	
 	rx_base=lp->rx_chain;
 
-	for(i=0;i<RX_RING_LEN;i++)
+	for(i=0; i<RX_RING_LEN; i++)
 	{
 		lp->rx_ring[i].skb=alloc_skb(1532, GFP_KERNEL);
 		skb_reserve(lp->rx_ring[i].skb, 18);  
@@ -814,21 +779,19 @@
  *
  *	Free the buffer for each ring slot. This may be called 
  *      before mc32_load_rx_ring(), eg. on error in mc32_open().
+ *      Requires rx skb pointers to point to a valid skb, or NULL.
  */
 
 static void mc32_flush_rx_ring(struct net_device *dev)
 {
 	struct mc32_local *lp = (struct mc32_local *)dev->priv;
-	
-	struct sk_buff *skb;
 	int i; 
 
 	for(i=0; i < RX_RING_LEN; i++) 
 	{ 
-		skb = lp->rx_ring[i].skb;
-		if (skb!=NULL) {
-			kfree_skb(skb);
-			skb=NULL; 
+		if (lp->rx_ring[i].skb) {
+			dev_kfree_skb(lp->rx_ring[i].skb);
+			lp->rx_ring[i].skb = NULL;
 		}
 		lp->rx_ring[i].p=NULL; 
 	} 
@@ -860,7 +823,7 @@
 
 	tx_base=lp->tx_box->data[0]; 
 
-	for(i=0;i<lp->tx_len;i++) 
+	for(i=0 ; i<TX_RING_LEN ; i++)
 	{
 		p=isa_bus_to_virt(lp->base+tx_base);
 		lp->tx_ring[i].p=p; 
@@ -869,11 +832,12 @@
 		tx_base=p->next;
 	}
 
-	/* -1 so that tx_ring_head cannot "lap" tx_ring_tail,           */
-	/* which would be bad news for mc32_tx_ring as cur. implemented */ 
+	/* -1 so that tx_ring_head cannot "lap" tx_ring_tail */
+	/* see mc32_tx_ring */
 
 	atomic_set(&lp->tx_count, TX_RING_LEN-1); 
-	lp->tx_ring_head=lp->tx_ring_tail=0; 
+	atomic_set(&lp->tx_ring_head, 0);
+	lp->tx_ring_tail=0;
 } 
 
 
@@ -881,47 +845,29 @@
  *	mc32_flush_tx_ring 	-	free transmit ring
  *	@lp: Local data of 3c527 to flush the tx ring of
  *
- *	We have to consider two cases here. We want to free the pending
- *	buffers only. If the ring buffer head is past the start then the
- *	ring segment we wish to free wraps through zero. The tx ring 
- *	house-keeping variables are then reset.
+ *      If the ring is non-empty, zip over the it, freeing any
+ *      allocated skb_buffs.  The tx ring house-keeping variables are
+ *      then reset. Requires rx skb pointers to point to a valid skb,
+ *      or NULL.
  */
 
 static void mc32_flush_tx_ring(struct net_device *dev)
 {
 	struct mc32_local *lp = (struct mc32_local *)dev->priv;
-	
-	if(lp->tx_ring_tail!=lp->tx_ring_head)
+	int i;
+
+	for (i=0; i < TX_RING_LEN; i++)
 	{
-		int i;	
-		if(lp->tx_ring_tail < lp->tx_ring_head)
-		{
-			for(i=lp->tx_ring_tail;i<lp->tx_ring_head;i++)
-			{
-				dev_kfree_skb(lp->tx_ring[i].skb);
-				lp->tx_ring[i].skb=NULL;
-				lp->tx_ring[i].p=NULL; 
-			}
-		}
-		else
+		if (lp->tx_ring[i].skb)
 		{
-			for(i=lp->tx_ring_tail; i<TX_RING_LEN; i++) 
-			{
-				dev_kfree_skb(lp->tx_ring[i].skb);
-				lp->tx_ring[i].skb=NULL;
-				lp->tx_ring[i].p=NULL; 
-			}
-			for(i=0; i<lp->tx_ring_head; i++) 
-			{
-				dev_kfree_skb(lp->tx_ring[i].skb);
-				lp->tx_ring[i].skb=NULL;
-				lp->tx_ring[i].p=NULL; 
-			}
+			dev_kfree_skb(lp->tx_ring[i].skb);
+			lp->tx_ring[i].skb = NULL;
 		}
 	}
-	
+
 	atomic_set(&lp->tx_count, 0); 
-	lp->tx_ring_tail=lp->tx_ring_head=0;
+	atomic_set(&lp->tx_ring_head, 0);
+	lp->tx_ring_tail=0;
 }
  	
 
@@ -958,6 +904,12 @@
 	regs|=HOST_CTRL_INTE;
 	outb(regs, ioaddr+HOST_CTRL);
 	
+	/*
+	 *      Allow ourselves to issue commands
+	 */
+
+	up(&lp->cmd_mutex);
+
 
 	/*
 	 *	Send the indications on command
@@ -1010,7 +962,7 @@
 		return -ENOBUFS;
 	}
 
-	lp->desired_state = RUNNING; 
+	lp->xceiver_desired_state = RUNNING;
 	
 	/* And finally, set the ball rolling... */
 	mc32_start_transceiver(dev);
@@ -1047,61 +999,64 @@
  *	Transmit a buffer. This normally means throwing the buffer onto
  *	the transmit queue as the queue is quite large. If the queue is
  *	full then we set tx_busy and return. Once the interrupt handler
- *	gets messages telling it to reclaim transmit queue entries we will
+ *	gets messages telling it to reclaim transmit queue entries, we will
  *	clear tx_busy and the kernel will start calling this again.
  *
- *	We use cli rather than spinlocks. Since I have no access to an SMP
- *	MCA machine I don't plan to change it. It is probably the top 
- *	performance hit for this driver on SMP however.
+ *      We do not disable interrupts or acquire any locks; this can
+ *      run concurrently with mc32_tx_ring(), and the function itself
+ *      is serialised at a higher layer. However, similarly for the
+ *      card itself, we must ensure that we update tx_ring_head only
+ *      after we've established a valid packet on the tx ring (and
+ *      before we let the card "see" it, to prevent it racing with the
+ *      irq handler).
+ *
  */
 
 static int mc32_send_packet(struct sk_buff *skb, struct net_device *dev)
 {
 	struct mc32_local *lp = (struct mc32_local *)dev->priv;
-	unsigned long flags;
+	u32 head = atomic_read(&lp->tx_ring_head);
 
 	volatile struct skb_header *p, *np;
 
 	netif_stop_queue(dev);
 
-	save_flags(flags);
-	cli();
-		
-	if(atomic_read(&lp->tx_count)==0)
-	{
-		restore_flags(flags);
+	if(atomic_read(&lp->tx_count)==0) {
 		return 1;
 	}
 
+	skb = skb_padto(skb, ETH_ZLEN);
+	if (skb == NULL) {
+		netif_wake_queue(dev);
+		return 0;
+	}
+
 	atomic_dec(&lp->tx_count); 
 
 	/* P is the last sending/sent buffer as a pointer */
-	p=lp->tx_ring[lp->tx_ring_head].p; 
+	p=lp->tx_ring[head].p;
 		
-	lp->tx_ring_head=next_tx(lp->tx_ring_head); 
+	head = next_tx(head);
 
 	/* NP is the buffer we will be loading */
-	np=lp->tx_ring[lp->tx_ring_head].p; 
-
-   	if (skb->len < ETH_ZLEN) {
-   		skb = skb_padto(skb, ETH_ZLEN);
-   		if (skb == NULL)
-   			goto out;
-   	}
+	np=lp->tx_ring[head].p;
 
 	/* We will need this to flush the buffer out */
-	lp->tx_ring[lp->tx_ring_head].skb = skb;
-   	   
-	np->length = (skb->len < ETH_ZLEN) ? ETH_ZLEN : skb->len; 
-			
+	lp->tx_ring[head].skb=skb;
+
+	np->length      = unlikely(skb->len < ETH_ZLEN) ? ETH_ZLEN : skb->len;
 	np->data	= isa_virt_to_bus(skb->data);
 	np->status	= 0;
 	np->control     = CONTROL_EOP | CONTROL_EOL;     
 	wmb();
 		
-	p->control     &= ~CONTROL_EOL;     /* Clear EOL on p */ 
-out:	
-	restore_flags(flags);
+	/*
+	 * The new frame has been setup; we can now
+	 * let the interrupt handler and card "see" it
+	 */
+
+	atomic_set(&lp->tx_ring_head, head);
+	p->control     &= ~CONTROL_EOL;
 
 	netif_wake_queue(dev);
 	return 0;
@@ -1182,10 +1137,11 @@
 {
 	struct mc32_local *lp=dev->priv;		
 	volatile struct skb_header *p;
-	u16 rx_ring_tail = lp->rx_ring_tail;
-	u16 rx_old_tail = rx_ring_tail; 
-
+	u16 rx_ring_tail;
+	u16 rx_old_tail;
 	int x=0;
+
+	rx_old_tail = rx_ring_tail = lp->rx_ring_tail;
 	
 	do
 	{ 
@@ -1275,9 +1231,14 @@
 	struct mc32_local *lp=(struct mc32_local *)dev->priv;
 	volatile struct skb_header *np;
 
-	/* NB: lp->tx_count=TX_RING_LEN-1 so that tx_ring_head cannot "lap" tail here */
+	/*
+	 * We rely on head==tail to mean 'queue empty'.
+	 * This is why lp->tx_count=TX_RING_LEN-1: in order to prevent
+	 * tx_ring_head wrapping to tail and confusing a 'queue empty'
+	 * condition with 'queue full'
+	 */
 
-	while (lp->tx_ring_tail != lp->tx_ring_head)  
+	while (lp->tx_ring_tail != atomic_read(&lp->tx_ring_head))
 	{   
 		u16 t; 
 
@@ -1388,8 +1349,7 @@
 				break;
 			case 3: /* Halt */
 			case 4: /* Abort */
-				lp->xceiver_state |= TX_HALTED; 
-				wake_up(&lp->event);
+				complete(&lp->xceiver_cmd);
 				break;
 			default:
 				printk("%s: strange tx ack %d\n", dev->name, status&7);
@@ -1404,8 +1364,7 @@
 				break;
 			case 3: /* Halt */
 			case 4: /* Abort */
-				lp->xceiver_state |= RX_HALTED;
-				wake_up(&lp->event);
+				complete(&lp->xceiver_cmd);
 				break;
 			case 6:
 				/* Out of RX buffers stat */
@@ -1421,26 +1380,17 @@
 		status>>=3;
 		if(status&1)
 		{
-
-			/* 0=no 1=yes 2=replied, get cmd, 3 = wait reply & dump it */
-			
-			if(lp->exec_pending!=3) {
-				lp->exec_pending=2;
-				wake_up(&lp->event);
-			}
-			else 
-			{				
-			  	lp->exec_pending=0;
-
-				/* A new multicast set may have been
-				   blocked while the old one was
-				   running. If so, do it now. */
+			/*
+			 * No thread is waiting: we need to tidy
+			 * up ourself.
+			 */
 				   
+			if (lp->cmd_nonblocking) {
+				up(&lp->cmd_mutex);
 				if (lp->mc_reload_wait) 
 					mc32_reset_multicast_list(dev);
-				else 
-					wake_up(&lp->event);			       
 			}
+			else complete(&lp->execution_cmd);
 		}
 		if(status&2)
 		{
@@ -1493,12 +1443,12 @@
 static int mc32_close(struct net_device *dev)
 {
 	struct mc32_local *lp = (struct mc32_local *)dev->priv;
-
 	int ioaddr = dev->base_addr;
+
 	u8 regs;
 	u16 one=1;
 	
-	lp->desired_state = HALTED;
+	lp->xceiver_desired_state = HALTED;
 	netif_stop_queue(dev);
 
 	/*
@@ -1511,11 +1461,10 @@
 
 	mc32_halt_transceiver(dev); 
 	
-	/* Catch any waiting commands */
+	/* Ensure we issue no more commands beyond this point */
+
+	down(&lp->cmd_mutex);
 	
-	while(lp->exec_pending==1)
-		sleep_on(&lp->event);
-	       
 	/* Ok the card is now stopping */	
 	
 	regs=inb(ioaddr+HOST_CTRL);
@@ -1542,12 +1491,9 @@
 
 static struct net_device_stats *mc32_get_stats(struct net_device *dev)
 {
-	struct mc32_local *lp;
+	struct mc32_local *lp = (struct mc32_local *)dev->priv;
 	
 	mc32_update_stats(dev); 
-
-	lp = (struct mc32_local *)dev->priv;
-
 	return &lp->net_stats;
 }
 
--- diff/drivers/net/3c527.h	2002-10-16 04:27:13.000000000 +0100
+++ source/drivers/net/3c527.h	2003-12-29 09:30:41.000000000 +0000
@@ -27,10 +27,8 @@
 
 #define HOST_RAMPAGE		8
 
-#define RX_HALTED (1<<0)
-#define TX_HALTED (1<<1)  
-#define HALTED (RX_HALTED | TX_HALTED)
-#define RUNNING 0
+#define HALTED 0
+#define RUNNING 1
 
 struct mc32_mailbox
 {
--- diff/drivers/net/3c59x.c	2003-10-09 09:47:16.000000000 +0100
+++ source/drivers/net/3c59x.c	2003-12-29 09:30:41.000000000 +0000
@@ -1063,6 +1063,22 @@
 	return rc;
 }
 
+#ifdef CONFIG_NET_POLL_CONTROLLER
+static void vortex_rx_poll(struct net_device *dev)
+{
+	disable_irq(dev->irq);
+	vortex_interrupt(dev->irq, (void *)dev, 0);
+	enable_irq(dev->irq);
+}
+
+static void boomerang_rx_poll(struct net_device *dev)
+{
+	disable_irq(dev->irq);
+	boomerang_interrupt(dev->irq, (void *)dev, 0);
+	enable_irq(dev->irq);
+}
+#endif
+
 /*
  * Start up the PCI/EISA device which is described by *gendev.
  * Return 0 on success.
@@ -1450,6 +1466,13 @@
 	dev->set_multicast_list = set_rx_mode;
 	dev->tx_timeout = vortex_tx_timeout;
 	dev->watchdog_timeo = (watchdog * HZ) / 1000;
+#ifdef CONFIG_NET_POLL_CONTROLLER
+	if (vp->full_bus_master_tx)
+		dev->poll_controller = boomerang_rx_poll;
+	else
+		dev->poll_controller = vortex_rx_poll;
+#endif
+
 	if (pdev) {
 		vp->pm_state_valid = 1;
  		pci_save_state(VORTEX_PCI(vp), vp->power_state);
--- diff/drivers/net/8139too.c	2003-11-25 15:24:57.000000000 +0000
+++ source/drivers/net/8139too.c	2003-12-29 09:30:41.000000000 +0000
@@ -620,6 +620,10 @@
 static void rtl8139_hw_start (struct net_device *dev);
 static struct ethtool_ops rtl8139_ethtool_ops;
 
+#ifdef CONFIG_NET_POLL_CONTROLLER
+static void rtl8139_rx_poll (struct net_device *dev);
+#endif
+
 #ifdef USE_IO_OPS
 
 #define RTL_R8(reg)		inb (((unsigned long)ioaddr) + (reg))
@@ -972,6 +976,10 @@
 	dev->tx_timeout = rtl8139_tx_timeout;
 	dev->watchdog_timeo = TX_TIMEOUT;
 
+#ifdef CONFIG_NET_POLL_CONTROLLER
+	dev->poll_controller = rtl8139_rx_poll;
+#endif
+
 	/* note: the hardware is not capable of sg/csum/highdma, however
 	 * through the use of skb_copy_and_csum_dev we enable these
 	 * features
@@ -2390,6 +2398,15 @@
 	return &tp->stats;
 }
 
+#ifdef CONFIG_NET_POLL_CONTROLLER
+static void rtl8139_rx_poll (struct net_device *dev)
+{
+	disable_irq(dev->irq);
+	rtl8139_interrupt(dev->irq, (void *)dev, 0);
+	enable_irq(dev->irq);
+}
+#endif
+
 /* Set or clear the multicast filter for this adaptor.
    This routine is not state sensitive and need not be SMP locked. */
 
@@ -2475,10 +2492,11 @@
 	tp->stats.rx_missed_errors += RTL_R32 (RxMissed);
 	RTL_W32 (RxMissed, 0);
 
+	spin_unlock_irqrestore (&tp->lock, flags);
+
 	pci_set_power_state (pdev, 3);
 	pci_save_state (pdev, tp->pci_state);
 
-	spin_unlock_irqrestore (&tp->lock, flags);
 	return 0;
 }
 
--- diff/drivers/net/Kconfig	2003-10-27 09:20:38.000000000 +0000
+++ source/drivers/net/Kconfig	2003-12-29 09:30:41.000000000 +0000
@@ -657,7 +657,7 @@
 
 config ELMC_II
 	tristate "3c527 \"EtherLink/MC 32\" support (EXPERIMENTAL)"
-	depends on NET_VENDOR_3COM && MCA && EXPERIMENTAL && BROKEN_ON_SMP
+	depends on NET_VENDOR_3COM && MCA && MCA_LEGACY
 	help
 	  If you have a network (Ethernet) card of this type, say Y and read
 	  the Ethernet-HOWTO, available from
@@ -1283,6 +1283,19 @@
 	  <file:Documentation/networking/net-modules.txt>.  The module will be
 	  called b44.
 
+config FORCEDETH
+	tristate "Reverse Engineered nForce Ethernet support (EXPERIMENTAL)"
+	depends on NET_PCI && PCI && EXPERIMENTAL
+	help
+	  If you have a network (Ethernet) controller of this type, say Y and
+	  read the Ethernet-HOWTO, available from
+	  <http://www.tldp.org/docs.html#howto>.
+
+	  To compile this driver as a module, choose M here and read
+	  <file:Documentation/networking/net-modules.txt>.  The module will be
+	  called forcedeth.
+
+
 config CS89x0
 	tristate "CS89x0 support"
 	depends on NET_PCI && ISA
@@ -2441,6 +2454,9 @@
 	  To compile this driver as a module, choose M here: the module
 	  will be called shaper.  If unsure, say N.
 
+config NET_POLL_CONTROLLER
+	def_bool KGDB
+
 source "drivers/net/wan/Kconfig"
 
 source "drivers/net/pcmcia/Kconfig"
--- diff/drivers/net/Makefile	2003-10-09 09:47:16.000000000 +0100
+++ source/drivers/net/Makefile	2003-12-29 09:30:41.000000000 +0000
@@ -32,6 +32,8 @@
 
 obj-$(CONFIG_OAKNET) += oaknet.o 8390.o
 
+obj-$(CONFIG_KGDB) += kgdb_eth.o
+
 obj-$(CONFIG_DGRS) += dgrs.o
 obj-$(CONFIG_RCPCI) += rcpci.o
 obj-$(CONFIG_VORTEX) += 3c59x.o
@@ -95,6 +97,7 @@
 obj-$(CONFIG_NE3210) += ne3210.o 8390.o
 obj-$(CONFIG_NET_SB1250_MAC) += sb1250-mac.o
 obj-$(CONFIG_B44) += b44.o
+obj-$(CONFIG_FORCEDETH) += forcedeth.o
 
 obj-$(CONFIG_PPP) += ppp_generic.o slhc.o
 obj-$(CONFIG_PPP_ASYNC) += ppp_async.o
--- diff/drivers/net/e100/e100_config.c	2003-09-30 15:46:15.000000000 +0100
+++ source/drivers/net/e100/e100_config.c	2003-12-29 09:30:41.000000000 +0000
@@ -60,7 +60,7 @@
  * All other init functions will only set values that are
  * different from the 82557 default.
  */
-void __devinit
+void
 e100_config_init_82557(struct e100_private *bdp)
 {
 	/* initialize config block */
@@ -104,7 +104,7 @@
 	e100_config_mulcast_enbl(bdp, false);
 }
 
-static void __devinit
+static void
 e100_config_init_82558(struct e100_private *bdp)
 {
 	/* MWI enable. This should be turned on only if the adapter is a 82558/9
@@ -136,7 +136,7 @@
 	e100_config_long_rx(bdp, true);
 }
 
-static void __devinit
+static void
 e100_config_init_82550(struct e100_private *bdp)
 {
 	/* The D102 chip allows for 32 config bytes.  This value is
@@ -160,7 +160,7 @@
 }
 
 /* Initialize the adapter's configure block */
-void __devinit
+void
 e100_config_init(struct e100_private *bdp)
 {
 	e100_config_init_82557(bdp);
--- diff/drivers/net/e100/e100_main.c	2003-10-09 09:47:16.000000000 +0100
+++ source/drivers/net/e100/e100_main.c	2003-12-29 09:30:41.000000000 +0000
@@ -125,7 +125,7 @@
 static inline void e100_tx_skb_free(struct e100_private *bdp, tcb_t *tcb);
 /* Global Data structures and variables */
 char e100_copyright[] __devinitdata = "Copyright (c) 2003 Intel Corporation";
-char e100_driver_version[]="2.3.30-k1";
+char e100_driver_version[]="2.3.30-k2";
 const char *e100_full_driver_name = "Intel(R) PRO/100 Network Driver";
 char e100_short_driver_name[] = "e100";
 static int e100nics = 0;
@@ -539,6 +539,15 @@
 	readw(&(bdp->scb->scb_status));	/* flushes last write, read-safe */
 }
 
+#ifdef CONFIG_NET_POLL_CONTROLLER
+static void e100_rx_poll(struct net_device *dev)
+{
+	disable_irq(dev->irq);
+	e100intr(dev->irq, (void *)dev, 0);
+	enable_irq(dev->irq);
+}
+#endif
+
 static int __devinit
 e100_found1(struct pci_dev *pcid, const struct pci_device_id *ent)
 {
@@ -631,7 +640,9 @@
 	dev->set_multicast_list = &e100_set_multi;
 	dev->set_mac_address = &e100_set_mac;
 	dev->do_ioctl = &e100_ioctl;
-
+#ifdef CONFIG_NET_POLL_CONTROLLER
+	dev->poll_controller = e100_rx_poll;
+#endif
 	if (bdp->flags & USE_IPCB)
 	dev->features = NETIF_F_SG | NETIF_F_IP_CSUM |
 			NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
@@ -1318,7 +1329,7 @@
 	return 1;
 }
 
-static void __devinit
+static void
 e100_tco_workaround(struct e100_private *bdp)
 {
 	int i;
@@ -2508,7 +2519,7 @@
  *      true: if successfully cleared stat counters
  *      false: otherwise
  */
-static unsigned char __devinit
+static unsigned char
 e100_clr_cntrs(struct e100_private *bdp)
 {
 	volatile u32 *pcmd_complete;
--- diff/drivers/net/e100/e100_phy.c	2003-07-22 18:54:27.000000000 +0100
+++ source/drivers/net/e100/e100_phy.c	2003-12-29 09:30:41.000000000 +0000
@@ -132,7 +132,7 @@
 	}
 }
 
-static unsigned char __devinit
+static unsigned char
 e100_phy_valid(struct e100_private *bdp, unsigned int phy_address)
 {
 	u16 ctrl_reg, stat_reg;
@@ -150,7 +150,7 @@
 	return true;
 }
 
-static void __devinit
+static void
 e100_phy_address_detect(struct e100_private *bdp)
 {
 	unsigned int addr;
@@ -180,7 +180,7 @@
 	}
 }
 
-static void __devinit
+static void
 e100_phy_id_detect(struct e100_private *bdp)
 {
 	u16 low_id_reg, high_id_reg;
@@ -204,7 +204,7 @@
 		      ((unsigned int) high_id_reg << 16));
 }
 
-static void __devinit
+static void
 e100_phy_isolate(struct e100_private *bdp)
 {
 	unsigned int phy_address;
@@ -227,7 +227,7 @@
 	}
 }
 
-static unsigned char __devinit
+static unsigned char
 e100_phy_specific_setup(struct e100_private *bdp)
 {
 	u16 misc_reg;
@@ -380,7 +380,7 @@
  * Returns:
  *	NOTHING
  */
-static void __devinit
+static void
 e100_fix_polarity(struct e100_private *bdp)
 {
 	u16 status;
@@ -916,7 +916,7 @@
 	schedule_timeout(HZ / 2);
 }
 
-unsigned char __devinit
+unsigned char
 e100_phy_init(struct e100_private *bdp)
 {
 	e100_phy_reset(bdp);
--- diff/drivers/net/eepro100.c	2003-10-09 09:47:16.000000000 +0100
+++ source/drivers/net/eepro100.c	2003-12-29 09:30:41.000000000 +0000
@@ -543,6 +543,9 @@
 static int speedo_rx(struct net_device *dev);
 static void speedo_tx_buffer_gc(struct net_device *dev);
 static irqreturn_t speedo_interrupt(int irq, void *dev_instance, struct pt_regs *regs);
+#ifdef CONFIG_NET_POLL_CONTROLLER
+static void poll_speedo (struct net_device *dev);
+#endif
 static int speedo_close(struct net_device *dev);
 static struct net_device_stats *speedo_get_stats(struct net_device *dev);
 static int speedo_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
@@ -885,6 +888,9 @@
 	dev->get_stats = &speedo_get_stats;
 	dev->set_multicast_list = &set_rx_mode;
 	dev->do_ioctl = &speedo_ioctl;
+#ifdef CONFIG_NET_POLL_CONTROLLER
+	dev->poll_controller = &poll_speedo;
+#endif
 
 	if (register_netdevice(dev))
 		goto err_free_unlock;
@@ -1675,6 +1681,22 @@
 	return IRQ_RETVAL(handled);
 }
 
+#ifdef CONFIG_NET_POLL_CONTROLLER
+
+/*
+ * Polling 'interrupt' - used by things like netconsole to send skbs
+ * without having to re-enable interrupts. It's not called while
+ * the interrupt routine is executing.
+ */
+
+static void poll_speedo (struct net_device *dev)
+{
+	disable_irq(dev->irq);
+	speedo_interrupt (dev->irq, dev, NULL);
+	enable_irq(dev->irq);
+}
+#endif
+
 static inline struct RxFD *speedo_rx_alloc(struct net_device *dev, int entry)
 {
 	struct speedo_private *sp = (struct speedo_private *)dev->priv;
--- diff/drivers/net/hamradio/scc.c	2003-10-27 09:20:38.000000000 +0000
+++ source/drivers/net/hamradio/scc.c	2003-12-29 09:30:41.000000000 +0000
@@ -1196,11 +1196,7 @@
  	if (scc->stat.tx_state == TXS_TIMEOUT)		/* we had a timeout? */
  	{
  		scc->stat.tx_state = TXS_WAIT;
-
- 		if (scc->kiss.mintime != TIMER_OFF)	/* try it again */
- 			scc_start_tx_timer(scc, t_dwait, scc->kiss.mintime*100);
- 		else
- 			scc_start_tx_timer(scc, t_dwait, 0);
+		scc_start_tx_timer(scc, t_dwait, scc->kiss.mintime*100);
  		return;
  	}
  	
@@ -1274,8 +1270,7 @@
 	del_timer(&scc->tx_wdog);
 
 	scc_key_trx(scc, TX_OFF);
-
-	if (scc->kiss.mintime != TIMER_OFF)
+	if(scc->kiss.mintime)
 		scc_start_tx_timer(scc, t_dwait, scc->kiss.mintime*100);
 	scc->stat.tx_state = TXS_WAIT;
 }
--- diff/drivers/net/pcmcia/3c574_cs.c	2003-09-30 15:46:15.000000000 +0100
+++ source/drivers/net/pcmcia/3c574_cs.c	2003-12-29 09:30:41.000000000 +0000
@@ -330,7 +330,7 @@
 	client_reg.event_handler = &tc574_event;
 	client_reg.Version = 0x0210;
 	client_reg.event_callback_args.client_data = link;
-	ret = CardServices(RegisterClient, &link->handle, &client_reg);
+	ret = pcmcia_register_client(&link->handle, &client_reg);
 	if (ret != 0) {
 		cs_error(link->handle, RegisterClient, ret);
 		tc574_detach(link);
@@ -369,7 +369,7 @@
 	}
 
 	if (link->handle)
-		CardServices(DeregisterClient, link->handle);
+		pcmcia_deregister_client(link->handle);
 
 	/* Unlink device structure, free bits */
 	*linkp = link->next;
@@ -387,8 +387,8 @@
 	ethernet device available to the system.
 */
 
-#define CS_CHECK(fn, args...) \
-while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
+#define CS_CHECK(fn, ret) \
+  do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
 
 static void tc574_config(dev_link_t *link)
 {
@@ -409,12 +409,12 @@
 
 	tuple.Attributes = 0;
 	tuple.DesiredTuple = CISTPL_CONFIG;
-	CS_CHECK(GetFirstTuple, handle, &tuple);
+	CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
 	tuple.TupleData = (cisdata_t *)buf;
 	tuple.TupleDataMax = 64;
 	tuple.TupleOffset = 0;
-	CS_CHECK(GetTupleData, handle, &tuple);
-	CS_CHECK(ParseTuple, handle, &tuple, &parse);
+	CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
+	CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
 	link->conf.ConfigBase = parse.config.base;
 	link->conf.Present = parse.config.rmask[0];
 
@@ -424,15 +424,15 @@
 	link->io.IOAddrLines = 16;
 	for (i = j = 0; j < 0x400; j += 0x20) {
 		link->io.BasePort1 = j ^ 0x300;
-		i = CardServices(RequestIO, link->handle, &link->io);
+		i = pcmcia_request_io(link->handle, &link->io);
 		if (i == CS_SUCCESS) break;
 	}
 	if (i != CS_SUCCESS) {
 		cs_error(link->handle, RequestIO, i);
 		goto failed;
 	}
-	CS_CHECK(RequestIRQ, link->handle, &link->irq);
-	CS_CHECK(RequestConfiguration, link->handle, &link->conf);
+	CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq));
+	CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf));
 
 	dev->irq = link->irq.AssignedIRQ;
 	dev->base_addr = link->io.BasePort1;
@@ -451,8 +451,8 @@
 	   the hardware address.  The future products may include a modem chip
 	   and put the address in the CIS. */
 	tuple.DesiredTuple = 0x88;
-	if (CardServices(GetFirstTuple, handle, &tuple) == CS_SUCCESS) {
-		CardServices(GetTupleData, handle, &tuple);
+	if (pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) {
+		pcmcia_get_tuple_data(handle, &tuple);
 		for (i = 0; i < 3; i++)
 			phys_addr[i] = htons(buf[i]);
 	} else {
@@ -466,9 +466,9 @@
 		}
 	}
 	tuple.DesiredTuple = CISTPL_VERS_1;
-	if (CardServices(GetFirstTuple, handle, &tuple) == CS_SUCCESS &&
-		CardServices(GetTupleData, handle, &tuple) == CS_SUCCESS &&
-		CardServices(ParseTuple, handle, &tuple, &parse) == CS_SUCCESS) {
+	if (pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS &&
+		pcmcia_get_tuple_data(handle, &tuple) == CS_SUCCESS &&
+		pcmcia_parse_tuple(handle, &tuple, &parse) == CS_SUCCESS) {
 		cardname = parse.version_1.str + parse.version_1.ofs[1];
 	} else
 		cardname = "3Com 3c574";
@@ -564,9 +564,9 @@
 		return;
 	}
 
-	CardServices(ReleaseConfiguration, link->handle);
-	CardServices(ReleaseIO, link->handle, &link->io);
-	CardServices(ReleaseIRQ, link->handle, &link->irq);
+	pcmcia_release_configuration(link->handle);
+	pcmcia_release_io(link->handle, &link->io);
+	pcmcia_release_irq(link->handle, &link->irq);
 
 	link->state &= ~DEV_CONFIG;
 
@@ -608,7 +608,7 @@
 		if (link->state & DEV_CONFIG) {
 			if (link->open)
 				netif_device_detach(dev);
-			CardServices(ReleaseConfiguration, link->handle);
+			pcmcia_release_configuration(link->handle);
 		}
 		break;
 	case CS_EVENT_PM_RESUME:
@@ -616,7 +616,7 @@
 		/* Fall through... */
 	case CS_EVENT_CARD_RESET:
 		if (link->state & DEV_CONFIG) {
-			CardServices(RequestConfiguration, link->handle, &link->conf);
+			pcmcia_request_configuration(link->handle, &link->conf);
 			if (link->open) {
 				tc574_reset(dev);
 				netif_device_attach(dev);
@@ -1092,8 +1092,12 @@
 {
 	struct el3_private *lp = (struct el3_private *)dev->priv;
 
-	if (netif_device_present(dev))
+	if (netif_device_present(dev)) {
+		unsigned long flags;
+		spin_lock_irqsave(&lp->window_lock, flags);
 		update_stats(dev);
+		spin_unlock_irqrestore(&lp->window_lock, flags);
+	}
 	return &lp->stats;
 }
 
@@ -1105,7 +1109,6 @@
 {
 	struct el3_private *lp = (struct el3_private *)dev->priv;
 	ioaddr_t ioaddr = dev->base_addr;
-	unsigned long flags;
 	u8 rx, tx, up;
 
 	DEBUG(2, "%s: updating the statistics.\n", dev->name);
@@ -1113,8 +1116,6 @@
 	if (inw(ioaddr+EL3_STATUS) == 0xffff) /* No card. */
 		return;
 		
-	spin_lock_irqsave(&lp->window_lock, flags);
-
 	/* Unlike the 3c509 we need not turn off stats updates while reading. */
 	/* Switch to the stats window, and read everything. */
 	EL3WINDOW(6);
@@ -1139,7 +1140,6 @@
 	lp->stats.tx_bytes 			+= tx + ((up & 0xf0) << 12);
 
 	EL3WINDOW(1);
-	spin_unlock_irqrestore(&lp->window_lock, flags);
 }
 
 static int el3_rx(struct net_device *dev, int worklimit)
@@ -1281,6 +1281,8 @@
 	DEBUG(2, "%s: shutting down ethercard.\n", dev->name);
 	
 	if (DEV_OK(link)) {
+		unsigned long flags;
+
 		/* Turn off statistics ASAP.  We update lp->stats below. */
 		outw(StatsDisable, ioaddr + EL3_CMD);
 		
@@ -1290,8 +1292,9 @@
 		
 		/* Note: Switching to window 0 may disable the IRQ. */
 		EL3WINDOW(0);
-		
+		spin_lock_irqsave(&lp->window_lock, flags);
 		update_stats(dev);
+		spin_unlock_irqrestore(&lp->window_lock, flags);
 	}
 
 	link->open--;
--- diff/drivers/net/pcmcia/3c589_cs.c	2003-09-30 15:46:15.000000000 +0100
+++ source/drivers/net/pcmcia/3c589_cs.c	2003-12-29 09:30:41.000000000 +0000
@@ -244,7 +244,7 @@
     client_reg.event_handler = &tc589_event;
     client_reg.Version = 0x0210;
     client_reg.event_callback_args.client_data = link;
-    ret = CardServices(RegisterClient, &link->handle, &client_reg);
+    ret = pcmcia_register_client(&link->handle, &client_reg);
     if (ret != 0) {
 	cs_error(link->handle, RegisterClient, ret);
 	tc589_detach(link);
@@ -283,7 +283,7 @@
     }
     
     if (link->handle)
-	CardServices(DeregisterClient, link->handle);
+	pcmcia_deregister_client(link->handle);
     
     /* Unlink device structure, free bits */
     *linkp = link->next;
@@ -303,8 +303,8 @@
     
 ======================================================================*/
 
-#define CS_CHECK(fn, args...) \
-while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
+#define CS_CHECK(fn, ret) \
+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
 
 static void tc589_config(dev_link_t *link)
 {
@@ -323,20 +323,20 @@
     phys_addr = (u16 *)dev->dev_addr;
     tuple.Attributes = 0;
     tuple.DesiredTuple = CISTPL_CONFIG;
-    CS_CHECK(GetFirstTuple, handle, &tuple);
+    CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
     tuple.TupleData = (cisdata_t *)buf;
     tuple.TupleDataMax = sizeof(buf);
     tuple.TupleOffset = 0;
-    CS_CHECK(GetTupleData, handle, &tuple);
-    CS_CHECK(ParseTuple, handle, &tuple, &parse);
+    CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
+    CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
     link->conf.ConfigBase = parse.config.base;
     link->conf.Present = parse.config.rmask[0];
     
     /* Is this a 3c562? */
     tuple.DesiredTuple = CISTPL_MANFID;
     tuple.Attributes = TUPLE_RETURN_COMMON;
-    if ((CardServices(GetFirstTuple, handle, &tuple) == CS_SUCCESS) &&
-	(CardServices(GetTupleData, handle, &tuple) == CS_SUCCESS)) {
+    if ((pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) &&
+	(pcmcia_get_tuple_data(handle, &tuple) == CS_SUCCESS)) {
 	if (le16_to_cpu(buf[0]) != MANFID_3COM)
 	    printk(KERN_INFO "3c589_cs: hmmm, is this really a "
 		   "3Com card??\n");
@@ -351,15 +351,15 @@
     for (i = j = 0; j < 0x400; j += 0x10) {
 	if (multi && (j & 0x80)) continue;
 	link->io.BasePort1 = j ^ 0x300;
-	i = CardServices(RequestIO, link->handle, &link->io);
+	i = pcmcia_request_io(link->handle, &link->io);
 	if (i == CS_SUCCESS) break;
     }
     if (i != CS_SUCCESS) {
 	cs_error(link->handle, RequestIO, i);
 	goto failed;
     }
-    CS_CHECK(RequestIRQ, link->handle, &link->irq);
-    CS_CHECK(RequestConfiguration, link->handle, &link->conf);
+    CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq));
+    CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf));
 	
     dev->irq = link->irq.AssignedIRQ;
     dev->base_addr = link->io.BasePort1;
@@ -374,8 +374,8 @@
     /* The 3c589 has an extra EEPROM for configuration info, including
        the hardware address.  The 3c562 puts the address in the CIS. */
     tuple.DesiredTuple = 0x88;
-    if (CardServices(GetFirstTuple, handle, &tuple) == CS_SUCCESS) {
-	CardServices(GetTupleData, handle, &tuple);
+    if (pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) {
+	pcmcia_get_tuple_data(handle, &tuple);
 	for (i = 0; i < 3; i++)
 	    phys_addr[i] = htons(buf[i]);
     } else {
@@ -440,9 +440,9 @@
 	return;
     }
     
-    CardServices(ReleaseConfiguration, link->handle);
-    CardServices(ReleaseIO, link->handle, &link->io);
-    CardServices(ReleaseIRQ, link->handle, &link->irq);
+    pcmcia_release_configuration(link->handle);
+    pcmcia_release_io(link->handle, &link->io);
+    pcmcia_release_irq(link->handle, &link->irq);
     
     link->state &= ~DEV_CONFIG;
 
@@ -486,7 +486,7 @@
 	if (link->state & DEV_CONFIG) {
 	    if (link->open)
 		netif_device_detach(dev);
-	    CardServices(ReleaseConfiguration, link->handle);
+	    pcmcia_release_configuration(link->handle);
 	}
 	break;
     case CS_EVENT_PM_RESUME:
@@ -494,7 +494,7 @@
 	/* Fall through... */
     case CS_EVENT_CARD_RESET:
 	if (link->state & DEV_CONFIG) {
-	    CardServices(RequestConfiguration, link->handle, &link->conf);
+	    pcmcia_request_configuration(link->handle, &link->conf);
 	    if (link->open) {
 		tc589_reset(dev);
 		netif_device_attach(dev);
--- diff/drivers/net/pcmcia/axnet_cs.c	2003-09-30 15:46:15.000000000 +0100
+++ source/drivers/net/pcmcia/axnet_cs.c	2003-12-29 09:30:41.000000000 +0000
@@ -205,7 +205,7 @@
     client_reg.event_handler = &axnet_event;
     client_reg.Version = 0x0210;
     client_reg.event_callback_args.client_data = link;
-    ret = CardServices(RegisterClient, &link->handle, &client_reg);
+    ret = pcmcia_register_client(&link->handle, &client_reg);
     if (ret != CS_SUCCESS) {
 	cs_error(link->handle, RegisterClient, ret);
 	axnet_detach(link);
@@ -244,7 +244,7 @@
     }
 
     if (link->handle)
-	CardServices(DeregisterClient, link->handle);
+	pcmcia_deregister_client(link->handle);
 
     /* Unlink device structure, free bits */
     *linkp = link->next;
@@ -313,11 +313,8 @@
 
 ======================================================================*/
 
-#define CS_CHECK(fn, args...) \
-while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
-
-#define CFG_CHECK(fn, args...) \
-if (CardServices(fn, args) != 0) goto next_entry
+#define CS_CHECK(fn, ret) \
+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
 
 static int try_io_port(dev_link_t *link)
 {
@@ -340,12 +337,12 @@
 	for (j = 0; j < 0x400; j += 0x20) {
 	    link->io.BasePort1 = j ^ 0x300;
 	    link->io.BasePort2 = (j ^ 0x300) + 0x10;
-	    ret = CardServices(RequestIO, link->handle, &link->io);
+	    ret = pcmcia_request_io(link->handle, &link->io);
 	    if (ret == CS_SUCCESS) return ret;
 	}
 	return ret;
     } else {
-	return CardServices(RequestIO, link->handle, &link->io);
+	return pcmcia_request_io(link->handle, &link->io);
     }
 }
 
@@ -367,9 +364,9 @@
     tuple.TupleDataMax = sizeof(buf);
     tuple.TupleOffset = 0;
     tuple.DesiredTuple = CISTPL_CONFIG;
-    CS_CHECK(GetFirstTuple, handle, &tuple);
-    CS_CHECK(GetTupleData, handle, &tuple);
-    CS_CHECK(ParseTuple, handle, &tuple, &parse);
+    CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
+    CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
+    CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
     link->conf.ConfigBase = parse.config.base;
     /* don't trust the CIS on this; Linksys got it wrong */
     link->conf.Present = 0x63;
@@ -378,19 +375,19 @@
     link->state |= DEV_CONFIG;
 
     /* Look up current Vcc */
-    CS_CHECK(GetConfigurationInfo, handle, &conf);
+    CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(handle, &conf));
     link->conf.Vcc = conf.Vcc;
 
     tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
     tuple.Attributes = 0;
-    CS_CHECK(GetFirstTuple, handle, &tuple);
+    CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
     while (last_ret == CS_SUCCESS) {
 	cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);
 	cistpl_io_t *io = &(parse.cftable_entry.io);
 	
-	CFG_CHECK(GetTupleData, handle, &tuple);
-	CFG_CHECK(ParseTuple, handle, &tuple, &parse);
-	if ((cfg->index == 0) || (cfg->io.nwin == 0))
+	if (pcmcia_get_tuple_data(handle, &tuple) != 0 ||
+		pcmcia_parse_tuple(handle, &tuple, &parse) != 0 ||
+		cfg->index == 0 || cfg->io.nwin == 0)
 	    goto next_entry;
 	
 	link->conf.ConfigIndex = 0x05;
@@ -411,21 +408,21 @@
 	    if (last_ret == CS_SUCCESS) break;
 	}
     next_entry:
-	last_ret = CardServices(GetNextTuple, handle, &tuple);
+	last_ret = pcmcia_get_next_tuple(handle, &tuple);
     }
     if (last_ret != CS_SUCCESS) {
 	cs_error(handle, RequestIO, last_ret);
 	goto failed;
     }
 
-    CS_CHECK(RequestIRQ, handle, &link->irq);
+    CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq));
     
     if (link->io.NumPorts2 == 8) {
 	link->conf.Attributes |= CONF_ENABLE_SPKR;
 	link->conf.Status = CCSR_AUDIO_ENA;
     }
     
-    CS_CHECK(RequestConfiguration, handle, &link->conf);
+    CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf));
     dev->irq = link->irq.AssignedIRQ;
     dev->base_addr = link->io.BasePort1;
     if (register_netdev(dev) != 0) {
@@ -476,7 +473,7 @@
        Bit 2 of CCSR is active low. */ 
     if (i == 32) {
 	conf_reg_t reg = { 0, CS_WRITE, CISREG_CCSR, 0x04 };
- 	CardServices(AccessConfigurationRegister, link->handle, &reg);
+ 	pcmcia_access_configuration_register(link->handle, &reg);
 	for (i = 0; i < 32; i++) {
 	    j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1);
 	    if ((j != 0) && (j != 0xffff)) break;
@@ -520,9 +517,9 @@
 	return;
     }
 
-    CardServices(ReleaseConfiguration, link->handle);
-    CardServices(ReleaseIO, link->handle, &link->io);
-    CardServices(ReleaseIRQ, link->handle, &link->irq);
+    pcmcia_release_configuration(link->handle);
+    pcmcia_release_io(link->handle, &link->io);
+    pcmcia_release_irq(link->handle, &link->irq);
 
     link->state &= ~DEV_CONFIG;
 
@@ -566,7 +563,7 @@
 	if (link->state & DEV_CONFIG) {
 	    if (link->open)
 		netif_device_detach(&info->dev);
-	    CardServices(ReleaseConfiguration, link->handle);
+	    pcmcia_release_configuration(link->handle);
 	}
 	break;
     case CS_EVENT_PM_RESUME:
@@ -574,7 +571,7 @@
 	/* Fall through... */
     case CS_EVENT_CARD_RESET:
 	if (link->state & DEV_CONFIG) {
-	    CardServices(RequestConfiguration, link->handle, &link->conf);
+	    pcmcia_request_configuration(link->handle, &link->conf);
 	    if (link->open) {
 		axnet_reset_8390(&info->dev);
 		AX88190_init(&info->dev, 1);
--- diff/drivers/net/pcmcia/com20020_cs.c	2003-09-30 15:46:15.000000000 +0100
+++ source/drivers/net/pcmcia/com20020_cs.c	2003-12-29 09:30:41.000000000 +0000
@@ -227,7 +227,7 @@
     client_reg.event_handler = &com20020_event;
     client_reg.Version = 0x0210;
     client_reg.event_callback_args.client_data = link;
-    ret = CardServices(RegisterClient, &link->handle, &client_reg);
+    ret = pcmcia_register_client(&link->handle, &client_reg);
     if (ret != 0) {
         cs_error(link->handle, RegisterClient, ret);
         com20020_detach(link);
@@ -277,7 +277,7 @@
     }
 
     if (link->handle)
-        CardServices(DeregisterClient, link->handle);
+        pcmcia_deregister_client(link->handle);
 
     /* Unlink device structure, free bits */
     DEBUG(1,"unlinking...\n");
@@ -325,8 +325,8 @@
 
 ======================================================================*/
 
-#define CS_CHECK(fn, args...) \
-while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
+#define CS_CHECK(fn, ret) \
+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
 
 static void com20020_config(dev_link_t *link)
 {
@@ -353,9 +353,9 @@
     tuple.TupleDataMax = 64;
     tuple.TupleOffset = 0;
     tuple.DesiredTuple = CISTPL_CONFIG;
-    CS_CHECK(GetFirstTuple, handle, &tuple);
-    CS_CHECK(GetTupleData, handle, &tuple);
-    CS_CHECK(ParseTuple, handle, &tuple, &parse);
+    CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
+    CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
+    CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
     link->conf.ConfigBase = parse.config.base;
 
     /* Configure card */
@@ -368,13 +368,13 @@
 	for (ioaddr = 0x100; ioaddr < 0x400; ioaddr += 0x10)
 	{
 	    link->io.BasePort1 = ioaddr;
-	    i = CardServices(RequestIO, link->handle, &link->io);
+	    i = pcmcia_request_io(link->handle, &link->io);
 	    if (i == CS_SUCCESS)
 		break;
 	}
     }
     else
-	i = CardServices(RequestIO, link->handle, &link->io);
+	i = pcmcia_request_io(link->handle, &link->io);
     
     if (i != CS_SUCCESS)
     {
@@ -388,7 +388,7 @@
     DEBUG(1,"arcnet: request IRQ %d (%Xh/%Xh)\n",
 	   link->irq.AssignedIRQ,
 	   link->irq.IRQInfo1, link->irq.IRQInfo2);
-    i = CardServices(RequestIRQ, link->handle, &link->irq);
+    i = pcmcia_request_irq(link->handle, &link->irq);
     if (i != CS_SUCCESS)
     {
 	DEBUG(1,"arcnet: requestIRQ failed totally!\n");
@@ -397,7 +397,7 @@
 
     dev->irq = link->irq.AssignedIRQ;
 
-    CS_CHECK(RequestConfiguration, link->handle, &link->conf);
+    CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf));
 
     if (com20020_check(dev))
     {
@@ -454,9 +454,9 @@
         return;
     }
 
-    CardServices(ReleaseConfiguration, link->handle);
-    CardServices(ReleaseIO, link->handle, &link->io);
-    CardServices(ReleaseIRQ, link->handle, &link->irq);
+    pcmcia_release_configuration(link->handle);
+    pcmcia_release_io(link->handle, &link->io);
+    pcmcia_release_irq(link->handle, &link->irq);
 
     link->state &= ~(DEV_CONFIG | DEV_RELEASE_PENDING);
 
@@ -502,7 +502,7 @@
             if (link->open) {
                 netif_device_detach(dev);
             }
-            CardServices(ReleaseConfiguration, link->handle);
+            pcmcia_release_configuration(link->handle);
         }
         break;
     case CS_EVENT_PM_RESUME:
@@ -510,7 +510,7 @@
         /* Fall through... */
     case CS_EVENT_CARD_RESET:
         if (link->state & DEV_CONFIG) {
-            CardServices(RequestConfiguration, link->handle, &link->conf);
+            pcmcia_request_configuration(link->handle, &link->conf);
             if (link->open) {
 		int ioaddr = dev->base_addr;
 		struct arcnet_local *lp = (struct arcnet_local *)dev->priv;
--- diff/drivers/net/pcmcia/fmvj18x_cs.c	2003-11-25 15:24:58.000000000 +0000
+++ source/drivers/net/pcmcia/fmvj18x_cs.c	2003-12-29 09:30:41.000000000 +0000
@@ -307,7 +307,7 @@
     client_reg.event_handler = &fmvj18x_event;
     client_reg.Version = 0x0210;
     client_reg.event_callback_args.client_data = link;
-    ret = CardServices(RegisterClient, &link->handle, &client_reg);
+    ret = pcmcia_register_client(&link->handle, &client_reg);
     if (ret != 0) {
 	cs_error(link->handle, RegisterClient, ret);
 	fmvj18x_detach(link);
@@ -340,7 +340,7 @@
 
     /* Break the link with Card Services */
     if (link->handle)
-	CardServices(DeregisterClient, link->handle);
+	pcmcia_deregister_client(link->handle);
     
     /* Unlink device structure, free pieces */
     *linkp = link->next;
@@ -354,8 +354,8 @@
 
 /*====================================================================*/
 
-#define CS_CHECK(fn, args...) \
-while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
+#define CS_CHECK(fn, ret) \
+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
 
 static int mfc_try_io_port(dev_link_t *link)
 {
@@ -369,7 +369,7 @@
 	    link->io.NumPorts2 = 0;
 	    printk(KERN_NOTICE "fmvj18x_cs: out of resource for serial\n");
 	}
-	ret = CardServices(RequestIO, link->handle, &link->io);
+	ret = pcmcia_request_io(link->handle, &link->io);
 	if (ret == CS_SUCCESS) return ret;
     }
     return ret;
@@ -385,7 +385,7 @@
     */
     for (ioaddr = 0x300; ioaddr < 0x3e0; ioaddr += 0x20) {
 	link->io.BasePort1 = ioaddr;
-	ret = CardServices(RequestIO, link->handle, &link->io);
+	ret = pcmcia_request_io(link->handle, &link->io);
 	if (ret == CS_SUCCESS) {
 	    /* calculate ConfigIndex value */
 	    link->conf.ConfigIndex = 
@@ -417,12 +417,12 @@
        registers.
     */
     tuple.DesiredTuple = CISTPL_CONFIG;
-    CS_CHECK(GetFirstTuple, handle, &tuple);
+    CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
     tuple.TupleData = (u_char *)buf;
     tuple.TupleDataMax = 64;
     tuple.TupleOffset = 0;
-    CS_CHECK(GetTupleData, handle, &tuple);
-    CS_CHECK(ParseTuple, handle, &tuple, &parse);
+    CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
+    CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
     
     /* Configure card */
     link->state |= DEV_CONFIG;
@@ -432,16 +432,16 @@
 
     tuple.DesiredTuple = CISTPL_FUNCE;
     tuple.TupleOffset = 0;
-    if (CardServices(GetFirstTuple, handle, &tuple) == CS_SUCCESS) {
+    if (pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) {
 	/* Yes, I have CISTPL_FUNCE. Let's check CISTPL_MANFID */
 	tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
-	CS_CHECK(GetFirstTuple, handle, &tuple);
-	CS_CHECK(GetTupleData, handle, &tuple);
-	CS_CHECK(ParseTuple, handle, &tuple, &parse);
+	CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
+	CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
+	CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
 	link->conf.ConfigIndex = parse.cftable_entry.index;
 	tuple.DesiredTuple = CISTPL_MANFID;
-	if (CardServices(GetFirstTuple, handle, &tuple) == CS_SUCCESS)
-	    CS_CHECK(GetTupleData, handle, &tuple);
+	if (pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS)
+	    CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
 	else
 	    buf[0] = 0xffff;
 	switch (le16_to_cpu(buf[0])) {
@@ -449,7 +449,7 @@
 	    cardtype = TDK;
 	    if (le16_to_cpu(buf[1]) == PRODID_TDK_CF010) {
 		cs_status_t status;
-		CardServices(GetStatus, handle, &status);
+		pcmcia_get_status(handle, &status);
 		if (status.CardState & CS_EVENT_3VCARD)
 		    link->conf.Vcc = 33; /* inserted in 3.3V slot */
 	    } else if (le16_to_cpu(buf[1]) == PRODID_TDK_GN3410) {
@@ -478,8 +478,8 @@
     } else {
 	/* old type card */
 	tuple.DesiredTuple = CISTPL_MANFID;
-	if (CardServices(GetFirstTuple, handle, &tuple) == CS_SUCCESS)
-	    CS_CHECK(GetTupleData, handle, &tuple);
+	if (pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS)
+	    CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
 	else
 	    buf[0] = 0xffff;
 	switch (le16_to_cpu(buf[0])) {
@@ -510,10 +510,10 @@
 	ret = ungermann_try_io_port(link);
 	if (ret != CS_SUCCESS) goto cs_failed;
     } else { 
-	CS_CHECK(RequestIO, link->handle, &link->io);
+	CS_CHECK(RequestIO, pcmcia_request_io(link->handle, &link->io));
     }
-    CS_CHECK(RequestIRQ, link->handle, &link->irq);
-    CS_CHECK(RequestConfiguration, link->handle, &link->conf);
+    CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq));
+    CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf));
     dev->irq = link->irq.AssignedIRQ;
     dev->base_addr = link->io.BasePort1;
     if (register_netdev(dev) != 0) {
@@ -546,17 +546,17 @@
     case CONTEC:
 	tuple.DesiredTuple = CISTPL_FUNCE;
 	tuple.TupleOffset = 0;
-	CS_CHECK(GetFirstTuple, handle, &tuple);
+	CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
 	tuple.TupleOffset = 0;
-	CS_CHECK(GetTupleData, handle, &tuple);
+	CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
 	if (cardtype == MBH10304) {
 	    /* MBH10304's CIS_FUNCE is corrupted */
 	    node_id = &(tuple.TupleData[5]);
 	    card_name = "FMV-J182";
 	} else {
 	    while (tuple.TupleData[0] != CISTPL_FUNCE_LAN_NODE_ID ) {
-		CS_CHECK(GetNextTuple, handle, &tuple) ;
-		CS_CHECK(GetTupleData, handle, &tuple) ;
+		CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple));
+		CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
 	    }
 	    node_id = &(tuple.TupleData[2]);
 	    if( cardtype == TDK ) {
@@ -633,8 +633,7 @@
     req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
     req.Base = 0; req.Size = 0;
     req.AccessSpeed = 0;
-    link->win = (window_handle_t)link->handle;
-    i = CardServices(RequestWindow, &link->win, &req);
+    i = pcmcia_request_window(&link->handle, &req, &link->win);
     if (i != CS_SUCCESS) {
 	cs_error(link->handle, RequestWindow, i);
 	return -1;
@@ -643,7 +642,7 @@
     base = ioremap(req.Base, req.Size);
     mem.Page = 0;
     mem.CardOffset = 0;
-    CardServices(MapMemPage, link->win, &mem);
+    pcmcia_map_mem_page(link->win, &mem);
 
     /*
      *  MBH10304 CISTPL_FUNCE_LAN_NODE_ID format
@@ -668,7 +667,7 @@
     }
 
     iounmap(base);
-    j = CardServices(ReleaseWindow, link->win);
+    j = pcmcia_release_window(link->win);
     if (j != CS_SUCCESS)
 	cs_error(link->handle, ReleaseWindow, j);
     return (i != 0x200) ? 0 : -1;
@@ -689,8 +688,7 @@
     req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
     req.Base = 0; req.Size = 0;
     req.AccessSpeed = 0;
-    link->win = (window_handle_t)link->handle;
-    i = CardServices(RequestWindow, &link->win, &req);
+    i = pcmcia_request_window(&link->handle, &req, &link->win);
     if (i != CS_SUCCESS) {
 	cs_error(link->handle, RequestWindow, i);
 	return -1;
@@ -699,7 +697,7 @@
     base = ioremap(req.Base, req.Size);
     mem.Page = 0;
     mem.CardOffset = 0;
-    CardServices(MapMemPage, link->win, &mem);
+    pcmcia_map_mem_page(link->win, &mem);
 
     ioaddr = dev->base_addr;
     writeb(0x47, base+0x800);	/* Config Option Register of LAN */
@@ -712,7 +710,7 @@
     writeb(0x8, base+0x822);	/* Config and Status Register */
 
     iounmap(base);
-    j = CardServices(ReleaseWindow, link->win);
+    j = pcmcia_release_window(link->win);
     if (j != CS_SUCCESS)
 	cs_error(link->handle, ReleaseWindow, j);
     return 0;
@@ -737,10 +735,10 @@
     }
 
     /* Don't bother checking to see if these succeed or not */
-    CardServices(ReleaseWindow, link->win);
-    CardServices(ReleaseConfiguration, link->handle);
-    CardServices(ReleaseIO, link->handle, &link->io);
-    CardServices(ReleaseIRQ, link->handle, &link->irq);
+    pcmcia_release_window(link->win);
+    pcmcia_release_configuration(link->handle);
+    pcmcia_release_io(link->handle, &link->io);
+    pcmcia_release_irq(link->handle, &link->irq);
     
     link->state &= ~DEV_CONFIG;
 
@@ -777,7 +775,7 @@
 	if (link->state & DEV_CONFIG) {
 	    if (link->open)
 		netif_device_detach(dev);
-	    CardServices(ReleaseConfiguration, link->handle);
+	    pcmcia_release_configuration(link->handle);
 	}
 	break;
     case CS_EVENT_PM_RESUME:
@@ -785,7 +783,7 @@
 	/* Fall through... */
     case CS_EVENT_CARD_RESET:
 	if (link->state & DEV_CONFIG) {
-	    CardServices(RequestConfiguration, link->handle, &link->conf);
+	    pcmcia_request_configuration(link->handle, &link->conf);
 	    if (link->open) {
 		fjn_reset(dev);
 		netif_device_attach(dev);
--- diff/drivers/net/pcmcia/ibmtr_cs.c	2003-11-25 15:24:58.000000000 +0000
+++ source/drivers/net/pcmcia/ibmtr_cs.c	2003-12-29 09:30:41.000000000 +0000
@@ -214,7 +214,7 @@
     client_reg.event_handler = &ibmtr_event;
     client_reg.Version = 0x0210;
     client_reg.event_callback_args.client_data = link;
-    ret = CardServices(RegisterClient, &link->handle, &client_reg);
+    ret = pcmcia_register_client(&link->handle, &client_reg);
     if (ret != 0) {
         cs_error(link->handle, RegisterClient, ret);
 	goto out_detach;
@@ -264,7 +264,7 @@
     }
 
     if (link->handle)
-        CardServices(DeregisterClient, link->handle);
+        pcmcia_deregister_client(link->handle);
 
     /* Unlink device structure, free bits */
     *linkp = link->next;
@@ -281,8 +281,8 @@
 
 ======================================================================*/
 
-#define CS_CHECK(fn, args...) \
-while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
+#define CS_CHECK(fn, ret) \
+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
 
 static void ibmtr_config(dev_link_t *link)
 {
@@ -304,9 +304,9 @@
     tuple.TupleDataMax = 64;
     tuple.TupleOffset = 0;
     tuple.DesiredTuple = CISTPL_CONFIG;
-    CS_CHECK(GetFirstTuple, handle, &tuple);
-    CS_CHECK(GetTupleData, handle, &tuple);
-    CS_CHECK(ParseTuple, handle, &tuple, &parse);
+    CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
+    CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
+    CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
     link->conf.ConfigBase = parse.config.base;
 
     /* Configure card */
@@ -318,18 +318,18 @@
 
     /* Try PRIMARY card at 0xA20-0xA23 */
     link->io.BasePort1 = 0xA20;
-    i = CardServices(RequestIO, link->handle, &link->io);
+    i = pcmcia_request_io(link->handle, &link->io);
     if (i == CS_SUCCESS) {
 	memcpy(info->node.dev_name, "tr0\0", 4);
     } else {
 	/* Couldn't get 0xA20-0xA23.  Try ALTERNATE at 0xA24-0xA27. */
 	link->io.BasePort1 = 0xA24;
-	CS_CHECK(RequestIO, link->handle, &link->io);
+	CS_CHECK(RequestIO, pcmcia_request_io(link->handle, &link->io));
 	memcpy(info->node.dev_name, "tr1\0", 4);
     }
     dev->base_addr = link->io.BasePort1;
 
-    CS_CHECK(RequestIRQ, link->handle, &link->irq);
+    CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq));
     dev->irq = link->irq.AssignedIRQ;
     ti->irq = link->irq.AssignedIRQ;
     ti->global_int_enable=GLOBAL_INT_ENABLE+((dev->irq==9) ? 2 : dev->irq);
@@ -340,12 +340,11 @@
     req.Base = 0; 
     req.Size = 0x2000;
     req.AccessSpeed = 250;
-    link->win = (window_handle_t)link->handle;
-    CS_CHECK(RequestWindow, &link->win, &req);
+    CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &link->win));
 
     mem.CardOffset = mmiobase;
     mem.Page = 0;
-    CS_CHECK(MapMemPage, link->win, &mem);
+    CS_CHECK(MapMemPage, pcmcia_map_mem_page(link->win, &mem));
     ti->mmio = ioremap(req.Base, req.Size);
 
     /* Allocate the SRAM memory window */
@@ -354,17 +353,16 @@
     req.Base = 0;
     req.Size = sramsize * 1024;
     req.AccessSpeed = 250;
-    info->sram_win_handle = (window_handle_t)link->handle;
-    CS_CHECK(RequestWindow, &info->sram_win_handle, &req);
+    CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &info->sram_win_handle));
 
     mem.CardOffset = srambase;
     mem.Page = 0;
-    CS_CHECK(MapMemPage, info->sram_win_handle, &mem);
+    CS_CHECK(MapMemPage, pcmcia_map_mem_page(info->sram_win_handle, &mem));
 
     ti->sram_base = mem.CardOffset >> 12;
     ti->sram_virt = (u_long)ioremap(req.Base, req.Size);
 
-    CS_CHECK(RequestConfiguration, link->handle, &link->conf);
+    CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf));
 
     /*  Set up the Token-Ring Controller Configuration Register and
         turn on the card.  Check the "Local Area Network Credit Card
@@ -419,14 +417,14 @@
         return;
     }
 
-    CardServices(ReleaseConfiguration, link->handle);
-    CardServices(ReleaseIO, link->handle, &link->io);
-    CardServices(ReleaseIRQ, link->handle, &link->irq);
+    pcmcia_release_configuration(link->handle);
+    pcmcia_release_io(link->handle, &link->io);
+    pcmcia_release_irq(link->handle, &link->irq);
     if (link->win) {
 	struct tok_info *ti = dev->priv;
 	iounmap((void *)ti->mmio);
-	CardServices(ReleaseWindow, link->win);
-	CardServices(ReleaseWindow, info->sram_win_handle);
+	pcmcia_release_window(link->win);
+	pcmcia_release_window(info->sram_win_handle);
     }
 
     link->state &= ~DEV_CONFIG;
@@ -474,7 +472,7 @@
         if (link->state & DEV_CONFIG) {
             if (link->open)
 		netif_device_detach(dev);
-            CardServices(ReleaseConfiguration, link->handle);
+            pcmcia_release_configuration(link->handle);
         }
         break;
     case CS_EVENT_PM_RESUME:
@@ -482,7 +480,7 @@
         /* Fall through... */
     case CS_EVENT_CARD_RESET:
         if (link->state & DEV_CONFIG) {
-            CardServices(RequestConfiguration, link->handle, &link->conf);
+            pcmcia_request_configuration(link->handle, &link->conf);
             if (link->open) {
 		(dev->init)(dev);
 		netif_device_attach(dev);
--- diff/drivers/net/pcmcia/nmclan_cs.c	2003-09-30 15:46:15.000000000 +0100
+++ source/drivers/net/pcmcia/nmclan_cs.c	2003-12-29 09:30:41.000000000 +0000
@@ -520,7 +520,7 @@
     client_reg.event_handler = &nmclan_event;
     client_reg.Version = 0x0210;
     client_reg.event_callback_args.client_data = link;
-    ret = CardServices(RegisterClient, &link->handle, &client_reg);
+    ret = pcmcia_register_client(&link->handle, &client_reg);
     if (ret != 0) {
 	cs_error(link->handle, RegisterClient, ret);
 	nmclan_detach(link);
@@ -558,7 +558,7 @@
     }
 
     if (link->handle)
-	CardServices(DeregisterClient, link->handle);
+	pcmcia_deregister_client(link->handle);
 
     /* Unlink device structure, free bits */
     *linkp = link->next;
@@ -706,8 +706,8 @@
 	ethernet device available to the system.
 ---------------------------------------------------------------------------- */
 
-#define CS_CHECK(fn, args...) \
-while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
+#define CS_CHECK(fn, ret) \
+  do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
 
 static void nmclan_config(dev_link_t *link)
 {
@@ -727,17 +727,17 @@
   tuple.TupleDataMax = 64;
   tuple.TupleOffset = 0;
   tuple.DesiredTuple = CISTPL_CONFIG;
-  CS_CHECK(GetFirstTuple, handle, &tuple);
-  CS_CHECK(GetTupleData, handle, &tuple);
-  CS_CHECK(ParseTuple, handle, &tuple, &parse);
+  CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
+  CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
+  CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
   link->conf.ConfigBase = parse.config.base;
 
   /* Configure card */
   link->state |= DEV_CONFIG;
 
-  CS_CHECK(RequestIO, handle, &link->io);
-  CS_CHECK(RequestIRQ, handle, &link->irq);
-  CS_CHECK(RequestConfiguration, handle, &link->conf);
+  CS_CHECK(RequestIO, pcmcia_request_io(handle, &link->io));
+  CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq));
+  CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf));
   dev->irq = link->irq.AssignedIRQ;
   dev->base_addr = link->io.BasePort1;
   i = register_netdev(dev);
@@ -753,8 +753,8 @@
   tuple.TupleData = buf;
   tuple.TupleDataMax = 64;
   tuple.TupleOffset = 0;
-  CS_CHECK(GetFirstTuple, handle, &tuple);
-  CS_CHECK(GetTupleData, handle, &tuple);
+  CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
+  CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
   memcpy(dev->dev_addr, tuple.TupleData, ETHER_ADDR_LEN);
 
   /* Verify configuration by reading the MACE ID. */
@@ -819,9 +819,9 @@
     return;
   }
 
-  CardServices(ReleaseConfiguration, link->handle);
-  CardServices(ReleaseIO, link->handle, &link->io);
-  CardServices(ReleaseIRQ, link->handle, &link->irq);
+  pcmcia_release_configuration(link->handle);
+  pcmcia_release_io(link->handle, &link->io);
+  pcmcia_release_irq(link->handle, &link->irq);
 
   link->state &= ~DEV_CONFIG;
 
@@ -863,7 +863,7 @@
       if (link->state & DEV_CONFIG) {
 	if (link->open)
 	  netif_device_detach(dev);
-	CardServices(ReleaseConfiguration, link->handle);
+	pcmcia_release_configuration(link->handle);
       }
       break;
     case CS_EVENT_PM_RESUME:
@@ -871,7 +871,7 @@
       /* Fall through... */
     case CS_EVENT_CARD_RESET:
       if (link->state & DEV_CONFIG) {
-	CardServices(RequestConfiguration, link->handle, &link->conf);
+	pcmcia_request_configuration(link->handle, &link->conf);
 	if (link->open) {
 	  nmclan_reset(dev);
 	  netif_device_attach(dev);
@@ -903,7 +903,7 @@
   reg.Action = CS_READ;
   reg.Offset = CISREG_COR;
   reg.Value = 0;
-  CardServices(AccessConfigurationRegister, link->handle, &reg);
+  pcmcia_access_configuration_register(link->handle, &reg);
   OrigCorValue = reg.Value;
 
   /* Reset Xilinx */
@@ -912,12 +912,12 @@
   DEBUG(1, "nmclan_reset: OrigCorValue=0x%lX, resetting...\n",
 	OrigCorValue);
   reg.Value = COR_SOFT_RESET;
-  CardServices(AccessConfigurationRegister, link->handle, &reg);
+  pcmcia_access_configuration_register(link->handle, &reg);
   /* Need to wait for 20 ms for PCMCIA to finish reset. */
 
   /* Restore original COR configuration index */
   reg.Value = COR_LEVEL_REQ | (OrigCorValue & COR_CONFIG_MASK);
-  CardServices(AccessConfigurationRegister, link->handle, &reg);
+  pcmcia_access_configuration_register(link->handle, &reg);
   /* Xilinx is now completely reset along with the MACE chip. */
   lp->tx_free_frames=AM2150_MAX_TX_FRAMES;
 
@@ -1046,7 +1046,7 @@
   printk(KERN_NOTICE "%s: transmit timed out -- ", dev->name);
 #if RESET_ON_TIMEOUT
   printk("resetting card\n");
-  CardServices(ResetCard, link->handle);
+  pcmcia_reset_card(link->handle, NULL);
 #else /* #if RESET_ON_TIMEOUT */
   printk("NOT resetting card\n");
 #endif /* #if RESET_ON_TIMEOUT */
--- diff/drivers/net/pcmcia/pcnet_cs.c	2003-10-27 09:20:38.000000000 +0000
+++ source/drivers/net/pcmcia/pcnet_cs.c	2003-12-29 09:30:41.000000000 +0000
@@ -11,7 +11,7 @@
 
     Copyright (C) 1999 David A. Hinds -- dahinds@users.sourceforge.net
 
-    pcnet_cs.c 1.149 2002/06/29 06:27:37
+    pcnet_cs.c 1.153 2003/11/09 18:53:09
     
     The network driver code is based on Donald Becker's NE2000 code:
 
@@ -74,7 +74,7 @@
 MODULE_PARM(pc_debug, "i");
 #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
 static char *version =
-"pcnet_cs.c 1.149 2002/06/29 06:27:37 (David Hinds)";
+"pcnet_cs.c 1.153 2003/11/09 18:53:09 (David Hinds)";
 #else
 #define DEBUG(n, args...)
 #endif
@@ -303,7 +303,7 @@
     client_reg.event_handler = &pcnet_event;
     client_reg.Version = 0x0210;
     client_reg.event_callback_args.client_data = link;
-    ret = CardServices(RegisterClient, &link->handle, &client_reg);
+    ret = pcmcia_register_client(&link->handle, &client_reg);
     if (ret != CS_SUCCESS) {
 	cs_error(link->handle, RegisterClient, ret);
 	pcnet_detach(link);
@@ -342,7 +342,7 @@
     }
 
     if (link->handle)
-	CardServices(DeregisterClient, link->handle);
+	pcmcia_deregister_client(link->handle);
 
     /* Unlink device structure, free bits */
     *linkp = link->next;
@@ -373,8 +373,7 @@
     req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
     req.Base = 0; req.Size = 0;
     req.AccessSpeed = 0;
-    link->win = (window_handle_t)link->handle;
-    i = CardServices(RequestWindow, &link->win, &req);
+    i = pcmcia_request_window(&link->handle, &req, &link->win);
     if (i != CS_SUCCESS) {
 	cs_error(link->handle, RequestWindow, i);
 	return NULL;
@@ -384,7 +383,7 @@
     mem.Page = 0;
     for (i = 0; i < NR_INFO; i++) {
 	mem.CardOffset = hw_info[i].offset & ~(req.Size-1);
-	CardServices(MapMemPage, link->win, &mem);
+	pcmcia_map_mem_page(link->win, &mem);
 	base = &virt[hw_info[i].offset & (req.Size-1)];
 	if ((readb(base+0) == hw_info[i].a0) &&
 	    (readb(base+2) == hw_info[i].a1) &&
@@ -397,7 +396,7 @@
     }
     
     iounmap(virt);
-    j = CardServices(ReleaseWindow, link->win);
+    j = pcmcia_release_window(link->win);
     if (j != CS_SUCCESS)
 	cs_error(link->handle, ReleaseWindow, j);
     return (i < NR_INFO) ? hw_info+i : NULL;
@@ -544,11 +543,8 @@
 
 ======================================================================*/
 
-#define CS_CHECK(fn, args...) \
-while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
-
-#define CFG_CHECK(fn, args...) \
-if (CardServices(fn, args) != 0) goto next_entry
+#define CS_CHECK(fn, ret) \
+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
 
 static int try_io_port(dev_link_t *link)
 {
@@ -571,12 +567,12 @@
 	for (j = 0; j < 0x400; j += 0x20) {
 	    link->io.BasePort1 = j ^ 0x300;
 	    link->io.BasePort2 = (j ^ 0x300) + 0x10;
-	    ret = CardServices(RequestIO, link->handle, &link->io);
+	    ret = pcmcia_request_io(link->handle, &link->io);
 	    if (ret == CS_SUCCESS) return ret;
 	}
 	return ret;
     } else {
-	return CardServices(RequestIO, link->handle, &link->io);
+	return pcmcia_request_io(link->handle, &link->io);
     }
 }
 
@@ -600,9 +596,9 @@
     tuple.TupleDataMax = sizeof(buf);
     tuple.TupleOffset = 0;
     tuple.DesiredTuple = CISTPL_CONFIG;
-    CS_CHECK(GetFirstTuple, handle, &tuple);
-    CS_CHECK(GetTupleData, handle, &tuple);
-    CS_CHECK(ParseTuple, handle, &tuple, &parse);
+    CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
+    CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
+    CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
     link->conf.ConfigBase = parse.config.base;
     link->conf.Present = parse.config.rmask[0];
 
@@ -610,28 +606,28 @@
     link->state |= DEV_CONFIG;
 
     /* Look up current Vcc */
-    CS_CHECK(GetConfigurationInfo, handle, &conf);
+    CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(handle, &conf));
     link->conf.Vcc = conf.Vcc;
 
     tuple.DesiredTuple = CISTPL_MANFID;
     tuple.Attributes = TUPLE_RETURN_COMMON;
-    if ((CardServices(GetFirstTuple, handle, &tuple) == CS_SUCCESS) &&
- 	(CardServices(GetTupleData, handle, &tuple) == CS_SUCCESS)) {
+    if ((pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) &&
+ 	(pcmcia_get_tuple_data(handle, &tuple) == CS_SUCCESS)) {
 	manfid = le16_to_cpu(buf[0]);
 	prodid = le16_to_cpu(buf[1]);
     }
     
     tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
     tuple.Attributes = 0;
-    CS_CHECK(GetFirstTuple, handle, &tuple);
+    CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
     while (last_ret == CS_SUCCESS) {
 	cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);
 	cistpl_io_t *io = &(parse.cftable_entry.io);
 	
-	CFG_CHECK(GetTupleData, handle, &tuple);
-	CFG_CHECK(ParseTuple, handle, &tuple, &parse);
-	if ((cfg->index == 0) || (cfg->io.nwin == 0))
-	    goto next_entry;
+	if (pcmcia_get_tuple_data(handle, &tuple) != 0 ||
+			pcmcia_parse_tuple(handle, &tuple, &parse) != 0 ||
+			cfg->index == 0 || cfg->io.nwin == 0)
+		goto next_entry;
 	
 	link->conf.ConfigIndex = cfg->index;
 	/* For multifunction cards, by convention, we configure the
@@ -653,14 +649,14 @@
 	    if (last_ret == CS_SUCCESS) break;
 	}
     next_entry:
-	last_ret = CardServices(GetNextTuple, handle, &tuple);
+	last_ret = pcmcia_get_next_tuple(handle, &tuple);
     }
     if (last_ret != CS_SUCCESS) {
 	cs_error(handle, RequestIO, last_ret);
 	goto failed;
     }
 
-    CS_CHECK(RequestIRQ, handle, &link->irq);
+    CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq));
     
     if (link->io.NumPorts2 == 8) {
 	link->conf.Attributes |= CONF_ENABLE_SPKR;
@@ -670,7 +666,7 @@
 	(prodid == PRODID_IBM_HOME_AND_AWAY))
 	link->conf.ConfigIndex |= 0x10;
     
-    CS_CHECK(RequestConfiguration, handle, &link->conf);
+    CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf));
     dev->irq = link->irq.AssignedIRQ;
     dev->base_addr = link->io.BasePort1;
     if (info->flags & HAS_MISC_REG) {
@@ -799,11 +795,11 @@
 
     if (info->flags & USE_SHMEM) {
 	iounmap(info->base);
-	CardServices(ReleaseWindow, link->win);
+	pcmcia_release_window(link->win);
     }
-    CardServices(ReleaseConfiguration, link->handle);
-    CardServices(ReleaseIO, link->handle, &link->io);
-    CardServices(ReleaseIRQ, link->handle, &link->irq);
+    pcmcia_release_configuration(link->handle);
+    pcmcia_release_io(link->handle, &link->io);
+    pcmcia_release_irq(link->handle, &link->irq);
 
     link->state &= ~DEV_CONFIG;
 
@@ -847,7 +843,7 @@
 	if (link->state & DEV_CONFIG) {
 	    if (link->open)
 		netif_device_detach(&info->dev);
-	    CardServices(ReleaseConfiguration, link->handle);
+	    pcmcia_release_configuration(link->handle);
 	}
 	break;
     case CS_EVENT_PM_RESUME:
@@ -855,7 +851,7 @@
 	/* Fall through... */
     case CS_EVENT_CARD_RESET:
 	if (link->state & DEV_CONFIG) {
-	    CardServices(RequestConfiguration, link->handle, &link->conf);
+	    pcmcia_request_configuration(link->handle, &link->conf);
 	    if (link->open) {
 		pcnet_reset_8390(&info->dev);
 		NS8390_init(&info->dev, 1);
@@ -871,13 +867,15 @@
 
     MII interface support for DL10019 and DL10022 based cards
 
-    On the DL10019, the MII IO direction bit is 0x10; on  the DL10022
+    On the DL10019, the MII IO direction bit is 0x10; on the DL10022
     it is 0x20.  Setting both bits seems to work on both card types.
 
 ======================================================================*/
 
 #define DLINK_GPIO		0x1c
 #define DLINK_DIAG		0x1d
+#define DLINK_EEPROM		0x1e
+
 #define MDIO_SHIFT_CLK		0x80
 #define MDIO_DATA_OUT		0x40
 #define MDIO_DIR_WRITE		0x30
@@ -940,6 +938,98 @@
     outb_p(0x00, addr);
 }
 
+/*======================================================================
+
+    EEPROM access routines for DL10019 and DL10022 based cards
+
+======================================================================*/
+
+#define EE_EEP		0x40
+#define EE_ASIC		0x10
+#define EE_CS		0x08
+#define EE_CK		0x04
+#define EE_DO		0x02
+#define EE_DI		0x01
+#define EE_ADOT		0x01	/* DataOut for ASIC */
+#define EE_READ_CMD	0x06
+
+#define DL19FDUPLX	0x0400	/* DL10019 Full duplex mode */
+
+static int read_eeprom(ioaddr_t ioaddr, int location)
+{
+    int i, retval = 0;
+    ioaddr_t ee_addr = ioaddr + DLINK_EEPROM;
+    int read_cmd = location | (EE_READ_CMD << 8);
+
+    outb(0, ee_addr);
+    outb(EE_EEP|EE_CS, ee_addr);
+
+    /* Shift the read command bits out. */
+    for (i = 10; i >= 0; i--) {
+	short dataval = (read_cmd & (1 << i)) ? EE_DO : 0;
+	outb_p(EE_EEP|EE_CS|dataval, ee_addr);
+	outb_p(EE_EEP|EE_CS|dataval|EE_CK, ee_addr);
+    }
+    outb(EE_EEP|EE_CS, ee_addr);
+
+    for (i = 16; i > 0; i--) {
+	outb_p(EE_EEP|EE_CS | EE_CK, ee_addr);
+	retval = (retval << 1) | ((inb(ee_addr) & EE_DI) ? 1 : 0);
+	outb_p(EE_EEP|EE_CS, ee_addr);
+    }
+
+    /* Terminate the EEPROM access. */
+    outb(0, ee_addr);
+    return retval;
+}
+
+/*
+    The internal ASIC registers can be changed by EEPROM READ access
+    with EE_ASIC bit set.
+    In ASIC mode, EE_ADOT is used to output the data to the ASIC.
+*/
+
+static void write_asic(ioaddr_t ioaddr, int location, short asic_data)
+{
+	int i;
+	ioaddr_t ee_addr = ioaddr + DLINK_EEPROM;
+	short dataval;
+	int read_cmd = location | (EE_READ_CMD << 8);
+
+	asic_data |= read_eeprom(ioaddr, location);
+
+	outb(0, ee_addr);
+	outb(EE_ASIC|EE_CS|EE_DI, ee_addr);
+
+	read_cmd = read_cmd >> 1;
+
+	/* Shift the read command bits out. */
+	for (i = 9; i >= 0; i--) {
+		dataval = (read_cmd & (1 << i)) ? EE_DO : 0;
+		outb_p(EE_ASIC|EE_CS|EE_DI|dataval, ee_addr);
+		outb_p(EE_ASIC|EE_CS|EE_DI|dataval|EE_CK, ee_addr);
+		outb_p(EE_ASIC|EE_CS|EE_DI|dataval, ee_addr);
+	}
+	// sync
+	outb(EE_ASIC|EE_CS, ee_addr);
+	outb(EE_ASIC|EE_CS|EE_CK, ee_addr);
+	outb(EE_ASIC|EE_CS, ee_addr);
+
+	for (i = 15; i >= 0; i--) {
+		dataval = (asic_data & (1 << i)) ? EE_ADOT : 0;
+		outb_p(EE_ASIC|EE_CS|dataval, ee_addr);
+		outb_p(EE_ASIC|EE_CS|dataval|EE_CK, ee_addr);
+		outb_p(EE_ASIC|EE_CS|dataval, ee_addr);
+	}
+
+	/* Terminate the ASIC access. */
+	outb(EE_ASIC|EE_DI, ee_addr);
+	outb(EE_ASIC|EE_DI| EE_CK, ee_addr);
+	outb(EE_ASIC|EE_DI, ee_addr);
+
+	outb(0, ee_addr);
+}
+
 /*====================================================================*/
 
 static void set_misc_reg(struct net_device *dev)
@@ -1154,6 +1244,9 @@
 	if (link && (info->flags & IS_DL10022)) {
 	    /* Disable collision detection on full duplex links */
 	    outb((p & 0x0140) ? 4 : 0, nic_base + DLINK_DIAG);
+	} else if (link && (info->flags & IS_DL10019)) {
+	    /* Disable collision detection on full duplex links */
+	    write_asic(dev->base_addr, 4, (p & 0x140) ? DL19FDUPLX : 0);
 	}
 	if (link) {
 	    if (info->phy_id == info->eth_phy) {
@@ -1523,14 +1616,13 @@
     req.Attributes |= WIN_USE_WAIT;
     req.Base = 0; req.Size = window_size;
     req.AccessSpeed = mem_speed;
-    link->win = (window_handle_t)link->handle;
-    CS_CHECK(RequestWindow, &link->win, &req);
+    CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &link->win));
 
     mem.CardOffset = (start_pg << 8) + cm_offset;
     offset = mem.CardOffset % window_size;
     mem.CardOffset -= offset;
     mem.Page = 0;
-    CS_CHECK(MapMemPage, link->win, &mem);
+    CS_CHECK(MapMemPage, pcmcia_map_mem_page(link->win, &mem));
 
     /* Try scribbling on the buffer */
     info->base = ioremap(req.Base, window_size);
@@ -1542,7 +1634,7 @@
     pcnet_reset_8390(dev);
     if (i != (TX_PAGES<<8)) {
 	iounmap(info->base);
-	CardServices(ReleaseWindow, link->win);
+	pcmcia_release_window(link->win);
 	info->base = NULL; link->win = NULL;
 	goto failed;
     }
--- diff/drivers/net/pcmcia/smc91c92_cs.c	2003-09-30 15:46:15.000000000 +0100
+++ source/drivers/net/pcmcia/smc91c92_cs.c	2003-12-29 09:30:41.000000000 +0000
@@ -379,7 +379,7 @@
     client_reg.event_handler = &smc91c92_event;
     client_reg.Version = 0x0210;
     client_reg.event_callback_args.client_data = link;
-    ret = CardServices(RegisterClient, &link->handle, &client_reg);
+    ret = pcmcia_register_client(&link->handle, &client_reg);
     if (ret != 0) {
 	cs_error(link->handle, RegisterClient, ret);
 	smc91c92_detach(link);
@@ -418,7 +418,7 @@
     }
 
     if (link->handle)
-	CardServices(DeregisterClient, link->handle);
+	pcmcia_deregister_client(link->handle);
 
     /* Unlink device structure, free bits */
     *linkp = link->next;
@@ -453,19 +453,27 @@
 
 /*====================================================================*/
 
-static int get_tuple(int fn, client_handle_t handle, tuple_t *tuple,
-		     cisparse_t *parse)
+static int first_tuple(client_handle_t handle, tuple_t *tuple,
+		cisparse_t *parse)
 {
-    int i;
-    i = CardServices(fn, handle, tuple);
-    if (i != CS_SUCCESS) return i;
-    i = CardServices(GetTupleData, handle, tuple);
-    if (i != CS_SUCCESS) return i;
-    return CardServices(ParseTuple, handle, tuple, parse);
+	int i;
+
+	if ((i = pcmcia_get_first_tuple(handle, tuple)) != CS_SUCCESS ||
+			(i = pcmcia_get_tuple_data(handle, tuple)) != CS_SUCCESS)
+		return i;
+	return pcmcia_parse_tuple(handle, tuple, parse);
 }
 
-#define first_tuple(a, b, c) get_tuple(GetFirstTuple, a, b, c)
-#define next_tuple(a, b, c) get_tuple(GetNextTuple, a, b, c)
+static int next_tuple(client_handle_t handle, tuple_t *tuple,
+		cisparse_t *parse)
+{
+	int i;
+
+	if ((i = pcmcia_get_next_tuple(handle, tuple)) != CS_SUCCESS ||
+			(i = pcmcia_get_tuple_data(handle, tuple)) != CS_SUCCESS)
+		return i;
+	return pcmcia_parse_tuple(handle, tuple, parse);
+}
 
 /*======================================================================
 
@@ -534,7 +542,7 @@
 	for (k = 0; k < 0x400; k += 0x10) {
 	    if (k & 0x80) continue;
 	    link->io.BasePort1 = k ^ 0x300;
-	    i = CardServices(RequestIO, link->handle, &link->io);
+	    i = pcmcia_request_io(link->handle, &link->io);
 	    if (i == CS_SUCCESS) break;
 	}
 	if (i == CS_SUCCESS) break;
@@ -548,15 +556,14 @@
     req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
     req.Base = req.Size = 0;
     req.AccessSpeed = 0;
-    link->win = (window_handle_t)link->handle;
-    i = CardServices(RequestWindow, &link->win, &req);
+    i = pcmcia_request_window(&link->handle, &req, &link->win);
     if (i != CS_SUCCESS)
 	return i;
     smc->base = ioremap(req.Base, req.Size);
     mem.CardOffset = mem.Page = 0;
     if (smc->manfid == MANFID_MOTOROLA)
 	mem.CardOffset = link->conf.ConfigBase;
-    i = CardServices(MapMemPage, link->win, &mem);
+    i = pcmcia_map_mem_page(link->win, &mem);
 
     if ((i == CS_SUCCESS)
 	&& (smc->manfid == MANFID_MEGAHERTZ)
@@ -594,9 +601,9 @@
 
     /* Another possibility: for the EM3288, in a special tuple */
     tuple.DesiredTuple = 0x81;
-    if (CardServices(GetFirstTuple, handle, &tuple) != CS_SUCCESS)
+    if (pcmcia_get_first_tuple(handle, &tuple) != CS_SUCCESS)
 	return -1;
-    if (CardServices(GetTupleData, handle, &tuple) != CS_SUCCESS)
+    if (pcmcia_get_tuple_data(handle, &tuple) != CS_SUCCESS)
 	return -1;
     buf[12] = '\0';
     if (cvt_ascii_address(dev, buf) == 0)
@@ -690,7 +697,7 @@
 	    link->conf.ConfigIndex = cf->index;
 	    link->io.BasePort1 = cf->io.win[0].base;
 	    link->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK;
-	    i = CardServices(RequestIO, link->handle, &link->io);
+	    i = pcmcia_request_io(link->handle, &link->io);
 	    if (i == CS_SUCCESS) break;
 	}
 	i = next_tuple(link->handle, &tuple, &parse);
@@ -763,14 +770,14 @@
 
     for (i = j = 0; j < 4; j++) {
 	link->io.BasePort2 = com[j];
-	i = CardServices(RequestIO, link->handle, &link->io);
+	i = pcmcia_request_io(link->handle, &link->io);
 	if (i == CS_SUCCESS) break;
     }
     if (i != CS_SUCCESS) {
 	/* Fallback: turn off hard decode */
 	link->conf.ConfigIndex = 0x03;
 	link->io.NumPorts2 = 0;
-	i = CardServices(RequestIO, link->handle, &link->io);
+	i = pcmcia_request_io(link->handle, &link->io);
     }
     dev->base_addr = link->io.BasePort1 + 0x10;
     return i;
@@ -791,12 +798,12 @@
 
     /* Read the station address from tuple 0x90, subtuple 0x04 */
     tuple.DesiredTuple = 0x90;
-    i = CardServices(GetFirstTuple, handle, &tuple);
+    i = pcmcia_get_first_tuple(handle, &tuple);
     while (i == CS_SUCCESS) {
-	i = CardServices(GetTupleData, handle, &tuple);
+	i = pcmcia_get_tuple_data(handle, &tuple);
 	if ((i != CS_SUCCESS) || (buf[0] == 0x04))
 	    break;
-	i = CardServices(GetNextTuple, handle, &tuple);
+	i = pcmcia_get_next_tuple(handle, &tuple);
     }
     if (i != CS_SUCCESS)
 	return -1;
@@ -869,9 +876,9 @@
 	printk(KERN_INFO "smc91c92_cs: using 8-bit IO window.\n");
 	args.client_data = link;
 	smc91c92_event(CS_EVENT_RESET_PHYSICAL, 0, &args);
-	CardServices(ReleaseIO, link->handle, &link->io);
+	pcmcia_release_io(link->handle, &link->io);
 	link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-	CardServices(RequestIO, link->handle, &link->io);
+	pcmcia_request_io(link->handle, &link->io);
 	smc91c92_event(CS_EVENT_CARD_RESET, 0, &args);
 	return check_sig(link);
     }
@@ -936,9 +943,9 @@
     }
     CS_EXIT_TEST(i, RequestIO, config_failed);
 
-    i = CardServices(RequestIRQ, link->handle, &link->irq);
+    i = pcmcia_request_irq(link->handle, &link->irq);
     CS_EXIT_TEST(i, RequestIRQ, config_failed);
-    i = CardServices(RequestConfiguration, link->handle, &link->conf);
+    i = pcmcia_request_configuration(link->handle, &link->conf);
     CS_EXIT_TEST(i, RequestConfiguration, config_failed);
 
     if (smc->manfid == MANFID_MOTOROLA)
@@ -1070,14 +1077,14 @@
 	return;
     }
 
-    CardServices(ReleaseConfiguration, link->handle);
-    CardServices(ReleaseIO, link->handle, &link->io);
-    CardServices(ReleaseIRQ, link->handle, &link->irq);
+    pcmcia_release_configuration(link->handle);
+    pcmcia_release_io(link->handle, &link->io);
+    pcmcia_release_irq(link->handle, &link->irq);
     if (link->win) {
 	struct net_device *dev = link->priv;
 	struct smc_private *smc = dev->priv;
 	iounmap(smc->base);
-	CardServices(ReleaseWindow, link->win);
+	pcmcia_release_window(link->win);
     }
 
     link->state &= ~DEV_CONFIG;
@@ -1124,7 +1131,7 @@
 	if (link->state & DEV_CONFIG) {
 	    if (link->open)
 		netif_device_detach(dev);
-	    CardServices(ReleaseConfiguration, link->handle);
+	    pcmcia_release_configuration(link->handle);
 	}
 	break;
     case CS_EVENT_PM_RESUME:
@@ -1135,7 +1142,7 @@
 	    if ((smc->manfid == MANFID_MEGAHERTZ) &&
 		(smc->cardid == PRODID_MEGAHERTZ_EM3288))
 		mhz_3288_power(link);
-	    CardServices(RequestConfiguration, link->handle, &link->conf);
+	    pcmcia_request_configuration(link->handle, &link->conf);
 	    if (smc->manfid == MANFID_MOTOROLA)
 		mot_config(link);
 	    if ((smc->manfid == MANFID_OSITECH) &&
--- diff/drivers/net/pcmcia/xirc2ps_cs.c	2003-09-30 15:46:15.000000000 +0100
+++ source/drivers/net/pcmcia/xirc2ps_cs.c	2003-12-29 09:30:41.000000000 +0000
@@ -391,28 +391,27 @@
 
 /*=============== Helper functions =========================*/
 static int
-get_tuple_data(int fn, client_handle_t handle, tuple_t *tuple)
+first_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
 {
-    int err;
+	int err;
 
-    if ((err=CardServices(fn, handle, tuple)))
+	if ((err = pcmcia_get_first_tuple(handle, tuple)) == 0 &&
+			(err = pcmcia_get_tuple_data(handle, tuple)) == 0)
+		err = pcmcia_parse_tuple(handle, tuple, parse);
 	return err;
-    return CardServices(GetTupleData, handle, tuple);
 }
 
 static int
-get_tuple(int fn, client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
+next_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
 {
-    int err;
+	int err;
 
-    if ((err=get_tuple_data(fn, handle, tuple)))
+	if ((err = pcmcia_get_next_tuple(handle, tuple)) == 0 &&
+			(err = pcmcia_get_tuple_data(handle, tuple)) == 0)
+		err = pcmcia_parse_tuple(handle, tuple, parse);
 	return err;
-    return CardServices(ParseTuple, handle, tuple, parse);
 }
 
-#define first_tuple(a, b, c) get_tuple(GetFirstTuple, a, b, c)
-#define next_tuple(a, b, c)  get_tuple(GetNextTuple, a, b, c)
-
 #define SelectPage(pgnr)   outb((pgnr), ioaddr + XIRCREG_PR)
 #define GetByte(reg)	   ((unsigned)inb(ioaddr + (reg)))
 #define GetWord(reg)	   ((unsigned)inw(ioaddr + (reg)))
@@ -636,7 +635,7 @@
     client_reg.event_handler = &xirc2ps_event;
     client_reg.Version = 0x0210;
     client_reg.event_callback_args.client_data = link;
-    if ((err = CardServices(RegisterClient, &link->handle, &client_reg))) {
+    if ((err = pcmcia_register_client(&link->handle, &client_reg))) {
 	cs_error(link->handle, RegisterClient, err);
 	xirc2ps_detach(link);
 	return NULL;
@@ -680,7 +679,7 @@
 
     /* Break the link with Card Services */
     if (link->handle)
-	CardServices(DeregisterClient, link->handle);
+	pcmcia_deregister_client(link->handle);
 
     /* Unlink device structure, free it */
     *linkp = link->next;
@@ -887,7 +886,8 @@
     }
     if (err) { /* not found: try to get the node-id from tuple 0x89 */
 	tuple.DesiredTuple = 0x89;  /* data layout looks like tuple 0x22 */
-	if (!(err = get_tuple_data(GetFirstTuple, handle, &tuple))) {
+	if ((err = pcmcia_get_first_tuple(handle, &tuple)) == 0 &&
+		(err = pcmcia_get_tuple_data(handle, &tuple)) == 0) {
 	    if (tuple.TupleDataLen == 8 && *buf == CISTPL_FUNCE_LAN_NODE_ID)
 		memcpy(&parse, buf, 8);
 	    else
@@ -953,8 +953,7 @@
 			link->conf.ConfigIndex = cf->index ;
 			link->io.BasePort2 = cf->io.win[0].base;
 			link->io.BasePort1 = ioaddr;
-			if (!(err=CardServices(RequestIO, link->handle,
-								&link->io)))
+			if (!(err=pcmcia_request_io(link->handle, &link->io)))
 			    goto port_found;
 		    }
 		}
@@ -976,8 +975,7 @@
 			link->io.BasePort1 = link->io.BasePort2
 				    + (pass ? (cf->index & 0x20 ? -24:8)
 					    : (cf->index & 0x20 ?   8:-24));
-			if (!(err=CardServices(RequestIO, link->handle,
-								&link->io)))
+			if (!(err=pcmcia_request_io(link->handle, &link->io)))
 			    goto port_found;
 		    }
 		}
@@ -992,11 +990,11 @@
 	link->io.NumPorts1 = 16;
 	for (ioaddr = 0x300; ioaddr < 0x400; ioaddr += 0x10) {
 	    link->io.BasePort1 = ioaddr;
-	    if (!(err=CardServices(RequestIO, link->handle, &link->io)))
+	    if (!(err=pcmcia_request_io(link->handle, &link->io)))
 		goto port_found;
 	}
 	link->io.BasePort1 = 0; /* let CS decide */
-	if ((err=CardServices(RequestIO, link->handle, &link->io))) {
+	if ((err=pcmcia_request_io(link->handle, &link->io))) {
 	    cs_error(link->handle, RequestIO, err);
 	    goto config_error;
 	}
@@ -1009,7 +1007,7 @@
      * Now allocate an interrupt line.	Note that this does not
      * actually assign a handler to the interrupt.
      */
-    if ((err=CardServices(RequestIRQ, link->handle, &link->irq))) {
+    if ((err=pcmcia_request_irq(link->handle, &link->irq))) {
 	cs_error(link->handle, RequestIRQ, err);
 	goto config_error;
     }
@@ -1018,8 +1016,7 @@
      * This actually configures the PCMCIA socket -- setting up
      * the I/O windows and the interrupt mapping.
      */
-    if ((err=CardServices(RequestConfiguration,
-			  link->handle, &link->conf))) {
+    if ((err=pcmcia_request_configuration(link->handle, &link->conf))) {
 	cs_error(link->handle, RequestConfiguration, err);
 	goto config_error;
     }
@@ -1037,16 +1034,14 @@
 	reg.Action = CS_WRITE;
 	reg.Offset = CISREG_IOBASE_0;
 	reg.Value = link->io.BasePort2 & 0xff;
-	if ((err = CardServices(AccessConfigurationRegister, link->handle,
-				&reg))) {
+	if ((err = pcmcia_access_configuration_register(link->handle, &reg))) {
 	    cs_error(link->handle, AccessConfigurationRegister, err);
 	    goto config_error;
 	}
 	reg.Action = CS_WRITE;
 	reg.Offset = CISREG_IOBASE_1;
 	reg.Value = (link->io.BasePort2 >> 8) & 0xff;
-	if ((err = CardServices(AccessConfigurationRegister, link->handle,
-				&reg))) {
+	if ((err = pcmcia_access_configuration_register(link->handle, &reg))) {
 	    cs_error(link->handle, AccessConfigurationRegister, err);
 	    goto config_error;
 	}
@@ -1058,15 +1053,14 @@
 	req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
 	req.Base = req.Size = 0;
 	req.AccessSpeed = 0;
-	link->win = (window_handle_t)link->handle;
-	if ((err = CardServices(RequestWindow, &link->win, &req))) {
+	if ((err = pcmcia_request_window(&link->handle, &req, &link->win))) {
 	    cs_error(link->handle, RequestWindow, err);
 	    goto config_error;
 	}
 	local->dingo_ccr = ioremap(req.Base,0x1000) + 0x0800;
 	mem.CardOffset = 0x0;
 	mem.Page = 0;
-	if ((err = CardServices(MapMemPage, link->win, &mem))) {
+	if ((err = pcmcia_map_mem_page(link->win, &mem))) {
 	    cs_error(link->handle, MapMemPage, err);
 	    goto config_error;
 	}
@@ -1171,11 +1165,11 @@
 	local_info_t *local = dev->priv;
 	if (local->dingo)
 	    iounmap(local->dingo_ccr - 0x0800);
-	CardServices(ReleaseWindow, link->win);
+	pcmcia_release_window(link->win);
     }
-    CardServices(ReleaseConfiguration, link->handle);
-    CardServices(ReleaseIO, link->handle, &link->io);
-    CardServices(ReleaseIRQ, link->handle, &link->irq);
+    pcmcia_release_configuration(link->handle);
+    pcmcia_release_io(link->handle, &link->io);
+    pcmcia_release_irq(link->handle, &link->irq);
     link->state &= ~DEV_CONFIG;
 
 } /* xirc2ps_release */
@@ -1227,7 +1221,7 @@
 		netif_device_detach(dev);
 		do_powerdown(dev);
 	    }
-	    CardServices(ReleaseConfiguration, link->handle);
+	    pcmcia_release_configuration(link->handle);
 	}
 	break;
     case CS_EVENT_PM_RESUME:
@@ -1235,7 +1229,7 @@
 	/* Fall through... */
     case CS_EVENT_CARD_RESET:
 	if (link->state & DEV_CONFIG) {
-	    CardServices(RequestConfiguration, link->handle, &link->conf);
+	    pcmcia_request_configuration(link->handle, &link->conf);
 	    if (link->open) {
 		do_reset(dev,1);
 		netif_device_attach(dev);
--- diff/drivers/net/ppp_async.c	2003-09-17 12:28:08.000000000 +0100
+++ source/drivers/net/ppp_async.c	2003-12-29 09:30:41.000000000 +0000
@@ -16,8 +16,6 @@
  * Part of the code in this driver was inspired by the old async-only
  * PPP driver, written by Michael Callahan and Al Longyear, and
  * subsequently hacked by Paul Mackerras.
- *
- * ==FILEVERSION 20020125==
  */
 
 #include <linux/module.h>
@@ -61,6 +59,9 @@
 
 	struct sk_buff	*rpkt;
 	int		lcp_fcs;
+	struct sk_buff_head rqueue;
+
+	struct tasklet_struct tsk;
 
 	atomic_t	refcnt;
 	struct semaphore dead_sem;
@@ -74,8 +75,9 @@
 #define XMIT_BUSY	2
 
 /* State bits */
-#define SC_TOSS		0x20000000
-#define SC_ESCAPE	0x40000000
+#define SC_TOSS		1
+#define SC_ESCAPE	2
+#define SC_PREV_ERROR	4
 
 /* Bits in rbits */
 #define SC_RCV_BITS	(SC_RCV_B7_1|SC_RCV_B7_0|SC_RCV_ODDP|SC_RCV_EVNP)
@@ -97,6 +99,8 @@
 			    char *flags, int count);
 static int ppp_async_ioctl(struct ppp_channel *chan, unsigned int cmd,
 			   unsigned long arg);
+static void ppp_async_process(unsigned long arg);
+
 static void async_lcp_peek(struct asyncppp *ap, unsigned char *data,
 			   int len, int inbound);
 
@@ -165,6 +169,9 @@
 	ap->olim = ap->obuf;
 	ap->lcp_fcs = -1;
 
+	skb_queue_head_init(&ap->rqueue);
+	tasklet_init(&ap->tsk, ppp_async_process, (unsigned long) ap);
+
 	atomic_set(&ap->refcnt, 1);
 	init_MUTEX_LOCKED(&ap->dead_sem);
 
@@ -214,10 +221,12 @@
 	 */
 	if (!atomic_dec_and_test(&ap->refcnt))
 		down(&ap->dead_sem);
+	tasklet_kill(&ap->tsk);
 
 	ppp_unregister_channel(&ap->chan);
 	if (ap->rpkt != 0)
 		kfree_skb(ap->rpkt);
+	skb_queue_purge(&ap->rqueue);
 	if (ap->tpkt != 0)
 		kfree_skb(ap->tpkt);
 	kfree(ap);
@@ -316,17 +325,24 @@
 	return 65535;
 }
 
+/*
+ * This can now be called from hard interrupt level as well
+ * as soft interrupt level or mainline.
+ */
 static void
 ppp_asynctty_receive(struct tty_struct *tty, const unsigned char *buf,
-		  char *flags, int count)
+		  char *cflags, int count)
 {
 	struct asyncppp *ap = ap_get(tty);
+	unsigned long flags;
 
 	if (ap == 0)
 		return;
-	spin_lock_bh(&ap->recv_lock);
-	ppp_async_input(ap, buf, flags, count);
-	spin_unlock_bh(&ap->recv_lock);
+	spin_lock_irqsave(&ap->recv_lock, flags);
+	ppp_async_input(ap, buf, cflags, count);
+	spin_unlock_irqrestore(&ap->recv_lock, flags);
+	if (skb_queue_len(&ap->rqueue))
+		tasklet_schedule(&ap->tsk);
 	ap_put(ap);
 	if (test_and_clear_bit(TTY_THROTTLED, &tty->flags)
 	    && tty->driver->unthrottle)
@@ -341,8 +357,8 @@
 	clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
 	if (ap == 0)
 		return;
-	if (ppp_async_push(ap))
-		ppp_output_wakeup(&ap->chan);
+	set_bit(XMIT_WAKEUP, &ap->xmit_flags);
+	tasklet_schedule(&ap->tsk);
 	ap_put(ap);
 }
 
@@ -396,9 +412,9 @@
 		if (get_user(val, (int *) arg))
 			break;
 		ap->flags = val & ~SC_RCV_BITS;
-		spin_lock_bh(&ap->recv_lock);
+		spin_lock_irq(&ap->recv_lock);
 		ap->rbits = val & SC_RCV_BITS;
-		spin_unlock_bh(&ap->recv_lock);
+		spin_unlock_irq(&ap->recv_lock);
 		err = 0;
 		break;
 
@@ -460,6 +476,28 @@
 }
 
 /*
+ * This is called at softirq level to deliver received packets
+ * to the ppp_generic code, and to tell the ppp_generic code
+ * if we can accept more output now.
+ */
+static void ppp_async_process(unsigned long arg)
+{
+	struct asyncppp *ap = (struct asyncppp *) arg;
+	struct sk_buff *skb;
+
+	/* process received packets */
+	while ((skb = skb_dequeue(&ap->rqueue)) != NULL) {
+		if (skb->cb[0])
+			ppp_input_error(&ap->chan, 0);
+		ppp_input(&ap->chan, skb);
+	}
+
+	/* try to push more stuff out */
+	if (test_bit(XMIT_WAKEUP, &ap->xmit_flags) && ppp_async_push(ap))
+		ppp_output_wakeup(&ap->chan);
+}
+
+/*
  * Procedures for encapsulation and framing.
  */
 
@@ -641,7 +679,6 @@
 	struct tty_struct *tty = ap->tty;
 	int tty_stuffed = 0;
 
-	set_bit(XMIT_WAKEUP, &ap->xmit_flags);
 	/*
 	 * We can get called recursively here if the tty write
 	 * function calls our wakeup function.  This can happen
@@ -752,22 +789,19 @@
 }
 
 /* called when a flag is seen - do end-of-packet processing */
-static inline void
+static void
 process_input_packet(struct asyncppp *ap)
 {
 	struct sk_buff *skb;
 	unsigned char *p;
 	unsigned int len, fcs, proto;
-	int code = 0;
+
+	if (ap->state & (SC_TOSS | SC_ESCAPE))
+		goto err;
 
 	skb = ap->rpkt;
-	ap->rpkt = 0;
-	if ((ap->state & (SC_TOSS | SC_ESCAPE)) || skb == 0) {
-		ap->state &= ~(SC_TOSS | SC_ESCAPE);
-		if (skb != 0)
-			kfree_skb(skb);
-		return;
-	}
+	if (skb == NULL)
+		return;		/* 0-length packet */
 
 	/* check the FCS */
 	p = skb->data;
@@ -801,20 +835,18 @@
 			async_lcp_peek(ap, p, skb->len, 1);
 	}
 
-	/* all OK, give it to the generic layer */
-	ppp_input(&ap->chan, skb);
+	/* queue the frame to be processed */
+	skb->cb[0] = ap->state;
+	skb_queue_tail(&ap->rqueue, skb);
+	ap->rpkt = 0;
+	ap->state = 0;
 	return;
 
  err:
-	kfree_skb(skb);
-	ppp_input_error(&ap->chan, code);
-}
-
-static inline void
-input_error(struct asyncppp *ap, int code)
-{
-	ap->state |= SC_TOSS;
-	ppp_input_error(&ap->chan, code);
+	/* frame had an error, remember that, reset SC_TOSS & SC_ESCAPE */
+	ap->state = SC_PREV_ERROR;
+	if (skb)
+		skb_trim(skb, 0);
 }
 
 /* called when the tty driver has data for us. */
@@ -856,7 +888,7 @@
 		}
 		if (f != 0) {
 			/* start tossing */
-			input_error(ap, f);
+			ap->state |= SC_TOSS;
 
 		} else if (n > 0 && (ap->state & SC_TOSS) == 0) {
 			/* stuff the chars in the skb */
@@ -872,7 +904,7 @@
 			}
 			if (n > skb_tailroom(skb)) {
 				/* packet overflowed MRU */
-				input_error(ap, 1);
+				ap->state |= SC_TOSS;
 			} else {
 				sp = skb_put(skb, n);
 				memcpy(sp, buf, n);
@@ -909,7 +941,7 @@
 
  nomem:
 	printk(KERN_ERR "PPPasync: no memory (input pkt)\n");
-	input_error(ap, 0);
+	ap->state |= SC_TOSS;
 }
 
 /*
--- diff/drivers/net/pppoe.c	2003-12-19 09:51:02.000000000 +0000
+++ source/drivers/net/pppoe.c	2003-12-29 09:30:41.000000000 +0000
@@ -1151,3 +1151,4 @@
 MODULE_AUTHOR("Michal Ostrowski <mostrows@speakeasy.net>");
 MODULE_DESCRIPTION("PPP over Ethernet driver");
 MODULE_LICENSE("GPL");
+MODULE_ALIAS_NETPROTO(PF_PPPOX);
--- diff/drivers/net/sis900.c	2003-11-25 15:24:58.000000000 +0000
+++ source/drivers/net/sis900.c	2003-12-29 09:30:41.000000000 +0000
@@ -18,10 +18,11 @@
    preliminary Rev. 1.0 Jan. 18, 1998
    http://www.sis.com.tw/support/databook.htm
 
+   Rev 1.08.07 Nov.  2 2003 Daniele Venzano <webvenza@libero.it> add suspend/resume support
    Rev 1.08.06 Sep. 24 2002 Mufasa Yang bug fix for Tx timeout & add SiS963 support
-   Rev 1.08.05 Jun. 6 2002 Mufasa Yang bug fix for read_eeprom & Tx descriptor over-boundary 
+   Rev 1.08.05 Jun.  6 2002 Mufasa Yang bug fix for read_eeprom & Tx descriptor over-boundary
    Rev 1.08.04 Apr. 25 2002 Mufasa Yang <mufasa@sis.com.tw> added SiS962 support
-   Rev 1.08.03 Feb. 1 2002 Matt Domsch <Matt_Domsch@dell.com> update to use library crc32 function
+   Rev 1.08.03 Feb.  1 2002 Matt Domsch <Matt_Domsch@dell.com> update to use library crc32 function
    Rev 1.08.02 Nov. 30 2001 Hui-Fen Hsu workaround for EDB & bug fix for dhcp problem
    Rev 1.08.01 Aug. 25 2001 Hui-Fen Hsu update for 630ET & workaround for ICS1893 PHY
    Rev 1.08.00 Jun. 11 2001 Hui-Fen Hsu workaround for RTL8201 PHY and some bug fix
@@ -72,7 +73,7 @@
 #include "sis900.h"
 
 #define SIS900_MODULE_NAME "sis900"
-#define SIS900_DRV_VERSION "v1.08.06 9/24/2002"
+#define SIS900_DRV_VERSION "v1.08.07 11/02/2003"
 
 static char version[] __devinitdata =
 KERN_INFO "sis900.c: " SIS900_DRV_VERSION "\n";
@@ -169,6 +170,7 @@
 
 	unsigned int tx_full;			/* The Tx queue is full.    */
 	u8 host_bridge_rev;
+	u32 pci_state[16];
 };
 
 MODULE_AUTHOR("Jim Huang <cmhuang@sis.com.tw>, Ollie Lho <ollie@sis.com.tw>");
@@ -305,7 +307,7 @@
 		*( ((u16 *)net_dev->dev_addr) + i) = inw(ioaddr + rfdr);
 	}
 
-	/* enable packet filitering */
+	/* enable packet filtering */
 	outl(rfcrSave | RFEN, rfcr + ioaddr);
 
 	return 1;
@@ -994,7 +996,7 @@
 		}
 	}
 
-	/* enable packet filitering */
+	/* enable packet filtering */
 	outl(rfcrSave | RFEN, rfcr + ioaddr);
 }
 
@@ -1466,7 +1468,7 @@
  *	@net_dev: the net device to transmit with
  *
  *	Set the transmit buffer descriptor, 
- *	and write TxENA to enable transimt state machine.
+ *	and write TxENA to enable transmit state machine.
  *	tell upper layer if the buffer is full
  */
 
@@ -2184,11 +2186,72 @@
 	pci_set_drvdata(pci_dev, NULL);
 }
 
+#ifdef CONFIG_PM
+
+static int sis900_suspend(struct pci_dev *pci_dev, u32 state)
+{
+	struct net_device *net_dev = pci_get_drvdata(pci_dev);
+	struct sis900_private *sis_priv = net_dev->priv;
+	long ioaddr = net_dev->base_addr;
+
+	if(!netif_running(net_dev))
+		return 0;
+
+	netif_stop_queue(net_dev);
+
+	/* Stop the chip's Tx and Rx Status Machine */
+	outl(RxDIS | TxDIS | inl(ioaddr + cr), ioaddr + cr);
+
+	pci_set_power_state(pci_dev, 3);
+	pci_save_state(pci_dev, sis_priv->pci_state);
+
+	return 0;
+}
+
+static int sis900_resume(struct pci_dev *pci_dev)
+{
+	struct net_device *net_dev = pci_get_drvdata(pci_dev);
+	struct sis900_private *sis_priv = net_dev->priv;
+	long ioaddr = net_dev->base_addr;
+
+	if(!netif_running(net_dev))
+		return 0;
+	pci_restore_state(pci_dev, sis_priv->pci_state);
+	pci_set_power_state(pci_dev, 0);
+
+	sis900_init_rxfilter(net_dev);
+
+	sis900_init_tx_ring(net_dev);
+	sis900_init_rx_ring(net_dev);
+
+	set_rx_mode(net_dev);
+
+	netif_device_attach(net_dev);
+	netif_start_queue(net_dev);
+
+	/* Workaround for EDB */
+	sis900_set_mode(ioaddr, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED);
+
+	/* Enable all known interrupts by setting the interrupt mask. */
+	outl((RxSOVR|RxORN|RxERR|RxOK|TxURN|TxERR|TxIDLE), ioaddr + imr);
+	outl(RxENA | inl(ioaddr + cr), ioaddr + cr);
+	outl(IE, ioaddr + ier);
+
+	sis900_check_mode(net_dev, sis_priv->mii);
+
+	return 0;
+}
+#endif /* CONFIG_PM */
+
 static struct pci_driver sis900_pci_driver = {
 	.name		= SIS900_MODULE_NAME,
 	.id_table	= sis900_pci_tbl,
 	.probe		= sis900_probe,
 	.remove		= __devexit_p(sis900_remove),
+#ifdef CONFIG_PM
+	.suspend	= sis900_suspend,
+	.resume		= sis900_resume,
+#endif /* CONFIG_PM */
 };
 
 static int __init sis900_init_module(void)
--- diff/drivers/net/tg3.c	2003-11-25 15:24:58.000000000 +0000
+++ source/drivers/net/tg3.c	2003-12-29 09:30:41.000000000 +0000
@@ -34,6 +34,10 @@
 #include <asm/byteorder.h>
 #include <asm/uaccess.h>
 
+#ifdef CONFIG_KGDB
+#include <asm/kgdb.h>
+#endif
+
 #ifdef CONFIG_SPARC64
 #include <asm/idprom.h>
 #include <asm/oplib.h>
@@ -1454,6 +1458,17 @@
 	return 0;
 }
 
+static irqreturn_t tg3_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+#ifdef CONFIG_KGDB
+static void tg3_poll_controller(struct net_device *dev)
+{
+	disable_irq(dev->irq);
+	tg3_interrupt(dev->irq, (void *)dev, 0);
+	enable_irq(dev->irq);
+}
+#endif
+
+
 struct tg3_fiber_aneginfo {
 	int state;
 #define ANEG_STATE_UNKNOWN		0
@@ -2183,6 +2198,100 @@
 }
 #endif
 
+#ifdef CONFIG_KGDB
+/* Get  skb from receive buffer */
+static void upcall_kgdb_hook(struct net_device *dev, int* drop)
+{
+ 	struct tg3 *tp = dev->priv;
+	u32 rx_rcb_ptr = tp->rx_rcb_ptr;
+	u16 hw_idx, sw_idx;
+
+	hw_idx = tp->hw_status->idx[0].rx_producer;
+	sw_idx = rx_rcb_ptr % TG3_RX_RCB_RING_SIZE(tp);
+	while (sw_idx != hw_idx) {
+		struct tg3_rx_buffer_desc *desc = &tp->rx_rcb[sw_idx];
+		unsigned int len;
+		struct sk_buff *skb;
+		dma_addr_t dma_addr;
+		u32 opaque_key, desc_idx ;
+
+		desc_idx = desc->opaque & RXD_OPAQUE_INDEX_MASK;
+		opaque_key = desc->opaque & RXD_OPAQUE_RING_MASK;
+		if (opaque_key == RXD_OPAQUE_RING_STD) {
+			dma_addr = pci_unmap_addr(&tp->rx_std_buffers[desc_idx],
+						  mapping);
+			skb = tp->rx_std_buffers[desc_idx].skb;
+		} else if (opaque_key == RXD_OPAQUE_RING_JUMBO) {
+			dma_addr = pci_unmap_addr(&tp->rx_jumbo_buffers[desc_idx],
+						  mapping);
+			skb = tp->rx_jumbo_buffers[desc_idx].skb;
+		}
+		else {
+			goto next_pkt;
+		}
+
+
+		if ((desc->err_vlan & RXD_ERR_MASK) != 0 &&
+		    (desc->err_vlan != RXD_ERR_ODD_NIBBLE_RCVD_MII)) {
+			goto next_pkt;
+		}
+
+		len = ((desc->idx_len & RXD_LEN_MASK) >> RXD_LEN_SHIFT) - 4; /* omit crc */
+
+		if (len > RX_COPY_THRESHOLD) {
+			int skb_size;
+			if (opaque_key == RXD_OPAQUE_RING_STD)
+				skb_size = RX_PKT_BUF_SZ;
+			else if (opaque_key == RXD_OPAQUE_RING_JUMBO)
+				skb_size = RX_JUMBO_PKT_BUF_SZ;
+			else
+				goto next_pkt;
+			skb = dev_alloc_skb(skb_size);
+			if (skb == NULL)
+				goto next_pkt;
+			skb->dev = tp->dev;
+			skb_reserve(skb, tp->rx_offset);
+			skb_put(skb, len);
+		} else {
+			struct sk_buff *copy_skb;
+			copy_skb = dev_alloc_skb(len + 2);
+			if (copy_skb == NULL)
+				goto next_pkt;
+
+			copy_skb->dev = tp->dev;
+			skb_reserve(copy_skb, 2);
+			skb_put(copy_skb, len);
+			memcpy(copy_skb->data, skb->data, len);
+
+			/* We'll reuse the original ring buffer. */
+			skb = copy_skb;
+		}
+		if ((tp->tg3_flags & TG3_FLAG_RX_CHECKSUMS) &&
+		    (desc->type_flags & RXD_FLAG_TCPUDP_CSUM) &&
+		    (((desc->ip_tcp_csum & RXD_TCPCSUM_MASK)
+		      >> RXD_TCPCSUM_SHIFT) == 0xffff))
+			skb->ip_summed = CHECKSUM_UNNECESSARY;
+		else
+			skb->ip_summed = CHECKSUM_NONE;
+
+		skb->protocol = eth_type_trans(skb, tp->dev);
+/*into gdb driver*/
+        	if (!kgdb_net_interrupt(skb)) {
+			/* No.. if we're 'trapped' then junk it */
+			if (kgdb_eth_is_trapped())
+				*drop=1;
+		} else {
+			/* kgdb_eth ate the packet... drop it silently */
+			*drop=1;
+		}
+		kfree_skb(skb);
+next_pkt:
+		rx_rcb_ptr++;
+		sw_idx = rx_rcb_ptr % TG3_RX_RCB_RING_SIZE(tp);
+	}
+}
+#endif
+
 /* The RX ring scheme is composed of multiple rings which post fresh
  * buffers to the chip, and one special ring the chip uses to report
  * status back to the host.
@@ -2453,9 +2562,15 @@
 		tr32(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW);
 		sblk->status &= ~SD_STATUS_UPDATED;
 
-		if (likely(tg3_has_work(dev, tp)))
+		if (likely(tg3_has_work(dev, tp))) {
+#ifdef CONFIG_KGDB
+			if (dev->poll_controller != NULL) {
+				int drop=0;
+				upcall_kgdb_hook(dev, &drop); /*drop may be used later */
+			}
+#endif
 			netif_rx_schedule(dev);		/* schedule NAPI poll */
-		else {
+		} else {
 			/* no work, shared interrupt perhaps?  re-enable
 			 * interrupts, and flush that PCI write
 			 */
@@ -7636,6 +7751,9 @@
 	dev->watchdog_timeo = TG3_TX_TIMEOUT;
 	dev->change_mtu = tg3_change_mtu;
 	dev->irq = pdev->irq;
+#ifdef CONFIG_KGDB
+ 	dev->poll_controller = tg3_poll_controller;
+#endif
 
 	err = tg3_get_invariants(tp);
 	if (err) {
--- diff/drivers/net/tlan.c	2003-11-25 15:24:58.000000000 +0000
+++ source/drivers/net/tlan.c	2003-12-29 09:30:41.000000000 +0000
@@ -297,6 +297,7 @@
 static int      TLan_probe1( struct pci_dev *pdev, long ioaddr, int irq, int rev, const struct pci_device_id *ent);
 static void	TLan_tx_timeout( struct net_device *dev);
 static int 	tlan_init_one( struct pci_dev *pdev, const struct pci_device_id *ent);
+static void	TLan_Poll(struct net_device *dev);
 
 static u32	TLan_HandleInvalid( struct net_device *, u16 );
 static u32	TLan_HandleTxEOF( struct net_device *, u16 );
@@ -453,6 +454,25 @@
 	pci_set_drvdata( pdev, NULL );
 } 
 
+#ifdef CONFIG_NET_POLL_CONTROLLER
+
+/*
+ * Polling 'interrupt' - used by things like netconsole to send skbs
+ * without having to re-enable interrupts. It's not called while
+ * the interrupt routine is executing.
+ */
+
+static void TLan_Poll (struct net_device *dev)
+{
+       disable_irq(dev->irq);
+       TLan_HandleInterrupt(dev->irq, dev, NULL);
+       enable_irq(dev->irq);
+}
+
+#endif
+
+
+
 static struct pci_driver tlan_driver = {
 	.name		= "tlan",
 	.id_table	= tlan_pci_tbl,
@@ -895,6 +915,9 @@
 	dev->do_ioctl = &TLan_ioctl;
 	dev->tx_timeout = &TLan_tx_timeout;
 	dev->watchdog_timeo = TX_TIMEOUT;
+#ifdef CONFIG_NET_POLL_CONTROLLER
+	dev->poll_controller = &TLan_Poll;
+#endif
 
 	return 0;
 
--- diff/drivers/net/tulip/Kconfig	2003-09-30 15:46:16.000000000 +0100
+++ source/drivers/net/tulip/Kconfig	2003-12-29 09:30:41.000000000 +0000
@@ -68,6 +68,26 @@
 	  obscure bugs if your mainboard has memory controller timing issues.
 	  If in doubt, say N.
 
+config TULIP_NAPI
+	bool "Use NAPI RX polling "
+	depends on TULIP
+	---help---
+	  This is of useful for servers and routers dealing with high network loads.
+
+	  See <file:Documentation/networking/NAPI_HOWTO.txt>.
+
+	  If in doubt, say N.
+
+config TULIP_NAPI_HW_MITIGATION
+	bool "Use Interrupt Mitigation "
+	depends on TULIP_NAPI
+	---help---
+	  Use HW to reduce RX interrupts. Not strict necessary since NAPI reduces
+	  RX interrupts but itself. Although this reduces RX interrupts even at
+	  low levels traffic at the cost of a small latency.
+
+	  If in doubt, say Y.
+
 config DE4X5
 	tristate "Generic DECchip & DIGITAL EtherWORKS PCI/EISA"
 	depends on NET_TULIP && (PCI || EISA)
--- diff/drivers/net/tulip/interrupt.c	2003-06-09 14:18:19.000000000 +0100
+++ source/drivers/net/tulip/interrupt.c	2003-12-29 09:30:41.000000000 +0000
@@ -19,13 +19,13 @@
 #include <linux/etherdevice.h>
 #include <linux/pci.h>
 
-
 int tulip_rx_copybreak;
 unsigned int tulip_max_interrupt_work;
 
-#ifdef CONFIG_NET_HW_FLOWCONTROL
-
+#ifdef CONFIG_TULIP_NAPI_HW_MITIGATION
 #define MIT_SIZE 15
+#define MIT_TABLE 15 /* We use 0 or max */
+
 unsigned int mit_table[MIT_SIZE+1] =
 {
         /*  CRS11 21143 hardware Mitigation Control Interrupt
@@ -99,16 +99,28 @@
 	return refilled;
 }
 
+#ifdef CONFIG_TULIP_NAPI
 
-static int tulip_rx(struct net_device *dev)
+void oom_timer(unsigned long data)
+{
+        struct net_device *dev = (struct net_device *)data;
+	netif_rx_schedule(dev);
+}
+
+int tulip_poll(struct net_device *dev, int *budget)
 {
 	struct tulip_private *tp = (struct tulip_private *)dev->priv;
 	int entry = tp->cur_rx % RX_RING_SIZE;
-	int rx_work_limit = tp->dirty_rx + RX_RING_SIZE - tp->cur_rx;
+	int rx_work_limit = *budget;
 	int received = 0;
 
-#ifdef CONFIG_NET_HW_FLOWCONTROL
-        int drop = 0, mit_sel = 0;
+	if (!netif_running(dev))
+		goto done;
+
+	if (rx_work_limit > dev->quota)
+		rx_work_limit = dev->quota;
+
+#ifdef CONFIG_TULIP_NAPI_HW_MITIGATION
 
 /* that one buffer is needed for mit activation; or might be a
    bug in the ring buffer code; check later -- JHS*/
@@ -119,6 +131,237 @@
 	if (tulip_debug > 4)
 		printk(KERN_DEBUG " In tulip_rx(), entry %d %8.8x.\n", entry,
 			   tp->rx_ring[entry].status);
+
+       do {
+               /* Acknowledge current RX interrupt sources. */
+               outl((RxIntr | RxNoBuf), dev->base_addr + CSR5);
+
+
+               /* If we own the next entry, it is a new packet. Send it up. */
+               while ( ! (tp->rx_ring[entry].status & cpu_to_le32(DescOwned))) {
+                       s32 status = le32_to_cpu(tp->rx_ring[entry].status);
+
+
+                       if (tp->dirty_rx + RX_RING_SIZE == tp->cur_rx)
+                               break;
+
+                       if (tulip_debug > 5)
+                               printk(KERN_DEBUG "%s: In tulip_rx(), entry %d %8.8x.\n",
+                                      dev->name, entry, status);
+                       if (--rx_work_limit < 0)
+                               goto not_done;
+
+                       if ((status & 0x38008300) != 0x0300) {
+                               if ((status & 0x38000300) != 0x0300) {
+                                /* Ingore earlier buffers. */
+                                       if ((status & 0xffff) != 0x7fff) {
+                                               if (tulip_debug > 1)
+                                                       printk(KERN_WARNING "%s: Oversized Ethernet frame "
+                                                              "spanned multiple buffers, status %8.8x!\n",
+                                                              dev->name, status);
+                                               tp->stats.rx_length_errors++;
+                                       }
+                               } else if (status & RxDescFatalErr) {
+                                /* There was a fatal error. */
+                                       if (tulip_debug > 2)
+                                               printk(KERN_DEBUG "%s: Receive error, Rx status %8.8x.\n",
+                                                      dev->name, status);
+                                       tp->stats.rx_errors++; /* end of a packet.*/
+                                       if (status & 0x0890) tp->stats.rx_length_errors++;
+                                       if (status & 0x0004) tp->stats.rx_frame_errors++;
+                                       if (status & 0x0002) tp->stats.rx_crc_errors++;
+                                       if (status & 0x0001) tp->stats.rx_fifo_errors++;
+                               }
+                       } else {
+                               /* Omit the four octet CRC from the length. */
+                               short pkt_len = ((status >> 16) & 0x7ff) - 4;
+                               struct sk_buff *skb;
+
+#ifndef final_version
+                               if (pkt_len > 1518) {
+                                       printk(KERN_WARNING "%s: Bogus packet size of %d (%#x).\n",
+                                              dev->name, pkt_len, pkt_len);
+                                       pkt_len = 1518;
+                                       tp->stats.rx_length_errors++;
+                               }
+#endif
+                               /* Check if the packet is long enough to accept without copying
+                                  to a minimally-sized skbuff. */
+                               if (pkt_len < tulip_rx_copybreak
+                                   && (skb = dev_alloc_skb(pkt_len + 2)) != NULL) {
+                                       skb->dev = dev;
+                                       skb_reserve(skb, 2);    /* 16 byte align the IP header */
+                                       pci_dma_sync_single(tp->pdev,
+                                                           tp->rx_buffers[entry].mapping,
+                                                           pkt_len, PCI_DMA_FROMDEVICE);
+#if ! defined(__alpha__)
+                                       eth_copy_and_sum(skb, tp->rx_buffers[entry].skb->tail,
+                                                        pkt_len, 0);
+                                       skb_put(skb, pkt_len);
+#else
+                                       memcpy(skb_put(skb, pkt_len),
+                                              tp->rx_buffers[entry].skb->tail,
+                                              pkt_len);
+#endif
+                               } else {        /* Pass up the skb already on the Rx ring. */
+                                       char *temp = skb_put(skb = tp->rx_buffers[entry].skb,
+                                                            pkt_len);
+
+#ifndef final_version
+                                       if (tp->rx_buffers[entry].mapping !=
+                                           le32_to_cpu(tp->rx_ring[entry].buffer1)) {
+                                               printk(KERN_ERR "%s: Internal fault: The skbuff addresses "
+                                                      "do not match in tulip_rx: %08x vs. %08x %p / %p.\n",
+                                                      dev->name,
+                                                      le32_to_cpu(tp->rx_ring[entry].buffer1),
+                                                      tp->rx_buffers[entry].mapping,
+                                                      skb->head, temp);
+                                       }
+#endif
+
+                                       pci_unmap_single(tp->pdev, tp->rx_buffers[entry].mapping,
+                                                        PKT_BUF_SZ, PCI_DMA_FROMDEVICE);
+
+                                       tp->rx_buffers[entry].skb = NULL;
+                                       tp->rx_buffers[entry].mapping = 0;
+                               }
+                               skb->protocol = eth_type_trans(skb, dev);
+
+                               netif_receive_skb(skb);
+
+                               dev->last_rx = jiffies;
+                               tp->stats.rx_packets++;
+                               tp->stats.rx_bytes += pkt_len;
+                       }
+                       received++;
+
+                       entry = (++tp->cur_rx) % RX_RING_SIZE;
+                       if (tp->cur_rx - tp->dirty_rx > RX_RING_SIZE/4)
+                               tulip_refill_rx(dev);
+
+                }
+
+               /* New ack strategy... irq does not ack Rx any longer
+                  hopefully this helps */
+
+               /* Really bad things can happen here... If new packet arrives
+                * and an irq arrives (tx or just due to occasionally unset
+                * mask), it will be acked by irq handler, but new thread
+                * is not scheduled. It is major hole in design.
+                * No idea how to fix this if "playing with fire" will fail
+                * tomorrow (night 011029). If it will not fail, we won
+                * finally: amount of IO did not increase at all. */
+       } while ((inl(dev->base_addr + CSR5) & RxIntr));
+
+done:
+
+ #ifdef CONFIG_TULIP_NAPI_HW_MITIGATION
+
+          /* We use this simplistic scheme for IM. It's proven by
+             real life installations. We can have IM enabled
+            continuesly but this would cause unnecessary latency.
+            Unfortunely we can't use all the NET_RX_* feedback here.
+            This would turn on IM for devices that is not contributing
+            to backlog congestion with unnecessary latency.
+
+             We monitor the the device RX-ring and have:
+
+             HW Interrupt Mitigation either ON or OFF.
+
+            ON:  More then 1 pkt received (per intr.) OR we are dropping
+             OFF: Only 1 pkt received
+
+             Note. We only use min and max (0, 15) settings from mit_table */
+
+
+          if( tp->flags &  HAS_INTR_MITIGATION) {
+                 if( received > 1 ) {
+                         if( ! tp->mit_on ) {
+                                 tp->mit_on = 1;
+                                 outl(mit_table[MIT_TABLE], dev->base_addr + CSR11);
+                         }
+                  }
+                 else {
+                         if( tp->mit_on ) {
+                                 tp->mit_on = 0;
+                                 outl(0, dev->base_addr + CSR11);
+                         }
+                  }
+          }
+
+#endif /* CONFIG_TULIP_NAPI_HW_MITIGATION */
+
+         dev->quota -= received;
+         *budget -= received;
+
+         tulip_refill_rx(dev);
+
+         /* If RX ring is not full we are out of memory. */
+         if (tp->rx_buffers[tp->dirty_rx % RX_RING_SIZE].skb == NULL) goto oom;
+
+         /* Remove us from polling list and enable RX intr. */
+
+         netif_rx_complete(dev);
+         outl(tulip_tbl[tp->chip_id].valid_intrs, dev->base_addr+CSR7);
+
+         /* The last op happens after poll completion. Which means the following:
+          * 1. it can race with disabling irqs in irq handler
+          * 2. it can race with dise/enabling irqs in other poll threads
+          * 3. if an irq raised after beginning loop, it will be immediately
+          *    triggered here.
+          *
+          * Summarizing: the logic results in some redundant irqs both
+          * due to races in masking and due to too late acking of already
+          * processed irqs. But it must not result in losing events.
+          */
+
+         return 0;
+
+ not_done:
+         if (!received) {
+
+                 received = dev->quota; /* Not to happen */
+         }
+         dev->quota -= received;
+         *budget -= received;
+
+         if (tp->cur_rx - tp->dirty_rx > RX_RING_SIZE/2 ||
+             tp->rx_buffers[tp->dirty_rx % RX_RING_SIZE].skb == NULL)
+                 tulip_refill_rx(dev);
+
+         if (tp->rx_buffers[tp->dirty_rx % RX_RING_SIZE].skb == NULL) goto oom;
+
+         return 1;
+
+
+ oom:    /* Executed with RX ints disabled */
+
+
+         /* Start timer, stop polling, but do not enable rx interrupts. */
+         mod_timer(&tp->oom_timer, jiffies+1);
+
+         /* Think: timer_pending() was an explicit signature of bug.
+          * Timer can be pending now but fired and completed
+          * before we did netif_rx_complete(). See? We would lose it. */
+
+         /* remove ourselves from the polling list */
+         netif_rx_complete(dev);
+
+         return 0;
+}
+
+#else /* CONFIG_TULIP_NAPI */
+
+static int tulip_rx(struct net_device *dev)
+{
+	struct tulip_private *tp = (struct tulip_private *)dev->priv;
+	int entry = tp->cur_rx % RX_RING_SIZE;
+	int rx_work_limit = tp->dirty_rx + RX_RING_SIZE - tp->cur_rx;
+	int received = 0;
+
+	if (tulip_debug > 4)
+		printk(KERN_DEBUG " In tulip_rx(), entry %d %8.8x.\n", entry,
+			   tp->rx_ring[entry].status);
 	/* If we own the next entry, it is a new packet. Send it up. */
 	while ( ! (tp->rx_ring[entry].status & cpu_to_le32(DescOwned))) {
 		s32 status = le32_to_cpu(tp->rx_ring[entry].status);
@@ -163,11 +406,6 @@
 			}
 #endif
 
-#ifdef CONFIG_NET_HW_FLOWCONTROL
-                        drop = atomic_read(&netdev_dropping);
-                        if (drop)
-                                goto throttle;
-#endif
 			/* Check if the packet is long enough to accept without copying
 			   to a minimally-sized skbuff. */
 			if (pkt_len < tulip_rx_copybreak
@@ -209,44 +447,9 @@
 				tp->rx_buffers[entry].mapping = 0;
 			}
 			skb->protocol = eth_type_trans(skb, dev);
-#ifdef CONFIG_NET_HW_FLOWCONTROL
-                        mit_sel =
-#endif
-			netif_rx(skb);
 
-#ifdef CONFIG_NET_HW_FLOWCONTROL
-                        switch (mit_sel) {
-                        case NET_RX_SUCCESS:
-                        case NET_RX_CN_LOW:
-                        case NET_RX_CN_MOD:
-                                break;
-
-                        case NET_RX_CN_HIGH:
-                                rx_work_limit -= NET_RX_CN_HIGH; /* additional*/
-                                break;
-                        case NET_RX_DROP:
-                                rx_work_limit = -1;
-                                break;
-                        default:
-                                printk("unknown feedback return code %d\n", mit_sel);
-                                break;
-                        }
+			netif_rx(skb);
 
-                        drop = atomic_read(&netdev_dropping);
-                        if (drop) {
-throttle:
-                                rx_work_limit = -1;
-                                mit_sel = NET_RX_DROP;
-
-                                if (tp->fc_bit) {
-                                        long ioaddr = dev->base_addr;
-
-                                        /* disable Rx & RxNoBuf ints. */
-                                        outl(tulip_tbl[tp->chip_id].valid_intrs&RX_A_NBF_STOP, ioaddr + CSR7);
-                                        set_bit(tp->fc_bit, &netdev_fc_xoff);
-                                }
-                        }
-#endif
 			dev->last_rx = jiffies;
 			tp->stats.rx_packets++;
 			tp->stats.rx_bytes += pkt_len;
@@ -254,42 +457,9 @@
 		received++;
 		entry = (++tp->cur_rx) % RX_RING_SIZE;
 	}
-#ifdef CONFIG_NET_HW_FLOWCONTROL
-
-        /* We use this simplistic scheme for IM. It's proven by
-           real life installations. We can have IM enabled
-           continuesly but this would cause unnecessary latency.
-           Unfortunely we can't use all the NET_RX_* feedback here.
-           This would turn on IM for devices that is not contributing
-           to backlog congestion with unnecessary latency.
-
-           We monitor the device RX-ring and have:
-
-           HW Interrupt Mitigation either ON or OFF.
-
-           ON:  More then 1 pkt received (per intr.) OR we are dropping
-           OFF: Only 1 pkt received
-
-           Note. We only use min and max (0, 15) settings from mit_table */
-
-
-        if( tp->flags &  HAS_INTR_MITIGATION) {
-                if((received > 1 || mit_sel == NET_RX_DROP)
-                   && tp->mit_sel != 15 ) {
-                        tp->mit_sel = 15;
-                        tp->mit_change = 1; /* Force IM change */
-                }
-                if((received <= 1 && mit_sel != NET_RX_DROP) && tp->mit_sel != 0 ) {
-                        tp->mit_sel = 0;
-                        tp->mit_change = 1; /* Force IM change */
-                }
-        }
-
-        return RX_RING_SIZE+1; /* maxrx+1 */
-#else
 	return received;
-#endif
 }
+#endif  /* CONFIG_TULIP_NAPI */
 
 static inline unsigned int phy_interrupt (struct net_device *dev)
 {
@@ -323,7 +493,6 @@
 	struct tulip_private *tp = (struct tulip_private *)dev->priv;
 	long ioaddr = dev->base_addr;
 	int csr5;
-	int entry;
 	int missed;
 	int rx = 0;
 	int tx = 0;
@@ -331,6 +500,11 @@
 	int maxrx = RX_RING_SIZE;
 	int maxtx = TX_RING_SIZE;
 	int maxoi = TX_RING_SIZE;
+#ifdef CONFIG_TULIP_NAPI
+	int rxd = 0;
+#else
+	int entry;
+#endif
 	unsigned int work_count = tulip_max_interrupt_work;
 	unsigned int handled = 0;
 
@@ -346,22 +520,41 @@
 	tp->nir++;
 
 	do {
+
+#ifdef CONFIG_TULIP_NAPI
+
+		if (!rxd && (csr5 & (RxIntr | RxNoBuf))) {
+			rxd++;
+			/* Mask RX intrs and add the device to poll list. */
+			outl(tulip_tbl[tp->chip_id].valid_intrs&~RxPollInt, ioaddr + CSR7);
+			netif_rx_schedule(dev);
+
+			if (!(csr5&~(AbnormalIntr|NormalIntr|RxPollInt|TPLnkPass)))
+                               break;
+		}
+
+               /* Acknowledge the interrupt sources we handle here ASAP
+                  the poll function does Rx and RxNoBuf acking */
+
+		outl(csr5 & 0x0001ff3f, ioaddr + CSR5);
+
+#else
 		/* Acknowledge all of the current interrupt sources ASAP. */
 		outl(csr5 & 0x0001ffff, ioaddr + CSR5);
 
-		if (tulip_debug > 4)
-			printk(KERN_DEBUG "%s: interrupt  csr5=%#8.8x new csr5=%#8.8x.\n",
-				   dev->name, csr5, inl(dev->base_addr + CSR5));
 
 		if (csr5 & (RxIntr | RxNoBuf)) {
-#ifdef CONFIG_NET_HW_FLOWCONTROL
-                        if ((!tp->fc_bit) ||
-			    (!test_bit(tp->fc_bit, &netdev_fc_xoff)))
-#endif
 				rx += tulip_rx(dev);
 			tulip_refill_rx(dev);
 		}
 
+#endif /*  CONFIG_TULIP_NAPI */
+
+		if (tulip_debug > 4)
+			printk(KERN_DEBUG "%s: interrupt  csr5=%#8.8x new csr5=%#8.8x.\n",
+			       dev->name, csr5, inl(dev->base_addr + CSR5));
+
+
 		if (csr5 & (TxNoBuf | TxDied | TxIntr | TimerInt)) {
 			unsigned int dirty_tx;
 
@@ -462,15 +655,8 @@
 			}
 			if (csr5 & RxDied) {		/* Missed a Rx frame. */
                                 tp->stats.rx_missed_errors += inl(ioaddr + CSR8) & 0xffff;
-#ifdef CONFIG_NET_HW_FLOWCONTROL
-				if (tp->fc_bit && !test_bit(tp->fc_bit, &netdev_fc_xoff)) {
-					tp->stats.rx_errors++;
-					tulip_start_rxtx(tp);
-				}
-#else
 				tp->stats.rx_errors++;
 				tulip_start_rxtx(tp);
-#endif
 			}
 			/*
 			 * NB: t21142_lnk_change() does a del_timer_sync(), so be careful if this
@@ -504,10 +690,6 @@
 			if (tulip_debug > 2)
 				printk(KERN_ERR "%s: Re-enabling interrupts, %8.8x.\n",
 					   dev->name, csr5);
-#ifdef CONFIG_NET_HW_FLOWCONTROL
-                        if (tp->fc_bit && (test_bit(tp->fc_bit, &netdev_fc_xoff)))
-                          if (net_ratelimit()) printk("BUG!! enabling interrupt when FC off (timerintr.) \n");
-#endif
 			outl(tulip_tbl[tp->chip_id].valid_intrs, ioaddr + CSR7);
 			tp->ttimer = 0;
 			oi++;
@@ -520,16 +702,9 @@
                        /* Acknowledge all interrupt sources. */
                         outl(0x8001ffff, ioaddr + CSR5);
                         if (tp->flags & HAS_INTR_MITIGATION) {
-#ifdef CONFIG_NET_HW_FLOWCONTROL
-                                if(tp->mit_change) {
-                                        outl(mit_table[tp->mit_sel], ioaddr + CSR11);
-                                        tp->mit_change = 0;
-                                }
-#else
                      /* Josip Loncaric at ICASE did extensive experimentation
 			to develop a good interrupt mitigation setting.*/
                                 outl(0x8b240000, ioaddr + CSR11);
-#endif
                         } else if (tp->chip_id == LC82C168) {
 				/* the LC82C168 doesn't have a hw timer.*/
 				outl(0x00, ioaddr + CSR7);
@@ -537,10 +712,8 @@
 			} else {
                           /* Mask all interrupting sources, set timer to
 				re-enable. */
-#ifndef CONFIG_NET_HW_FLOWCONTROL
                                 outl(((~csr5) & 0x0001ebef) | AbnormalIntr | TimerInt, ioaddr + CSR7);
                                 outl(0x0012, ioaddr + CSR11);
-#endif
                         }
 			break;
 		}
@@ -550,6 +723,21 @@
 			break;
 
 		csr5 = inl(ioaddr + CSR5);
+
+#ifdef CONFIG_TULIP_NAPI
+		if (rxd)
+			csr5 &= ~RxPollInt;
+	} while ((csr5 & (TxNoBuf |
+			  TxDied |
+			  TxIntr |
+			  TimerInt |
+			  /* Abnormal intr. */
+			  RxDied |
+			  TxFIFOUnderflow |
+			  TxJabber |
+			  TPLnkFail |
+			  SytemError )) != 0);
+#else
 	} while ((csr5 & (NormalIntr|AbnormalIntr)) != 0);
 
 	tulip_refill_rx(dev);
@@ -574,6 +762,7 @@
 			}
 		}
 	}
+#endif /* CONFIG_TULIP_NAPI */
 
 	if ((missed = inl(ioaddr + CSR8) & 0x1ffff)) {
 		tp->stats.rx_dropped += missed & 0x10000 ? 0x10000 : missed;
--- diff/drivers/net/tulip/tulip.h	2003-06-09 14:18:19.000000000 +0100
+++ source/drivers/net/tulip/tulip.h	2003-12-29 09:30:41.000000000 +0000
@@ -126,6 +126,7 @@
 	CFDD_Snooze = (1 << 30),
 };
 
+#define RxPollInt (RxIntr|RxNoBuf|RxDied|RxJabber)
 
 /* The bits in the CSR5 status registers, mostly interrupt sources. */
 enum status_bits {
@@ -251,9 +252,9 @@
    Making the Tx ring too large decreases the effectiveness of channel
    bonding and packet priority.
    There are no ill effects from too-large receive rings. */
-#define TX_RING_SIZE	16
-#define RX_RING_SIZE	32
 
+#define TX_RING_SIZE	32
+#define RX_RING_SIZE	128
 #define MEDIA_MASK     31
 
 #define PKT_BUF_SZ		1536	/* Size of each temporary Rx buffer. */
@@ -343,17 +344,15 @@
 	int flags;
 	struct net_device_stats stats;
 	struct timer_list timer;	/* Media selection timer. */
+	struct timer_list oom_timer;    /* Out of memory timer. */
 	u32 mc_filter[2];
 	spinlock_t lock;
 	spinlock_t mii_lock;
 	unsigned int cur_rx, cur_tx;	/* The next free ring entry */
 	unsigned int dirty_rx, dirty_tx;	/* The ring entries to be free()ed. */
 
-#ifdef CONFIG_NET_HW_FLOWCONTROL
-#define RX_A_NBF_STOP 0xffffff3f /* To disable RX and RX-NOBUF ints. */
-        int fc_bit;
-        int mit_sel;
-        int mit_change; /* Signal for Interrupt Mitigtion */
+#ifdef 	CONFIG_TULIP_NAPI_HW_MITIGATION
+        int mit_on;
 #endif
 	unsigned int full_duplex:1;	/* Full-duplex operation requested. */
 	unsigned int full_duplex_lock:1;
@@ -415,6 +414,10 @@
 extern int tulip_rx_copybreak;
 irqreturn_t tulip_interrupt(int irq, void *dev_instance, struct pt_regs *regs);
 int tulip_refill_rx(struct net_device *dev);
+#ifdef CONFIG_TULIP_NAPI
+int tulip_poll(struct net_device *dev, int *budget);
+#endif
+
 
 /* media.c */
 int tulip_mdio_read(struct net_device *dev, int phy_id, int location);
@@ -438,6 +441,7 @@
 extern const char * const medianame[];
 extern const char tulip_media_cap[];
 extern struct tulip_chip_table tulip_tbl[];
+void oom_timer(unsigned long data);
 extern u8 t21040_csr13[];
 
 #ifndef USE_IO_OPS
--- diff/drivers/net/tulip/tulip_core.c	2003-11-25 15:24:58.000000000 +0000
+++ source/drivers/net/tulip/tulip_core.c	2003-12-29 09:30:41.000000000 +0000
@@ -14,11 +14,17 @@
 
 */
 
+#include <linux/config.h>
+
 #define DRV_NAME	"tulip"
+#ifdef CONFIG_TULIP_NAPI
+#define DRV_VERSION    "1.1.13-NAPI" /* Keep at least for test */
+#else
 #define DRV_VERSION	"1.1.13"
+#endif
 #define DRV_RELDATE	"May 11, 2002"
 
-#include <linux/config.h>
+
 #include <linux/module.h>
 #include "tulip.h"
 #include <linux/pci.h>
@@ -247,6 +253,9 @@
 static struct net_device_stats *tulip_get_stats(struct net_device *dev);
 static int private_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
 static void set_rx_mode(struct net_device *dev);
+#ifdef CONFIG_NET_POLL_CONTROLLER
+static void poll_tulip(struct net_device *dev);
+#endif
 
 
 
@@ -466,29 +475,16 @@
 	   to an alternate media type. */
 	tp->timer.expires = RUN_AT(next_tick);
 	add_timer(&tp->timer);
-}
-
-#ifdef CONFIG_NET_HW_FLOWCONTROL
-/* Enable receiver */
-void tulip_xon(struct net_device *dev)
-{
-        struct tulip_private *tp = (struct tulip_private *)dev->priv;
-
-        clear_bit(tp->fc_bit, &netdev_fc_xoff);
-        if (netif_running(dev)){
-
-                tulip_refill_rx(dev);
-                outl(tulip_tbl[tp->chip_id].valid_intrs,  dev->base_addr+CSR7);
-        }
-}
+#ifdef CONFIG_TULIP_NAPI
+	init_timer(&tp->oom_timer);
+        tp->oom_timer.data = (unsigned long)dev;
+        tp->oom_timer.function = oom_timer;
 #endif
+}
 
 static int
 tulip_open(struct net_device *dev)
 {
-#ifdef CONFIG_NET_HW_FLOWCONTROL
-        struct tulip_private *tp = (struct tulip_private *)dev->priv;
-#endif
 	int retval;
 
 	if ((retval = request_irq(dev->irq, &tulip_interrupt, SA_SHIRQ, dev->name, dev)))
@@ -498,10 +494,6 @@
 
 	tulip_up (dev);
 
-#ifdef CONFIG_NET_HW_FLOWCONTROL
-        tp->fc_bit = netdev_register_fc(dev, tulip_xon);
-#endif
-
 	netif_start_queue (dev);
 
 	return 0;
@@ -582,10 +574,7 @@
 #endif
 
 	/* Stop and restart the chip's Tx processes . */
-#ifdef CONFIG_NET_HW_FLOWCONTROL
-        if (tp->fc_bit && test_bit(tp->fc_bit,&netdev_fc_xoff))
-                printk("BUG tx_timeout restarting rx when fc on\n");
-#endif
+
 	tulip_restart_rxtx(tp);
 	/* Trigger an immediate transmit demand. */
 	outl(0, ioaddr + CSR1);
@@ -742,7 +731,9 @@
 	unsigned long flags;
 
 	del_timer_sync (&tp->timer);
-
+#ifdef CONFIG_TULIP_NAPI
+	del_timer_sync (&tp->oom_timer);
+#endif
 	spin_lock_irqsave (&tp->lock, flags);
 
 	/* Disable interrupts by clearing the interrupt mask. */
@@ -781,13 +772,6 @@
 
 	netif_stop_queue (dev);
 
-#ifdef CONFIG_NET_HW_FLOWCONTROL
-        if (tp->fc_bit) {
-                int bit = tp->fc_bit;
-                tp->fc_bit = 0;
-                netdev_unregister_fc(bit);
-        }
-#endif
 	tulip_down (dev);
 
 	if (tulip_debug > 1)
@@ -1629,10 +1613,17 @@
 	dev->hard_start_xmit = tulip_start_xmit;
 	dev->tx_timeout = tulip_tx_timeout;
 	dev->watchdog_timeo = TX_TIMEOUT;
+#ifdef CONFIG_TULIP_NAPI
+	dev->poll = tulip_poll;
+	dev->weight = 16;
+#endif
 	dev->stop = tulip_close;
 	dev->get_stats = tulip_get_stats;
 	dev->do_ioctl = private_ioctl;
 	dev->set_multicast_list = set_rx_mode;
+#ifdef CONFIG_NET_POLL_CONTROLLER
+	dev->poll_controller = &poll_tulip;
+#endif
 
 	if (register_netdev(dev))
 		goto err_out_free_ring;
@@ -1790,6 +1781,24 @@
 }
 
 
+#ifdef CONFIG_NET_POLL_CONTROLLER
+
+/*
+ * Polling 'interrupt' - used by things like netconsole to send skbs
+ * without having to re-enable interrupts. It's not called while
+ * the interrupt routine is executing.
+ */
+
+static void poll_tulip (struct net_device *dev)
+{
+       disable_irq(dev->irq);
+       tulip_interrupt (dev->irq, dev, NULL);
+       enable_irq(dev->irq);
+}
+
+#endif
+
+
 static struct pci_driver tulip_driver = {
 	.name		= DRV_NAME,
 	.id_table	= tulip_pci_tbl,
--- diff/drivers/net/wan/cycx_drv.c	2003-09-17 12:28:08.000000000 +0100
+++ source/drivers/net/wan/cycx_drv.c	2003-12-29 09:30:41.000000000 +0000
@@ -425,8 +425,8 @@
 	if (cksum != cfm->checksum) {
 		printk(KERN_ERR "%s:%s: firmware corrupted!\n",
 				modname, __FUNCTION__);
-		printk(KERN_ERR " cdsize = 0x%lx (expected 0x%lx)\n",
-				len - sizeof(struct cycx_firmware) - 1,
+		printk(KERN_ERR " cdsize = 0x%x (expected 0x%x)\n",
+				len - (int)sizeof(struct cycx_firmware) - 1,
 				cfm->info.codesize);
 		printk(KERN_ERR " chksum = 0x%x (expected 0x%x)\n",
 				cksum, cfm->checksum);
--- diff/drivers/pci/Makefile	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/pci/Makefile	2003-12-29 09:30:41.000000000 +0000
@@ -27,6 +27,7 @@
 obj-$(CONFIG_SGI_IP27) += setup-irq.o
 obj-$(CONFIG_SGI_IP32) += setup-irq.o
 obj-$(CONFIG_X86_VISWS) += setup-irq.o
+obj-$(CONFIG_PCI_USE_VECTOR) += msi.o
 
 # Cardbus & CompactPCI use setup-bus
 obj-$(CONFIG_HOTPLUG) += setup-bus.o
--- diff/drivers/pci/pci.c	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/pci/pci.c	2003-12-29 09:30:41.000000000 +0000
@@ -223,6 +223,8 @@
 	int pm;
 	u16 pmcsr;
 
+	might_sleep();
+
 	/* bound the state we're entering */
 	if (state > 3) state = 3;
 
--- diff/drivers/pci/probe.c	2003-10-09 09:47:16.000000000 +0100
+++ source/drivers/pci/probe.c	2003-12-29 09:30:41.000000000 +0000
@@ -176,7 +176,7 @@
 		limit |= (io_limit_hi << 16);
 	}
 
-	if (base && base <= limit) {
+	if (base <= limit) {
 		res->flags = (io_base_lo & PCI_IO_RANGE_TYPE_MASK) | IORESOURCE_IO;
 		res->start = base;
 		res->end = limit + 0xfff;
@@ -187,7 +187,7 @@
 	pci_read_config_word(dev, PCI_MEMORY_LIMIT, &mem_limit_lo);
 	base = (mem_base_lo & PCI_MEMORY_RANGE_MASK) << 16;
 	limit = (mem_limit_lo & PCI_MEMORY_RANGE_MASK) << 16;
-	if (base && base <= limit) {
+	if (base <= limit) {
 		res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM;
 		res->start = base;
 		res->end = limit + 0xfffff;
@@ -213,7 +213,7 @@
 		}
 #endif
 	}
-	if (base && base <= limit) {
+	if (base <= limit) {
 		res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM | IORESOURCE_PREFETCH;
 		res->start = base;
 		res->end = limit + 0xfffff;
@@ -552,6 +552,7 @@
 		struct pci_dev *dev;
 
 		dev = pci_scan_device(bus, devfn);
+		pci_scan_msi_device(dev);
 		if (func == 0) {
 			if (!dev)
 				break;
--- diff/drivers/pci/proc.c	2003-08-20 14:16:31.000000000 +0100
+++ source/drivers/pci/proc.c	2003-12-29 09:30:41.000000000 +0000
@@ -25,7 +25,7 @@
 {
 	loff_t new = -1;
 
-	lock_kernel();
+	down(&file->f_dentry->d_inode->i_sem);
 	switch (whence) {
 	case 0:
 		new = off;
@@ -37,10 +37,12 @@
 		new = PCI_CFG_SPACE_SIZE + off;
 		break;
 	}
-	unlock_kernel();
 	if (new < 0 || new > PCI_CFG_SPACE_SIZE)
-		return -EINVAL;
-	return (file->f_pos = new);
+		new = -EINVAL;
+	else
+		file->f_pos = new;
+	up(&file->f_dentry->d_inode->i_sem);
+	return new;
 }
 
 static ssize_t
--- diff/drivers/pci/remove.c	2003-08-20 14:16:15.000000000 +0100
+++ source/drivers/pci/remove.c	2003-12-29 09:30:41.000000000 +0000
@@ -14,6 +14,8 @@
 {
 	int i;
 
+ 	msi_remove_pci_irq_vectors(dev);
+
 	for (i = 0; i < PCI_NUM_RESOURCES; i++) {
 		struct resource *res = dev->resource + i;
 		if (res->parent)
--- diff/drivers/pcmcia/cistpl.c	2003-09-17 12:28:09.000000000 +0100
+++ source/drivers/pcmcia/cistpl.c	2003-12-29 09:30:41.000000000 +0000
@@ -341,8 +341,11 @@
 int verify_cis_cache(struct pcmcia_socket *s)
 {
 	struct cis_cache_entry *cis;
-	char buf[256];
+	char *buf;
 
+	buf = kmalloc(256, GFP_KERNEL);
+	if (buf == NULL)
+		return -1;
 	list_for_each_entry(cis, &s->cis_cache, node) {
 		int len = cis->len;
 
@@ -355,9 +358,12 @@
 #endif
 			read_cis_mem(s, cis->attr, cis->addr, len, buf);
 
-		if (memcmp(buf, cis->cache, len) != 0)
+		if (memcmp(buf, cis->cache, len) != 0) {
+			kfree(buf);
 			return -1;
+		}
 	}
+	kfree(buf);
 	return 0;
 }
 
@@ -1404,19 +1410,24 @@
 int read_tuple(client_handle_t handle, cisdata_t code, void *parse)
 {
     tuple_t tuple;
-    cisdata_t buf[255];
+    cisdata_t *buf;
     int ret;
-    
+
+    buf = kmalloc(256, GFP_KERNEL);
+    if (buf == NULL)
+	return CS_OUT_OF_RESOURCE;
     tuple.DesiredTuple = code;
     tuple.Attributes = TUPLE_RETURN_COMMON;
     ret = pcmcia_get_first_tuple(handle, &tuple);
-    if (ret != CS_SUCCESS) return ret;
+    if (ret != CS_SUCCESS) goto done;
     tuple.TupleData = buf;
     tuple.TupleOffset = 0;
-    tuple.TupleDataMax = sizeof(buf);
+    tuple.TupleDataMax = 255;
     ret = pcmcia_get_tuple_data(handle, &tuple);
-    if (ret != CS_SUCCESS) return ret;
+    if (ret != CS_SUCCESS) goto done;
     ret = pcmcia_parse_tuple(handle, &tuple, parse);
+done:
+    kfree(buf);
     return ret;
 }
 
@@ -1432,50 +1443,61 @@
 
 int pcmcia_validate_cis(client_handle_t handle, cisinfo_t *info)
 {
-    tuple_t tuple;
-    cisparse_t p;
+    tuple_t *tuple;
+    cisparse_t *p;
     int ret, reserved, dev_ok = 0, ident_ok = 0;
 
     if (CHECK_HANDLE(handle))
 	return CS_BAD_HANDLE;
+    tuple = kmalloc(sizeof(*tuple), GFP_KERNEL);
+    if (tuple == NULL)
+	return CS_OUT_OF_RESOURCE;
+    p = kmalloc(sizeof(*p), GFP_KERNEL);
+    if (p == NULL) {
+	kfree(tuple);
+	return CS_OUT_OF_RESOURCE;
+    }
 
     info->Chains = reserved = 0;
-    tuple.DesiredTuple = RETURN_FIRST_TUPLE;
-    tuple.Attributes = TUPLE_RETURN_COMMON;
-    ret = pcmcia_get_first_tuple(handle, &tuple);
+    tuple->DesiredTuple = RETURN_FIRST_TUPLE;
+    tuple->Attributes = TUPLE_RETURN_COMMON;
+    ret = pcmcia_get_first_tuple(handle, tuple);
     if (ret != CS_SUCCESS)
-	return CS_SUCCESS;
+	goto done;
 
     /* First tuple should be DEVICE; we should really have either that
        or a CFTABLE_ENTRY of some sort */
-    if ((tuple.TupleCode == CISTPL_DEVICE) ||
-	(read_tuple(handle, CISTPL_CFTABLE_ENTRY, &p) == CS_SUCCESS) ||
-	(read_tuple(handle, CISTPL_CFTABLE_ENTRY_CB, &p) == CS_SUCCESS))
+    if ((tuple->TupleCode == CISTPL_DEVICE) ||
+	(read_tuple(handle, CISTPL_CFTABLE_ENTRY, p) == CS_SUCCESS) ||
+	(read_tuple(handle, CISTPL_CFTABLE_ENTRY_CB, p) == CS_SUCCESS))
 	dev_ok++;
 
     /* All cards should have a MANFID tuple, and/or a VERS_1 or VERS_2
        tuple, for card identification.  Certain old D-Link and Linksys
        cards have only a broken VERS_2 tuple; hence the bogus test. */
-    if ((read_tuple(handle, CISTPL_MANFID, &p) == CS_SUCCESS) ||
-	(read_tuple(handle, CISTPL_VERS_1, &p) == CS_SUCCESS) ||
-	(read_tuple(handle, CISTPL_VERS_2, &p) != CS_NO_MORE_ITEMS))
+    if ((read_tuple(handle, CISTPL_MANFID, p) == CS_SUCCESS) ||
+	(read_tuple(handle, CISTPL_VERS_1, p) == CS_SUCCESS) ||
+	(read_tuple(handle, CISTPL_VERS_2, p) != CS_NO_MORE_ITEMS))
 	ident_ok++;
 
     if (!dev_ok && !ident_ok)
-	return CS_SUCCESS;
+	goto done;
 
     for (info->Chains = 1; info->Chains < MAX_TUPLES; info->Chains++) {
-	ret = pcmcia_get_next_tuple(handle, &tuple);
+	ret = pcmcia_get_next_tuple(handle, tuple);
 	if (ret != CS_SUCCESS) break;
-	if (((tuple.TupleCode > 0x23) && (tuple.TupleCode < 0x40)) ||
-	    ((tuple.TupleCode > 0x47) && (tuple.TupleCode < 0x80)) ||
-	    ((tuple.TupleCode > 0x90) && (tuple.TupleCode < 0xff)))
+	if (((tuple->TupleCode > 0x23) && (tuple->TupleCode < 0x40)) ||
+	    ((tuple->TupleCode > 0x47) && (tuple->TupleCode < 0x80)) ||
+	    ((tuple->TupleCode > 0x90) && (tuple->TupleCode < 0xff)))
 	    reserved++;
     }
     if ((info->Chains == MAX_TUPLES) || (reserved > 5) ||
 	((!dev_ok || !ident_ok) && (info->Chains > 10)))
 	info->Chains = 0;
 
+done:
+    kfree(tuple);
+    kfree(p);
     return CS_SUCCESS;
 }
 
--- diff/drivers/pcmcia/cs.c	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/pcmcia/cs.c	2003-12-29 09:30:41.000000000 +0000
@@ -1916,7 +1916,7 @@
 {
     struct pcmcia_socket *s;
     config_t *c;
-    int ret = 0, irq = 0;
+    int ret = CS_IN_USE, irq = 0;
     
     if (CHECK_HANDLE(handle))
 	return CS_BAD_HANDLE;
@@ -1928,13 +1928,9 @@
 	return CS_CONFIGURATION_LOCKED;
     if (c->state & CONFIG_IRQ_REQ)
 	return CS_IN_USE;
-    
-    /* Short cut: if there are no ISA interrupts, then it is PCI */
-    if (!s->irq_mask) {
-	irq = s->pci_irq;
-	ret = (irq) ? 0 : CS_IN_USE;
+
 #ifdef CONFIG_PCMCIA_PROBE
-    } else if (s->irq.AssignedIRQ != 0) {
+    if (s->irq.AssignedIRQ != 0) {
 	/* If the interrupt is already assigned, it must match */
 	irq = s->irq.AssignedIRQ;
 	if (req->IRQInfo1 & IRQ_INFO2_VALID) {
@@ -1943,7 +1939,6 @@
 	} else
 	    ret = ((req->IRQInfo1&IRQ_MASK) == irq) ? 0 : CS_BAD_ARGS;
     } else {
-	ret = CS_IN_USE;
 	if (req->IRQInfo1 & IRQ_INFO2_VALID) {
 	    u_int try, mask = req->IRQInfo2 & s->irq_mask;
 	    for (try = 0; try < 2; try++) {
@@ -1958,12 +1953,13 @@
 	    irq = req->IRQInfo1 & IRQ_MASK;
 	    ret = try_irq(req->Attributes, irq, 1);
 	}
-#else
-    } else {
-	ret = CS_UNSUPPORTED_MODE;
+    }
 #endif
+    if (ret != 0) {
+	if (!s->pci_irq)
+	    return ret;
+	irq = s->pci_irq;
     }
-    if (ret != 0) return ret;
 
     if (req->Attributes & IRQ_HANDLE_PRESENT) {
 	if (request_irq(irq, req->Handler,
--- diff/drivers/pcmcia/i82365.c	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/pcmcia/i82365.c	2003-12-29 09:30:41.000000000 +0000
@@ -42,7 +42,6 @@
 #include <linux/timer.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
-#include <linux/pci.h>
 #include <linux/ioport.h>
 #include <linux/delay.h>
 #include <linux/workqueue.h>
@@ -188,10 +187,6 @@
 
 /*====================================================================*/
 
-/* Default settings for PCI command configuration register */
-#define CMD_DFLT (PCI_COMMAND_IO|PCI_COMMAND_MEMORY| \
-		  PCI_COMMAND_MASTER|PCI_COMMAND_WAIT)
-
 /* These definitions must match the pcic table! */
 typedef enum pcic_id {
     IS_I82365A, IS_I82365B, IS_I82365DF,
@@ -202,15 +197,10 @@
 /* Flags for classifying groups of controllers */
 #define IS_VADEM	0x0001
 #define IS_CIRRUS	0x0002
-#define IS_TI		0x0004
-#define IS_O2MICRO	0x0008
 #define IS_VIA		0x0010
-#define IS_TOPIC	0x0020
-#define IS_RICOH	0x0040
 #define IS_UNKNOWN	0x0400
 #define IS_VG_PWR	0x0800
 #define IS_DF_PWR	0x1000
-#define IS_PCI		0x2000
 #define IS_ALIVE	0x8000
 
 typedef struct pcic_t {
@@ -351,26 +341,24 @@
     if (has_ring == -1) has_ring = 1;
     flip(p->misc2, PD67_MC2_IRQ15_RI, has_ring);
     flip(p->misc2, PD67_MC2_DYNAMIC_MODE, dynamic_mode);
+    flip(p->misc2, PD67_MC2_FREQ_BYPASS, freq_bypass);
     if (p->misc2 & PD67_MC2_IRQ15_RI)
 	strcat(buf, " [ring]");
     if (p->misc2 & PD67_MC2_DYNAMIC_MODE)
 	strcat(buf, " [dyn mode]");
+    if (p->misc2 & PD67_MC2_FREQ_BYPASS)
+	strcat(buf, " [freq bypass]");
     if (p->misc1 & PD67_MC1_INPACK_ENA)
 	strcat(buf, " [inpack]");
-    if (!(t->flags & IS_PCI)) {
-	if (p->misc2 & PD67_MC2_IRQ15_RI)
-	    mask &= ~0x8000;
-	if (has_led > 0) {
-	    strcat(buf, " [led]");
-	    mask &= ~0x1000;
-	}
-	if (has_dma > 0) {
-	    strcat(buf, " [dma]");
-	    mask &= ~0x0600;
-	flip(p->misc2, PD67_MC2_FREQ_BYPASS, freq_bypass);
-	if (p->misc2 & PD67_MC2_FREQ_BYPASS)
-	    strcat(buf, " [freq bypass]");
-	}
+    if (p->misc2 & PD67_MC2_IRQ15_RI)
+	mask &= ~0x8000;
+    if (has_led > 0) {
+	strcat(buf, " [led]");
+	mask &= ~0x1000;
+    }
+    if (has_dma > 0) {
+	strcat(buf, " [dma]");
+	mask &= ~0x0600;
     }
     if (!(t->flags & IS_VIA)) {
 	if (setup_time >= 0)
@@ -540,7 +528,6 @@
     return (irq_hits != 1);
 }
 
-
 static u_int __init isa_scan(u_short sock, u_int mask0)
 {
     u_int mask1 = 0;
@@ -585,7 +572,6 @@
     return mask1;
 }
 
-
 /*====================================================================*/
 
 /* Time conversion functions */
@@ -597,7 +583,6 @@
 
 /*====================================================================*/
 
-
 static int __init identify(u_short port, u_short sock)
 {
     u_char val;
@@ -700,7 +685,7 @@
 static void __init add_pcic(int ns, int type)
 {
     u_int mask = 0, i, base;
-    int use_pci = 0, isa_irq = 0;
+    int isa_irq = 0;
     struct i82365_socket *t = &socket[sockets-ns];
 
     base = sockets-ns;
@@ -721,17 +706,16 @@
     mask &= I365_MASK & set_bridge_opts(base, ns);
     /* Scan for ISA interrupts */
     mask = isa_scan(base, mask);
-    printk(KERN_INFO "    PCI card interrupts,");
         
     /* Poll if only two interrupts available */
-    if (!use_pci && !poll_interval) {
+    if (!poll_interval) {
 	u_int tmp = (mask & 0xff20);
 	tmp = tmp & (tmp-1);
 	if ((tmp & (tmp-1)) == 0)
 	    poll_interval = HZ;
     }
     /* Only try an ISA cs_irq if this is the first controller */
-    if (!use_pci && !grab_irq && (cs_irq || !poll_interval)) {
+    if (!grab_irq && (cs_irq || !poll_interval)) {
 	/* Avoid irq 12 unless it is explicitly requested */
 	u_int cs_mask = mask & ((cs_irq) ? (1<<cs_irq) : ~(1<<12));
 	for (cs_irq = 15; cs_irq > 0; cs_irq--)
@@ -745,7 +729,7 @@
 	}
     }
     
-    if (!use_pci && !isa_irq) {
+    if (!isa_irq) {
 	if (poll_interval == 0)
 	    poll_interval = HZ;
 	printk(" polling interval = %d ms\n",
@@ -763,10 +747,8 @@
 
 } /* add_pcic */
 
-
 /*====================================================================*/
 
-
 #ifdef CONFIG_PNP
 static struct isapnp_device_id id_table[] __initdata = {
 	{ 	ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('P', 'N', 'P'),
@@ -832,7 +814,9 @@
 	    }
 	}
     } else {
-	for (i = 0; i < (extra_sockets ? 8 : 4); i += 2) {
+	for (i = 0; i < 8; i += 2) {
+	    if (sockets && !extra_sockets && (i == 4))
+		break;
 	    port = i365_base + 2*(i>>2);
 	    sock = (i & 3);
 	    id = identify(port, sock);
@@ -856,7 +840,6 @@
     }
 }
 
-
 /*====================================================================*/
 
 static irqreturn_t pcic_interrupt(int irq, void *dev,
@@ -872,8 +855,7 @@
     for (j = 0; j < 20; j++) {
 	active = 0;
 	for (i = 0; i < sockets; i++) {
-	    if ((socket[i].cs_irq != irq) &&
-		(socket[i].socket.pci_irq != irq))
+	    if (socket[i].cs_irq != irq)
 		continue;
 	    handled = 1;
 	    ISA_LOCK(i, flags);
@@ -911,7 +893,6 @@
 static void pcic_interrupt_wrapper(u_long data)
 {
     pcic_interrupt(0, NULL, NULL);
-    init_timer(&poll_timer);
     poll_timer.expires = jiffies + poll_interval;
     add_timer(&poll_timer);
 }
@@ -1039,7 +1020,7 @@
     
     /* IO card, RESET flag, IO interrupt */
     reg = t->intr;
-    if (state->io_irq != t->socket.pci_irq) reg |= state->io_irq;
+    reg |= state->io_irq;
     reg |= (state->flags & SS_RESET) ? 0 : I365_PC_RESET;
     reg |= (state->flags & SS_IOCARD) ? I365_PC_IOCARD : 0;
     i365_set(sock, I365_INTCTL, reg);
@@ -1177,8 +1158,7 @@
     if ((map > 4) || (mem->card_start > 0x3ffffff) ||
 	(mem->sys_start > mem->sys_stop) || (mem->speed > 1000))
 	return -EINVAL;
-    if (!(socket[sock].flags & IS_PCI) &&
-	((mem->sys_start > 0xffffff) || (mem->sys_stop > 0xffffff)))
+    if ((mem->sys_start > 0xffffff) || (mem->sys_stop > 0xffffff))
 	return -EINVAL;
 	
     /* Turn off the window before changing anything */
@@ -1211,6 +1191,7 @@
     return 0;
 } /* i365_set_mem_map */
 
+#if 0 /* driver model ordering issue */
 /*======================================================================
 
     Routines for accessing socket information and register dumps via
@@ -1250,6 +1231,7 @@
 
 static CLASS_DEVICE_ATTR(exca, S_IRUGO, show_exca, NULL);
 static CLASS_DEVICE_ATTR(info, S_IRUGO, show_info, NULL);
+#endif
 
 /*====================================================================*/
 
@@ -1385,7 +1367,7 @@
     if (driver_register(&i82365_driver))
 	return -1;
 
-    printk(KERN_INFO "Intel PCIC probe: ");
+    printk(KERN_INFO "Intel ISA PCIC probe: ");
     sockets = 0;
 
     isa_probe();
@@ -1414,10 +1396,12 @@
 			    pcmcia_unregister_socket(&socket[i].socket);
 		    break;
 	    }
+#if 0 /* driver model ordering issue */
 	   class_device_create_file(&socket[i].socket.dev,
 			   	    &class_device_attr_info);
 	   class_device_create_file(&socket[i].socket.dev,
 			   	    &class_device_attr_exca);
+#endif
     }
 
     /* Finally, schedule a polling interrupt */
--- diff/drivers/pcmcia/yenta_socket.c	2003-11-25 15:24:58.000000000 +0000
+++ source/drivers/pcmcia/yenta_socket.c	2003-12-29 09:30:41.000000000 +0000
@@ -30,7 +30,7 @@
 
 
 #if 0
-#define DEBUG(x,args...)	printk("%s: " x, __FUNCTION__, ##args)
+#define DEBUG(x,args...)	printk(KERN_DEBUG "%s: " x, __FUNCTION__, ##args)
 #else
 #define DEBUG(x,args...)
 #endif
@@ -779,7 +779,7 @@
 	socket->socket.irq_mask = yenta_probe_irq(socket, isa_irq_mask);
 	socket->socket.cb_dev = socket->dev;
 
-	printk(KERN_INFO "Yenta: ISA IRQ list %04x, PCI irq%d\n",
+	printk(KERN_INFO "Yenta: ISA IRQ mask 0x%04x, PCI irq %d\n",
 	       socket->socket.irq_mask, socket->cb_irq);
 }
 
@@ -860,7 +860,7 @@
 		goto disable;
 
 	if (!pci_resource_start(dev, 0)) {
-		printk("No cardbus resource!\n");
+		printk(KERN_ERR "No cardbus resource!\n");
 		ret = -ENODEV;
 		goto release;
 	}
@@ -916,7 +916,7 @@
 
 	/* Figure out what the dang thing can do for the PCMCIA layer... */
 	yenta_get_socket_capabilities(socket, isa_interrupts);
-	printk("Socket status: %08x\n", cb_readl(socket, CB_SOCKET_STATE));
+	printk(KERN_INFO "Socket status: %08x\n", cb_readl(socket, CB_SOCKET_STATE));
 
 	/* Register it with the pcmcia layer.. */
 	ret = pcmcia_register_socket(&socket->socket);
--- diff/drivers/pnp/Kconfig	2003-08-20 14:16:31.000000000 +0100
+++ source/drivers/pnp/Kconfig	2003-12-29 09:30:41.000000000 +0000
@@ -30,33 +30,9 @@
 comment "Protocols"
 	depends on PNP
 
-config ISAPNP
-	bool "ISA Plug and Play support (EXPERIMENTAL)"
-	depends on PNP && EXPERIMENTAL
-	help
-	  Say Y here if you would like support for ISA Plug and Play devices.
-	  Some information is in <file:Documentation/isapnp.txt>.
+source "drivers/pnp/isapnp/Kconfig"
 
-	  If unsure, say Y.
-
-config PNPBIOS
-	bool "Plug and Play BIOS support (EXPERIMENTAL)"
-	depends on PNP && EXPERIMENTAL
-	---help---
-	  Linux uses the PNPBIOS as defined in "Plug and Play BIOS
-	  Specification Version 1.0A May 5, 1994" to autodetect built-in
-	  mainboard resources (e.g. parallel port resources).
-
-	  Some features (e.g. event notification, docking station information,
-	  ISAPNP services) are not used.
-
-	  Note: ACPI is expected to supersede PNPBIOS some day, currently it
-	  co-exists nicely.
-
-	  See latest pcmcia-cs (stand-alone package) for a nice "lspnp" tools,
-	  or have a look at /proc/bus/pnp.
-
-	  If unsure, say Y.
+source "drivers/pnp/pnpbios/Kconfig"
 
 endmenu
 
--- diff/drivers/pnp/isapnp/core.c	2003-09-30 15:46:16.000000000 +0100
+++ source/drivers/pnp/isapnp/core.c	2003-12-29 09:30:41.000000000 +0000
@@ -890,11 +890,9 @@
 			header[4], header[5], header[6], header[7], header[8]);
 		printk(KERN_DEBUG "checksum = 0x%x\n", checksum);
 #endif
-		/* Don't be strict on the checksum, here !
-                   e.g. 'SCM SwapBox Plug and Play' has header[8]==0 (should be: b7)*/
-		if (header[8] == 0)
-			;
-		else if (checksum == 0x00 || checksum != header[8])	/* not valid CSN */
+		/* Per Section 6.1 of the Plug and Play ISA Specification (Version 1.0a), */
+		/* Bit[7] of Vendor ID Byte 0 must be 0 */
+		if (header[0] & 0x80)	/* not valid CSN */
 			continue;
 		if ((card = isapnp_alloc(sizeof(struct pnp_card))) == NULL)
 			continue;
--- diff/drivers/pnp/pnpbios/Makefile	2003-08-20 14:16:31.000000000 +0100
+++ source/drivers/pnp/pnpbios/Makefile	2003-12-29 09:30:41.000000000 +0000
@@ -2,6 +2,6 @@
 # Makefile for the kernel PNPBIOS driver.
 #
 
-pnpbios-proc-$(CONFIG_PROC_FS) = proc.o
+pnpbios-proc-$(CONFIG_PNPBIOS_PROC_FS) = proc.o
 
 obj-y := core.o bioscalls.o rsparser.o $(pnpbios-proc-y)
--- diff/drivers/pnp/pnpbios/core.c	2003-09-30 15:46:16.000000000 +0100
+++ source/drivers/pnp/pnpbios/core.c	2003-12-29 09:30:41.000000000 +0000
@@ -353,16 +353,8 @@
 
 	for(nodenum=0; nodenum<0xff; ) {
 		u8 thisnodenum = nodenum;
-		/* eventually we will want to use PNPMODE_STATIC here but for now
-		 * dynamic will help us catch buggy bioses to add to the blacklist.
-		 */
-		if (!pnpbios_dont_use_current_config) {
-			if (pnp_bios_get_dev_node(&nodenum, (char )PNPMODE_DYNAMIC, node))
-				break;
-		} else {
-			if (pnp_bios_get_dev_node(&nodenum, (char )PNPMODE_STATIC, node))
-				break;
-		}
+		if (pnp_bios_get_dev_node(&nodenum, (char )PNPMODE_STATIC, node))
+			break;
 		nodes_got++;
 		dev =  pnpbios_kmalloc(sizeof (struct pnp_dev), GFP_KERNEL);
 		if (!dev)
--- diff/drivers/pnp/pnpbios/pnpbios.h	2003-09-30 15:46:16.000000000 +0100
+++ source/drivers/pnp/pnpbios/pnpbios.h	2003-12-29 09:30:41.000000000 +0000
@@ -36,7 +36,7 @@
 extern void pnpbios_print_status(const char * module, u16 status);
 extern void pnpbios_calls_init(union pnp_bios_install_struct * header);
 
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_PNPBIOS_PROC_FS
 extern int pnpbios_interface_attach_device(struct pnp_bios_node * node);
 extern int pnpbios_proc_init (void);
 extern void pnpbios_proc_exit (void);
@@ -44,4 +44,4 @@
 static inline int pnpbios_interface_attach_device(struct pnp_bios_node * node) { return 0; }
 static inline int pnpbios_proc_init (void) { return 0; }
 static inline void pnpbios_proc_exit (void) { ; }
-#endif /* CONFIG_PROC */
+#endif /* CONFIG_PNPBIOS_PROC_FS */
--- diff/drivers/s390/block/dasd.c	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/s390/block/dasd.c	2003-12-29 09:30:41.000000000 +0000
@@ -1643,9 +1643,9 @@
 }
 
 static int
-dasd_open(struct inode *inp, struct file *filp)
+dasd_open(struct block_device *bdev, struct file *filp)
 {
-	struct gendisk *disk = inp->i_bdev->bd_disk;
+	struct gendisk *disk = bdev->bd_disk;
 	struct dasd_device *device = disk->private_data;
 	int rc;
 
@@ -1676,10 +1676,8 @@
 	return rc;
 }
 
-static int
-dasd_release(struct inode *inp, struct file *filp)
+static int dasd_release(struct gendisk *disk)
 {
-	struct gendisk *disk = inp->i_bdev->bd_disk;
 	struct dasd_device *device = disk->private_data;
 
 	if (device->state < DASD_STATE_BASIC) {
--- diff/drivers/s390/block/dasd_int.h	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/s390/block/dasd_int.h	2003-12-29 09:30:41.000000000 +0000
@@ -493,7 +493,7 @@
 void dasd_ioctl_exit(void);
 int  dasd_ioctl_no_register(struct module *, int, dasd_ioctl_fn_t);
 int  dasd_ioctl_no_unregister(struct module *, int, dasd_ioctl_fn_t);
-int  dasd_ioctl(struct inode *, struct file *, unsigned int, unsigned long);
+int  dasd_ioctl(struct block_device *, struct file *, unsigned int, unsigned long);
 
 /* externals in dasd_proc.c */
 int dasd_proc_init(void);
--- diff/drivers/s390/block/dasd_ioctl.c	2003-09-30 15:46:16.000000000 +0100
+++ source/drivers/s390/block/dasd_ioctl.c	2003-12-29 09:30:41.000000000 +0000
@@ -78,10 +78,9 @@
 }
 
 int
-dasd_ioctl(struct inode *inp, struct file *filp,
+dasd_ioctl(struct block_device *bdev, struct file *filp,
 	   unsigned int no, unsigned long data)
 {
-	struct block_device *bdev = inp->i_bdev;
 	struct dasd_device *device = bdev->bd_disk->private_data;
 	struct dasd_ioctl *ioctl;
 	const char *dir;
--- diff/drivers/s390/block/xpram.c	2003-09-30 15:46:16.000000000 +0100
+++ source/drivers/s390/block/xpram.c	2003-12-29 09:30:41.000000000 +0000
@@ -328,7 +328,7 @@
 	return 0;
 }
 
-static int xpram_ioctl (struct inode *inode, struct file *filp,
+static int xpram_ioctl (struct block_device *bdev, struct file *filp,
 		 unsigned int cmd, unsigned long arg)
 {
 	struct hd_geometry *geo;
--- diff/drivers/s390/char/tape_block.c	2003-09-30 15:46:16.000000000 +0100
+++ source/drivers/s390/char/tape_block.c	2003-12-29 09:30:41.000000000 +0000
@@ -27,8 +27,8 @@
 /*
  * file operation structure for tape block frontend
  */
-static int tapeblock_open(struct inode *, struct file *);
-static int tapeblock_release(struct inode *, struct file *);
+static int tapeblock_open(block_device *, struct file *);
+static int tapeblock_release(struct gendisk *);
 
 static struct block_device_operations tapeblock_fops = {
 	.owner		= THIS_MODULE,
@@ -299,9 +299,9 @@
  * Block frontend tape device open function.
  */
 static int
-tapeblock_open(struct inode *inode, struct file *filp)
+tapeblock_open(struct block_device *bdev, struct file *filp)
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
+	struct gendisk *disk = bdev->bd_disk;
 	struct tape_device *device = disk->private_data;
 	int rc;
 
@@ -336,9 +336,8 @@
  * Block frontend tape device release function.
  */
 static int
-tapeblock_release(struct inode *inode, struct file *filp)
+tapeblock_release(struct gendisk *disk)
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
 	struct tape_device *device = disk->private_data;
 
 	tape_release(device);
--- diff/drivers/scsi/BusLogic.c	2003-09-30 15:46:17.000000000 +0100
+++ source/drivers/scsi/BusLogic.c	2003-12-29 09:30:41.000000000 +0000
@@ -3462,6 +3462,18 @@
   return false;
 }
 
+/* Error Handling (EH) support */
+
+static int BusLogic_host_reset(Scsi_Cmnd *SCpnt)
+{
+	BusLogic_HostAdapter_T *HostAdapter =
+		(BusLogic_HostAdapter_T *) SCpnt->device->host->hostdata;
+
+	/* printk("BusLogic_host_reset\n"); */
+	HostAdapter->HostAdapterExternalReset = 1;
+	BusLogic_ResetHostAdapter(HostAdapter, NULL, 0);
+	return SUCCESS;
+}
 
 /*
   BusLogic_QueueCommand creates a CCB for Command and places it into an
@@ -4589,220 +4601,8 @@
   adapters whereas the remaining options apply individually only to the
   selected host adapter.
 
-  The BusLogic Driver Probing Options comprise the following:
-
-  IO:<integer>
-
-    The "IO:" option specifies an ISA I/O Address to be probed for a non-PCI
-    MultiMaster Host Adapter.  If neither "IO:" nor "NoProbeISA" options are
-    specified, then the standard list of BusLogic MultiMaster ISA I/O Addresses
-    will be probed (0x330, 0x334, 0x230, 0x234, 0x130, and 0x134).  Multiple
-    "IO:" options may be specified to precisely determine the I/O Addresses to
-    be probed, but the probe order will always follow the standard list.
-
-  NoProbe
-
-    The "NoProbe" option disables all probing and therefore no BusLogic Host
-    Adapters will be detected.
-
-  NoProbeISA
-
-    The "NoProbeISA" option disables probing of the standard BusLogic ISA I/O
-    Addresses and therefore only PCI MultiMaster and FlashPoint Host Adapters
-    will be detected.
-
-  NoProbePCI
-
-    The "NoProbePCI" options disables the interrogation of PCI Configuration
-    Space and therefore only ISA Multimaster Host Adapters will be detected, as
-    well as PCI Multimaster Host Adapters that have their ISA Compatible I/O
-    Port set to "Primary" or "Alternate".
-
-  NoSortPCI
-
-    The "NoSortPCI" option forces PCI MultiMaster Host Adapters to be
-    enumerated in the order provided by the PCI BIOS, ignoring any setting of
-    the AutoSCSI "Use Bus And Device # For PCI Scanning Seq." option.
-
-  MultiMasterFirst
-
-    The "MultiMasterFirst" option forces MultiMaster Host Adapters to be probed
-    before FlashPoint Host Adapters.  By default, if both FlashPoint and PCI
-    MultiMaster Host Adapters are present, this driver will probe for
-    FlashPoint Host Adapters first unless the BIOS primary disk is controlled
-    by the first PCI MultiMaster Host Adapter, in which case MultiMaster Host
-    Adapters will be probed first.
-
-  FlashPointFirst
-
-    The "FlashPointFirst" option forces FlashPoint Host Adapters to be probed
-    before MultiMaster Host Adapters.
-
-  The BusLogic Driver Tagged Queuing Options allow for explicitly specifying
-  the Queue Depth and whether Tagged Queuing is permitted for each Target
-  Device (assuming that the Target Device supports Tagged Queuing).  The Queue
-  Depth is the number of SCSI Commands that are allowed to be concurrently
-  presented for execution (either to the Host Adapter or Target Device).  Note
-  that explicitly enabling Tagged Queuing may lead to problems; the option to
-  enable or disable Tagged Queuing is provided primarily to allow disabling
-  Tagged Queuing on Target Devices that do not implement it correctly.  The
-  following options are available:
-
-  QueueDepth:<integer>
-
-    The "QueueDepth:" or QD:" option specifies the Queue Depth to use for all
-    Target Devices that support Tagged Queuing, as well as the maximum Queue
-    Depth for devices that do not support Tagged Queuing.  If no Queue Depth
-    option is provided, the Queue Depth will be determined automatically based
-    on the Host Adapter's Total Queue Depth and the number, type, speed, and
-    capabilities of the detected Target Devices.  For Host Adapters that
-    require ISA Bounce Buffers, the Queue Depth is automatically set by default
-    to BusLogic_TaggedQueueDepthBB or BusLogic_UntaggedQueueDepthBB to avoid
-    excessive preallocation of DMA Bounce Buffer memory.  Target Devices that
-    do not support Tagged Queuing always have their Queue Depth set to
-    BusLogic_UntaggedQueueDepth or BusLogic_UntaggedQueueDepthBB, unless a
-    lower Queue Depth option is provided.  A Queue Depth of 1 automatically
-    disables Tagged Queuing.
-
-  QueueDepth:[<integer>,<integer>...]
-
-    The "QueueDepth:[...]" or "QD:[...]" option specifies the Queue Depth
-    individually for each Target Device.  If an <integer> is omitted, the
-    associated Target Device will have its Queue Depth selected automatically.
-
-  TaggedQueuing:Default
-
-    The "TaggedQueuing:Default" or "TQ:Default" option permits Tagged Queuing
-    based on the firmware version of the BusLogic Host Adapter and based on
-    whether the Queue Depth allows queuing multiple commands.
-
-  TaggedQueuing:Enable
-
-    The "TaggedQueuing:Enable" or "TQ:Enable" option enables Tagged Queuing for
-    all Target Devices on this Host Adapter, overriding any limitation that
-    would otherwise be imposed based on the Host Adapter firmware version.
-
-  TaggedQueuing:Disable
-
-    The "TaggedQueuing:Disable" or "TQ:Disable" option disables Tagged Queuing
-    for all Target Devices on this Host Adapter.
-
-  TaggedQueuing:<Target-Spec>
-
-    The "TaggedQueuing:<Target-Spec>" or "TQ:<Target-Spec>" option controls
-    Tagged Queuing individually for each Target Device.  <Target-Spec> is a
-    sequence of "Y", "N", and "X" characters.  "Y" enables Tagged Queuing, "N"
-    disables Tagged Queuing, and "X" accepts the default based on the firmware
-    version.  The first character refers to Target Device 0, the second to
-    Target Device 1, and so on; if the sequence of "Y", "N", and "X" characters
-    does not cover all the Target Devices, unspecified characters are assumed
-    to be "X".
-
-  The BusLogic Driver Error Recovery Option allows for explicitly specifying
-  the Error Recovery action to be performed when BusLogic_ResetCommand is
-  called due to a SCSI Command failing to complete successfully.  The following
-  options are available:
-
-  ErrorRecovery:Default
-
-    The "ErrorRecovery:Default" or "ER:Default" option selects between the Hard
-    Reset and Bus Device Reset options based on the recommendation of the SCSI
-    Subsystem.
-
-  ErrorRecovery:HardReset
-
-    The "ErrorRecovery:HardReset" or "ER:HardReset" option will initiate a Host
-    Adapter Hard Reset which also causes a SCSI Bus Reset.
-
-  ErrorRecovery:BusDeviceReset
-
-    The "ErrorRecovery:BusDeviceReset" or "ER:BusDeviceReset" option will send
-    a Bus Device Reset message to the individual Target Device causing the
-    error.  If Error Recovery is again initiated for this Target Device and no
-    SCSI Command to this Target Device has completed successfully since the Bus
-    Device Reset message was sent, then a Hard Reset will be attempted.
-
-  ErrorRecovery:None
-
-    The "ErrorRecovery:None" or "ER:None" option suppresses Error Recovery.
-    This option should only be selected if a SCSI Bus Reset or Bus Device Reset
-    will cause the Target Device or a critical operation to suffer a complete
-    and unrecoverable failure.
-
-  ErrorRecovery:<Target-Spec>
-
-    The "ErrorRecovery:<Target-Spec>" or "ER:<Target-Spec>" option controls
-    Error Recovery individually for each Target Device.  <Target-Spec> is a
-    sequence of "D", "H", "B", and "N" characters.  "D" selects Default, "H"
-    selects Hard Reset, "B" selects Bus Device Reset, and "N" selects None.
-    The first character refers to Target Device 0, the second to Target Device
-    1, and so on; if the sequence of "D", "H", "B", and "N" characters does not
-    cover all the possible Target Devices, unspecified characters are assumed
-    to be "D".
-
-  The BusLogic Driver Miscellaneous Options comprise the following:
-
-  BusSettleTime:<seconds>
-
-    The "BusSettleTime:" or "BST:" option specifies the Bus Settle Time in
-    seconds.  The Bus Settle Time is the amount of time to wait between a Host
-    Adapter Hard Reset which initiates a SCSI Bus Reset and issuing any SCSI
-    Commands.  If unspecified, it defaults to BusLogic_DefaultBusSettleTime.
-
-  InhibitTargetInquiry
-
-    The "InhibitTargetInquiry" option inhibits the execution of an Inquire
-    Target Devices or Inquire Installed Devices command on MultiMaster Host
-    Adapters.  This may be necessary with some older Target Devices that do not
-    respond correctly when Logical Units above 0 are addressed.
-
-  The BusLogic Driver Debugging Options comprise the following:
-
-  TraceProbe
-
-    The "TraceProbe" option enables tracing of Host Adapter Probing.
-
-  TraceHardwareReset
-
-    The "TraceHardwareReset" option enables tracing of Host Adapter Hardware
-    Reset.
-
-  TraceConfiguration
-
-    The "TraceConfiguration" option enables tracing of Host Adapter
-    Configuration.
-
-  TraceErrors
-
-    The "TraceErrors" option enables tracing of SCSI Commands that return an
-    error from the Target Device.  The CDB and Sense Data will be printed for
-    each SCSI Command that fails.
-
-  Debug
-
-    The "Debug" option enables all debugging options.
-
-  The following examples demonstrate setting the Queue Depth for Target Devices
-  1 and 2 on the first host adapter to 7 and 15, the Queue Depth for all Target
-  Devices on the second host adapter to 31, and the Bus Settle Time on the
-  second host adapter to 30 seconds.
-
-  Linux Kernel Command Line:
-
-    linux BusLogic=QueueDepth:[,7,15];QueueDepth:31,BusSettleTime:30
-
-  LILO Linux Boot Loader (in /etc/lilo.conf):
-
-    append = "BusLogic=QueueDepth:[,7,15];QueueDepth:31,BusSettleTime:30"
-
-  INSMOD Loadable Kernel Module Installation Facility:
-
-    insmod BusLogic.o \
-	'BusLogic="QueueDepth:[,7,15];QueueDepth:31,BusSettleTime:30"'
-
-  NOTE: Module Utilities 2.1.71 or later is required for correct parsing
-	of driver options containing commas.
-
+  The BusLogic Driver Probing Options are described in
+  <file:Documentation/scsi/BusLogic.txt>.
 */
 
 static int __init BusLogic_ParseDriverOptions(char *OptionsString)
@@ -5126,6 +4926,7 @@
 	.queuecommand		= BusLogic_QueueCommand,
 	.slave_configure	= BusLogic_SlaveConfigure,
 	.bios_param		= BusLogic_BIOSDiskParameters,
+	.eh_host_reset_handler	= BusLogic_host_reset,
 	.unchecked_isa_dma	= 1,
 	.max_sectors		= 128,
 	.use_clustering		= ENABLE_CLUSTERING,
--- diff/drivers/scsi/Kconfig	2003-11-25 15:24:58.000000000 +0000
+++ source/drivers/scsi/Kconfig	2003-12-29 09:30:41.000000000 +0000
@@ -55,6 +55,14 @@
 	  In this case, do not compile the driver for your SCSI host adapter
 	  (below) as a module either.
 
+config MAX_SD_DISKS
+	int "Maximum number of SCSI disks to support (256-8192)"
+	depends on BLK_DEV_SD
+	default "256"
+	help
+	The maximum number SCSI disks to support. Default is 256.
+	Change this value if you want kernel to support lots of SCSI devices.
+
 config CHR_DEV_ST
 	tristate "SCSI tape support"
 	depends on SCSI
@@ -911,37 +919,34 @@
 	depends on SCSI_SYM53C8XX_2
 	default "1"
 	---help---
-	  This option only applies to PCI-SCSI chip that are PCI DAC capable 
-	  (875A, 895A, 896, 1010-33, 1010-66, 1000).
+	  This option only applies to PCI-SCSI chips that are PCI DAC
+	  capable (875A, 895A, 896, 1010-33, 1010-66, 1000).
 
-	  When set to 0, only PCI 32 bit DMA addressing (SAC) will be performed.
-	  When set to 1, 40 bit DMA addressing (with upper 24 bits of address 
-	  set to zero) is supported. The addressable range is here 1 TB.
-	  When set to 2, full 64 bits of address for DMA are supported, but only
-	  16 segments of 4 GB can be addressed. The addressable range is so 
-	  limited to 64 GB.
-
-	  The safest value is 0 (32 bit DMA addressing) that is guessed to still 
-	  fit most of real machines.
-
-	  The preferred value 1 (40 bit DMA addressing) should make happy 
-	  properly engineered PCI DAC capable host bridges. You may configure
-	  this option for Intel platforms with more than 4 GB of memory.
-
-	  The still experimental value 2 (64 bit DMA addressing with 16 x 4GB 
-	  segments limitation) can be used on systems that require PCI address 
-	  bits past bit 39 to be set for the addressing of memory using PCI 
-	  DAC cycles.
+	  When set to 0, the driver will program the chip to only perform
+	  32-bit DMA.  When set to 1, the chip will be able to perform DMA
+	  to addresses up to 1TB.  When set to 2, the driver supports the
+	  full 64-bit DMA address range, but can only address 16 segments
+	  of 4 GB each.  This limits the total addressable range to 64 GB.
+
+	  Most machines with less than 4GB of memory should use a setting
+	  of 0 for best performance.  If your machine has 4GB of memory
+	  or more, you should set this option to 1 (the default).
+
+	  The still experimental value 2 (64 bit DMA addressing with 16
+	  x 4GB segments limitation) can be used on systems that require
+	  PCI address bits past bit 39 to be set for the addressing of
+	  memory using PCI DAC cycles.
 
 config SCSI_SYM53C8XX_DEFAULT_TAGS
 	int "default tagged command queue depth"
 	depends on SCSI_SYM53C8XX_2
 	default "16"
 	help
-	  This is the default value of the command queue depth the driver will 
-	  announce to the generic SCSI layer for devices that support tagged 
-	  command queueing. This value can be changed from the boot command line.
-	  This is a soft limit that cannot exceed CONFIG_SCSI_SYM53C8XX_MAX_TAGS.
+	  This is the default value of the command queue depth the
+	  driver will announce to the generic SCSI layer for devices
+	  that support tagged command queueing. This value can be changed
+	  from the boot command line.  This is a soft limit that cannot
+	  exceed CONFIG_SCSI_SYM53C8XX_MAX_TAGS.
 
 config SCSI_SYM53C8XX_MAX_TAGS
 	int "maximum number of queued commands"
@@ -954,11 +959,12 @@
 	  This value is used as a compiled-in hard limit.
 
 config SCSI_SYM53C8XX_IOMAPPED
-	bool "use normal IO"
+	bool "use port IO"
 	depends on SCSI_SYM53C8XX_2
 	help
-	  If you say Y here, the driver will preferently use normal IO rather than 
-	  memory mapped IO.
+	  If you say Y here, the driver will use port IO to access
+	  the card.  This is significantly slower then using memory
+	  mapped IO.  Most people should answer N.
 
 config SCSI_ZALON
 	tristate "Zalon SCSI support"
--- diff/drivers/scsi/aic7xxx/Makefile	2003-10-09 09:47:16.000000000 +0100
+++ source/drivers/scsi/aic7xxx/Makefile	2003-12-29 09:30:41.000000000 +0000
@@ -58,7 +58,9 @@
 	-p $(obj)/aic7xxx_reg_print.c -i aic7xxx_osm.h
 
 ifeq ($(CONFIG_AIC7XXX_BUILD_FIRMWARE),y)
-$(aic7xxx-gen-y): $(src)/aic7xxx.seq $(src)/aic7xxx.reg $(obj)/aicasm/aicasm
+$(aic7xxx-gen-y): $(src)/aic7xxx.seq
+
+$(src)/aic7xxx.seq: $(obj)/aicasm/aicasm $(src)/aic7xxx.reg
 	$(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic7xxx_reg.h \
 			      $(aicasm-7xxx-opts-y) -o $(obj)/aic7xxx_seq.h \
 			      $(src)/aic7xxx.seq
@@ -72,7 +74,9 @@
 	-p $(obj)/aic79xx_reg_print.c -i aic79xx_osm.h
 
 ifeq ($(CONFIG_AIC79XX_BUILD_FIRMWARE),y)
-$(aic79xx-gen-y): $(src)/aic79xx.seq $(src)/aic79xx.reg $(obj)/aicasm/aicasm
+$(aic79xx-gen-y): $(src)/aic79xx.seq
+
+$(src)/aic79xx.seq: $(obj)/aicasm/aicasm $(src)/aic79xx.reg
 	$(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic79xx_reg.h \
 			      $(aicasm-79xx-opts-y) -o $(obj)/aic79xx_seq.h \
 			      $(src)/aic79xx.seq
--- diff/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c	2003-09-17 12:28:09.000000000 +0100
+++ source/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c	2003-12-29 09:30:41.000000000 +0000
@@ -100,9 +100,10 @@
 		ahc_lock(ahc, &s);
 		ahc_intr_enable(ahc, FALSE);
 		ahc_unlock(ahc, &s);
-		ahc_free(ahc);
 	}
 	ahc_list_unlock(&l);
+	if (ahc)
+		ahc_free(ahc);
 }
 #endif /* !LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) */
 
--- diff/drivers/scsi/aic7xxx/aicasm/Makefile	2003-10-09 09:47:16.000000000 +0100
+++ source/drivers/scsi/aic7xxx/aicasm/Makefile	2003-12-29 09:30:41.000000000 +0000
@@ -49,14 +49,18 @@
 clean:
 	rm -f $(clean-files)
 
-aicasm_gram.c aicasm_gram.h: aicasm_gram.y
+aicasm_gram.c: aicasm_gram.h
+	mv $(<:.h=).tab.c $(<:.h=.c)
+
+aicasm_gram.h: aicasm_gram.y
 	$(YACC) $(YFLAGS) -b $(<:.y=) $<
-	mv $(<:.y=).tab.c $(<:.y=.c)
 	mv $(<:.y=).tab.h $(<:.y=.h)
 
-aicasm_macro_gram.c aicasm_macro_gram.h: aicasm_macro_gram.y
+aicasm_macro_gram.c: aicasm_macro_gram.h
+	mv $(<:.h=).tab.c $(<:.h=.c)
+
+aicasm_macro_gram.h: aicasm_macro_gram.y
 	$(YACC) $(YFLAGS) -b $(<:.y=) -p mm $<
-	mv $(<:.y=).tab.c $(<:.y=.c)
 	mv $(<:.y=).tab.h $(<:.y=.h)
 
 aicasm_scan.c: aicasm_scan.l
--- diff/drivers/scsi/aic7xxx_old/aic7xxx_proc.c	2003-10-09 09:47:16.000000000 +0100
+++ source/drivers/scsi/aic7xxx_old/aic7xxx_proc.c	2003-12-29 09:30:41.000000000 +0000
@@ -90,9 +90,7 @@
   unsigned char i;
   unsigned char tindex;
 
-  HBAptr = NULL;
-
-  for(p=first_aic7xxx; p->host != HBAptr; p=p->next)
+  for(p=first_aic7xxx; p && p->host != HBAptr; p=p->next)
     ;
 
   if (!p)
--- diff/drivers/scsi/hosts.c	2003-11-25 15:24:58.000000000 +0000
+++ source/drivers/scsi/hosts.c	2003-12-29 09:30:41.000000000 +0000
@@ -109,7 +109,7 @@
 	}
 
 	if (!shost->shost_gendev.parent)
-		shost->shost_gendev.parent = dev ? dev : &legacy_bus;
+		shost->shost_gendev.parent = dev ? dev : &platform_bus;
 
 	error = device_add(&shost->shost_gendev);
 	if (error)
--- diff/drivers/scsi/ide-scsi.c	2003-12-19 09:51:11.000000000 +0000
+++ source/drivers/scsi/ide-scsi.c	2003-12-29 09:30:41.000000000 +0000
@@ -636,24 +636,23 @@
 	.drives			= LIST_HEAD_INIT(idescsi_driver.drives),
 };
 
-static int idescsi_ide_open(struct inode *inode, struct file *filp)
+static int idescsi_ide_open(struct block_device *bdev, struct file *filp)
 {
-	ide_drive_t *drive = inode->i_bdev->bd_disk->private_data;
+	ide_drive_t *drive = bdev->bd_disk->private_data;
 	drive->usage++;
 	return 0;
 }
 
-static int idescsi_ide_release(struct inode *inode, struct file *filp)
+static int idescsi_ide_release(struct gendisk *disk)
 {
-	ide_drive_t *drive = inode->i_bdev->bd_disk->private_data;
+	ide_drive_t *drive = disk->private_data;
 	drive->usage--;
 	return 0;
 }
 
-static int idescsi_ide_ioctl(struct inode *inode, struct file *file,
+static int idescsi_ide_ioctl(struct block_device *bdev, struct file *file,
 			unsigned int cmd, unsigned long arg)
 {
-	struct block_device *bdev = inode->i_bdev;
 	return generic_ide_ioctl(bdev, cmd, arg);
 }
 
--- diff/drivers/scsi/qla1280.c	2003-12-19 09:51:11.000000000 +0000
+++ source/drivers/scsi/qla1280.c	2003-12-29 09:30:41.000000000 +0000
@@ -4,6 +4,7 @@
 * QLogic  QLA1280 (Ultra2)  and  QLA12160 (Ultra3) SCSI driver
 * Copyright (C) 2000 Qlogic Corporation (www.qlogic.com)
 * Copyright (C) 2001-2003 Jes Sorensen, Wild Open Source Inc.
+* Copyright (C) 2003 Christoph Hellwig
 *
 * 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
@@ -16,13 +17,17 @@
 * General Public License for more details.
 *
 ******************************************************************************/
-#define QLA1280_VERSION      "3.23.37.1"
+#define QLA1280_VERSION      "3.23.38.1"
 /*****************************************************************************
     Revision History:
     Rev  3.23.37.1 December 17, 2003, Jes Sorensen
 	- Delete completion queue from srb if mailbox command failed to
 	  to avoid qla1280_done completeting qla1280_error_action's
 	  obsolete context
+    Rev  3.23.38 October 18, 2003, Christoph Hellwig
+	- Convert to new-style hotplugable driver for 2.6
+	- Fix missing scsi_unregister/scsi_host_put on HBA removal
+	- Kill some of cruft
     Rev  3.23.37 October 1, 2003, Jes Sorensen
 	- Make MMIO depend on CONFIG_X86_VISWS instead of yet another
 	  random CONFIG option
@@ -341,9 +346,6 @@
  * Compile time Options:
  *            0 - Disable and 1 - Enable
  */
-#define  QL1280_LUN_SUPPORT	0
-#define  WATCHDOGTIMER		0
-
 #define  DEBUG_QLA1280_INTR	0
 #define  DEBUG_PRINT_NVRAM	0
 #define  DEBUG_QLA1280		0
@@ -423,6 +425,14 @@
 	}
 	device->queue_depth = depth;
 }
+static inline struct Scsi_Host *scsi_host_alloc(Scsi_Host_Template *t, size_t s)
+{
+	return scsi_register(t, s);
+}
+static inline void scsi_host_put(struct Scsi_Host *h)
+{
+	scsi_unregister(h);
+}
 #else
 #define HOST_LOCK			ha->host->host_lock
 #endif
@@ -435,30 +445,23 @@
 #define ia64_platform_is(foo)		(!strcmp(x, platform_name))
 #endif
 
+static int qla1280_probe_one(struct pci_dev *, const struct pci_device_id *);
+static void qla1280_remove_one(struct pci_dev *);
+
 /*
  *  QLogic Driver Support Function Prototypes.
  */
 static void qla1280_done(struct scsi_qla_host *, struct srb **, struct srb **);
-static void qla1280_done_q_put(struct srb *, struct srb **, struct srb **);
-static int qla1280_slave_configure(Scsi_Device *);
 #if LINUX_VERSION_CODE < 0x020545
-static void qla1280_select_queue_depth(struct Scsi_Host *, Scsi_Device *);
 static void qla1280_get_target_options(struct scsi_cmnd *, struct scsi_qla_host *);
 #endif
-
-static int qla1280_return_status(struct response * sts, Scsi_Cmnd * cp);
-static void qla1280_mem_free(struct scsi_qla_host *ha);
 static int qla1280_get_token(char *);
 static int qla1280_setup(char *s) __init;
-static inline void qla1280_enable_intrs(struct scsi_qla_host *);
-static inline void qla1280_disable_intrs(struct scsi_qla_host *);
 
 /*
  *  QLogic ISP1280 Hardware Support Function Prototypes.
  */
-static int qla1280_initialize_adapter(struct scsi_qla_host *ha);
 static int qla1280_isp_firmware(struct scsi_qla_host *);
-static int qla1280_pci_config(struct scsi_qla_host *);
 static int qla1280_chip_diag(struct scsi_qla_host *);
 static int qla1280_setup_chip(struct scsi_qla_host *);
 static int qla1280_init_rings(struct scsi_qla_host *);
@@ -477,7 +480,6 @@
 static void qla1280_reset_adapter(struct scsi_qla_host *);
 static void qla1280_marker(struct scsi_qla_host *, int, int, int, u8);
 static void qla1280_isp_cmd(struct scsi_qla_host *);
-irqreturn_t qla1280_intr_handler(int, void *, struct pt_regs *);
 static void qla1280_isr(struct scsi_qla_host *, struct srb **, struct srb **);
 static void qla1280_rst_aen(struct scsi_qla_host *);
 static void qla1280_status_entry(struct scsi_qla_host *, struct response *,
@@ -490,11 +492,9 @@
 static request_t *qla1280_req_pkt(struct scsi_qla_host *);
 static int qla1280_check_for_dead_scsi_bus(struct scsi_qla_host *,
 					   unsigned int);
-static int qla1280_mem_alloc(struct scsi_qla_host *ha);
-
-static void qla12160_get_target_parameters(struct scsi_qla_host *,
+static void qla1280_get_target_parameters(struct scsi_qla_host *,
 					   Scsi_Device *);
-static int qla12160_set_target_parameters(struct scsi_qla_host *, int, int);
+static int qla1280_set_target_parameters(struct scsi_qla_host *, int, int);
 
 
 static struct qla_driver_setup driver_setup __initdata;
@@ -529,10 +529,6 @@
 	return flags;
 }
 		
-#if QL1280_LUN_SUPPORT
-static void qla1280_enable_lun(struct scsi_qla_host *, int, int);
-#endif
-
 #if DEBUG_QLA1280
 static void __qla1280_print_scsi_cmd(Scsi_Cmnd * cmd);
 static void __qla1280_dump_buffer(char *, int);
@@ -551,8 +547,6 @@
 __setup("qla1280=", qla1280_setup);
 #endif
 
-MODULE_LICENSE("GPL");
-
 
 /* We use the Scsi_Pointer structure that's included with each command
  * SCSI_Cmnd as a scratchpad for our SRB.
@@ -576,28 +570,23 @@
 #define	CMD_RESULT(Cmnd)	Cmnd->result
 #define	CMD_HANDLE(Cmnd)	Cmnd->host_scribble
 #if LINUX_VERSION_CODE < 0x020545
-#define	CMD_HOST(Cmnd)		Cmnd->host
 #define CMD_REQUEST(Cmnd)	Cmnd->request.cmd
-#define SCSI_BUS_32(Cmnd)	Cmnd->channel
-#define SCSI_TCN_32(Cmnd)	Cmnd->target
-#define SCSI_LUN_32(Cmnd)	Cmnd->lun
 #else
-#define	CMD_HOST(Cmnd)		Cmnd->device->host
 #define CMD_REQUEST(Cmnd)	Cmnd->request->cmd
+#endif
+
+#define CMD_HOST(Cmnd)		Cmnd->device->host
 #define SCSI_BUS_32(Cmnd)	Cmnd->device->channel
 #define SCSI_TCN_32(Cmnd)	Cmnd->device->id
 #define SCSI_LUN_32(Cmnd)	Cmnd->device->lun
-#endif
+
 
 /*****************************************/
 /*   ISP Boards supported by this driver */
 /*****************************************/
 
-#define NUM_OF_ISP_DEVICES	6
-
 struct qla_boards {
 	unsigned char name[9];	/* Board ID String */
-	unsigned long device_id;	/* Device PCI ID   */
 	int numPorts;		/* Number of SCSI ports */
 	unsigned short *fwcode;	/* pointer to FW array         */
 	unsigned short *fwlen;	/* number of words in array    */
@@ -605,28 +594,38 @@
 	unsigned char *fwver;	/* Ptr to F/W version array    */
 };
 
-struct qla_boards ql1280_board_tbl[NUM_OF_ISP_DEVICES] = {
-	/* Name ,  Board PCI Device ID,         Number of ports */
-	{"QLA12160", PCI_DEVICE_ID_QLOGIC_ISP12160, 2,
-	 &fw12160i_code01[0], &fw12160i_length01,
+/* NOTE: qla1280_pci_tbl and ql1280_board_tbl must be in the same order */
+static struct pci_device_id qla1280_pci_tbl[] = {
+	{PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP12160,
+		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+	{PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP1080,
+		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1},
+	{PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP1240,
+		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2},
+	{PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP1280,
+		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3},
+	{PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP10160,
+		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4},
+	{0,}
+};
+MODULE_DEVICE_TABLE(pci, qla1280_pci_tbl);
+
+static struct qla_boards ql1280_board_tbl[] = {
+	/* Name ,  Number of ports, FW details */
+	{"QLA12160", 2, &fw12160i_code01[0], &fw12160i_length01,
 	 &fw12160i_addr01, &fw12160i_version_str[0]},
-	{"QLA1080", PCI_DEVICE_ID_QLOGIC_ISP1080, 1,
-	 &fw1280ei_code01[0], &fw1280ei_length01,
+	{"QLA1080", 1, &fw1280ei_code01[0], &fw1280ei_length01,
 	 &fw1280ei_addr01, &fw1280ei_version_str[0]},
-	{"QLA1240", PCI_DEVICE_ID_QLOGIC_ISP1240, 2,
-	 &fw1280ei_code01[0], &fw1280ei_length01,
+	{"QLA1240", 2, &fw1280ei_code01[0], &fw1280ei_length01,
 	 &fw1280ei_addr01, &fw1280ei_version_str[0]},
-	{"QLA1280", PCI_DEVICE_ID_QLOGIC_ISP1280, 2,
-	 &fw1280ei_code01[0], &fw1280ei_length01,
+	{"QLA1280", 2, &fw1280ei_code01[0], &fw1280ei_length01,
 	 &fw1280ei_addr01, &fw1280ei_version_str[0]},
-	{"QLA10160", PCI_DEVICE_ID_QLOGIC_ISP10160, 1,
-	 &fw12160i_code01[0], &fw12160i_length01,
+	{"QLA10160", 1, &fw12160i_code01[0], &fw12160i_length01,
 	 &fw12160i_addr01, &fw12160i_version_str[0]},
-	{"        ", 0, 0}
+	{"        ", 0}
 };
 
 static int qla1280_verbose = 1;
-static struct scsi_qla_host *qla1280_hostlist;
 static int qla1280_buffer_size;
 static char *qla1280_buffer;
 
@@ -675,31 +674,19 @@
 	int size = 0;
 	int len = 0;
 	struct qla_boards *bdp;
-#ifdef BOGUS_QUEUE
-	struct scsi_lu *up;
-	uint32_t b, t, l;
-#endif
-#if LINUX_VERSION_CODE >= 0x020600
-	ha = (struct scsi_qla_host *)host->hostdata;
-#else
+#if LINUX_VERSION_CODE < 0x020600
 	struct Scsi_Host *host;
-	/* Find the host that was specified */
-	for (ha = qla1280_hostlist; (ha != NULL)
-		     && ha->host->host_no != hostno; ha = ha->next) ;
-
-	/* if host wasn't found then exit */
-	if (!ha) {
-		size =  sprintf(buffer, "Can't find adapter for host "
-				"number %d\n", hostno);
-		if (size > length) {
-			return size;
-		} else {
-			return 0;
-		}
+
+	for (host = scsi_hostlist; host; host = host->next) {
+		if (host->host_no == hostno)
+			goto found;
 	}
 
-	host = ha->host;
+	return -ESRCH;
+
+ found:
 #endif
+	ha = (struct scsi_qla_host *)host->hostdata;
 
 	if (inout)
 		return -ENOSYS;
@@ -753,51 +740,6 @@
 	size = sprintf(PROC_BUF, "\n");	/* 1       */
 	len += size;
 
-	size = sprintf(PROC_BUF, "SCSI device Information:\n");
-	len += size;
-#ifdef BOGUS_QUEUE
-	/* scan for all equipment stats */
-	for (b = 0; b < MAX_BUSES; b++)
-		for (t = 0; t < MAX_TARGETS; t++) {
-			for (l = 0; l < MAX_LUNS; l++) {
-				up = LU_Q(ha, b, t, l);
-				if (up == NULL)
-					continue;
-				/* unused device/lun */
-				if (up->io_cnt == 0 || up->io_cnt < 2)
-					continue;
-				/* total reads since boot */
-				/* total writes since boot */
-				/* total requests since boot  */
-				size = sprintf (PROC_BUF,
-						"(%2d:%2d:%2d): Total reqs %ld,",
-						b, t, l, up->io_cnt);
-				len += size;
-				/* current number of pending requests */
-				size =	sprintf(PROC_BUF, " Pend reqs %d,",
-						up->q_outcnt);
-				len += size;
-#if 0
-				/* avg response time */
-				size = sprintf(PROC_BUF, " Avg resp time %ld%%,",
-					       (up->resp_time / up->io_cnt) *
-					       100);
-				len += size;
-
-				/* avg active time */
-				size = sprintf(PROC_BUF,
-					       " Avg active time %ld%%\n",
-					       (up->act_time / up->io_cnt) * 100);
-#else
-				size = sprintf(PROC_BUF, "\n");
-#endif
-				len += size;
-			}
-			if (len >= qla1280_buffer_size)
-				break;
-		}
-#endif
-
 	if (len >= qla1280_buffer_size) {
 		printk(KERN_WARNING
 		       "qla1280: Overflow buffer in qla1280_proc.c\n");
@@ -875,312 +817,6 @@
 	return chksum;
 }
 
-
-/**************************************************************************
- * qla1280_do_device_init
- *    This routine will register the device with the SCSI subsystem,
- *    initialize the host adapter structure and call the device init
- *    routines.
- *
- * Input:
- *     pdev      - pointer to struct pci_dev for adapter
- *     template  - pointer to SCSI template
- *     devnum    - the device number
- *     bdp       - pointer to struct _qlaboards
- *     num_hosts - the host number
- *
- * Returns:
- *  host - pointer to SCSI host structure
- **************************************************************************/
-struct Scsi_Host *
-qla1280_do_device_init(struct pci_dev *pdev, Scsi_Host_Template * template,
-		       int devnum, struct qla_boards *bdp, int num_hosts)
-{
-	struct Scsi_Host *host;
-	struct scsi_qla_host *ha;
-
-	printk(KERN_INFO "qla1280: %s found on PCI bus %i, dev %i\n",
-	       bdp->name, pdev->bus->number, PCI_SLOT(pdev->devfn));
-
-	host = scsi_register(template, sizeof(struct scsi_qla_host));
-	if (!host) {
-		printk(KERN_WARNING
-		       "qla1280: Failed to register host, aborting.\n");
-		goto error;
-	}
-
-#if LINUX_VERSION_CODE < 0x020545
-	scsi_set_pci_device(host, pdev);
-#else
-	scsi_set_device(host, &pdev->dev);
-#endif
-	ha = (struct scsi_qla_host *)host->hostdata;
-	/* Clear our data area */
-	memset(ha, 0, sizeof(struct scsi_qla_host));
-	/* Sanitize the information from PCI BIOS.  */
-	host->irq = pdev->irq;
-	ha->pci_bus = pdev->bus->number;
-	ha->pci_device_fn = pdev->devfn;
-	ha->pdev = pdev;
-	ha->device_id = bdp->device_id;
-	ha->devnum = devnum;	/* specifies microcode load address */
-
-	if (qla1280_mem_alloc(ha)) {
-		printk(KERN_INFO "qla1x160: Failed to get memory\n");
-		goto error_scsi_unregister;
-	}
-
-	ha->ports = bdp->numPorts;
-	/* following needed for all cases of OS versions */
-	ha->host = host;
-	ha->host_no = host->host_no;
-
-	host->can_queue = 0xfffff;	/* unlimited  */
-	host->cmd_per_lun = 1;
-	host->base = (unsigned long)ha->mmpbase;
-	host->max_channel = bdp->numPorts - 1;
-	host->max_lun = MAX_LUNS - 1;
-	host->max_id = MAX_TARGETS;
-	host->max_sectors = 1024;
-#if LINUX_VERSION_CODE < 0x020545
-	host->select_queue_depths = qla1280_select_queue_depth;
-#endif
-
-	ha->instance = num_hosts;
-	host->unique_id = ha->instance;
-
-	if (qla1280_pci_config(ha)) {
-		printk(KERN_INFO "qla1x160: Unable to configure PCI\n");
-		goto error_mem_alloced;
-	}
-
-	/* Disable ISP interrupts. */
-	qla1280_disable_intrs(ha);
-
-	/* Register the IRQ with Linux (sharable) */
-	if (request_irq(host->irq, qla1280_intr_handler, SA_SHIRQ,
-			"qla1280", ha)) {
-		printk("qla1280 : Failed to reserve interrupt %d already "
-		       "in use\n", host->irq);
-		goto error_iounmap;
-	}
-#if !MEMORY_MAPPED_IO
-	/* Register the I/O space with Linux */
-	if (!request_region(host->io_port, 0xff, "qla1280")) {
-		printk("qla1280: Failed to reserve i/o region 0x%04lx-0x%04lx"
-		       " already in use\n",
-		       host->io_port, host->io_port + 0xff);
-		goto error_free_irq;
-	}
-#endif
-
-	/* load the F/W, read paramaters, and init the H/W */
-	if (qla1280_initialize_adapter(ha)) {
-		printk(KERN_INFO "qla1x160: Failed to initialize adapter\n");
-		goto error_release_region;
-	}
-
-	/* set our host ID  (need to do something about our two IDs) */
-	host->this_id = ha->bus_settings[0].id;
-
-	return host;
-
- error_release_region:
-#if !MEMORY_MAPPED_IO
-	release_region(host->io_port, 0xff);
- error_free_irq:
-#endif
-	free_irq(host->irq, ha);
- error_iounmap:
-#if MEMORY_MAPPED_IO
-	if (ha->mmpbase)
-		iounmap((void *)(((unsigned long) ha->mmpbase) & PAGE_MASK));
-#endif
- error_mem_alloced:
-	qla1280_mem_free(ha);
- error_scsi_unregister:
-	scsi_unregister(host);
- error:
-	return NULL;
-}
-
-/**************************************************************************
- * qla1280_detect
- *    This routine will probe for Qlogic 1280 SCSI host adapters.
- *    It returns the number of host adapters of a particular
- *    type that were found.	 It also initialize all data necessary for
- *    the driver.  It is passed-in the host number, so that it
- *    knows where its first entry is in the scsi_hosts[] array.
- *
- * Input:
- *     template - pointer to SCSI template
- *
- * Returns:
- *  num - number of host adapters found.
- **************************************************************************/
-static int
-qla1280_detect(Scsi_Host_Template * template)
-{
-	struct pci_dev *pdev = NULL;
-	struct Scsi_Host *host;
-	struct scsi_qla_host *ha, *cur_ha;
-	struct qla_boards *bdp;
-	uint16_t subsys_vendor, subsys_device;
-	int num_hosts = 0;
-	int devnum = 0;
-
-	ENTER("qla1280_detect");
-
-	if (sizeof(struct srb) > sizeof(Scsi_Pointer)) {
-		printk(KERN_WARNING
-		       "qla1280_detect: [WARNING] struct srb too big\n");
-		return 0;
-	}
-#ifdef MODULE
-	/*
-	 * If we are called as a module, the qla1280 pointer may not be null
-	 * and it would point to our bootup string, just like on the lilo
-	 * command line.  IF not NULL, then process this config string with
-	 * qla1280_setup
-	 *
-	 * Boot time Options
-	 * To add options at boot time add a line to your lilo.conf file like:
-	 * append="qla1280=verbose,max_tags:{{255,255,255,255},{255,255,255,255}}"
-	 * which will result in the first four devices on the first two
-	 * controllers being set to a tagged queue depth of 32.
-	 */
-	if (qla1280)
-		qla1280_setup(qla1280);
-#endif
-
-	bdp = &ql1280_board_tbl[0];
-	qla1280_hostlist = NULL;
-	template->proc_name = "qla1280";
-
-	/* First Initialize QLA12160 on PCI Bus 1 Dev 2 */
-	while ((pdev = pci_find_subsys(PCI_VENDOR_ID_QLOGIC, bdp->device_id,
-				       PCI_ANY_ID, PCI_ANY_ID, pdev))) {
-
-		/* find QLA12160 device on PCI bus=1 slot=2 */
-		if ((pdev->bus->number != 1) || (PCI_SLOT(pdev->devfn) != 2))
-			continue;
-
-		/* Bypass all AMI SUBSYS VENDOR IDs */
-		if (pdev->subsystem_vendor == PCI_VENDOR_ID_AMI) {
-			printk(KERN_INFO
-			       "qla1x160: Skip AMI SubSys Vendor ID Chip\n");
-			continue;
-		}
-
-		if (pci_enable_device(pdev))
-			goto find_devices;
-
-		host = qla1280_do_device_init(pdev, template, devnum,
-					      bdp, num_hosts);
-		if (!host)
-			continue;
-		ha = (struct scsi_qla_host *)host->hostdata;
-
-		/* this preferred device will always be the first one found */
-		cur_ha = qla1280_hostlist = ha;
-		num_hosts++;
-	}
-
- find_devices:
-
-	pdev = NULL;
-	/* Try and find each different type of adapter we support */
-	for (devnum = 0; bdp->device_id != 0 && devnum < NUM_OF_ISP_DEVICES;
-	     devnum++, bdp++) {
-		/* PCI_SUBSYSTEM_IDS supported */
-		while ((pdev = pci_find_subsys(PCI_VENDOR_ID_QLOGIC,
-					       bdp->device_id, PCI_ANY_ID,
-					       PCI_ANY_ID, pdev))) {
-			if (pci_enable_device(pdev))
-				continue;
-			/* found an adapter */
-			subsys_vendor = pdev->subsystem_vendor;
-			subsys_device = pdev->subsystem_device;
-
-			/*
-			 * skip QLA12160 already initialized on
-			 * PCI Bus 1 Dev 2 since we already initialized
-			 * and presented it
-			 */
-			if ((bdp->device_id == PCI_DEVICE_ID_QLOGIC_ISP12160)&&
-			    (pdev->bus->number == 1) &&
-			    (PCI_SLOT(pdev->devfn) == 2))
-				continue;
-
-			/* Bypass all AMI SUBSYS VENDOR IDs */
-			if (subsys_vendor == PCI_VENDOR_ID_AMI) {
-				printk(KERN_INFO
-				       "qla1x160: Skip AMI SubSys Vendor ID Chip\n");
-				continue;
-			}
-			dprintk(1, "qla1x160: Supported Device Found VID=%x "
-			       "DID=%x SSVID=%x SSDID=%x\n", pdev->vendor,
-			       pdev->device, subsys_vendor, subsys_device);
-
-			host = qla1280_do_device_init(pdev, template,
-						      devnum, bdp, num_hosts);
-			if (!host)
-				continue;
-			ha = (struct scsi_qla_host *)host->hostdata;
-
-			if (qla1280_hostlist == NULL) {
-				cur_ha = qla1280_hostlist = ha;
-			} else {
-				cur_ha = qla1280_hostlist;
-				while (cur_ha->next != NULL)
-					cur_ha = cur_ha->next;
-				cur_ha->next = ha;
-			}
-			num_hosts++;
-		}		/* end of WHILE */
-	}			/* end of FOR */
-
-	LEAVE("qla1280_detect");
-	return num_hosts;
-}
-
-/**************************************************************************
- *   qla1280_release
- *   Free the passed in Scsi_Host memory structures prior to unloading the
- *   module.
- **************************************************************************/
-static int
-qla1280_release(struct Scsi_Host *host)
-{
-	struct scsi_qla_host *ha = (struct scsi_qla_host *)host->hostdata;
-
-	ENTER("qla1280_release");
-
-	if (!ha->flags.online)
-		return 0;
-
-	/* turn-off interrupts on the card */
-	WRT_REG_WORD(&ha->iobase->ictrl, 0);
-
-	/* Detach interrupts */
-	if (host->irq)
-		free_irq(host->irq, ha);
-
-#if MEMORY_MAPPED_IO
-	if (ha->mmpbase)
-		iounmap(ha->mmpbase);
-#else
-	/* release io space registers  */
-	if (host->io_port)
-		release_region(host->io_port, 0xff);
-#endif				/* MEMORY_MAPPED_IO */
-
-	qla1280_mem_free(ha);
-
-	ENTER("qla1280_release");
-	return 0;
-}
-
 /**************************************************************************
  *   qla1280_info
  *     Return a string describing the driver.
@@ -1197,11 +833,11 @@
 	ha = (struct scsi_qla_host *)host->hostdata;
 	bdp = &ql1280_board_tbl[ha->devnum];
 	memset(bp, 0, sizeof(qla1280_scsi_name_buffer));
+
 	sprintf (bp,
-		 "QLogic %s PCI to SCSI Host Adapter: bus %d device %d irq %d\n"
+		 "QLogic %s PCI to SCSI Host Adapter\n"
 		 "       Firmware version: %2d.%02d.%02d, Driver version %s",
-		 &bdp->name[0], ha->pci_bus, (ha->pci_device_fn & 0xf8) >> 3,
-		 host->irq, bdp->fwver[0], bdp->fwver[1], bdp->fwver[2],
+		 &bdp->name[0], bdp->fwver[0], bdp->fwver[1], bdp->fwver[2],
 		 QLA1280_VERSION);
 	return bp;
 }
@@ -1220,38 +856,19 @@
 static int
 qla1280_queuecommand(Scsi_Cmnd * cmd, void (*fn) (Scsi_Cmnd *))
 {
-	struct scsi_qla_host *ha;
-	struct srb *sp;
-	struct Scsi_Host *host;
-	int bus, target, lun;
-	int status;
-
-	/*ENTER("qla1280_queuecommand");
-	 */
-	dprintk(2, "qla1280_queuecommand(): jiffies %li\n", jiffies);
-
-	host = CMD_HOST(cmd);
-	ha = (struct scsi_qla_host *)host->hostdata;
+	struct Scsi_Host *host = cmd->device->host;
+	struct scsi_qla_host *ha = (struct scsi_qla_host *)host->hostdata;
+	struct srb *sp = (struct srb *)&cmd->SCp;
 
-	/* send command to adapter */
-	sp = (struct srb *)CMD_SP(cmd);
-	sp->cmd = cmd;
 	cmd->scsi_done = fn;
+	sp->cmd = cmd;
 	sp->flags = 0;
 
 	qla1280_print_scsi_cmd(5, cmd);
 
-	/* Generate LU queue on bus, target, LUN */
-	bus = SCSI_BUS_32(cmd);
-	target = SCSI_TCN_32(cmd);
-	lun = SCSI_LUN_32(cmd);
 	if (ha->flags.enable_64bit_addressing)
-		status = qla1280_64bit_start_scsi(ha, sp);
-	else
-		status = qla1280_32bit_start_scsi(ha, sp);
-
-	/*LEAVE("qla1280_queuecommand"); */
-	return status;
+		return qla1280_64bit_start_scsi(ha, sp);
+	return qla1280_32bit_start_scsi(ha, sp);
 }
 
 enum action {
@@ -1564,29 +1181,105 @@
 	unsigned long capacity = disk->capacity;
 #endif
 
-	heads = 64;
-	sectors = 32;
-	cylinders = (unsigned long)capacity / (heads * sectors);
-	if (cylinders > 1024) {
-		heads = 255;
-		sectors = 63;
-		cylinders = (unsigned long)capacity / (heads * sectors);
-		/* if (cylinders > 1023)
-		   cylinders = 1023; */
+	heads = 64;
+	sectors = 32;
+	cylinders = (unsigned long)capacity / (heads * sectors);
+	if (cylinders > 1024) {
+		heads = 255;
+		sectors = 63;
+		cylinders = (unsigned long)capacity / (heads * sectors);
+		/* if (cylinders > 1023)
+		   cylinders = 1023; */
+	}
+
+	geom[0] = heads;
+	geom[1] = sectors;
+	geom[2] = cylinders;
+
+	return 0;
+}
+
+#if LINUX_VERSION_CODE < 0x020600
+static int
+qla1280_detect(Scsi_Host_Template *template)
+{
+	struct pci_device_id *id = &qla1280_pci_tbl[0];
+	struct pci_dev *pdev = NULL;
+	int num_hosts = 0;
+
+	if (sizeof(struct srb) > sizeof(Scsi_Pointer)) {
+		printk(KERN_WARNING
+		       "qla1280: struct srb too big, aborting\n");
+		return 0;
+	}
+
+#ifdef MODULE
+	/*
+	 * If we are called as a module, the qla1280 pointer may not be null
+	 * and it would point to our bootup string, just like on the lilo
+	 * command line.  IF not NULL, then process this config string with
+	 * qla1280_setup
+	 *
+	 * Boot time Options
+	 * To add options at boot time add a line to your lilo.conf file like:
+	 * append="qla1280=verbose,max_tags:{{255,255,255,255},{255,255,255,255}}"
+	 * which will result in the first four devices on the first two
+	 * controllers being set to a tagged queue depth of 32.
+	 */
+	if (qla1280)
+		qla1280_setup(qla1280);
+#endif
+
+	/* First Initialize QLA12160 on PCI Bus 1 Dev 2 */
+	while ((pdev = pci_find_device(id->vendor, id->device, pdev))) {
+		if (pdev->bus->number == 1 && PCI_SLOT(pdev->devfn) == 2) {
+			if (!qla1280_probe_one(pdev, id))
+				num_hosts++;
+		}
+	}
+
+	pdev = NULL;
+	/* Try and find each different type of adapter we support */
+	for (id = &qla1280_pci_tbl[0]; id->device; id++) {
+		while ((pdev = pci_find_device(id->vendor, id->device, pdev))) {
+			/*
+			 * skip QLA12160 already initialized on
+			 * PCI Bus 1 Dev 2 since we already initialized
+			 * and presented it
+			 */
+			if (id->device == PCI_DEVICE_ID_QLOGIC_ISP12160 &&
+			    pdev->bus->number == 1 &&
+			    PCI_SLOT(pdev->devfn) == 2)
+				continue;
+
+			if (!qla1280_probe_one(pdev, id))
+				num_hosts++;
+		}
 	}
 
-	geom[0] = heads;
-	geom[1] = sectors;
-	geom[2] = cylinders;
+	return num_hosts;
+}
+
+/*
+ * This looks a bit ugly as we could just pass down host to
+ * qla1280_remove_one, but I want to keep qla1280_release purely a wrapper
+ * around pci_driver::remove as used from 2.6 onwards.
+ */
+static int
+qla1280_release(struct Scsi_Host *host)
+{
+	struct scsi_qla_host *ha = (struct scsi_qla_host *)host->hostdata;
 
+	qla1280_remove_one(ha->pdev);
 	return 0;
 }
+#endif
 
 /**************************************************************************
  * qla1280_intr_handler
  *   Handles the H/W interrupt
  **************************************************************************/
-irqreturn_t
+static irqreturn_t
 qla1280_intr_handler(int irq, void *dev_id, struct pt_regs *regs)
 {
 	struct scsi_qla_host *ha;
@@ -1624,7 +1317,7 @@
 
 
 static int
-qla12160_set_target_parameters(struct scsi_qla_host *ha, int bus, int target)
+qla1280_set_target_parameters(struct scsi_qla_host *ha, int bus, int target)
 {
 	uint8_t mr;
 	uint16_t mb[MAILBOX_REGISTER_COUNT];
@@ -1633,8 +1326,8 @@
 
 	nv = &ha->nvram;
 
-	if (ha->device_id == PCI_DEVICE_ID_QLOGIC_ISP12160 ||
-	    ha->device_id == PCI_DEVICE_ID_QLOGIC_ISP10160)
+	if (ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP12160 ||
+	    ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP10160)
 		is1x160 = 1;
 	else
 		is1x160 = 0;
@@ -1721,8 +1414,8 @@
 	    (driver_setup.wide_mask &&
 	     (~driver_setup.wide_mask & (1 << target))))
 		nv->bus[bus].target[target].parameter.f.enable_wide = 0;
-	if (ha->device_id == PCI_DEVICE_ID_QLOGIC_ISP12160 ||
-	    ha->device_id == PCI_DEVICE_ID_QLOGIC_ISP10160) {
+	if (ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP12160 ||
+	    ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP10160) {
 		if (driver_setup.no_ppr ||
 		    (driver_setup.ppr_mask &&
 		     (~driver_setup.ppr_mask & (1 << target))))
@@ -1730,11 +1423,9 @@
 	}
 
 	spin_lock_irqsave(HOST_LOCK, flags);
-	if (nv->bus[bus].target[target].parameter.f.enable_sync) {
-		status = qla12160_set_target_parameters(ha, bus, target);
-	}
-
-	qla12160_get_target_parameters(ha, device);
+	if (nv->bus[bus].target[target].parameter.f.enable_sync)
+		status = qla1280_set_target_parameters(ha, bus, target);
+	qla1280_get_target_parameters(ha, device);
 	spin_unlock_irqrestore(HOST_LOCK, flags);
 	return status;
 }
@@ -1761,16 +1452,11 @@
 
 	if (scsi_devs)
 		qla1280_check_for_dead_scsi_bus(ha, scsi_devs->channel);
-
 	LEAVE("qla1280_select_queue_depth");
 }
 #endif
 
 /*
- * Driver Support Routines
- */
-
-/*
  * qla1280_done
  *      Process completed commands.
  *
@@ -1972,100 +1658,19 @@
 	LEAVE("qla1280_put_done_q");
 }
 
-
-/*
-* qla1280_mem_alloc
-*      Allocates adapter memory.
-*
-* Returns:
-*      0  = success.
-*      1  = failure.
-*/
-static int
-qla1280_mem_alloc(struct scsi_qla_host *ha)
-{
-	int status = 1;
-	dma_addr_t dma_handle;
-
-	ENTER("qla1280_mem_alloc");
-
-	/* get consistent memory allocated for request and response rings */
-	ha->request_ring = pci_alloc_consistent(ha->pdev,
-						((REQUEST_ENTRY_CNT + 1) *
-						 (sizeof(request_t))),
-						&dma_handle);
-	if (!ha->request_ring)
-		goto error;
-	ha->request_dma = dma_handle;
-	ha->response_ring = pci_alloc_consistent(ha->pdev,
-						 ((RESPONSE_ENTRY_CNT + 1) *
-						  (sizeof(struct response))),
-						 &dma_handle);
-	if (!ha->response_ring)
-		goto error;
-	ha->response_dma = dma_handle;
-	status = 0;
-	goto finish;
-
- error:
-	if (status)
-		dprintk(2, "qla1280_mem_alloc: **** FAILED ****\n");
-
-	if (ha->request_ring)
-		pci_free_consistent(ha->pdev,
-                                    ((REQUEST_ENTRY_CNT + 1) *
-				     (sizeof(request_t))),
-                                    ha->request_ring, ha->request_dma);
- finish:
-	LEAVE("qla1280_mem_alloc");
-	return status;
-}
-
-/*
- * qla1280_mem_free
- *      Frees adapter allocated memory.
- *
- * Input:
- *      ha = adapter block pointer.
- */
-static void
-qla1280_mem_free(struct scsi_qla_host *ha)
-{
-	ENTER("qlc1280_mem_free");
-	/* free consistent memory allocated for request and response rings */
-	if (ha->request_ring)
-		pci_free_consistent(ha->pdev,
-				    ((REQUEST_ENTRY_CNT + 1) *
-				     (sizeof(request_t))),
-				    ha->request_ring, ha->request_dma);
-
-	if (ha->response_ring)
-		pci_free_consistent(ha->pdev,
-				    ((RESPONSE_ENTRY_CNT + 1) *
-				     (sizeof(struct response))),
-				    ha->response_ring, ha->response_dma);
-
-	if (qla1280_buffer) {
-		free_page((unsigned long) qla1280_buffer);
-		qla1280_buffer = NULL;
-	}
-
-	LEAVE("qlc1280_mem_free");
-}
-
 /****************************************************************************/
 /*                QLogic ISP1280 Hardware Support Functions.                */
 /****************************************************************************/
 
  /*
-    * qla2100_enable_intrs
-    * qla2100_disable_intrs
-    *
-    * Input:
-    *      ha = adapter block pointer.
-    *
-    * Returns:
-    *      None
+  * qla2100_enable_intrs
+  * qla2100_disable_intrs
+  *
+  * Input:
+  *      ha = adapter block pointer.
+  *
+  * Returns:
+  *      None
   */
 static inline void
 qla1280_enable_intrs(struct scsi_qla_host *ha)
@@ -2101,7 +1706,7 @@
  * Returns:
  *      0 = success
  */
-static int
+static int __devinit
 qla1280_initialize_adapter(struct scsi_qla_host *ha)
 {
 	struct device_reg *reg;
@@ -2297,7 +1902,7 @@
  * Returns:
  *      0 = success.
  */
-static int
+static int __devinit
 qla1280_pci_config(struct scsi_qla_host *ha)
 {
 #if MEMORY_MAPPED_IO
@@ -2724,8 +2329,8 @@
 
 	ENTER("qla1280_nvram_config");
 
-	if (ha->device_id == PCI_DEVICE_ID_QLOGIC_ISP12160 ||
-	    ha->device_id == PCI_DEVICE_ID_QLOGIC_ISP10160)
+	if (ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP12160 ||
+	    ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP10160)
 		is1x160 = 1;
 	else
 		is1x160 = 0;
@@ -4207,48 +3812,6 @@
 	LEAVE("qla1280_isp_cmd");
 }
 
-#if QL1280_LUN_SUPPORT
-/*
- * qla1280_enable_lun
- *      Issue enable LUN entry IOCB.
- *
- * Input:
- *      ha  = adapter block pointer.
- *      bus = SCSI BUS number.
- *      lun  = LUN number.
- */
-static void
-qla1280_enable_lun(struct scsi_qla_host *ha, int bus, int lun)
-{
-	struct elun_entry *pkt;
-
-	ENTER("qla1280_enable_lun");
-
-	/* Get request packet. */
-	/*
-	  if (pkt = (struct elun_entry *)qla1280_req_pkt(ha))
-	  {
-	  pkt->entry_type = ENABLE_LUN_TYPE;
-	  pkt->lun = cpu_to_le16(bus ? lun | BIT_15 : lun);
-	  pkt->command_count = 32;
-	  pkt->immed_notify_count = 1;
-	  pkt->group_6_length = MAX_CMDSZ;
-	  pkt->group_7_length = MAX_CMDSZ;
-	  pkt->timeout = cpu_to_le16(0x30);
-
-	  qla1280_isp_cmd(ha);
-	  }
-	*/
-	pkt = (struct elun_entry *) 1;
-
-	if (!pkt)
-		dprintk(2, "qla1280_enable_lun: **** FAILED ****\n");
-	else
-		dprintk(3, "qla1280_enable_lun: exiting normally\n");
-}
-#endif
-
-
 /****************************************************************************/
 /*                        Interrupt Service Routine.                        */
 /****************************************************************************/
@@ -4894,7 +4457,7 @@
 }
 
 static void
-qla12160_get_target_parameters(struct scsi_qla_host *ha, Scsi_Device *device)
+qla1280_get_target_parameters(struct scsi_qla_host *ha, Scsi_Device *device)
 {
 	uint16_t mb[MAILBOX_REGISTER_COUNT];
 	int bus, target, lun;
@@ -5136,34 +4699,274 @@
 	return ret;
 }
 
-
-static Scsi_Host_Template driver_template = {
-	.proc_info		= qla1280_proc_info,
+static Scsi_Host_Template qla1280_driver_template = {
+	.proc_name		= "qla1280",
 	.name			= "Qlogic ISP 1280/12160",
+#if LINUX_VERSION_CODE >= 0x020545
+	.slave_configure	= qla1280_slave_configure,
+#else
 	.detect			= qla1280_detect,
 	.release		= qla1280_release,
+#endif
 	.info			= qla1280_info,
 	.queuecommand		= qla1280_queuecommand,
-#if LINUX_VERSION_CODE >= 0x020545
-	.slave_configure	= qla1280_slave_configure,
-#endif
 	.eh_abort_handler	= qla1280_eh_abort,
 	.eh_device_reset_handler= qla1280_eh_device_reset,
 	.eh_bus_reset_handler	= qla1280_eh_bus_reset,
 	.eh_host_reset_handler	= qla1280_eh_adapter_reset,
 	.bios_param		= qla1280_biosparam,
-	.can_queue		= 255,
+	.proc_info		= qla1280_proc_info,
+	.can_queue		= 0xfffff,
 	.this_id		= -1,
 	.sg_tablesize		= SG_ALL,
-	.cmd_per_lun		= 3,
+	.cmd_per_lun		= 1,
 	.use_clustering		= ENABLE_CLUSTERING,
 #if LINUX_VERSION_CODE < 0x020545
 	.use_new_eh_code	= 1,
 #endif
 };
 
-#include "scsi_module.c"
+static int __devinit
+qla1280_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
+{
+	int devnum = id->driver_data;
+	struct qla_boards *bdp = &ql1280_board_tbl[devnum];
+	struct Scsi_Host *host;
+	struct scsi_qla_host *ha;
+	int error = -ENODEV;
+
+	/* Bypass all AMI SUBSYS VENDOR IDs */
+	if (pdev->subsystem_vendor == PCI_VENDOR_ID_AMI) {
+		printk(KERN_INFO
+		       "qla1280: Skipping AMI SubSys Vendor ID Chip\n");
+		goto error;
+	}
+
+	printk(KERN_INFO "qla1280: %s found on PCI bus %i, dev %i\n",
+	       bdp->name, pdev->bus->number, PCI_SLOT(pdev->devfn));
+
+	if (pci_enable_device(pdev)) {
+		printk(KERN_WARNING
+		       "qla1280: Failed to enabled pci device, aborting.\n");
+		goto error;
+	}
+
+	error = -ENOMEM;
+	host = scsi_host_alloc(&qla1280_driver_template, sizeof(*ha));
+	if (!host) {
+		printk(KERN_WARNING
+		       "qla1280: Failed to register host, aborting.\n");
+		goto error;
+	}
+
+	ha = (struct scsi_qla_host *)host->hostdata;
+	memset(ha, 0, sizeof(struct scsi_qla_host));
+
+	ha->pdev = pdev;
+	ha->devnum = devnum;	/* specifies microcode load address */
+
+	ha->request_ring = pci_alloc_consistent(ha->pdev,
+			((REQUEST_ENTRY_CNT + 1) * (sizeof(request_t))),
+			&ha->request_dma);
+	if (!ha->request_ring) {
+		printk(KERN_INFO "qla1280: Failed to get request memory\n");
+		goto error_put_host;
+	}
+
+	ha->response_ring = pci_alloc_consistent(ha->pdev,
+			((RESPONSE_ENTRY_CNT + 1) * (sizeof(struct response))),
+			&ha->response_dma);
+	if (!ha->response_ring) {
+		printk(KERN_INFO "qla1280: Failed to get response memory\n");
+		goto error_free_request_ring;
+	}
+
+	ha->ports = bdp->numPorts;
+
+	ha->host = host;
+	ha->host_no = host->host_no;
+
+	host->irq = pdev->irq;
+	host->base = (unsigned long)ha->mmpbase;
+	host->max_channel = bdp->numPorts - 1;
+	host->max_lun = MAX_LUNS - 1;
+	host->max_id = MAX_TARGETS;
+	host->max_sectors = 1024;
+	host->unique_id = host->host_no;
+
+#if LINUX_VERSION_CODE < 0x020545
+	host->select_queue_depths = qla1280_select_queue_depth;
+#endif
+
+	error = -ENODEV;
+	if (qla1280_pci_config(ha)) {
+		printk(KERN_INFO "qla1280: Unable to configure PCI\n");
+		goto error_free_response_ring;
+	}
+
+	/* Disable ISP interrupts. */
+	qla1280_disable_intrs(ha);
+
+	/* Register the IRQ with Linux (sharable) */
+	if (request_irq(pdev->irq, qla1280_intr_handler, SA_SHIRQ,
+				"qla1280", ha)) {
+		printk("qla1280 : Failed to reserve interrupt %d already "
+		       "in use\n", pdev->irq);
+		goto error_iounmap;
+	}
+
+#if !MEMORY_MAPPED_IO
+	/* Register the I/O space with Linux */
+	if (!request_region(host->io_port, 0xff, "qla1280")) {
+		printk("qla1280: Failed to reserve i/o region 0x%04lx-0x%04lx"
+		       " already in use\n",
+		       host->io_port, host->io_port + 0xff);
+		goto error_free_irq;
+	}
+#endif
+
+	/* load the F/W, read paramaters, and init the H/W */
+	if (qla1280_initialize_adapter(ha)) {
+		printk(KERN_INFO "qla1x160: Failed to initialize adapter\n");
+		goto error_release_region;
+	}
+
+	/* set our host ID  (need to do something about our two IDs) */
+	host->this_id = ha->bus_settings[0].id;
+
+	pci_set_drvdata(pdev, host);
+
+#if LINUX_VERSION_CODE >= 0x020600
+	error = scsi_add_host(host, &pdev->dev);
+	if (error)
+		goto error_disable_adapter;
+	scsi_scan_host(host);
+#else
+	scsi_set_pci_device(host, pdev);
+#endif
+
+	return 0;
+
+#if LINUX_VERSION_CODE >= 0x020600
+ error_disable_adapter:
+	WRT_REG_WORD(&ha->iobase->ictrl, 0);
+#endif
+ error_release_region:
+#if !MEMORY_MAPPED_IO
+	release_region(host->io_port, 0xff);
+ error_free_irq:
+#endif
+	free_irq(pdev->irq, ha);
+ error_iounmap:
+#if MEMORY_MAPPED_IO
+	iounmap((void *)(((unsigned long) ha->mmpbase) & PAGE_MASK));
+#endif
+ error_free_response_ring:
+	pci_free_consistent(ha->pdev,
+			((RESPONSE_ENTRY_CNT + 1) * (sizeof(struct response))),
+			ha->response_ring, ha->response_dma);
+ error_free_request_ring:
+	pci_free_consistent(ha->pdev,
+			((REQUEST_ENTRY_CNT + 1) * (sizeof(request_t))),
+			ha->request_ring, ha->request_dma);
+ error_put_host:
+	scsi_host_put(host);
+ error:
+	return error;
+}
+
+/*
+ * Older ia64 toolchains have problems with relative links when this
+ * goes into the .exit.text section
+ */
+#if !defined(CONFIG_QLA1280_MODULE) && defined(__ia64__) && (__GNUC__ == 2)
+static void
+#else
+static void __devexit
+#endif
+qla1280_remove_one(struct pci_dev *pdev)
+{
+	struct Scsi_Host *host = pci_get_drvdata(pdev);
+	struct scsi_qla_host *ha = (struct scsi_qla_host *)host->hostdata;
+
+#if LINUX_VERSION_CODE >= 0x020600
+	scsi_remove_host(host);
+#endif
+
+	WRT_REG_WORD(&ha->iobase->ictrl, 0);
+
+	free_irq(pdev->irq, ha);
+
+#if MEMORY_MAPPED_IO
+	iounmap(ha->mmpbase);
+#else
+	release_region(host->io_port, 0xff);
+#endif
+
+	pci_free_consistent(ha->pdev,
+			((REQUEST_ENTRY_CNT + 1) * (sizeof(request_t))),
+			ha->request_ring, ha->request_dma);
+	pci_free_consistent(ha->pdev,
+			((RESPONSE_ENTRY_CNT + 1) * (sizeof(struct response))),
+			ha->response_ring, ha->response_dma);
+
+	scsi_host_put(host);
+}
+
+#if LINUX_VERSION_CODE >= 0x020600
+static struct pci_driver qla1280_pci_driver = {
+	.name		= "qla1280",
+	.id_table	= qla1280_pci_tbl,
+	.probe		= qla1280_probe_one,
+	.remove		= __devexit_p(qla1280_remove_one),
+};
+
+static int __init
+qla1280_init(void)
+{
+	if (sizeof(struct srb) > sizeof(Scsi_Pointer)) {
+		printk(KERN_WARNING
+		       "qla1280: struct srb too big, aborting\n");
+		return -EINVAL;
+	}
+
+#ifdef MODULE
+	/*
+	 * If we are called as a module, the qla1280 pointer may not be null
+	 * and it would point to our bootup string, just like on the lilo
+	 * command line.  IF not NULL, then process this config string with
+	 * qla1280_setup
+	 *
+	 * Boot time Options
+	 * To add options at boot time add a line to your lilo.conf file like:
+	 * append="qla1280=verbose,max_tags:{{255,255,255,255},{255,255,255,255}}"
+	 * which will result in the first four devices on the first two
+	 * controllers being set to a tagged queue depth of 32.
+	 */
+	if (qla1280)
+		qla1280_setup(qla1280);
+#endif
+
+	return pci_module_init(&qla1280_pci_driver);
+}
 
+static void __exit
+qla1280_exit(void)
+{
+	pci_unregister_driver(&qla1280_pci_driver);
+}
+
+module_init(qla1280_init);
+module_exit(qla1280_exit);
+
+#else
+# define driver_template qla1280_driver_template
+# include "scsi_module.c"
+#endif
+
+MODULE_AUTHOR("Qlogic & Jes Sorensen");
+MODULE_DESCRIPTION("Qlogic ISP SCSI (qla1x80/qla1x160) driver");
+MODULE_LICENSE("GPL");
 
 /*
  * Overrides for Emacs so that we almost follow Linus's tabbing style.
--- diff/drivers/scsi/qla1280.h	2003-09-30 15:46:17.000000000 +0100
+++ source/drivers/scsi/qla1280.h	2003-12-29 09:30:41.000000000 +0000
@@ -1021,11 +1021,7 @@
 
 	unsigned char *mmpbase;	/* memory mapped address */
 	unsigned long host_no;
-	unsigned long instance;
 	struct pci_dev *pdev;
-	uint32_t device_id;
-	uint8_t pci_bus;
-	uint8_t pci_device_fn;
 	uint8_t devnum;
 	uint8_t revision;
 	uint8_t ports;
@@ -1040,18 +1036,9 @@
 	/* BUS configuration data */
 	struct bus_param bus_settings[MAX_BUSES];
 
-#if 0
-	/* bottom half run queue */
-	struct tq_struct run_qla_bh;
-#endif
-
 	/* Received ISP mailbox data. */
 	volatile uint16_t mailbox_out[MAILBOX_REGISTER_COUNT];
 
-#ifdef UNUSED
-	struct timer_list dev_timer[MAX_TARGETS];
-#endif
-
 	dma_addr_t request_dma;		/* Physical Address */
 	request_t *request_ring;	/* Base virtual address */
 	request_t *request_ring_ptr;	/* Current address. */
@@ -1063,15 +1050,6 @@
 	struct response *response_ring_ptr;	/* Current address. */
 	uint16_t rsp_ring_index;	/* Current index. */
 
-#if WATCHDOGTIMER
-	/* Watchdog queue, lock and total timer */
-	uint8_t watchdog_q_lock;	/* Lock for watchdog queue */
-	struct srb *wdg_q_first;	/* First job on watchdog queue */
-	struct srb *wdg_q_last;	/* Last job on watchdog queue */
-	uint32_t total_timeout;	/* Total timeout (quantum count) */
-	uint32_t watchdogactive;
-#endif
-
 	struct srb *done_q_first;	/* First job on done queue */
 	struct srb *done_q_last;	/* Last job on done queue */
 
--- diff/drivers/scsi/sd.c	2003-10-27 09:20:43.000000000 +0000
+++ source/drivers/scsi/sd.c	2003-12-29 09:30:41.000000000 +0000
@@ -62,6 +62,7 @@
  */
 #define SD_MAJORS	16
 #define SD_DISKS	(SD_MAJORS << 4)
+#define TOTAL_SD_DISKS	CONFIG_MAX_SD_DISKS
 
 /*
  * Time out in seconds for disks and Magneto-opticals (which are slower).
@@ -95,7 +96,7 @@
 };
 
 
-static unsigned long sd_index_bits[SD_DISKS / BITS_PER_LONG];
+static unsigned long sd_index_bits[TOTAL_SD_DISKS / BITS_PER_LONG];
 static spinlock_t sd_index_lock = SPIN_LOCK_UNLOCKED;
 
 static int sd_revalidate_disk(struct gendisk *disk);
@@ -130,6 +131,9 @@
 		return SCSI_DISK1_MAJOR + major_idx - 1;
 	case 8 ... 15:
 		return SCSI_DISK8_MAJOR + major_idx - 8;
+#define MAX_IDX        (TOTAL_SD_DISKS >> 4)
+	case 16 ... MAX_IDX:
+		return SCSI_DISK15_MAJOR;
 	default:
 		BUG();
 		return 0;	/* shut up gcc */
@@ -378,9 +382,9 @@
  *	In the latter case @inode and @filp carry an abridged amount
  *	of information as noted above.
  **/
-static int sd_open(struct inode *inode, struct file *filp)
+static int sd_open(struct block_device *bdev, struct file *filp)
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
+	struct gendisk *disk = bdev->bd_disk;
 	struct scsi_disk *sdkp = scsi_disk(disk);
 	struct scsi_device *sdev;
 	int retval;
@@ -402,7 +406,7 @@
 		goto error_out;
 
 	if (sdev->removable || sdkp->write_prot)
-		check_disk_change(inode->i_bdev);
+		check_disk_change(bdev);
 
 	/*
 	 * If the drive is empty, just let the open fail.
@@ -453,9 +457,8 @@
  *	Note: may block (uninterruptible) if error recovery is underway
  *	on this disk.
  **/
-static int sd_release(struct inode *inode, struct file *filp)
+static int sd_release(struct gendisk *disk)
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
 	struct scsi_disk *sdkp = scsi_disk(disk);
 	struct scsi_device *sdev = sdkp->device;
 
@@ -518,10 +521,9 @@
  *	Note: most ioctls are forward onto the block subsystem or further
  *	down in the scsi subsytem.
  **/
-static int sd_ioctl(struct inode * inode, struct file * filp, 
+static int sd_ioctl(struct block_device *bdev, struct file *filp,
 		    unsigned int cmd, unsigned long arg)
 {
-	struct block_device *bdev = inode->i_bdev;
 	struct gendisk *disk = bdev->bd_disk;
 	struct scsi_device *sdp = scsi_disk(disk)->device;
 	int error;
@@ -1320,8 +1322,8 @@
 		goto out_free;
 
 	spin_lock(&sd_index_lock);
-	index = find_first_zero_bit(sd_index_bits, SD_DISKS);
-	if (index == SD_DISKS) {
+	index = find_first_zero_bit(sd_index_bits, TOTAL_SD_DISKS);
+	if (index == TOTAL_SD_DISKS) {
 		spin_unlock(&sd_index_lock);
 		error = -EBUSY;
 		goto out_put;
@@ -1336,15 +1338,24 @@
 	sdkp->openers = 0;
 
 	gd->major = sd_major(index >> 4);
-	gd->first_minor = (index & 15) << 4;
+	if (index > SD_DISKS)
+		gd->first_minor = ((index - SD_DISKS) & 15) << 4;
+	else
+		gd->first_minor = (index & 15) << 4;
 	gd->minors = 16;
 	gd->fops = &sd_fops;
 
-	if (index >= 26) {
+	if (index < 26) {
+		sprintf(gd->disk_name, "sd%c", 'a' + index % 26);
+	} else if (index < (26*27)) {
 		sprintf(gd->disk_name, "sd%c%c",
 			'a' + index/26-1,'a' + index % 26);
 	} else {
-		sprintf(gd->disk_name, "sd%c", 'a' + index % 26);
+		const unsigned int m1 = (index/ 26 - 1) / 26 - 1;
+		const unsigned int m2 = (index / 26 - 1) % 26;
+		const unsigned int m3 = index % 26;
+		sprintf(gd->disk_name, "sd%c%c%c",
+			'a' + m1, 'a' + m2, 'a' + m3);
 	}
 
 	strcpy(gd->devfs_name, sdp->devfs_name);
--- diff/drivers/scsi/sg.c	2003-11-25 15:24:58.000000000 +0000
+++ source/drivers/scsi/sg.c	2003-12-29 09:30:41.000000000 +0000
@@ -1118,7 +1118,7 @@
 }
 
 static struct page *
-sg_vma_nopage(struct vm_area_struct *vma, unsigned long addr, int unused)
+sg_vma_nopage(struct vm_area_struct *vma, unsigned long addr, int *type)
 {
 	Sg_fd *sfp;
 	struct page *page = NOPAGE_SIGBUS;
@@ -1158,6 +1158,8 @@
 		page = virt_to_page(page_ptr);
 		get_page(page);	/* increment page count */
 	}
+	if (type)
+		*type = VM_FAULT_MINOR;
 	return page;
 }
 
@@ -2974,3 +2976,4 @@
 
 module_init(init_sg);
 module_exit(exit_sg);
+MODULE_ALIAS_CHARDEV_MAJOR(SCSI_GENERIC_MAJOR);
--- diff/drivers/scsi/sr.c	2003-10-27 09:20:43.000000000 +0000
+++ source/drivers/scsi/sr.c	2003-12-29 09:30:41.000000000 +0000
@@ -67,7 +67,8 @@
 	(CDC_CLOSE_TRAY|CDC_OPEN_TRAY|CDC_LOCK|CDC_SELECT_SPEED| \
 	 CDC_SELECT_DISC|CDC_MULTI_SESSION|CDC_MCN|CDC_MEDIA_CHANGED| \
 	 CDC_PLAY_AUDIO|CDC_RESET|CDC_IOCTLS|CDC_DRIVE_STATUS| \
-	 CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_DVD_RAM|CDC_GENERIC_PACKET)
+	 CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_DVD_RAM|CDC_GENERIC_PACKET| \
+	 CDC_MRW|CDC_MRW_W|CDC_RAM)
 
 static int sr_probe(struct device *);
 static int sr_remove(struct device *);
@@ -413,22 +414,22 @@
 	return 1;
 }
 
-static int sr_block_open(struct inode *inode, struct file *file)
+static int sr_block_open(struct block_device *bdev, struct file *file)
 {
-	struct scsi_cd *cd = scsi_cd(inode->i_bdev->bd_disk);
-	return cdrom_open(&cd->cdi, inode, file);
+	struct scsi_cd *cd = scsi_cd(bdev->bd_disk);
+	return cdrom_open(&cd->cdi, bdev, file);
 }
 
-static int sr_block_release(struct inode *inode, struct file *file)
+static int sr_block_release(struct gendisk *disk)
 {
-	struct scsi_cd *cd = scsi_cd(inode->i_bdev->bd_disk);
-	return cdrom_release(&cd->cdi, file);
+	struct scsi_cd *cd = scsi_cd(disk);
+	return cdrom_release(&cd->cdi);
 }
 
-static int sr_block_ioctl(struct inode *inode, struct file *file, unsigned cmd,
-			  unsigned long arg)
+static int sr_block_ioctl(struct block_device *bdev, struct file *file,
+			  unsigned cmd, unsigned long arg)
 {
-	struct scsi_cd *cd = scsi_cd(inode->i_bdev->bd_disk);
+	struct scsi_cd *cd = scsi_cd(bdev->bd_disk);
 	struct scsi_device *sdev = cd->device;
 
         /*
@@ -440,7 +441,7 @@
                 case SCSI_IOCTL_GET_BUS_NUMBER:
                         return scsi_ioctl(sdev, cmd, (void *)arg);
 	}
-	return cdrom_ioctl(&cd->cdi, inode, cmd, arg);
+	return cdrom_ioctl(&cd->cdi, bdev, cmd, arg);
 }
 
 static int sr_block_media_changed(struct gendisk *disk)
@@ -692,7 +693,7 @@
 static void get_capabilities(struct scsi_cd *cd)
 {
 	unsigned char *buffer;
-	int rc, n;
+	int rc, n, mrw_write = 0, mrw = 1;
 	struct scsi_mode_data data;
 	struct scsi_request *SRpnt;
 	unsigned char cmd[MAX_COMMAND_SIZE];
@@ -765,6 +766,15 @@
 		printk("%s: scsi-1 drive\n", cd->cdi.name);
 		return;
 	}
+
+	if (cdrom_is_mrw(&cd->cdi, &mrw_write)) {
+		mrw = 0;
+		cd->cdi.mask |= CDC_MRW;
+		cd->cdi.mask |= CDC_MRW_W;
+	}
+	if (!mrw_write)
+		cd->cdi.mask |= CDC_MRW_W;
+
 	n = data.header_length + data.block_descriptor_length;
 	cd->cdi.speed = ((buffer[n + 8] << 8) + buffer[n + 9]) / 176;
 	cd->readcd_known = 1;
@@ -788,9 +798,7 @@
 	if ((buffer[n + 3] & 0x20) == 0) {
 		/* can't write DVD-RAM media */
 		cd->cdi.mask |= CDC_DVD_RAM;
-	} else {
-		cd->device->writeable = 1;
-	}
+	} else
 	if ((buffer[n + 3] & 0x10) == 0)
 		/* can't write DVD-R media */
 		cd->cdi.mask |= CDC_DVD_R;
@@ -814,6 +822,12 @@
 	/*else    I don't think it can close its tray
 		cd->cdi.mask |= CDC_CLOSE_TRAY; */
 
+	/*
+	 * if DVD-RAM of MRW-W, we are randomly writeable
+	 */
+	if ((cd->cdi.mask & (CDC_DVD_RAM | CDC_MRW_W)) != (CDC_DVD_RAM | CDC_MRW_W))
+		cd->device->writeable = 1;
+
 	scsi_release_request(SRpnt);
 	kfree(buffer);
 }
--- diff/drivers/scsi/sym53c8xx_2/sym53c8xx.h	2003-09-30 15:46:17.000000000 +0100
+++ source/drivers/scsi/sym53c8xx_2/sym53c8xx.h	2003-12-29 09:30:41.000000000 +0000
@@ -55,19 +55,7 @@
 
 #include <linux/config.h>
 
-/*
- *  Use normal IO if configured.
- *  Normal IO forced for alpha.
- *  Forced to MMIO for sparc.
- */
-#if defined(__alpha__)
-#define	SYM_CONF_IOMAPPED
-#elif defined(__sparc__)
-#undef SYM_CONF_IOMAPPED
-/* #elif defined(__powerpc__) */
-/* #define	SYM_CONF_IOMAPPED */
-/* #define SYM_OPT_NO_BUS_MEMORY_MAPPING */
-#elif defined(CONFIG_SCSI_SYM53C8XX_IOMAPPED)
+#ifdef CONFIG_SCSI_SYM53C8XX_IOMAPPED
 #define	SYM_CONF_IOMAPPED
 #endif
 
@@ -93,8 +81,6 @@
  */
 #if 1
 #define SYM_CONF_NVRAM_SUPPORT		(1)
-#define SYM_SETUP_SYMBIOS_NVRAM		(1)
-#define SYM_SETUP_TEKRAM_NVRAM		(1)
 #endif
 
 /*
--- diff/drivers/scsi/sym53c8xx_2/sym_fw.c	2003-09-17 12:28:10.000000000 +0100
+++ source/drivers/scsi/sym53c8xx_2/sym_fw.c	2003-12-29 09:30:41.000000000 +0000
@@ -89,9 +89,6 @@
 };
 static struct sym_fwz_ofs sym_fw1z_ofs = {
 	SYM_GEN_FW_Z(struct SYM_FWZ_SCR)
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-	SYM_GEN_Z(struct SYM_FWZ_SCR, start_ram)
-#endif
 };
 #undef	SYM_FWA_SCR
 #undef	SYM_FWB_SCR
@@ -122,10 +119,6 @@
 };
 static struct sym_fwz_ofs sym_fw2z_ofs = {
 	SYM_GEN_FW_Z(struct SYM_FWZ_SCR)
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-	SYM_GEN_Z(struct SYM_FWZ_SCR, start_ram)
-	SYM_GEN_Z(struct SYM_FWZ_SCR, start_ram64)
-#endif
 };
 #undef	SYM_FWA_SCR
 #undef	SYM_FWB_SCR
@@ -146,22 +139,10 @@
 {
 	struct sym_fw1a_scr *scripta0;
 	struct sym_fw1b_scr *scriptb0;
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-	struct sym_fw1z_scr *scriptz0 = 
-		(struct sym_fw1z_scr *) np->scriptz0;
-#endif
 
 	scripta0 = (struct sym_fw1a_scr *) np->scripta0;
 	scriptb0 = (struct sym_fw1b_scr *) np->scriptb0;
 
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-	/*
-	 *  Set up BUS physical address of SCRIPTS that is to 
-	 *  be copied to on-chip RAM by the SCRIPTS processor.
-	 */
-	scriptz0->scripta0_ba[0]	= cpu_to_scr(vtobus(scripta0));
-#endif
-
 	/*
 	 *  Remove LED support if not needed.
 	 */
@@ -199,25 +180,10 @@
 {
 	struct sym_fw2a_scr *scripta0;
 	struct sym_fw2b_scr *scriptb0;
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-	struct sym_fw2z_scr *scriptz0 = 
-		(struct sym_fw2z_scr *) np->scriptz0;
-#endif
 
 	scripta0 = (struct sym_fw2a_scr *) np->scripta0;
 	scriptb0 = (struct sym_fw2b_scr *) np->scriptb0;
 
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-	/*
-	 *  Set up BUS physical address of SCRIPTS that is to 
-	 *  be copied to on-chip RAM by the SCRIPTS processor.
-	 */
-	scriptz0->scripta0_ba64[0]	= /* Nothing is missing here */
-	scriptz0->scripta0_ba[0]	= cpu_to_scr(vtobus(scripta0));
-	scriptz0->scriptb0_ba64[0]	= cpu_to_scr(vtobus(scriptb0));
-	scriptz0->ram_seg64[0]		= np->scr_ram_seg;
-#endif
-
 	/*
 	 *  Remove LED support if not needed.
 	 */
--- diff/drivers/scsi/sym53c8xx_2/sym_fw.h	2002-10-16 04:28:23.000000000 +0100
+++ source/drivers/scsi/sym53c8xx_2/sym_fw.h	2003-12-29 09:30:41.000000000 +0000
@@ -113,10 +113,6 @@
 };
 struct sym_fwz_ofs {
 	SYM_GEN_FW_Z(u_short)
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-	SYM_GEN_Z(u_short, start_ram)
-	SYM_GEN_Z(u_short, start_ram64)
-#endif
 };
 
 /*
@@ -136,10 +132,6 @@
 };
 struct sym_fwz_ba {
 	SYM_GEN_FW_Z(u32)
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-	SYM_GEN_Z(u32, start_ram)
-	SYM_GEN_Z(u32, start_ram64)
-#endif
 };
 #undef	SYM_GEN_A
 #undef	SYM_GEN_B
--- diff/drivers/scsi/sym53c8xx_2/sym_fw1.h	2003-05-21 11:49:46.000000000 +0100
+++ source/drivers/scsi/sym53c8xx_2/sym_fw1.h	2003-12-29 09:30:41.000000000 +0000
@@ -234,10 +234,6 @@
 struct SYM_FWZ_SCR {
 	u32 snooptest		[  9];
 	u32 snoopend		[  2];
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-	u32 start_ram		[  1];
-	u32 scripta0_ba		[  4];
-#endif
 };
 
 static struct SYM_FWA_SCR SYM_FWA_SCR = {
@@ -1851,24 +1847,5 @@
 	 */
 	SCR_INT,
 		99,
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-	/*
-	 *  We may use MEMORY MOVE instructions to load the on chip-RAM,
-	 *  if it happens that mapping PCI memory is not possible.
-	 *  But writing the RAM from the CPU is the preferred method, 
-	 *  since PCI 2.2 seems to disallow PCI self-mastering.
-	 */
-}/*-------------------------< START_RAM >------------------------*/,{
-	/*
-	 *  Load the script into on-chip RAM, 
-	 *  and jump to start point.
-	 */
-	SCR_COPY (sizeof(struct SYM_FWA_SCR)),
-}/*-------------------------< SCRIPTA0_BA >----------------------*/,{
-		0,
-		PADDR_A (start),
-	SCR_JUMP,
-		PADDR_A (init),
-#endif /* SYM_OPT_NO_BUS_MEMORY_MAPPING */
 }/*--------------------------<>----------------------------------*/
 };
--- diff/drivers/scsi/sym53c8xx_2/sym_fw2.h	2003-05-21 11:49:46.000000000 +0100
+++ source/drivers/scsi/sym53c8xx_2/sym_fw2.h	2003-12-29 09:30:41.000000000 +0000
@@ -228,14 +228,6 @@
 struct SYM_FWZ_SCR {
 	u32 snooptest		[  6];
 	u32 snoopend		[  2];
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-	u32 start_ram		[  1];
-	u32 scripta0_ba		[  4];
-	u32 start_ram64		[  3];
-	u32 scripta0_ba64	[  3];
-	u32 scriptb0_ba64	[  6];
-	u32 ram_seg64		[  1];
-#endif
 };
 
 static struct SYM_FWA_SCR SYM_FWA_SCR = {
@@ -1944,51 +1936,5 @@
 	 */
 	SCR_INT,
 		99,
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-	/*
-	 *  We may use MEMORY MOVE instructions to load the on chip-RAM,
-	 *  if it happens that mapping PCI memory is not possible.
-	 *  But writing the RAM from the CPU is the preferred method, 
-	 *  since PCI 2.2 seems to disallow PCI self-mastering.
-	 */
-}/*-------------------------< START_RAM >------------------------*/,{
-	/*
-	 *  Load the script into on-chip RAM, 
-	 *  and jump to start point.
-	 */
-	SCR_COPY (sizeof(struct SYM_FWA_SCR)),
-}/*-------------------------< SCRIPTA0_BA >----------------------*/,{
-		0,
-		PADDR_A (start),
-	SCR_JUMP,
-		PADDR_A (init),
-}/*-------------------------< START_RAM64 >----------------------*/,{
-	/*
-	 *  Load the RAM and start for 64 bit PCI (895A,896).
-	 *  Both scripts (script and scripth) are loaded into 
-	 *  the RAM which is 8K (4K for 825A/875/895).
-	 *  We also need to load some 32-63 bit segments 
-	 *  address of the SCRIPTS processor.
-	 *  LOAD/STORE ABSOLUTE always refers to on-chip RAM 
-	 *  in our implementation. The main memory is 
-	 *  accessed using LOAD/STORE DSA RELATIVE.
-	 */
-	SCR_LOAD_REL (mmws, 4),
-		offsetof (struct sym_hcb, scr_ram_seg),
-	SCR_COPY (sizeof(struct SYM_FWA_SCR)),
-}/*-------------------------< SCRIPTA0_BA64 >--------------------*/,{
-		0,
-		PADDR_A (start),
-	SCR_COPY (sizeof(struct SYM_FWB_SCR)),
-}/*-------------------------< SCRIPTB0_BA64 >--------------------*/,{
-		0,
-		PADDR_B  (start64),
-	SCR_LOAD_REL (mmrs, 4),
-		offsetof (struct sym_hcb, scr_ram_seg),
-	SCR_JUMP64,
-		PADDR_B (start64),
-}/*-------------------------< RAM_SEG64 >------------------------*/,{
-		0,
-#endif /* SYM_OPT_NO_BUS_MEMORY_MAPPING */
 }/*-------------------------<>-----------------------------------*/
 };
--- diff/drivers/scsi/sym53c8xx_2/sym_glue.c	2003-10-09 09:47:16.000000000 +0100
+++ source/drivers/scsi/sym53c8xx_2/sym_glue.c	2003-12-29 09:30:41.000000000 +0000
@@ -167,34 +167,16 @@
 #define SYM_SCMD_PTR(ucmd) sym_que_entry(ucmd, struct scsi_cmnd, SCp)
 #define SYM_SOFTC_PTR(cmd) (((struct host_data *)cmd->device->host->hostdata)->ncb)
 
-/*
- *  Deal with DMA mapping/unmapping.
- */
-#define	bus_unmap_sg(pdev, sgptr, sgcnt, dir)		\
-	pci_unmap_sg(pdev, sgptr, sgcnt, dir)
-#define	bus_unmap_single(pdev, mapping, bufptr, dir)	\
-	pci_unmap_single(pdev, mapping, bufptr, dir)
-#define	bus_map_single(pdev, bufptr, bufsiz, dir)	\
-	pci_map_single(pdev, bufptr, bufsiz, dir)
-#define	bus_map_sg(pdev, sgptr, sgcnt, dir)		\
-	pci_map_sg(pdev, sgptr, sgcnt, dir)
-#define	bus_dma_sync_sg(pdev, sgptr, sgcnt, dir)	\
-	pci_dma_sync_sg(pdev, sgptr, sgcnt, dir)
-#define	bus_dma_sync_single(pdev, mapping, bufsiz, dir)	\
-	pci_dma_sync_single(pdev, mapping, bufsiz, dir)
-#define bus_sg_dma_address(sc)	sg_dma_address(sc)
-#define bus_sg_dma_len(sc)	sg_dma_len(sc)
-
 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);
 
 	switch(SYM_UCMD_PTR(cmd)->data_mapped) {
 	case 2:
-		bus_unmap_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
+		pci_unmap_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
 		break;
 	case 1:
-		bus_unmap_single(pdev, SYM_UCMD_PTR(cmd)->data_mapping,
+		pci_unmap_single(pdev, SYM_UCMD_PTR(cmd)->data_mapping,
 				 cmd->request_bufflen, dma_dir);
 		break;
 	}
@@ -206,7 +188,7 @@
 	dma_addr_t mapping;
 	int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
 
-	mapping = bus_map_single(pdev, cmd->request_buffer,
+	mapping = pci_map_single(pdev, cmd->request_buffer,
 				 cmd->request_bufflen, dma_dir);
 	if (mapping) {
 		SYM_UCMD_PTR(cmd)->data_mapped  = 1;
@@ -221,7 +203,7 @@
 	int use_sg;
 	int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
 
-	use_sg = bus_map_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
+	use_sg = pci_map_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
 	if (use_sg > 0) {
 		SYM_UCMD_PTR(cmd)->data_mapped  = 2;
 		SYM_UCMD_PTR(cmd)->data_mapping = use_sg;
@@ -236,10 +218,10 @@
 
 	switch(SYM_UCMD_PTR(cmd)->data_mapped) {
 	case 2:
-		bus_dma_sync_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
+		pci_dma_sync_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
 		break;
 	case 1:
-		bus_dma_sync_single(pdev, SYM_UCMD_PTR(cmd)->data_mapping,
+		pci_dma_sync_single(pdev, SYM_UCMD_PTR(cmd)->data_mapping,
 				    cmd->request_bufflen, dma_dir);
 		break;
 	}
@@ -469,8 +451,8 @@
 		data = &cp->phys.data[SYM_CONF_MAX_SG - use_sg];
 
 		for (segment = 0; segment < use_sg; segment++) {
-			dma_addr_t baddr = bus_sg_dma_address(&scatter[segment]);
-			unsigned int len = bus_sg_dma_len(&scatter[segment]);
+			dma_addr_t baddr = sg_dma_address(&scatter[segment]);
+			unsigned int len = sg_dma_len(&scatter[segment]);
 
 			sym_build_sge(np, &data[segment], baddr, len);
 			cp->data_len += len;
@@ -1595,10 +1577,8 @@
 	if (np->s.mmio_va)
 		iounmap(np->s.mmio_va);
 #endif
-#ifndef SYM_OPT_NO_BUS_MEMORY_MAPPING
 	if (np->s.ram_va)
 		iounmap(np->s.ram_va);
-#endif
 	/*
 	 *  Free O/S independent resources.
 	 */
@@ -1650,14 +1630,13 @@
  *  If all is OK, install interrupt handling and
  *  start the timer daemon.
  */
-static int __devinit 
-sym_attach (struct scsi_host_template *tpnt, int unit, struct sym_device *dev)
+static struct Scsi_Host * __devinit sym_attach(struct scsi_host_template *tpnt,
+		int unit, struct sym_device *dev)
 {
 	struct host_data *host_data;
 	struct sym_hcb *np = NULL;
 	struct Scsi_Host *instance = NULL;
 	unsigned long flags;
-	struct sym_nvram *nvram = dev->nvram;
 	struct sym_fw *fw;
 
 	printk(KERN_INFO
@@ -1762,20 +1741,18 @@
 			np->ram_ws = 8192;
 		else
 			np->ram_ws = 4096;
-#ifndef SYM_OPT_NO_BUS_MEMORY_MAPPING
 		np->s.ram_va = ioremap(dev->s.base_2_c, np->ram_ws);
 		if (!np->s.ram_va) {
 			printf_err("%s: can't map PCI MEMORY region\n",
 				sym_name(np));
 			goto attach_failed;
 		}
-#endif
 	}
 
 	/*
 	 *  Perform O/S independent stuff.
 	 */
-	if (sym_hcb_attach(np, fw, nvram))
+	if (sym_hcb_attach(np, fw, dev->nvram))
 		goto attach_failed;
 
 
@@ -1843,13 +1820,7 @@
 
 	spin_unlock_irqrestore(instance->host_lock, flags);
 
-	/*
-	 *  Now let the generic SCSI driver
-	 *  look for the SCSI devices on the bus ..
-	 */
-	scsi_add_host(instance, &dev->pdev->dev); /* XXX: handle failure */
-	scsi_scan_host(instance);
-	return 0;
+	return instance;
 
  reset_failed:
 	printf_err("%s: FATAL ERROR: CHECK SCSI BUS - CABLES, "
@@ -1857,13 +1828,13 @@
 	spin_unlock_irqrestore(instance->host_lock, flags);
  attach_failed:
 	if (!instance)
-		return -1;
+		return NULL;
 	printf_info("%s: giving up ...\n", sym_name(np));
 	if (np)
 		sym_free_resources(np);
 	scsi_host_put(instance);
 
-	return -1;
+	return NULL;
  }
 
 
@@ -2115,7 +2086,7 @@
 	 *  Ignore Symbios chips controlled by various RAID controllers.
 	 *  These controllers set value 0x52414944 at RAM end - 16.
 	 */
-#if defined(__i386__) && !defined(SYM_OPT_NO_BUS_MEMORY_MAPPING)
+#if defined(__i386__)
 	if (base_2_c) {
 		unsigned int ram_size, ram_val;
 		void *ram_ptr;
@@ -2202,12 +2173,9 @@
 
 
 /*
- *  Linux release module stuff.
- *
  *  Called before unloading the module.
  *  Detach the host.
  *  We have to free resources and halt the NCR chip.
- *
  */
 static int __devexit sym_detach(struct sym_hcb *np)
 {
@@ -2216,18 +2184,15 @@
 	del_timer_sync(&np->s.timer);
 
 	/*
-	 *  Reset NCR chip.
-	 *  We should use sym_soft_reset(), but we donnot want to do 
-	 *  so, since we may not be safe if interrupts occur.
+	 * Reset NCR chip.
+	 * We should use sym_soft_reset(), but we don't want to do
+	 * so, since we may not be safe if interrupts occur.
 	 */
 	printk("%s: resetting chip\n", sym_name(np));
 	OUTB (nc_istat, SRST);
 	UDELAY (10);
 	OUTB (nc_istat, 0);
 
-	/*
-	 *  Free host resources
-	 */
 	sym_free_resources(np);
 
 	return 1;
@@ -2336,6 +2301,7 @@
 {
 	struct sym_device sym_dev;
 	struct sym_nvram nvram;
+	struct Scsi_Host *instance;
 
 	memset(&sym_dev, 0, sizeof(sym_dev));
 	memset(&nvram, 0, sizeof(nvram));
@@ -2354,12 +2320,20 @@
 
 	sym_get_nvram(&sym_dev, &nvram);
 
-	if (sym_attach(&sym2_template, attach_count, &sym_dev))
+	instance = sym_attach(&sym2_template, attach_count, &sym_dev);
+	if (!instance)
 		goto free;
 
+	if (scsi_add_host(instance, &pdev->dev))
+		goto detach;
+	scsi_scan_host(instance);
+
 	attach_count++;
+
 	return 0;
 
+ detach:
+	sym_detach(pci_get_drvdata(pdev));
  free:
 	pci_release_regions(pdev);
  disable:
@@ -2369,7 +2343,13 @@
 
 static void __devexit sym2_remove(struct pci_dev *pdev)
 {
-	sym_detach(pci_get_drvdata(pdev));
+	struct sym_hcb *np = pci_get_drvdata(pdev);
+	struct Scsi_Host *host = np->s.host;
+
+	scsi_remove_host(host);
+	scsi_host_put(host);
+
+	sym_detach(np);
 
 	pci_release_regions(pdev);
 	pci_disable_device(pdev);
--- diff/drivers/scsi/sym53c8xx_2/sym_glue.h	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/scsi/sym53c8xx_2/sym_glue.h	2003-12-29 09:30:41.000000000 +0000
@@ -74,10 +74,6 @@
 #define bzero(d, n)	memset((d), 0, (n))
 #endif
 
-#ifndef bcmp
-#define bcmp(a, b, n)	memcmp((a), (b), (n))
-#endif
-
 /*
  *  General driver includes.
  */
@@ -96,7 +92,6 @@
 #define SYM_OPT_SNIFF_INQUIRY
 #define SYM_OPT_LIMIT_COMMAND_REORDERING
 #define	SYM_OPT_ANNOUNCE_TRANSFER_RATE
-#define	SYM_OPT_BUS_DMA_ABSTRACTION
 
 /*
  *  Print a message with severity.
--- diff/drivers/scsi/sym53c8xx_2/sym_hipd.c	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/scsi/sym53c8xx_2/sym_hipd.c	2003-12-29 09:30:41.000000000 +0000
@@ -50,7 +50,7 @@
  * SUCH DAMAGE.
  */
 
-#define SYM_DRIVER_NAME	"sym-2.1.18b"
+#define SYM_DRIVER_NAME	"sym-2.1.18f"
 
 #ifdef __FreeBSD__
 #include <dev/sym/sym_glue.h>
@@ -751,8 +751,6 @@
 				&np->maxwide, &scsi_mode))
 		return period;
 
-	printk("scsi_mode = %d, period = %ld\n", scsi_mode, pdc_period);
-
 	if (scsi_mode >= 0) {
 		/* C3000 PDC reports period/mode */
 		SYM_SETUP_SCSI_DIFF = 0;
@@ -1060,12 +1058,10 @@
 		 *  and BUS width.
 		 */
 		if (np->features & FE_ULTRA3) {
-			if (tp->tinfo.user.period <= 9	&&
-			    tp->tinfo.user.width == BUS_16_BIT) {
-				tp->tinfo.user.options |= PPR_OPT_DT;
-				tp->tinfo.user.offset   = np->maxoffs_dt;
-				tp->tinfo.user.spi_version = 3;
-			}
+			tp->tinfo.user.options |= PPR_OPT_DT;
+			tp->tinfo.user.period = np->minsync_dt;
+			tp->tinfo.user.offset = np->maxoffs_dt;
+			tp->tinfo.user.spi_version = 3;
 		}
 
 		if (!tp->usrtags)
@@ -1962,13 +1958,6 @@
 		if (sym_verbose >= 2)
 			printf ("%s: Downloading SCSI SCRIPTS.\n",
 				sym_name(np));
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-		np->fw_patch(np);
-		if (np->ram_ws == 8192)
-			phys = SCRIPTZ_BA (np, start_ram64);
-		else
-			phys = SCRIPTZ_BA (np, start_ram);
-#else
 		if (np->ram_ws == 8192) {
 			OUTRAM_OFF(4096, np->scriptb0, np->scriptb_sz);
 			phys =  scr_to_cpu(np->scr_ram_seg);
@@ -1980,7 +1969,6 @@
 		else
 			phys = SCRIPTA_BA (np, init);
 		OUTRAM_OFF(0, np->scripta0, np->scripta_sz);
-#endif
 	}
 	else
 		phys = SCRIPTA_BA (np, init);
@@ -2136,9 +2124,15 @@
 
 	sym_settrans(np, target, 0, ofs, per, wide, div, fak);
 
-	tp->tinfo.goal.period	= tp->tinfo.curr.period  = per;
-	tp->tinfo.goal.offset	= tp->tinfo.curr.offset  = ofs;
-	tp->tinfo.goal.options	= tp->tinfo.curr.options = 0;
+	tp->tinfo.curr.period  = per;
+	tp->tinfo.curr.offset  = ofs;
+	tp->tinfo.curr.options = 0;
+
+	if (!(tp->tinfo.goal.options & PPR_OPT_MASK)) {
+		tp->tinfo.goal.period	= per;
+		tp->tinfo.goal.offset	= ofs;
+		tp->tinfo.goal.options	= 0;
+	}
 
 	sym_xpt_async_nego_sync(np, target);
 }
@@ -4151,8 +4145,10 @@
 	/*
 	 *  Check values against our limits.
 	 */
-	if (wide > np->maxwide)
-		{chg = 1; wide = np->maxwide;}
+	if (wide > np->maxwide) {
+		chg = 1;
+		wide = np->maxwide;
+	}
 	if (!wide || !(np->features & FE_ULTRA3))
 		dt &= ~PPR_OPT_DT;
 	if (req) {
@@ -4306,8 +4302,10 @@
 	/*
 	 *  Check values against our limits.
 	 */
-	if (wide > np->maxwide)
-		{chg = 1; wide = np->maxwide;}
+	if (wide > np->maxwide) {
+		chg = 1;
+		wide = np->maxwide;
+	}
 	if (req) {
 		if (wide > tp->tinfo.user.width)
 			{chg = 1; wide = tp->tinfo.user.width;}
--- diff/drivers/scsi/sym53c8xx_2/sym_hipd.h	2003-09-30 15:46:17.000000000 +0100
+++ source/drivers/scsi/sym53c8xx_2/sym_hipd.h	2003-12-29 09:30:41.000000000 +0000
@@ -59,12 +59,6 @@
  *  They may be defined in platform specific headers, if they 
  *  are useful.
  *
- *    SYM_OPT_NO_BUS_MEMORY_MAPPING
- *        When this option is set, the driver will not load the 
- *        on-chip RAM using MMIO, but let the SCRIPTS processor 
- *        do the work using MOVE MEMORY instructions.
- *        (set for Linux/PPC)
- *
  *    SYM_OPT_HANDLE_DIR_UNKNOWN
  *        When this option is set, the SCRIPTS used by the driver 
  *        are able to handle SCSI transfers with direction not 
@@ -75,12 +69,6 @@
  *        When this option is set, the driver will use a queue per 
  *        device and handle QUEUE FULL status requeuing internally.
  *
- *    SYM_OPT_BUS_DMA_ABSTRACTION
- *        When this option is set, the driver allocator is responsible 
- *        of maintaining bus physical addresses and so provides virtual 
- *        to bus physical address translation of driver data structures.
- *        (set for FreeBSD-4 and Linux 2.3)
- *
  *    SYM_OPT_SNIFF_INQUIRY
  *        When this option is set, the driver sniff out successful 
  *        INQUIRY response and performs negotiations accordingly.
@@ -92,10 +80,8 @@
  *        (set for Linux)
  */
 #if 0
-#define SYM_OPT_NO_BUS_MEMORY_MAPPING
 #define SYM_OPT_HANDLE_DIR_UNKNOWN
 #define SYM_OPT_HANDLE_DEVICE_QUEUEING
-#define SYM_OPT_BUS_DMA_ABSTRACTION
 #define SYM_OPT_SNIFF_INQUIRY
 #define SYM_OPT_LIMIT_COMMAND_REORDERING
 #endif
@@ -958,9 +944,7 @@
 	/*
 	 *  DMA pool handle for this HBA.
 	 */
-#ifdef	SYM_OPT_BUS_DMA_ABSTRACTION
 	m_pool_ident_t	bus_dmat;
-#endif
 
 	/*
 	 *  O/S specific data structure
@@ -1133,9 +1117,20 @@
 /*
  *  NVRAM reading (sym_nvram.c).
  */
+#if SYM_CONF_NVRAM_SUPPORT
 void sym_nvram_setup_host (hcb_p np, struct sym_nvram *nvram);
 void sym_nvram_setup_target (hcb_p np, int target, struct sym_nvram *nvp);
 int sym_read_nvram (sdev_p np, struct sym_nvram *nvp);
+#else
+static inline void sym_nvram_setup_host(hcb_p np, struct sym_nvram *nvram) { }
+static inline void sym_nvram_setup_target(hcb_p np, struct sym_nvram *nvram) { }
+static inline int sym_read_nvram(sdev_p np, struct sym_nvram *nvp)
+{
+	nvp->type = 0;
+	return 0;
+}
+#endif
+
 
 /*
  *  FIRMWARES (sym_fw.c)
@@ -1347,7 +1342,6 @@
  *  Virtual to bus physical translation for a given cluster.
  *  Such a structure is only useful with DMA abstraction.
  */
-#ifdef	SYM_OPT_BUS_DMA_ABSTRACTION
 typedef struct sym_m_vtob {	/* Virtual to Bus address translation */
 	struct sym_m_vtob *next;
 #ifdef	SYM_HAVE_M_SVTOB
@@ -1363,7 +1357,6 @@
 #define VTOB_HASH_MASK		(VTOB_HASH_SIZE-1)
 #define VTOB_HASH_CODE(m)	\
 	((((m_addr_t) (m)) >> SYM_MEM_CLUSTER_SHIFT) & VTOB_HASH_MASK)
-#endif	/* SYM_OPT_BUS_DMA_ABSTRACTION */
 
 /*
  *  Memory pool of a given kind.
@@ -1375,7 +1368,6 @@
  *     method are expected to tell the driver about.
  */
 typedef struct sym_m_pool {
-#ifdef	SYM_OPT_BUS_DMA_ABSTRACTION
 	m_pool_ident_t	dev_dmat;	/* Identifies the pool (see above) */
 	m_addr_t (*get_mem_cluster)(struct sym_m_pool *);
 #ifdef	SYM_MEM_FREE_UNUSED
@@ -1389,10 +1381,6 @@
 	int nump;
 	m_vtob_p vtob[VTOB_HASH_SIZE];
 	struct sym_m_pool *next;
-#else
-#define M_GET_MEM_CLUSTER()		sym_get_mem_cluster()
-#define M_FREE_MEM_CLUSTER(p)		sym_free_mem_cluster(p)
-#endif	/* SYM_OPT_BUS_DMA_ABSTRACTION */
 	struct sym_m_link h[SYM_MEM_CLUSTER_SHIFT - SYM_MEM_SHIFT + 1];
 } *m_pool_p;
 
@@ -1406,12 +1394,10 @@
  *  Alloc, free and translate addresses to bus physical 
  *  for DMAable memory.
  */
-#ifdef	SYM_OPT_BUS_DMA_ABSTRACTION
 void *__sym_calloc_dma_unlocked(m_pool_ident_t dev_dmat, int size, char *name);
 void 
 __sym_mfree_dma_unlocked(m_pool_ident_t dev_dmat, void *m,int size, char *name);
 u32 __vtobus_unlocked(m_pool_ident_t dev_dmat, void *m);
-#endif
 
 /*
  * Verbs used by the driver code for DMAable memory handling.
--- diff/drivers/scsi/sym53c8xx_2/sym_malloc.c	2003-02-26 16:01:09.000000000 +0000
+++ source/drivers/scsi/sym53c8xx_2/sym_malloc.c	2003-12-29 09:30:41.000000000 +0000
@@ -204,18 +204,9 @@
 /*
  *  Default memory pool we donnot need to involve in DMA.
  *
- *  If DMA abtraction is not needed, the generic allocator 
- *  calls directly some kernel allocator.
- *
  *  With DMA abstraction, we use functions (methods), to 
  *  distinguish between non DMAable memory and DMAable memory.
  */
-#ifndef	SYM_OPT_BUS_DMA_ABSTRACTION
-
-static struct sym_m_pool mp0;
-
-#else
-
 static m_addr_t ___mp0_get_mem_cluster(m_pool_p mp)
 {
 	m_addr_t m = (m_addr_t) sym_get_mem_cluster();
@@ -240,8 +231,6 @@
 	{0, ___mp0_get_mem_cluster};
 #endif
 
-#endif	/* SYM_OPT_BUS_DMA_ABSTRACTION */
-
 /*
  * Actual memory allocation routine for non-DMAed memory.
  */
@@ -260,7 +249,6 @@
 	__sym_mfree(&mp0, ptr, size, name);
 }
 
-#ifdef	SYM_OPT_BUS_DMA_ABSTRACTION
 /*
  *  Methods that maintains DMAable pools according to user allocations.
  *  New pools are created on the fly when a new pool id is provided.
@@ -417,5 +405,3 @@
 		panic("sym: VTOBUS FAILED!\n");
 	return (u32)(vp ? vp->baddr + (((m_addr_t) m) - a) : 0);
 }
-
-#endif	/* SYM_OPT_BUS_DMA_ABSTRACTION */
--- diff/drivers/scsi/sym53c8xx_2/sym_misc.c	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/scsi/sym53c8xx_2/sym_misc.c	2003-12-29 09:30:41.000000000 +0000
@@ -328,7 +328,6 @@
 	    tp->inq_byte56  != inq_byte56) {
 		tp->inq_version = inq_version;
 		tp->inq_byte7   = inq_byte7;
-		tp->inq_byte56  = inq_byte56;
 		return 1;
 	}
 	return 0;
--- diff/drivers/scsi/sym53c8xx_2/sym_nvram.c	2002-10-16 04:28:24.000000000 +0100
+++ source/drivers/scsi/sym53c8xx_2/sym_nvram.c	2003-12-29 09:30:41.000000000 +0000
@@ -59,25 +59,22 @@
 /*
  *  Some poor and bogus sync table that refers to Tekram NVRAM layout.
  */
-#if SYM_CONF_NVRAM_SUPPORT
 static u_char Tekram_sync[16] =
 	{25,31,37,43, 50,62,75,125, 12,15,18,21, 6,7,9,10};
 #ifdef	SYM_CONF_DEBUG_NVRAM
 static u_char Tekram_boot_delay[7] = {3, 5, 10, 20, 30, 60, 120};
 #endif
-#endif
 
 /*
  *  Get host setup from NVRAM.
  */
-void sym_nvram_setup_host (hcb_p np, struct sym_nvram *nvram)
+void sym_nvram_setup_host(struct sym_hcb *np, struct sym_nvram *nvram)
 {
-#if SYM_CONF_NVRAM_SUPPORT
 	/*
 	 *  Get parity checking, host ID, verbose mode 
 	 *  and miscellaneous host flags from NVRAM.
 	 */
-	switch(nvram->type) {
+	switch (nvram->type) {
 	case SYM_SYMBIOS_NVRAM:
 		if (!(nvram->data.Symbios.flags & SYMBIOS_PARITY_ENABLE))
 			np->rv_scntl0  &= ~0x0a;
@@ -95,41 +92,15 @@
 	default:
 		break;
 	}
-#endif
-}
-
-/*
- *  Get target setup from NVRAM.
- */
-#if SYM_CONF_NVRAM_SUPPORT
-static void sym_Symbios_setup_target(hcb_p np,int target, Symbios_nvram *nvram);
-static void sym_Tekram_setup_target(hcb_p np,int target, Tekram_nvram *nvram);
-#endif
-
-void sym_nvram_setup_target (hcb_p np, int target, struct sym_nvram *nvp)
-{
-#if SYM_CONF_NVRAM_SUPPORT
-	switch(nvp->type) {
-	case SYM_SYMBIOS_NVRAM:
-		sym_Symbios_setup_target (np, target, &nvp->data.Symbios);
-		break;
-	case SYM_TEKRAM_NVRAM:
-		sym_Tekram_setup_target (np, target, &nvp->data.Tekram);
-		break;
-	default:
-		break;
-	}
-#endif
 }
 
-#if SYM_CONF_NVRAM_SUPPORT
 /*
  *  Get target set-up from Symbios format NVRAM.
  */
 static void
-sym_Symbios_setup_target(hcb_p np, int target, Symbios_nvram *nvram)
+sym_Symbios_setup_target(struct sym_hcb *np, int target, Symbios_nvram *nvram)
 {
-	tcb_p tp = &np->target[target];
+	struct sym_tcb *tp = &np->target[target];
 	Symbios_target *tn = &nvram->target[target];
 
 	tp->tinfo.user.period = tn->sync_period ? (tn->sync_period + 3) / 4 : 0;
@@ -149,9 +120,9 @@
  *  Get target set-up from Tekram format NVRAM.
  */
 static void
-sym_Tekram_setup_target(hcb_p np, int target, Tekram_nvram *nvram)
+sym_Tekram_setup_target(struct sym_hcb *np, int target, Tekram_nvram *nvram)
 {
-	tcb_p tp = &np->target[target];
+	struct sym_tcb *tp = &np->target[target];
 	struct Tekram_target *tn = &nvram->target[target];
 	int i;
 
@@ -160,8 +131,8 @@
 		tp->tinfo.user.period = Tekram_sync[i];
 	}
 
-	tp->tinfo.user.width =
-		(tn->flags & TEKRAM_WIDE_NEGO) ? BUS_16_BIT : BUS_8_BIT;
+	tp->tinfo.user.width = (tn->flags & TEKRAM_WIDE_NEGO) ?
+		BUS_16_BIT : BUS_8_BIT;
 
 	if (tn->flags & TEKRAM_TAGGED_COMMANDS) {
 		tp->usrtags = 2 << nvram->max_tags_index;
@@ -175,11 +146,28 @@
 		np->rv_scntl0  &= ~0x0a; /* SCSI parity checking disabled */
 }
 
+/*
+ *  Get target setup from NVRAM.
+ */
+void sym_nvram_setup_target(struct sym_hcb *np, int target, struct sym_nvram *nvp)
+{
+	switch (nvp->type) {
+	case SYM_SYMBIOS_NVRAM:
+		sym_Symbios_setup_target(np, target, &nvp->data.Symbios);
+		break;
+	case SYM_TEKRAM_NVRAM:
+		sym_Tekram_setup_target(np, target, &nvp->data.Tekram);
+		break;
+	default:
+		break;
+	}
+}
+
 #ifdef	SYM_CONF_DEBUG_NVRAM
 /*
  *  Dump Symbios format NVRAM for debugging purpose.
  */
-static void sym_display_Symbios_nvram(sdev_p np, Symbios_nvram *nvram)
+static void sym_display_Symbios_nvram(struct sym_device *np, Symbios_nvram *nvram)
 {
 	int i;
 
@@ -211,7 +199,7 @@
 /*
  *  Dump TEKRAM format NVRAM for debugging purpose.
  */
-static void sym_display_Tekram_nvram(sdev_p np, Tekram_nvram *nvram)
+static void sym_display_Tekram_nvram(struct sym_device *np, Tekram_nvram *nvram)
 {
 	int i, tags, boot_delay;
 	char *rem;
@@ -221,7 +209,7 @@
 	boot_delay = 0;
 	if (nvram->boot_delay_index < 6)
 		boot_delay = Tekram_boot_delay[nvram->boot_delay_index];
-	switch((nvram->flags & TEKRAM_REMOVABLE_FLAGS) >> 6) {
+	switch ((nvram->flags & TEKRAM_REMOVABLE_FLAGS) >> 6) {
 	default:
 	case 0:	rem = "";			break;
 	case 1: rem = " REMOVABLE=boot device";	break;
@@ -257,49 +245,12 @@
 		sync);
 	}
 }
-#endif	/* SYM_CONF_DEBUG_NVRAM */
-#endif	/* SYM_CONF_NVRAM_SUPPORT */
-
-
-/*
- *  Try reading Symbios or Tekram NVRAM
- */
-#if SYM_CONF_NVRAM_SUPPORT
-static int sym_read_Symbios_nvram (sdev_p np, Symbios_nvram *nvram);
-static int sym_read_Tekram_nvram  (sdev_p np, Tekram_nvram *nvram);
-#endif
-
-int sym_read_nvram (sdev_p np, struct sym_nvram *nvp)
-{
-#if SYM_CONF_NVRAM_SUPPORT
-	/*
-	 *  Try to read SYMBIOS nvram.
-	 *  Try to read TEKRAM nvram if Symbios nvram not found.
-	 */
-	if	(SYM_SETUP_SYMBIOS_NVRAM &&
-		 !sym_read_Symbios_nvram (np, &nvp->data.Symbios)) {
-		nvp->type = SYM_SYMBIOS_NVRAM;
-#ifdef SYM_CONF_DEBUG_NVRAM
-		sym_display_Symbios_nvram(np, &nvp->data.Symbios);
-#endif
-	}
-	else if	(SYM_SETUP_TEKRAM_NVRAM &&
-		 !sym_read_Tekram_nvram (np, &nvp->data.Tekram)) {
-		nvp->type = SYM_TEKRAM_NVRAM;
-#ifdef SYM_CONF_DEBUG_NVRAM
-		sym_display_Tekram_nvram(np, &nvp->data.Tekram);
-#endif
-	}
-	else
-		nvp->type = 0;
 #else
-	nvp->type = 0;
-#endif
-	return nvp->type;
-}
+static void sym_display_Symbios_nvram(struct sym_device *np, Symbios_nvram *nvram) { }
+static void sym_display_Tekram_nvram(struct sym_device *np, Tekram_nvram *nvram) { }
+#endif	/* SYM_CONF_DEBUG_NVRAM */
 
 
-#if SYM_CONF_NVRAM_SUPPORT
 /*
  *  24C16 EEPROM reading.
  *
@@ -316,11 +267,11 @@
 /*
  *  Set/clear data/clock bit in GPIO0
  */
-static void S24C16_set_bit(sdev_p np, u_char write_bit, u_char *gpreg, 
+static void S24C16_set_bit(struct sym_device *np, u_char write_bit, u_char *gpreg,
 			  int bit_mode)
 {
 	UDELAY (5);
-	switch (bit_mode){
+	switch (bit_mode) {
 	case SET_BIT:
 		*gpreg |= write_bit;
 		break;
@@ -342,7 +293,7 @@
 /*
  *  Send START condition to NVRAM to wake it up.
  */
-static void S24C16_start(sdev_p np, u_char *gpreg)
+static void S24C16_start(struct sym_device *np, u_char *gpreg)
 {
 	S24C16_set_bit(np, 1, gpreg, SET_BIT);
 	S24C16_set_bit(np, 0, gpreg, SET_CLK);
@@ -353,7 +304,7 @@
 /*
  *  Send STOP condition to NVRAM - puts NVRAM to sleep... ZZzzzz!!
  */
-static void S24C16_stop(sdev_p np, u_char *gpreg)
+static void S24C16_stop(struct sym_device *np, u_char *gpreg)
 {
 	S24C16_set_bit(np, 0, gpreg, SET_CLK);
 	S24C16_set_bit(np, 1, gpreg, SET_BIT);
@@ -363,7 +314,7 @@
  *  Read or write a bit to the NVRAM,
  *  read if GPIO0 input else write if GPIO0 output
  */
-static void S24C16_do_bit(sdev_p np, u_char *read_bit, u_char write_bit, 
+static void S24C16_do_bit(struct sym_device *np, u_char *read_bit, u_char write_bit,
 			 u_char *gpreg)
 {
 	S24C16_set_bit(np, write_bit, gpreg, SET_BIT);
@@ -378,7 +329,7 @@
  *  Output an ACK to the NVRAM after reading,
  *  change GPIO0 to output and when done back to an input
  */
-static void S24C16_write_ack(sdev_p np, u_char write_bit, u_char *gpreg, 
+static void S24C16_write_ack(struct sym_device *np, u_char write_bit, u_char *gpreg,
 			    u_char *gpcntl)
 {
 	OUTB (nc_gpcntl, *gpcntl & 0xfe);
@@ -390,7 +341,7 @@
  *  Input an ACK from NVRAM after writing,
  *  change GPIO0 to input and when done back to an output
  */
-static void S24C16_read_ack(sdev_p np, u_char *read_bit, u_char *gpreg, 
+static void S24C16_read_ack(struct sym_device *np, u_char *read_bit, u_char *gpreg,
 			   u_char *gpcntl)
 {
 	OUTB (nc_gpcntl, *gpcntl | 0x01);
@@ -402,7 +353,7 @@
  *  WRITE a byte to the NVRAM and then get an ACK to see it was accepted OK,
  *  GPIO0 must already be set as an output
  */
-static void S24C16_write_byte(sdev_p np, u_char *ack_data, u_char write_data, 
+static void S24C16_write_byte(struct sym_device *np, u_char *ack_data, u_char write_data,
 			     u_char *gpreg, u_char *gpcntl)
 {
 	int x;
@@ -417,7 +368,7 @@
  *  READ a byte from the NVRAM and then send an ACK to say we have got it,
  *  GPIO0 must already be set as an input
  */
-static void S24C16_read_byte(sdev_p np, u_char *read_data, u_char ack_data, 
+static void S24C16_read_byte(struct sym_device *np, u_char *read_data, u_char ack_data,
 			    u_char *gpreg, u_char *gpcntl)
 {
 	int x;
@@ -435,7 +386,7 @@
 /*
  *  Read 'len' bytes starting at 'offset'.
  */
-static int sym_read_S24C16_nvram (sdev_p np, int offset, u_char *data, int len)
+static int sym_read_S24C16_nvram(struct sym_device *np, int offset, u_char *data, int len)
 {
 	u_char	gpcntl, gpreg;
 	u_char	old_gpcntl, old_gpreg;
@@ -514,7 +465,7 @@
  *  Try reading Symbios NVRAM.
  *  Return 0 if OK.
  */
-static int sym_read_Symbios_nvram (sdev_p np, Symbios_nvram *nvram)
+static int sym_read_Symbios_nvram(struct sym_device *np, Symbios_nvram *nvram)
 {
 	static u_char Symbios_trailer[6] = {0xfe, 0xfe, 0, 0, 0, 0};
 	u_char *data = (u_char *) nvram;
@@ -528,7 +479,7 @@
 
 	/* check valid NVRAM signature, verify byte count and checksum */
 	if (nvram->type != 0 ||
-	    bcmp(nvram->trailer, Symbios_trailer, 6) ||
+	    memcmp(nvram->trailer, Symbios_trailer, 6) ||
 	    nvram->byte_count != len - 12)
 		return 1;
 
@@ -555,7 +506,7 @@
 /*
  *  Pulse clock bit in GPIO0
  */
-static void T93C46_Clk(sdev_p np, u_char *gpreg)
+static void T93C46_Clk(struct sym_device *np, u_char *gpreg)
 {
 	OUTB (nc_gpreg, *gpreg | 0x04);
 	UDELAY (2);
@@ -565,7 +516,7 @@
 /* 
  *  Read bit from NVRAM
  */
-static void T93C46_Read_Bit(sdev_p np, u_char *read_bit, u_char *gpreg)
+static void T93C46_Read_Bit(struct sym_device *np, u_char *read_bit, u_char *gpreg)
 {
 	UDELAY (2);
 	T93C46_Clk(np, gpreg);
@@ -575,7 +526,7 @@
 /*
  *  Write bit to GPIO0
  */
-static void T93C46_Write_Bit(sdev_p np, u_char write_bit, u_char *gpreg)
+static void T93C46_Write_Bit(struct sym_device *np, u_char write_bit, u_char *gpreg)
 {
 	if (write_bit & 0x01)
 		*gpreg |= 0x02;
@@ -593,7 +544,7 @@
 /*
  *  Send STOP condition to NVRAM - puts NVRAM to sleep... ZZZzzz!!
  */
-static void T93C46_Stop(sdev_p np, u_char *gpreg)
+static void T93C46_Stop(struct sym_device *np, u_char *gpreg)
 {
 	*gpreg &= 0xef;
 	OUTB (nc_gpreg, *gpreg);
@@ -605,7 +556,7 @@
 /*
  *  Send read command and address to NVRAM
  */
-static void T93C46_Send_Command(sdev_p np, u_short write_data, 
+static void T93C46_Send_Command(struct sym_device *np, u_short write_data,
 				u_char *read_bit, u_char *gpreg)
 {
 	int x;
@@ -620,7 +571,8 @@
 /*
  *  READ 2 bytes from the NVRAM
  */
-static void T93C46_Read_Word(sdev_p np, u_short *nvram_data, u_char *gpreg)
+static void T93C46_Read_Word(struct sym_device *np,
+		unsigned short *nvram_data, unsigned char *gpreg)
 {
 	int x;
 	u_char read_bit;
@@ -639,13 +591,13 @@
 /*
  *  Read Tekram NvRAM data.
  */
-static int T93C46_Read_Data(sdev_p np, u_short *data,int len,u_char *gpreg)
+static int T93C46_Read_Data(struct sym_device *np, unsigned short *data,
+		int len, unsigned char *gpreg)
 {
-	u_char	read_bit;
-	int	x;
+	int x;
 
 	for (x = 0; x < len; x++)  {
-
+		unsigned char read_bit;
 		/* output read command and address */
 		T93C46_Send_Command(np, 0x180 | x, &read_bit, gpreg);
 		if (read_bit & 0x01)
@@ -660,7 +612,7 @@
 /*
  *  Try reading 93C46 Tekram NVRAM.
  */
-static int sym_read_T93C46_nvram (sdev_p np, Tekram_nvram *nvram)
+static int sym_read_T93C46_nvram(struct sym_device *np, Tekram_nvram *nvram)
 {
 	u_char gpcntl, gpreg;
 	u_char old_gpcntl, old_gpreg;
@@ -692,7 +644,7 @@
  *  Try reading Tekram NVRAM.
  *  Return 0 if OK.
  */
-static int sym_read_Tekram_nvram (sdev_p np, Tekram_nvram *nvram)
+static int sym_read_Tekram_nvram (struct sym_device *np, Tekram_nvram *nvram)
 {
 	u_char *data = (u_char *) nvram;
 	int len = sizeof(*nvram);
@@ -700,13 +652,13 @@
 	int x;
 
 	switch (np->device_id) {
-	case PCI_ID_SYM53C885:
-	case PCI_ID_SYM53C895:
-	case PCI_ID_SYM53C896:
+	case PCI_DEVICE_ID_NCR_53C885:
+	case PCI_DEVICE_ID_NCR_53C895:
+	case PCI_DEVICE_ID_NCR_53C896:
 		x = sym_read_S24C16_nvram(np, TEKRAM_24C16_NVRAM_ADDRESS,
 					  data, len);
 		break;
-	case PCI_ID_SYM53C875:
+	case PCI_DEVICE_ID_NCR_53C875:
 		x = sym_read_S24C16_nvram(np, TEKRAM_24C16_NVRAM_ADDRESS,
 					  data, len);
 		if (!x)
@@ -727,4 +679,19 @@
 	return 0;
 }
 
-#endif	/* SYM_CONF_NVRAM_SUPPORT */
+/*
+ *  Try reading Symbios or Tekram NVRAM
+ */
+int sym_read_nvram(struct sym_device *np, struct sym_nvram *nvp)
+{
+	if (!sym_read_Symbios_nvram(np, &nvp->data.Symbios)) {
+		nvp->type = SYM_SYMBIOS_NVRAM;
+		sym_display_Symbios_nvram(np, &nvp->data.Symbios);
+	} else if (!sym_read_Tekram_nvram(np, &nvp->data.Tekram)) {
+		nvp->type = SYM_TEKRAM_NVRAM;
+		sym_display_Tekram_nvram(np, &nvp->data.Tekram);
+	} else {
+		nvp->type = 0;
+	}
+	return nvp->type;
+}
--- diff/drivers/serial/8250.c	2003-10-27 09:20:43.000000000 +0000
+++ source/drivers/serial/8250.c	2003-12-29 09:30:41.000000000 +0000
@@ -844,7 +844,7 @@
 		if (unlikely(tty->flip.count >= TTY_FLIPBUF_SIZE)) {
 			tty->flip.work.func((void *)tty);
 			if (tty->flip.count >= TTY_FLIPBUF_SIZE)
-				return; // if TTY_DONT_FLIP is set
+				return;	/* if TTY_DONT_FLIP is set */
 		}
 		ch = serial_inp(up, UART_RX);
 		*tty->flip.char_buf_ptr = ch;
@@ -1205,12 +1205,21 @@
 	spin_unlock_irqrestore(&up->port.lock, flags);
 }
 
+#ifdef CONFIG_KGDB
+static int kgdb_irq = -1;
+#endif
+
 static int serial8250_startup(struct uart_port *port)
 {
 	struct uart_8250_port *up = (struct uart_8250_port *)port;
 	unsigned long flags;
 	int retval;
 
+#ifdef CONFIG_KGDB
+	if (up->port.irq == kgdb_irq)
+		return -EBUSY;
+#endif
+
 	up->capabilities = uart_config[up->port.type].flags;
 
 	if (up->port.type == PORT_16C950) {
@@ -1876,6 +1885,10 @@
 	for (i = 0; i < UART_NR; i++) {
 		struct uart_8250_port *up = &serial8250_ports[i];
 
+#ifdef CONFIG_KGDB
+		if (up->port.irq == kgdb_irq)
+			up->port.kgdb = 1;
+#endif
 		up->port.line = i;
 		up->port.ops = &serial8250_pops;
 		init_timer(&up->timer);
@@ -2145,6 +2158,31 @@
 	uart_resume_port(&serial8250_reg, &serial8250_ports[line].port);
 }
 
+#ifdef CONFIG_KGDB
+/*
+ * Find all the ports using the given irq and shut them down.
+ * Result should be that the irq will be released.
+ */
+void shutdown_for_kgdb(struct async_struct * info)
+{
+        int irq = info->state->irq;
+        struct uart_8250_port *up;
+	int ttyS;
+
+	kgdb_irq = irq;			/* save for later init */
+	for (ttyS = 0; ttyS < UART_NR; ttyS++){
+		up =  &serial8250_ports[ttyS];
+		if (up->port.irq == irq && (irq_lists + irq)->head) {
+#ifdef CONFIG_DEBUG_SPINLOCK   /* ugly business... */
+			if(up->port.lock.magic != SPINLOCK_MAGIC)
+				spin_lock_init(&up->port.lock);
+#endif
+			serial8250_shutdown(&up->port);
+		}
+        }
+}
+#endif	/* CONFIG_KGDB */
+
 static int __init serial8250_init(void)
 {
 	int ret, i;
--- diff/drivers/serial/serial_core.c	2003-11-25 15:24:58.000000000 +0000
+++ source/drivers/serial/serial_core.c	2003-12-29 09:30:41.000000000 +0000
@@ -1862,6 +1862,9 @@
 	if (flow == 'r')
 		termios.c_cflag |= CRTSCTS;
 
+	if (!port->ops)
+		return 0;	/* "console=" on ia64 */
+
 	port->ops->set_termios(port, &termios, NULL);
 	co->cflag = termios.c_cflag;
 
@@ -1975,6 +1978,11 @@
 {
 	unsigned int flags;
 
+#ifdef CONFIG_KGDB
+	if (port->kgdb)
+		return;
+#endif
+
 	/*
 	 * If there isn't a port here, don't do anything further.
 	 */
--- diff/drivers/usb/class/cdc-acm.c	2003-10-27 09:20:44.000000000 +0000
+++ source/drivers/usb/class/cdc-acm.c	2003-12-29 09:30:41.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * acm.c  Version 0.22
+ * cdc-acm.c
  *
  * Copyright (c) 1999 Armin Fuerst	<fuerst@in.tum.de>
  * Copyright (c) 1999 Pavel Machek	<pavel@suse.cz>
@@ -26,6 +26,7 @@
  *	v0.21 - revert to probing on device for devices with multiple configs
  *	v0.22 - probe only the control interface. if usbcore doesn't choose the
  *		config we want, sysadmin changes bConfigurationValue in sysfs.
+ *	v0.23 - use softirq for rx processing, as needed by tty layer
  */
 
 /*
@@ -44,6 +45,8 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  */
 
+#undef DEBUG
+
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/init.h>
@@ -54,14 +57,13 @@
 #include <linux/module.h>
 #include <linux/smp_lock.h>
 #include <asm/uaccess.h>
-#undef DEBUG
 #include <linux/usb.h>
 #include <asm/byteorder.h>
 
 /*
  * Version Information
  */
-#define DRIVER_VERSION "v0.21"
+#define DRIVER_VERSION "v0.23"
 #define DRIVER_AUTHOR "Armin Fuerst, Pavel Machek, Johannes Erdfelt, Vojtech Pavlik"
 #define DRIVER_DESC "USB Abstract Control Model driver for USB modems and ISDN adapters"
 
@@ -146,7 +148,8 @@
 	struct tty_struct *tty;				/* the corresponding tty */
 	struct urb *ctrlurb, *readurb, *writeurb;	/* urbs */
 	struct acm_line line;				/* line coding (bits, stop, parity) */
-	struct work_struct work;					/* work queue entry for line discipline waking up */
+	struct work_struct work;			/* work queue entry for line discipline waking up */
+	struct tasklet_struct bh;			/* rx processing */
 	unsigned int ctrlin;				/* input control lines (DCD, DSR, RI, break, overruns) */
 	unsigned int ctrlout;				/* output control lines (DTR, RTS) */
 	unsigned int writesize;				/* max packet size for the output bulk endpoint */
@@ -184,9 +187,10 @@
 #define acm_send_break(acm, ms)		acm_ctrl_msg(acm, ACM_REQ_SEND_BREAK, ms, NULL, 0)
 
 /*
- * Interrupt handler for various ACM control events
+ * Interrupt handlers for various ACM device responses
  */
 
+/* control interface reports status changes with "interrupt" transfers */
 static void acm_ctrl_irq(struct urb *urb, struct pt_regs *regs)
 {
 	struct acm *acm = urb->context;
@@ -251,20 +255,30 @@
 		     __FUNCTION__, status);
 }
 
+/* data interface returns incoming bytes, or we got unthrottled */
 static void acm_read_bulk(struct urb *urb, struct pt_regs *regs)
 {
 	struct acm *acm = urb->context;
-	struct tty_struct *tty = acm->tty;
-	unsigned char *data = urb->transfer_buffer;
-	int i = 0;
 
 	if (!ACM_READY(acm))
 		return;
 
 	if (urb->status)
-		dbg("nonzero read bulk status received: %d", urb->status);
+		dev_dbg(&acm->data->dev, "bulk rx status %d\n", urb->status);
+
+	/* calling tty_flip_buffer_push() in_irq() isn't allowed */
+	tasklet_schedule(&acm->bh);
+}
+
+static void acm_rx_tasklet(unsigned long _acm)
+{
+	struct acm *acm = (void *)_acm;
+	struct urb *urb = acm->readurb;
+	struct tty_struct *tty = acm->tty;
+	unsigned char *data = urb->transfer_buffer;
+	int i = 0;
 
-	if (!urb->status && !acm->throttle)  {
+	if (urb->actual_length > 0 && !acm->throttle)  {
 		for (i = 0; i < urb->actual_length && !acm->throttle; i++) {
 			/* if we insert more than TTY_FLIPBUF_SIZE characters,
 			 * we drop them. */
@@ -285,10 +299,12 @@
 	urb->actual_length = 0;
 	urb->dev = acm->dev;
 
-	if (usb_submit_urb(urb, GFP_ATOMIC))
-		dbg("failed resubmitting read urb");
+	i = usb_submit_urb(urb, GFP_ATOMIC);
+	if (i)
+		dev_dbg(&acm->data->dev, "bulk rx resubmit %d\n", i);
 }
 
+/* data interface wrote those outgoing bytes */
 static void acm_write_bulk(struct urb *urb, struct pt_regs *regs)
 {
 	struct acm *acm = (struct acm *)urb->context;
@@ -621,6 +637,8 @@
 			acm->minor = minor;
 			acm->dev = dev;
 
+			acm->bh.func = acm_rx_tasklet;
+			acm->bh.data = (unsigned long) acm;
 			INIT_WORK(&acm->work, acm_softint, acm);
 
 			if (!(buf = kmalloc(ctrlsize + readsize + acm->writesize, GFP_KERNEL))) {
--- diff/drivers/usb/core/urb.c	2003-08-20 14:16:31.000000000 +0100
+++ source/drivers/usb/core/urb.c	2003-12-29 09:30:41.000000000 +0000
@@ -268,7 +268,7 @@
 		/* "high bandwidth" mode, 1-3 packets/uframe? */
 		if (dev->speed == USB_SPEED_HIGH) {
 			int	mult = 1 + ((max >> 11) & 0x03);
-			max &= 0x03ff;
+			max &= 0x07ff;
 			max *= mult;
 		}
 
--- diff/drivers/usb/host/ehci-sched.c	2003-08-20 14:16:31.000000000 +0100
+++ source/drivers/usb/host/ehci-sched.c	2003-12-29 09:30:41.000000000 +0000
@@ -580,10 +580,10 @@
 		maxp = urb->dev->epmaxpacketout [epnum];
 		buf1 = 0;
 	}
-	buf1 |= (maxp & 0x03ff);
+	buf1 |= (maxp & 0x07ff);
 	multi = 1;
 	multi += (maxp >> 11) & 0x03;
-	maxp &= 0x03ff;
+	maxp &= 0x07ff;
 	maxp *= multi;
 
 	/* transfer can't fit in any uframe? */ 
--- diff/drivers/usb/input/powermate.c	2003-09-17 12:28:10.000000000 +0100
+++ source/drivers/usb/input/powermate.c	2003-12-29 09:30:41.000000000 +0000
@@ -54,7 +54,11 @@
 #define UPDATE_PULSE_AWAKE       (1<<2)
 #define UPDATE_PULSE_MODE        (1<<3)
 
-#define POWERMATE_PAYLOAD_SIZE 3
+/* at least two versions of the hardware exist, with differing payload
+   sizes. the first three bytes always contain the "interesting" data in
+   the relevant format. */
+#define POWERMATE_PAYLOAD_SIZE_MAX 6
+#define POWERMATE_PAYLOAD_SIZE_MIN 3
 struct powermate_device {
 	signed char *data;
 	dma_addr_t data_dma;
@@ -269,7 +273,7 @@
 
 static int powermate_alloc_buffers(struct usb_device *udev, struct powermate_device *pm)
 {
-	pm->data = usb_buffer_alloc(udev, POWERMATE_PAYLOAD_SIZE,
+	pm->data = usb_buffer_alloc(udev, POWERMATE_PAYLOAD_SIZE_MAX,
 				    SLAB_ATOMIC, &pm->data_dma);
 	if (!pm->data)
 		return -1;
@@ -284,7 +288,7 @@
 static void powermate_free_buffers(struct usb_device *udev, struct powermate_device *pm)
 {
 	if (pm->data)
-		usb_buffer_free(udev, POWERMATE_PAYLOAD_SIZE,
+		usb_buffer_free(udev, POWERMATE_PAYLOAD_SIZE_MAX,
 				pm->data, pm->data_dma);
 	if (pm->configcr)
 		usb_buffer_free(udev, sizeof(*(pm->configcr)),
@@ -347,12 +351,14 @@
 	pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress);
 	maxp = usb_maxpacket(udev, pipe, usb_pipeout(pipe));
 
-	if (maxp != POWERMATE_PAYLOAD_SIZE)
-		printk("powermate: Expected payload of %d bytes, found %d bytes!\n", POWERMATE_PAYLOAD_SIZE, maxp);
-
+	if(maxp < POWERMATE_PAYLOAD_SIZE_MIN || maxp > POWERMATE_PAYLOAD_SIZE_MAX){
+		printk("powermate: Expected payload of %d--%d bytes, found %d bytes!\n",
+			POWERMATE_PAYLOAD_SIZE_MIN, POWERMATE_PAYLOAD_SIZE_MAX, maxp);
+		maxp = POWERMATE_PAYLOAD_SIZE_MAX;
+	}
 
 	usb_fill_int_urb(pm->irq, udev, pipe, pm->data,
-			 POWERMATE_PAYLOAD_SIZE, powermate_irq,
+			 maxp, powermate_irq,
 			 pm, endpoint->bInterval);
 	pm->irq->transfer_dma = pm->data_dma;
 	pm->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
--- diff/drivers/video/cirrusfb.c	2003-06-30 10:07:23.000000000 +0100
+++ source/drivers/video/cirrusfb.c	2003-12-29 09:30:41.000000000 +0000
@@ -2528,7 +2528,7 @@
 
 	pdev = clgen_pci_dev_get (btype);
 	if (!pdev) {
-		printk (KERN_ERR " Couldn't find PCI device\n");
+		printk (KERN_INFO "cirrusfb: couldn't find Cirrus Logic PCI device\n");
 		DPRINTK ("EXIT, returning 1\n");
 		return 1;
 	}
--- diff/drivers/video/fbmon.c	2003-06-30 10:07:23.000000000 +0100
+++ source/drivers/video/fbmon.c	2003-12-29 09:30:41.000000000 +0000
@@ -890,30 +890,6 @@
 	u32 vtotal;
 };
 
-/*
- * a simple function to get the square root of integers 
- */
-static u32 fb_sqrt(int x)
-{
-	register int op, res, one;
-
-	op = x;
-	res = 0;
-
-	one = 1 << 30;
-	while (one > op) one >>= 2;
-
-	while (one != 0) {
-		if (op >= res + one) {
-			op = op - (res + one);
-			res = res +  2 * one;
-		}
-		res /= 2;
-		one /= 4;
-	}
-	return((u32) res);
-}
-
 /**
  * fb_get_vblank - get vertical blank time
  * @hfreq: horizontal freq
@@ -1002,7 +978,7 @@
 	h_period += (M_VAL * xres * 2 * 1000)/(5 * dclk);
 	h_period *=10000; 
 
-	h_period = fb_sqrt((int) h_period);
+	h_period = int_sqrt(h_period);
 	h_period -= (100 - C_VAL) * 100;
 	h_period *= 1000; 
 	h_period /= 2 * M_VAL;
--- diff/drivers/video/hgafb.c	2003-05-21 11:50:16.000000000 +0100
+++ source/drivers/video/hgafb.c	2003-12-29 09:30:41.000000000 +0000
@@ -539,7 +539,7 @@
 int __init hgafb_init(void)
 {
 	if (! hga_card_detect()) {
-		printk(KERN_ERR "hgafb: HGA card not detected.\n");
+		printk(KERN_INFO "hgafb: HGA card not detected.\n");
 		return -EINVAL;
 	}
 
--- diff/drivers/video/radeonfb.c	2003-11-25 15:24:58.000000000 +0000
+++ source/drivers/video/radeonfb.c	2003-12-29 09:30:41.000000000 +0000
@@ -679,7 +679,7 @@
  */
         
 static char *mode_option __initdata;
-static char noaccel = 1;
+static char noaccel = 0;
 static char mirror = 0;
 static int panel_yres __initdata = 0;
 static char force_dfp __initdata = 0;
@@ -1099,7 +1099,7 @@
 	printk("radeonfb: detected DFP panel size from BIOS: %dx%d\n",
 		rinfo->panel_xres, rinfo->panel_yres);
 
-	for(i=0; i<20; i++) {
+	for(i=0; i<21; i++) {
 		tmp0 = rinfo->bios_seg + readw(tmp+64+i*2);
 		if (tmp0 == 0)
 			break;
@@ -1241,9 +1241,6 @@
 	radeon_fifo_wait (1);
 	OUTREG(RB2D_DSTCACHE_MODE, 0);
 
-	/* XXX */
-	rinfo->pitch = ((rinfo->xres_virtual * (rinfo->bpp / 8) + 0x3f)) >> 6;
-
 	radeon_fifo_wait (1);
 	temp = INREG(DEFAULT_PITCH_OFFSET);
 	OUTREG(DEFAULT_PITCH_OFFSET, ((temp & 0xc0000000) | 
@@ -1782,6 +1779,7 @@
 	int hsync_start, hsync_fudge, bytpp, hsync_wid, vsync_wid;
 	int primary_mon = PRIMARY_MONITOR(rinfo);
 	int depth = var_to_depth(mode);
+        int accel = (mode->accel_flags & FB_ACCELF_TEXT) != 0;
 
 	rinfo->xres = mode->xres;
 	rinfo->yres = mode->yres;
@@ -1878,7 +1876,15 @@
 	newmode.crtc_v_sync_strt_wid = (((vSyncStart - 1) & 0xfff) |
 					 (vsync_wid << 16) | (v_sync_pol  << 23));
 
-	newmode.crtc_pitch = (mode->xres_virtual >> 3);
+	if (accel) {
+		/* We first calculate the engine pitch */
+		rinfo->pitch = ((mode->xres_virtual * ((mode->bits_per_pixel + 1) / 8) + 0x3f)
+ 				& ~(0x3f)) >> 6;
+
+		/* Then, re-multiply it to get the CRTC pitch */
+		newmode.crtc_pitch = (rinfo->pitch << 3) / ((mode->bits_per_pixel + 1) / 8);
+	} else
+		newmode.crtc_pitch = (mode->xres_virtual >> 3);
 	newmode.crtc_pitch |= (newmode.crtc_pitch << 16);
 
 #if defined(__BIG_ENDIAN)
@@ -2085,18 +2091,21 @@
 	if (!rinfo->asleep) {
 		radeon_write_mode (rinfo, &newmode);
 		/* (re)initialize the engine */
-		if (!noaccel)
+		if (noaccel)
 			radeon_engine_init (rinfo);
 	
 	}
 	/* Update fix */
-        info->fix.line_length = rinfo->pitch*64;
+	if (accel)
+        	info->fix.line_length = rinfo->pitch*64;
+        else
+		info->fix.line_length = mode->xres_virtual * ((mode->bits_per_pixel + 1) / 8);
         info->fix.visual = rinfo->depth == 8 ? FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
 
 #ifdef CONFIG_BOOTX_TEXT
 	/* Update debug text engine */
 	btext_update_display(rinfo->fb_base_phys, mode->xres, mode->yres,
-			     rinfo->depth, rinfo->pitch*64);
+			     rinfo->depth, info->fix.line_length);
 #endif
 
 	return 0;
@@ -3022,11 +3031,6 @@
 	 */
 	radeon_save_state (rinfo, &rinfo->init_state);
 
-	if (!noaccel) {
-		/* initialize the engine */
-		radeon_engine_init (rinfo);
-	}
-
 	/* set all the vital stuff */
 	radeon_set_fbinfo (rinfo);
 
--- diff/drivers/video/sis/init301.c	2003-10-09 09:47:17.000000000 +0100
+++ source/drivers/video/sis/init301.c	2003-12-29 09:30:41.000000000 +0000
@@ -11712,7 +11712,7 @@
   }
 
   temp = GetOEMLCDPtr(SiS_Pr,HwDeviceExtension, ROMAddr, 1);
-  if(temp = 0xFFFF) return;
+  if(temp == 0xFFFF) return;
 
   index = SiS_Pr->SiS_VBModeIDTable[ModeIdIndex]._VB_LCDHIndex;
   for(i=0x14, j=0; i<=0x17; i++, j++) {
--- diff/fs/Kconfig	2003-10-27 09:20:38.000000000 +0000
+++ source/fs/Kconfig	2003-12-29 09:30:41.000000000 +0000
@@ -246,6 +246,7 @@
 
 config JFS_FS
 	tristate "JFS filesystem support"
+	select NLS
 	help
 	  This is a port of IBM's Journaled Filesystem .  More information is
 	  available in the file Documentation/filesystems/jfs.txt.
@@ -485,6 +486,7 @@
 config JOLIET
 	bool "Microsoft Joliet CDROM extensions"
 	depends on ISO9660_FS
+	select NLS
 	help
 	  Joliet is a Microsoft extension for the ISO 9660 CD-ROM file system
 	  which allows for long filenames in unicode format (unicode is the
@@ -530,6 +532,7 @@
 
 config FAT_FS
 	tristate "DOS FAT fs support"
+	select NLS
 	help
 	  If you want to use one of the FAT-based file systems (the MS-DOS,
 	  VFAT (Windows 95) and UMSDOS (used to run Linux on top of an
@@ -651,6 +654,7 @@
 
 config NTFS_FS
 	tristate "NTFS file system support"
+	select NLS
 	help
 	  NTFS is the file system of Microsoft Windows NT, 2000, XP and 2003.
 
@@ -764,6 +768,30 @@
 	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 needed by the block subsystem to mount the root partition.
+	Therefore, you MUST say Y if you're booting from a hard drive. If you use any
+	type of hotpluggable device, you'll also need sysfs for /sbin/hotplug support.
+
+	However, designers of embedded systems may want to say Y here to conserve
+	space.
+
 config DEVFS_FS
 	bool "/dev file system support (OBSOLETE)"
 	depends on EXPERIMENTAL
@@ -962,6 +990,7 @@
 config BEFS_FS
 	tristate "BeOS file systemv(BeFS) support (read only) (EXPERIMENTAL)"
 	depends on EXPERIMENTAL
+	select NLS
 	help
 	  The BeOS File System (BeFS) is the native file system of Be, Inc's
 	  BeOS. Notable features include support for arbitrary attributes
@@ -1440,6 +1469,7 @@
 config SMB_FS
 	tristate "SMB file system support (to mount Windows shares etc.)"
 	depends on INET
+	select NLS
 	help
 	  SMB (Server Message Block) is the protocol Windows for Workgroups
 	  (WfW), Windows 95/98, Windows NT and OS/2 Lan Manager use to share
@@ -1495,6 +1525,7 @@
 config CIFS
 	tristate "CIFS support (advanced network filesystem for Samba, Window and other CIFS compliant servers)(EXPERIMENTAL)"
 	depends on INET
+	select NLS
 	help
 	  This is the client VFS module for the Common Internet File System
 	  (CIFS) protocol which is the successor to the Server Message Block 
--- diff/fs/Kconfig.binfmt	2003-11-25 15:24:58.000000000 +0000
+++ source/fs/Kconfig.binfmt	2003-12-29 09:30:41.000000000 +0000
@@ -23,10 +23,6 @@
 	  ld.so (check the file <file:Documentation/Changes> for location and
 	  latest version).
 
-	  To compile this as a module, choose M here: the module will be called
-	  binfmt_elf. Saying M or N here is dangerous because some crucial
-	  programs on your system might be in ELF format.
-
 config BINFMT_FLAT
 	tristate "Kernel support for flat binaries"
 	depends on !MMU || SUPERH
--- diff/fs/Makefile	2003-08-26 10:00:54.000000000 +0100
+++ source/fs/Makefile	2003-12-29 09:30:41.000000000 +0000
@@ -39,7 +39,7 @@
 
 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/aio.c	2003-11-25 15:24:58.000000000 +0000
+++ source/fs/aio.c	2003-12-29 09:30:41.000000000 +0000
@@ -27,6 +27,8 @@
 #include <linux/aio.h>
 #include <linux/highmem.h>
 #include <linux/workqueue.h>
+#include <linux/writeback.h>
+#include <linux/pagemap.h>
 
 #include <asm/kmap_types.h>
 #include <asm/uaccess.h>
@@ -38,6 +40,9 @@
 #define dprintk(x...)	do { ; } while (0)
 #endif
 
+long aio_run = 0; /* for testing only */
+long aio_wakeups = 0; /* for testing only */
+
 /*------ sysctl variables----*/
 atomic_t aio_nr = ATOMIC_INIT(0);	/* current system wide number of aio requests */
 unsigned aio_max_nr = 0x10000;	/* system wide maximum number of aio requests */
@@ -47,6 +52,7 @@
 static kmem_cache_t	*kioctx_cachep;
 
 static struct workqueue_struct *aio_wq;
+static struct workqueue_struct *aio_fput_wq;
 
 /* Used for rare fput completion. */
 static void aio_fput_routine(void *);
@@ -74,6 +80,7 @@
 		panic("unable to create kioctx cache");
 
 	aio_wq = create_workqueue("aio");
+	aio_fput_wq = create_workqueue("aio_fput");
 
 	pr_debug("aio_setup: sizeof(struct page) = %d\n", (int)sizeof(struct page));
 
@@ -281,6 +288,7 @@
 		struct kiocb *iocb = list_kiocb(pos);
 		list_del_init(&iocb->ki_list);
 		cancel = iocb->ki_cancel;
+		kiocbSetCancelled(iocb);
 		if (cancel) {
 			iocb->ki_users++;
 			spin_unlock_irq(&ctx->ctx_lock);
@@ -341,6 +349,11 @@
 		aio_cancel_all(ctx);
 
 		wait_for_all_aios(ctx);
+		/*
+		 * this is an overkill, but ensures we don't leave
+		 * the ctx on the aio_wq
+		 */
+		flush_workqueue(aio_wq);
 
 		if (1 != atomic_read(&ctx->users))
 			printk(KERN_DEBUG
@@ -400,6 +413,7 @@
 	req->ki_cancel = NULL;
 	req->ki_retry = NULL;
 	req->ki_user_obj = NULL;
+	INIT_LIST_HEAD(&req->ki_run_list);
 
 	/* Check if the completion queue has enough free space to
 	 * accept an event from this io.
@@ -499,7 +513,7 @@
 		spin_lock(&fput_lock);
 		list_add(&req->ki_list, &fput_head);
 		spin_unlock(&fput_lock);
-		queue_work(aio_wq, &fput_work);
+		queue_work(aio_fput_wq, &fput_work);
 	} else
 		really_put_req(ctx, req);
 	return 1;
@@ -541,65 +555,324 @@
 	return ioctx;
 }
 
+/*
+ * use_mm
+ * 	Makes the calling kernel thread take on the specified
+ * 	mm context.
+ * 	Called by the retry thread execute retries within the
+ * 	iocb issuer's mm context, so that copy_from/to_user
+ * 	operations work seamlessly for aio.
+ * 	(Note: this routine is intended to be called only
+ * 	from a kernel thread context)
+ */
 static void use_mm(struct mm_struct *mm)
 {
-	struct mm_struct *active_mm = current->active_mm;
+	struct mm_struct *active_mm;
+	struct task_struct *tsk = current;
+
+	task_lock(tsk);
+	active_mm = tsk->active_mm;
 	atomic_inc(&mm->mm_count);
-	current->mm = mm;
-	if (mm != active_mm) {
-		current->active_mm = mm;
-		activate_mm(active_mm, mm);
-	}
+	tsk->mm = mm;
+	tsk->active_mm = mm;
+	activate_mm(active_mm, mm);
+	task_unlock(tsk);
+
 	mmdrop(active_mm);
 }
 
-static void unuse_mm(struct mm_struct *mm)
+/*
+ * unuse_mm
+ * 	Reverses the effect of use_mm, i.e. releases the
+ * 	specified mm context which was earlier taken on
+ * 	by the calling kernel thread
+ * 	(Note: this routine is intended to be called only
+ * 	from a kernel thread context)
+ *
+ * Comments: Called with ctx->ctx_lock held. This nests
+ * task_lock instead ctx_lock.
+ */
+void unuse_mm(struct mm_struct *mm)
 {
-	current->mm = NULL;
+	struct task_struct *tsk = current;
+
+	task_lock(tsk);
+	tsk->mm = NULL;
 	/* active_mm is still 'mm' */
-	enter_lazy_tlb(mm, current);
+	enter_lazy_tlb(mm, tsk);
+	task_unlock(tsk);
 }
 
-/* Run on kevent's context.  FIXME: needs to be per-cpu and warn if an
- * operation blocks.
+/*
+ * Queue up a kiocb to be retried. Assumes that the kiocb
+ * has already been marked as kicked, and places it on
+ * the retry run list for the corresponding ioctx, if it
+ * isn't already queued. Returns 1 if it actually queued
+ * the kiocb (to tell the caller to activate the work
+ * queue to process it), or 0, if it found that it was
+ * already queued.
+ *
+ * Should be called with the spin lock iocb->ki_ctx->ctx_lock
+ * held
  */
-static void aio_kick_handler(void *data)
+static inline int __queue_kicked_iocb(struct kiocb *iocb)
 {
-	struct kioctx *ctx = data;
+	struct kioctx	*ctx = iocb->ki_ctx;
 
-	use_mm(ctx->mm);
+	if (list_empty(&iocb->ki_run_list)) {
+		list_add_tail(&iocb->ki_run_list,
+			&ctx->run_list);
+		iocb->ki_queued++;
+		return 1;
+	}
+	return 0;
+}
 
-	spin_lock_irq(&ctx->ctx_lock);
-	while (!list_empty(&ctx->run_list)) {
-		struct kiocb *iocb;
-		long ret;
+/* aio_run_iocb
+ * 	 This is the core aio execution routine. It is
+ * 	 invoked both for initial i/o submission and
+ * 	 subsequent retries via the aio_kick_handler.
+ *       Expects to be invoked with iocb->ki_ctx->lock
+ *       already held. The lock is released and reaquired
+ *       as needed during processing.
+ *
+ * Calls the iocb retry method (already setup for the
+ * iocb on initial submission) for operation specific
+ * handling, but takes care of most of common retry
+ * execution details for a given iocb. The retry method
+ * needs to be non-blocking as far as possible, to avoid
+ * holding up other iocbs waiting to be serviced by the
+ * retry kernel thread.
+ *
+ * The trickier parts in this code have to do with
+ * ensuring that only one retry instance is in progress
+ * for a given iocb at any time. Providing that guarantee
+ * simplifies the coding of individual aio operations as
+ * it avoids various potential races.
+ */
+static ssize_t aio_run_iocb(struct kiocb *iocb)
+{
+	struct kioctx	*ctx = iocb->ki_ctx;
+	ssize_t (*retry)(struct kiocb *);
+	ssize_t ret;
 
-		iocb = list_entry(ctx->run_list.next, struct kiocb,
-				  ki_run_list);
-		list_del(&iocb->ki_run_list);
-		iocb->ki_users ++;
-		spin_unlock_irq(&ctx->ctx_lock);
+	if (iocb->ki_retried++ > 1024*1024) {
+		printk("Maximal retry count.  Bytes done %Zd\n",
+			iocb->ki_nbytes - iocb->ki_left);
+		return -EAGAIN;
+	}
 
-		kiocbClearKicked(iocb);
-		ret = iocb->ki_retry(iocb);
+	if (!(iocb->ki_retried & 0xff)) {
+		pr_debug("%ld retry: %d of %d (kick %ld, Q %ld run %ld, wake %ld)\n",
+			iocb->ki_retried,
+			iocb->ki_nbytes - iocb->ki_left, iocb->ki_nbytes,
+			iocb->ki_kicked, iocb->ki_queued, aio_run, aio_wakeups);
+	}
+
+	if (!(retry = iocb->ki_retry)) {
+		printk("aio_run_iocb: iocb->ki_retry = NULL\n");
+		return 0;
+	}
+
+	/*
+	 * We don't want the next retry iteration for this
+	 * operation to start until this one has returned and
+	 * updated the iocb state. However, wait_queue functions
+	 * can trigger a kick_iocb from interrupt context in the
+	 * meantime, indicating that data is available for the next
+	 * iteration. We want to remember that and enable the
+	 * next retry iteration _after_ we are through with
+	 * this one.
+	 *
+	 * So, in order to be able to register a "kick", but
+	 * prevent it from being queued now, we clear the kick
+	 * flag, but make the kick code *think* that the iocb is
+	 * still on the run list until we are actually done.
+	 * When we are done with this iteration, we check if
+	 * the iocb was kicked in the meantime and if so, queue
+	 * it up afresh.
+	 */
+
+	kiocbClearKicked(iocb);
+
+	/*
+	 * This is so that aio_complete knows it doesn't need to
+	 * pull the iocb off the run list (We can't just call
+	 * INIT_LIST_HEAD because we don't want a kick_iocb to
+	 * queue this on the run list yet)
+	 */
+	iocb->ki_run_list.next = iocb->ki_run_list.prev = NULL;
+	iocb->ki_retry = NULL;
+	spin_unlock_irq(&ctx->ctx_lock);
+
+	/* Quit retrying if the i/o has been cancelled */
+	if (kiocbIsCancelled(iocb)) {
+		ret = -EINTR;
+		aio_complete(iocb, ret, 0);
+		/* must not access the iocb after this */
+		goto out;
+	}
+
+	/*
+	 * Now we are all set to call the retry method in async
+	 * context. By setting this thread's io_wait context
+	 * to point to the wait queue entry inside the currently
+	 * running iocb for the duration of the retry, we ensure
+	 * that async notification wakeups are queued by the
+	 * operation instead of blocking waits, and when notified,
+	 * cause the iocb to be kicked for continuation (through
+	 * the aio_wake_function callback).
+	 */
+	BUG_ON(current->io_wait != NULL);
+	current->io_wait = &iocb->ki_wait;
+	ret = retry(iocb);
+	current->io_wait = NULL;
+
+	if (-EIOCBRETRY != ret) {
 		if (-EIOCBQUEUED != ret) {
+			BUG_ON(!list_empty(&iocb->ki_wait.task_list));
 			aio_complete(iocb, ret, 0);
-			iocb = NULL;
+			/* must not access the iocb after this */
 		}
+	} else {
+		/*
+		 * Issue an additional retry to avoid waiting forever if
+		 * no waits were queued (e.g. in case of a short read).
+		 */
+		if (list_empty(&iocb->ki_wait.task_list))
+			kiocbSetKicked(iocb);
+	}
+out:
+	spin_lock_irq(&ctx->ctx_lock);
 
-		spin_lock_irq(&ctx->ctx_lock);
-		if (NULL != iocb)
-			__aio_put_req(ctx, iocb);
+	if (-EIOCBRETRY == ret) {
+		/*
+		 * OK, now that we are done with this iteration
+		 * and know that there is more left to go,
+		 * this is where we let go so that a subsequent
+		 * "kick" can start the next iteration
+		 */
+		iocb->ki_retry = retry;
+		/* will make __queue_kicked_iocb succeed from here on */
+		INIT_LIST_HEAD(&iocb->ki_run_list);
+		/* we must queue the next iteration ourselves, if it
+		 * has already been kicked */
+		if (kiocbIsKicked(iocb)) {
+			__queue_kicked_iocb(iocb);
+		}
 	}
+	return ret;
+}
+
+/*
+ * __aio_run_iocbs:
+ * 	Process all pending retries queued on the ioctx
+ * 	run list.
+ * Assumes it is operating within the aio issuer's mm
+ * context. Expects to be called with ctx->ctx_lock held
+ */
+static int __aio_run_iocbs(struct kioctx *ctx)
+{
+	struct kiocb *iocb;
+	int count = 0;
+	LIST_HEAD(run_list);
+
+	list_splice_init(&ctx->run_list, &run_list);
+	while (!list_empty(&run_list)) {
+		iocb = list_entry(run_list.next, struct kiocb,
+			ki_run_list);
+		list_del(&iocb->ki_run_list);
+		/*
+		 * Hold an extra reference while retrying i/o.
+		 */
+		iocb->ki_users++;	/* grab extra reference */
+		aio_run_iocb(iocb);
+		if (__aio_put_req(ctx, iocb))  /* drop extra ref */
+			put_ioctx(ctx);
+		count++;
+	}
+	aio_run++;
+	if (!list_empty(&ctx->run_list))
+		return 1;
+	return 0;
+}
+
+/*
+ * aio_run_iocbs:
+ * 	Process all pending retries queued on the ioctx
+ * 	run list.
+ * Assumes it is operating within the aio issuer's mm
+ * context.
+ */
+static inline void aio_run_iocbs(struct kioctx *ctx)
+{
+	int requeue;
+
+	spin_lock_irq(&ctx->ctx_lock);
+	requeue = __aio_run_iocbs(ctx);
 	spin_unlock_irq(&ctx->ctx_lock);
+	if (requeue)
+		queue_work(aio_wq, &ctx->wq);
+}
 
+/*
+ * aio_kick_handler:
+ * 	Work queue handler triggered to process pending
+ * 	retries on an ioctx. Takes on the aio issuer's
+ * 	mm context before running the iocbs, so that
+ * 	copy_xxx_user operates on the issuer's address
+ * 	space.
+ * Run on aiod's context.
+ */
+static void aio_kick_handler(void *data)
+{
+	struct kioctx *ctx = data;
+	mm_segment_t oldfs = get_fs();
+	int requeue;
+
+	set_fs(USER_DS);
+	use_mm(ctx->mm);
+	spin_lock_irq(&ctx->ctx_lock);
+	requeue = __aio_run_iocbs(ctx);
 	unuse_mm(ctx->mm);
+	spin_unlock_irq(&ctx->ctx_lock);
+	set_fs(oldfs);
+	if (requeue)
+		queue_work(aio_wq, &ctx->wq);
 }
 
-void kick_iocb(struct kiocb *iocb)
+
+/*
+ * Called by kick_iocb to queue the kiocb for retry
+ * and if required activate the aio work queue to process
+ * it
+ */
+void queue_kicked_iocb(struct kiocb *iocb)
 {
 	struct kioctx	*ctx = iocb->ki_ctx;
+	unsigned long flags;
+	int run = 0;
+
+	WARN_ON((!list_empty(&iocb->ki_wait.task_list)));
 
+	spin_lock_irqsave(&ctx->ctx_lock, flags);
+	run = __queue_kicked_iocb(iocb);
+	spin_unlock_irqrestore(&ctx->ctx_lock, flags);
+	if (run) {
+		queue_work(aio_wq, &ctx->wq);
+		aio_wakeups++;
+	}
+}
+
+/*
+ * kick_iocb:
+ * 	Called typically from a wait queue callback context
+ * 	(aio_wake_function) to trigger a retry of the iocb.
+ * 	The retry is usually executed by aio workqueue
+ * 	threads (See aio_kick_handler).
+ */
+void kick_iocb(struct kiocb *iocb)
+{
 	/* sync iocbs are easy: they can only ever be executing from a 
 	 * single context. */
 	if (is_sync_kiocb(iocb)) {
@@ -608,12 +881,10 @@
 		return;
 	}
 
+	iocb->ki_kicked++;
+	/* If its already kicked we shouldn't queue it again */
 	if (!kiocbTryKick(iocb)) {
-		unsigned long flags;
-		spin_lock_irqsave(&ctx->ctx_lock, flags);
-		list_add_tail(&iocb->ki_run_list, &ctx->run_list);
-		spin_unlock_irqrestore(&ctx->ctx_lock, flags);
-		schedule_work(&ctx->wq);
+		queue_kicked_iocb(iocb);
 	}
 }
 
@@ -666,6 +937,9 @@
 	 */
 	spin_lock_irqsave(&ctx->ctx_lock, flags);
 
+	if (iocb->ki_run_list.prev && !list_empty(&iocb->ki_run_list))
+		list_del_init(&iocb->ki_run_list);
+
 	ring = kmap_atomic(info->ring_pages[0], KM_IRQ1);
 
 	tail = info->tail;
@@ -694,6 +968,11 @@
 
 	pr_debug("added to ring %p at [%lu]\n", iocb, tail);
 
+	pr_debug("%ld retries: %d of %d (kicked %ld, Q %ld run %ld wake %ld)\n",
+		iocb->ki_retried,
+		iocb->ki_nbytes - iocb->ki_left, iocb->ki_nbytes,
+		iocb->ki_kicked, iocb->ki_queued, aio_run, aio_wakeups);
+
 	/* everything turned out well, dispose of the aiocb. */
 	ret = __aio_put_req(ctx, iocb);
 
@@ -808,6 +1087,7 @@
 	int			i = 0;
 	struct io_event		ent;
 	struct timeout		to;
+	int 			event_loop = 0; /* testing only */
 
 	/* needed to zero any padding within an entry (there shouldn't be 
 	 * any, but C is fun!
@@ -857,7 +1137,6 @@
 		add_wait_queue_exclusive(&ctx->wait, &wait);
 		do {
 			set_task_state(tsk, TASK_INTERRUPTIBLE);
-
 			ret = aio_read_evt(ctx, &ent);
 			if (ret)
 				break;
@@ -867,6 +1146,7 @@
 			if (to.timed_out)	/* Only check after read evt */
 				break;
 			schedule();
+			event_loop++;
 			if (signal_pending(tsk)) {
 				ret = -EINTR;
 				break;
@@ -894,6 +1174,9 @@
 	if (timeout)
 		clear_timeout(&to);
 out:
+	pr_debug("event loop executed %d times\n", event_loop);
+	pr_debug("aio_run %ld\n", aio_run);
+	pr_debug("aio_wakeups %ld\n", aio_wakeups);
 	return i ? i : ret;
 }
 
@@ -923,6 +1206,11 @@
 
 	aio_cancel_all(ioctx);
 	wait_for_all_aios(ioctx);
+	/*
+	 * this is an overkill, but ensures we don't leave
+	 * the ctx on the aio_wq
+	 */
+	flush_workqueue(aio_wq);
 	put_ioctx(ioctx);	/* once for the lookup */
 }
 
@@ -985,13 +1273,191 @@
 	return -EINVAL;
 }
 
+/*
+ * Retry method for aio_read (also used for first time submit)
+ * Responsible for updating iocb state as retries progress
+ */
+static ssize_t aio_pread(struct kiocb *iocb)
+{
+	struct file *file = iocb->ki_filp;
+	ssize_t ret = 0;
+
+	ret = file->f_op->aio_read(iocb, iocb->ki_buf,
+		iocb->ki_left, iocb->ki_pos);
+
+	/*
+	 * Can't just depend on iocb->ki_left to determine
+	 * whether we are done. This may have been a short read.
+	 */
+	if (ret > 0) {
+		iocb->ki_buf += ret;
+		iocb->ki_left -= ret;
+
+		ret = -EIOCBRETRY;
+	}
+
+	/* This means we must have transferred all that we could */
+	/* No need to retry anymore */
+	if ((ret == 0) || (iocb->ki_left == 0))
+		ret = iocb->ki_nbytes - iocb->ki_left;
+
+	return ret;
+}
+
+/*
+ * Retry method for aio_write (also used for first time submit)
+ * Responsible for updating iocb state as retries progress
+ */
+static ssize_t aio_pwrite(struct kiocb *iocb)
+{
+	struct file *file = iocb->ki_filp;
+	struct address_space *mapping = file->f_mapping;
+	struct inode *inode = mapping->host;
+	ssize_t ret = 0;
+
+	ret = file->f_op->aio_write(iocb, iocb->ki_buf,
+				iocb->ki_left, iocb->ki_pos);
+
+	/*
+	 * Even if iocb->ki_left = 0, we may need to wait
+	 * for a balance_dirty_pages to complete
+	 */
+	if (ret > 0) {
+		iocb->ki_buf += iocb->ki_buf ? ret : 0;
+		iocb->ki_left -= ret;
+
+		ret = -EIOCBRETRY;
+	}
+
+	/* This means we must have transferred all that we could */
+	/* No need to retry anymore unless we need to osync data */
+	if (ret == 0) {
+		ret = iocb->ki_nbytes - iocb->ki_left;
+		if (!iocb->ki_buf)
+			return ret;
+
+		/* Set things up for potential O_SYNC */
+		if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
+			iocb->ki_buf = NULL;
+			iocb->ki_pos -= ret; /* back up fpos */
+			iocb->ki_left = ret; /* sync what we have written out */
+			iocb->ki_nbytes = ret;
+			ret = -EIOCBRETRY;
+		}
+	}
+
+	return ret;
+}
+
+static ssize_t aio_fdsync(struct kiocb *iocb)
+{
+	struct file *file = iocb->ki_filp;
+	ssize_t ret = -EINVAL;
+
+	if (file->f_op->aio_fsync)
+		ret = file->f_op->aio_fsync(iocb, 1);
+	return ret;
+}
+
+static ssize_t aio_fsync(struct kiocb *iocb)
+{
+	struct file *file = iocb->ki_filp;
+	ssize_t ret = -EINVAL;
+
+	if (file->f_op->aio_fsync)
+		ret = file->f_op->aio_fsync(iocb, 0);
+	return ret;
+}
+
+/*
+ * aio_setup_iocb:
+ *	Performs the initial checks and aio retry method
+ *	setup for the kiocb at the time of io submission.
+ */
+ssize_t aio_setup_iocb(struct kiocb *kiocb)
+{
+	struct file *file = kiocb->ki_filp;
+	ssize_t ret = 0;
+
+	switch (kiocb->ki_opcode) {
+	case IOCB_CMD_PREAD:
+		ret = -EBADF;
+		if (unlikely(!(file->f_mode & FMODE_READ)))
+			break;
+		ret = -EFAULT;
+		if (unlikely(!access_ok(VERIFY_WRITE, kiocb->ki_buf,
+			kiocb->ki_left)))
+			break;
+		ret = -EINVAL;
+		if (file->f_op->aio_read)
+			kiocb->ki_retry = aio_pread;
+		break;
+	case IOCB_CMD_PWRITE:
+		ret = -EBADF;
+		if (unlikely(!(file->f_mode & FMODE_WRITE)))
+			break;
+		ret = -EFAULT;
+		if (unlikely(!access_ok(VERIFY_READ, kiocb->ki_buf,
+			kiocb->ki_left)))
+			break;
+		ret = -EINVAL;
+		if (file->f_op->aio_write)
+			kiocb->ki_retry = aio_pwrite;
+		break;
+	case IOCB_CMD_FDSYNC:
+		ret = -EINVAL;
+		if (file->f_op->aio_fsync)
+			kiocb->ki_retry = aio_fdsync;
+		break;
+	case IOCB_CMD_FSYNC:
+		ret = -EINVAL;
+		if (file->f_op->aio_fsync)
+			kiocb->ki_retry = aio_fsync;
+		break;
+	default:
+		dprintk("EINVAL: io_submit: no operation provided\n");
+		ret = -EINVAL;
+	}
+
+	if (!kiocb->ki_retry)
+		return ret;
+
+	return 0;
+}
+
+/*
+ * aio_wake_function:
+ * 	wait queue callback function for aio notification,
+ * 	Simply triggers a retry of the operation via kick_iocb.
+ *
+ * 	This callback is specified in the wait queue entry in
+ *	a kiocb	(current->io_wait points to this wait queue
+ *	entry when an aio operation executes; it is used
+ * 	instead of a synchronous wait when an i/o blocking
+ *	condition is encountered during aio).
+ *
+ * Note:
+ * This routine is executed with the wait queue lock held.
+ * Since kick_iocb acquires iocb->ctx->ctx_lock, it nests
+ * the ioctx lock inside the wait queue lock. This is safe
+ * because this callback isn't used for wait queues which
+ * are nested inside ioctx lock (i.e. ctx->wait)
+ */
+int aio_wake_function(wait_queue_t *wait, unsigned mode, int sync)
+{
+	struct kiocb *iocb = container_of(wait, struct kiocb, ki_wait);
+
+	list_del_init(&wait->task_list);
+	kick_iocb(iocb);
+	return 1;
+}
+
 int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
 			 struct iocb *iocb)
 {
 	struct kiocb *req;
 	struct file *file;
 	ssize_t ret;
-	char *buf;
 
 	/* enforce forwards compatibility on users */
 	if (unlikely(iocb->aio_reserved1 || iocb->aio_reserved2 ||
@@ -1032,52 +1498,31 @@
 	req->ki_user_data = iocb->aio_data;
 	req->ki_pos = iocb->aio_offset;
 
-	buf = (char *)(unsigned long)iocb->aio_buf;
+	req->ki_buf = (char *)(unsigned long)iocb->aio_buf;
+	req->ki_left = req->ki_nbytes = iocb->aio_nbytes;
+	req->ki_opcode = iocb->aio_lio_opcode;
+	init_waitqueue_func_entry(&req->ki_wait, aio_wake_function);
+	INIT_LIST_HEAD(&req->ki_wait.task_list);
+	req->ki_run_list.next = req->ki_run_list.prev = NULL;
+	req->ki_retry = NULL;
+	req->ki_retried = 0;
+	req->ki_kicked = 0;
+	req->ki_queued = 0;
+	aio_run = 0;
+	aio_wakeups = 0;
 
-	switch (iocb->aio_lio_opcode) {
-	case IOCB_CMD_PREAD:
-		ret = -EBADF;
-		if (unlikely(!(file->f_mode & FMODE_READ)))
-			goto out_put_req;
-		ret = -EFAULT;
-		if (unlikely(!access_ok(VERIFY_WRITE, buf, iocb->aio_nbytes)))
-			goto out_put_req;
-		ret = -EINVAL;
-		if (file->f_op->aio_read)
-			ret = file->f_op->aio_read(req, buf,
-					iocb->aio_nbytes, req->ki_pos);
-		break;
-	case IOCB_CMD_PWRITE:
-		ret = -EBADF;
-		if (unlikely(!(file->f_mode & FMODE_WRITE)))
-			goto out_put_req;
-		ret = -EFAULT;
-		if (unlikely(!access_ok(VERIFY_READ, buf, iocb->aio_nbytes)))
-			goto out_put_req;
-		ret = -EINVAL;
-		if (file->f_op->aio_write)
-			ret = file->f_op->aio_write(req, buf,
-					iocb->aio_nbytes, req->ki_pos);
-		break;
-	case IOCB_CMD_FDSYNC:
-		ret = -EINVAL;
-		if (file->f_op->aio_fsync)
-			ret = file->f_op->aio_fsync(req, 1);
-		break;
-	case IOCB_CMD_FSYNC:
-		ret = -EINVAL;
-		if (file->f_op->aio_fsync)
-			ret = file->f_op->aio_fsync(req, 0);
-		break;
-	default:
-		dprintk("EINVAL: io_submit: no operation provided\n");
-		ret = -EINVAL;
-	}
+	ret = aio_setup_iocb(req);
+
+	if (ret)
+		goto out_put_req;
+
+	spin_lock_irq(&ctx->ctx_lock);
+	ret = aio_run_iocb(req);
+	spin_unlock_irq(&ctx->ctx_lock);
 
+	if (-EIOCBRETRY == ret)
+		queue_work(aio_wq, &ctx->wq);
 	aio_put_req(req);	/* drop extra ref to req */
-	if (likely(-EIOCBQUEUED == ret))
-		return 0;
-	aio_complete(req, ret, 0);	/* will drop i/o ref to req */
 	return 0;
 
 out_put_req:
--- diff/fs/binfmt_elf.c	2003-10-27 09:20:44.000000000 +0000
+++ source/fs/binfmt_elf.c	2003-12-29 09:30:41.000000000 +0000
@@ -82,13 +82,17 @@
 
 #define BAD_ADDR(x)	((unsigned long)(x) > TASK_SIZE)
 
-static void set_brk(unsigned long start, unsigned long end)
+static int set_brk(unsigned long start, unsigned long end)
 {
 	start = ELF_PAGEALIGN(start);
 	end = ELF_PAGEALIGN(end);
-	if (end > start)
-		do_brk(start, end - start);
+	if (end > start) {
+		unsigned long addr = do_brk(start, end - start);
+		if (BAD_ADDR(addr))
+			return addr;
+	}
 	current->mm->start_brk = current->mm->brk = end;
+	return 0;
 }
 
 
@@ -381,8 +385,11 @@
 	elf_bss = ELF_PAGESTART(elf_bss + ELF_MIN_ALIGN - 1);	/* What we have mapped so far */
 
 	/* Map the last of the bss segment */
-	if (last_bss > elf_bss)
-		do_brk(elf_bss, last_bss - elf_bss);
+	if (last_bss > elf_bss) {
+		error = do_brk(elf_bss, last_bss - elf_bss);
+		if (BAD_ADDR(error))
+			goto out_close;
+	}
 
 	*interp_load_addr = load_addr;
 	error = ((unsigned long) interp_elf_ex->e_entry) + load_addr;
@@ -466,6 +473,7 @@
 	struct elfhdr interp_elf_ex;
   	struct exec interp_ex;
 	char passed_fileno[6];
+	struct files_struct *files;
 	
 	/* Get the exec-header */
 	elf_ex = *((struct elfhdr *) bprm->buf);
@@ -498,9 +506,20 @@
 	if (retval < 0)
 		goto out_free_ph;
 
+	files = current->files;		/* Refcounted so ok */
+	if(unshare_files() < 0)
+		goto out_free_ph;
+	if (files == current->files) {
+		put_files_struct(files);
+		files = NULL;
+	}
+
+	/* exec will make our files private anyway, but for the a.out
+	   loader stuff we need to do it earlier */
+
 	retval = get_unused_fd();
 	if (retval < 0)
-		goto out_free_ph;
+		goto out_free_fh;
 	get_file(bprm->file);
 	fd_install(elf_exec_fileno = retval, bprm->file);
 
@@ -631,6 +650,13 @@
 	if (retval)
 		goto out_free_dentry;
 
+	/* Discard our unneeded old files struct */
+	if (files) {
+		steal_locks(files);
+		put_files_struct(files);
+		files = NULL;
+	}
+
 	/* OK, This is the point of no return */
 	current->mm->start_data = 0;
 	current->mm->end_data = 0;
@@ -672,7 +698,12 @@
 			/* There was a PT_LOAD segment with p_memsz > p_filesz
 			   before this one. Map anonymous pages, if needed,
 			   and clear the area.  */
-			set_brk (elf_bss + load_bias, elf_brk + load_bias);
+			retval = set_brk (elf_bss + load_bias,
+					  elf_brk + load_bias);
+			if (retval) {
+				send_sig(SIGKILL, current, 0);
+				goto out_free_dentry;
+			}
 			nbyte = ELF_PAGEOFFSET(elf_bss);
 			if (nbyte) {
 				nbyte = ELF_MIN_ALIGN - nbyte;
@@ -737,6 +768,18 @@
 	start_data += load_bias;
 	end_data += load_bias;
 
+	/* Calling set_brk effectively mmaps the pages that we need
+	 * for the bss and break sections.  We must do this before
+	 * mapping in the interpreter, to make sure it doesn't wind
+	 * up getting placed where the bss needs to go.
+	 */
+	retval = set_brk(elf_bss, elf_brk);
+	if (retval) {
+		send_sig(SIGKILL, current, 0);
+		goto out_free_dentry;
+	}
+	padzero(elf_bss);
+
 	if (elf_interpreter) {
 		if (interpreter_type == INTERPRETER_AOUT)
 			elf_entry = load_aout_interp(&interp_ex,
@@ -745,19 +788,17 @@
 			elf_entry = load_elf_interp(&interp_elf_ex,
 						    interpreter,
 						    &interp_load_addr);
-
-		allow_write_access(interpreter);
-		fput(interpreter);
-		kfree(elf_interpreter);
-
 		if (BAD_ADDR(elf_entry)) {
 			printk(KERN_ERR "Unable to load interpreter\n");
-			kfree(elf_phdata);
 			send_sig(SIGSEGV, current, 0);
 			retval = -ENOEXEC; /* Nobody gets to see this, but.. */
-			goto out;
+			goto out_free_dentry;
 		}
 		reloc_func_desc = interp_load_addr;
+
+		allow_write_access(interpreter);
+		fput(interpreter);
+		kfree(elf_interpreter);
 	} else {
 		elf_entry = elf_ex.e_entry;
 	}
@@ -782,13 +823,6 @@
 	current->mm->end_data = end_data;
 	current->mm->start_stack = bprm->p;
 
-	/* Calling set_brk effectively mmaps the pages that we need
-	 * for the bss and break sections
-	 */
-	set_brk(elf_bss, elf_brk);
-
-	padzero(elf_bss);
-
 	if (current->personality & MMAP_PAGE_ZERO) {
 		/* Why this, you ask???  Well SVr4 maps page 0 as read-only,
 		   and some applications "depend" upon this behavior.
@@ -835,6 +869,11 @@
 		kfree(elf_interpreter);
 out_free_file:
 	sys_close(elf_exec_fileno);
+out_free_fh:
+	if (files) {
+		put_files_struct(current->files);
+		current->files = files;
+	}
 out_free_ph:
 	kfree(elf_phdata);
 	goto out;
--- diff/fs/binfmt_som.c	2003-02-13 11:46:54.000000000 +0000
+++ source/fs/binfmt_som.c	2003-12-29 09:30:41.000000000 +0000
@@ -217,7 +217,7 @@
 			(char *) hpuxhdr, size);
 	if (retval < 0)
 		goto out_free;
-
+#error "Fix security hole before enabling me"
 	retval = get_unused_fd();
 	if (retval < 0)
 		goto out_free;
--- diff/fs/block_dev.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/block_dev.c	2003-12-29 09:30:41.000000000 +0000
@@ -25,6 +25,22 @@
 #include <linux/namei.h>
 #include <asm/uaccess.h>
 
+struct bdev_inode {
+	struct block_device bdev;
+	struct inode vfs_inode;
+};
+
+static inline struct bdev_inode *BDEV_I(struct inode *inode)
+{
+	return container_of(inode, struct bdev_inode, vfs_inode);
+}
+
+inline struct block_device *I_BDEV(struct inode *inode)
+{
+	return &BDEV_I(inode)->bdev;
+}
+
+EXPORT_SYMBOL(I_BDEV);
 
 static sector_t max_block(struct block_device *bdev)
 {
@@ -100,10 +116,10 @@
 blkdev_get_block(struct inode *inode, sector_t iblock,
 		struct buffer_head *bh, int create)
 {
-	if (iblock >= max_block(inode->i_bdev))
+	if (iblock >= max_block(I_BDEV(inode)))
 		return -EIO;
 
-	bh->b_bdev = inode->i_bdev;
+	bh->b_bdev = I_BDEV(inode);
 	bh->b_blocknr = iblock;
 	set_buffer_mapped(bh);
 	return 0;
@@ -113,10 +129,10 @@
 blkdev_get_blocks(struct inode *inode, sector_t iblock,
 		unsigned long max_blocks, struct buffer_head *bh, int create)
 {
-	if ((iblock + max_blocks) > max_block(inode->i_bdev))
+	if ((iblock + max_blocks) > max_block(I_BDEV(inode)))
 		return -EIO;
 
-	bh->b_bdev = inode->i_bdev;
+	bh->b_bdev = I_BDEV(inode);
 	bh->b_blocknr = iblock;
 	bh->b_size = max_blocks << inode->i_blkbits;
 	set_buffer_mapped(bh);
@@ -128,9 +144,9 @@
 			loff_t offset, unsigned long nr_segs)
 {
 	struct file *file = iocb->ki_filp;
-	struct inode *inode = file->f_dentry->d_inode->i_mapping->host;
+	struct inode *inode = file->f_mapping->host;
 
-	return blockdev_direct_IO(rw, iocb, inode, inode->i_bdev, iov, offset,
+	return blockdev_direct_IO(rw, iocb, inode, I_BDEV(inode), iov, offset,
 				nr_segs, blkdev_get_blocks, NULL);
 }
 
@@ -161,11 +177,10 @@
  */
 static loff_t block_llseek(struct file *file, loff_t offset, int origin)
 {
-	struct inode *bd_inode;
+	struct inode *bd_inode = file->f_mapping->host;
 	loff_t size;
 	loff_t retval;
 
-	bd_inode = file->f_dentry->d_inode->i_bdev->bd_inode;
 	down(&bd_inode->i_sem);
 	size = i_size_read(bd_inode);
 
@@ -188,15 +203,13 @@
 }
 	
 /*
- *	Filp may be NULL when we are called by an msync of a vma
- *	since the vma has no handle.
+ *	Filp is never NULL; the only case when ->fsync() is called with
+ *	NULL first argument is nfsd_sync_dir() and that's not a directory.
  */
  
 static int block_fsync(struct file *filp, struct dentry *dentry, int datasync)
 {
-	struct inode * inode = dentry->d_inode;
-
-	return sync_blockdev(inode->i_bdev);
+	return sync_blockdev(I_BDEV(filp->f_mapping->host));
 }
 
 /*
@@ -206,16 +219,6 @@
 static spinlock_t bdev_lock __cacheline_aligned_in_smp = SPIN_LOCK_UNLOCKED;
 static kmem_cache_t * bdev_cachep;
 
-struct bdev_inode {
-	struct block_device bdev;
-	struct inode vfs_inode;
-};
-
-static inline struct bdev_inode *BDEV_I(struct inode *inode)
-{
-	return container_of(inode, struct bdev_inode, vfs_inode);
-}
-
 static struct inode *bdev_alloc_inode(struct super_block *sb)
 {
 	struct bdev_inode *ei = kmem_cache_alloc(bdev_cachep, SLAB_KERNEL);
@@ -387,26 +390,27 @@
 
 EXPORT_SYMBOL(bdput);
  
-int bd_acquire(struct inode *inode)
+static struct block_device *bd_acquire(struct inode *inode)
 {
 	struct block_device *bdev;
 	spin_lock(&bdev_lock);
-	if (inode->i_bdev && igrab(inode->i_bdev->bd_inode)) {
+	bdev = inode->i_bdev;
+	if (bdev && igrab(bdev->bd_inode)) {
 		spin_unlock(&bdev_lock);
-		return 0;
+		return bdev;
 	}
 	spin_unlock(&bdev_lock);
 	bdev = bdget(inode->i_rdev);
-	if (!bdev)
-		return -ENOMEM;
-	spin_lock(&bdev_lock);
-	if (inode->i_bdev)
-		__bd_forget(inode);
-	inode->i_bdev = bdev;
-	inode->i_mapping = bdev->bd_inode->i_mapping;
-	list_add(&inode->i_devices, &bdev->bd_inodes);
-	spin_unlock(&bdev_lock);
-	return 0;
+	if (bdev) {
+		spin_lock(&bdev_lock);
+		if (inode->i_bdev)
+			__bd_forget(inode);
+		inode->i_bdev = bdev;
+		inode->i_mapping = bdev->bd_inode->i_mapping;
+		list_add(&inode->i_devices, &bdev->bd_inodes);
+		spin_unlock(&bdev_lock);
+	}
+	return bdev;
 }
 
 /* Call when you free inode */
@@ -531,13 +535,14 @@
 	bdev->bd_inode->i_blkbits = blksize_bits(bsize);
 }
 
-static int do_open(struct block_device *bdev, struct inode *inode, struct file *file)
+static int do_open(struct block_device *bdev, struct file *file)
 {
 	struct module *owner = NULL;
 	struct gendisk *disk;
 	int ret = -ENXIO;
 	int part;
 
+	file->f_mapping = bdev->bd_inode->i_mapping;
 	lock_kernel();
 	disk = get_gendisk(bdev->bd_dev, &part);
 	if (!disk) {
@@ -554,7 +559,7 @@
 		if (!part) {
 			struct backing_dev_info *bdi;
 			if (disk->fops->open) {
-				ret = disk->fops->open(inode, file);
+				ret = disk->fops->open(bdev, file);
 				if (ret)
 					goto out_first;
 			}
@@ -599,7 +604,7 @@
 		module_put(owner);
 		if (bdev->bd_contains == bdev) {
 			if (bdev->bd_disk->fops->open) {
-				ret = bdev->bd_disk->fops->open(inode, file);
+				ret = bdev->bd_disk->fops->open(bdev, file);
 				if (ret)
 					goto out;
 			}
@@ -647,7 +652,7 @@
 	fake_file.f_dentry = &fake_dentry;
 	fake_dentry.d_inode = bdev->bd_inode;
 
-	return do_open(bdev, bdev->bd_inode, &fake_file);
+	return do_open(bdev, &fake_file);
 }
 
 EXPORT_SYMBOL(blkdev_get);
@@ -665,10 +670,9 @@
 	 */
 	filp->f_flags |= O_LARGEFILE;
 
-	bd_acquire(inode);
-	bdev = inode->i_bdev;
+	bdev = bd_acquire(inode);
 
-	res = do_open(bdev, inode, filp);
+	res = do_open(bdev, filp);
 	if (res)
 		return res;
 
@@ -687,7 +691,6 @@
 int blkdev_put(struct block_device *bdev, int kind)
 {
 	int ret = 0;
-	struct inode *bd_inode = bdev->bd_inode;
 	struct gendisk *disk = bdev->bd_disk;
 
 	down(&bdev->bd_sem);
@@ -696,14 +699,14 @@
 		switch (kind) {
 		case BDEV_FILE:
 		case BDEV_FS:
-			sync_blockdev(bd_inode->i_bdev);
+			sync_blockdev(bdev);
 			break;
 		}
 		kill_bdev(bdev);
 	}
 	if (bdev->bd_contains == bdev) {
 		if (disk->fops->release)
-			ret = disk->fops->release(bd_inode, NULL);
+			ret = disk->fops->release(disk);
 	} else {
 		down(&bdev->bd_contains->bd_sem);
 		bdev->bd_contains->bd_part_count--;
@@ -734,11 +737,12 @@
 
 EXPORT_SYMBOL(blkdev_put);
 
-int blkdev_close(struct inode * inode, struct file * filp)
+static int blkdev_close(struct inode * inode, struct file * filp)
 {
-	if (inode->i_bdev->bd_holder == filp)
-		bd_release(inode->i_bdev);
-	return blkdev_put(inode->i_bdev, BDEV_FILE);
+	struct block_device *bdev = I_BDEV(filp->f_mapping->host);
+	if (bdev->bd_holder == filp)
+		bd_release(bdev);
+	return blkdev_put(bdev, BDEV_FILE);
 }
 
 static ssize_t blkdev_file_write(struct file *file, const char __user *buf,
@@ -757,6 +761,11 @@
 	return generic_file_aio_write_nolock(iocb, &local_iov, 1, &iocb->ki_pos);
 }
 
+static int block_ioctl(struct inode *inode, struct file *file, unsigned cmd,
+			unsigned long arg)
+{
+	return blkdev_ioctl(I_BDEV(file->f_mapping->host), file, cmd, arg);
+}
 
 struct address_space_operations def_blk_aops = {
 	.readpage	= blkdev_readpage,
@@ -778,7 +787,7 @@
   	.aio_write	= blkdev_file_aio_write, 
 	.mmap		= generic_file_mmap,
 	.fsync		= block_fsync,
-	.ioctl		= blkdev_ioctl,
+	.ioctl		= block_ioctl,
 	.readv		= generic_file_readv,
 	.writev		= generic_file_writev,
 	.sendfile	= generic_file_sendfile,
@@ -791,7 +800,7 @@
 	int res;
 	mm_segment_t old_fs = get_fs();
 	set_fs(KERNEL_DS);
-	res = blkdev_ioctl(bdev->bd_inode, NULL, cmd, arg);
+	res = blkdev_ioctl(bdev, NULL, cmd, arg);
 	set_fs(old_fs);
 	return res;
 }
@@ -828,11 +837,10 @@
 	error = -EACCES;
 	if (nd.mnt->mnt_flags & MNT_NODEV)
 		goto fail;
-	error = bd_acquire(inode);
-	if (error)
+	error = -ENOMEM;
+	bdev = bd_acquire(inode);
+	if (!bdev)
 		goto fail;
-	bdev = inode->i_bdev;
-
 out:
 	path_release(&nd);
 	return bdev;
--- diff/fs/buffer.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/buffer.c	2003-12-29 09:30:41.000000000 +0000
@@ -116,27 +116,50 @@
 }
 
 /*
- * Block until a buffer comes unlocked.  This doesn't stop it
+ * Wait until a buffer comes unlocked.  This doesn't stop it
  * from becoming locked again - you have to lock it yourself
  * if you want to preserve its state.
+ * If the wait queue parameter specifies an async i/o callback,
+ * then instead of blocking, we just queue up the callback
+ * on the wait queue for async notification when the buffer gets
+ * unlocked.
+ * A NULL wait queue parameter defaults to synchronous behaviour
  */
-void __wait_on_buffer(struct buffer_head * bh)
+int __wait_on_buffer_wq(struct buffer_head * bh, wait_queue_t *wait)
 {
 	wait_queue_head_t *wqh = bh_waitq_head(bh);
-	DEFINE_WAIT(wait);
+	DEFINE_WAIT(local_wait);
+
+	if (!wait)
+		wait = &local_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);
+		prepare_to_wait(wqh, wait, TASK_UNINTERRUPTIBLE);
 		if (buffer_locked(bh)) {
 			blk_run_queues();
+			if (!is_sync_wait(wait)) {
+				/*
+				 * if we've queued an async wait queue
+				 * callback do not block; just tell the
+				 * caller to return and retry later when
+				 * the callback is notified
+				 */
+				return -EIOCBRETRY;
+			}
 			io_schedule();
 		}
 	} while (buffer_locked(bh));
-	finish_wait(wqh, &wait);
+	finish_wait(wqh, wait);
+	return 0;
+}
+
+void __wait_on_buffer(struct buffer_head * bh)
+{
+	__wait_on_buffer_wq(bh, NULL);
 }
 
 static void
@@ -314,8 +337,7 @@
 asmlinkage long sys_fsync(unsigned int fd)
 {
 	struct file * file;
-	struct dentry * dentry;
-	struct inode * inode;
+	struct address_space *mapping;
 	int ret, err;
 
 	ret = -EBADF;
@@ -323,8 +345,7 @@
 	if (!file)
 		goto out;
 
-	dentry = file->f_dentry;
-	inode = dentry->d_inode;
+	mapping = file->f_mapping;
 
 	ret = -EINVAL;
 	if (!file->f_op || !file->f_op->fsync) {
@@ -333,17 +354,17 @@
 	}
 
 	/* We need to protect against concurrent writers.. */
-	down(&inode->i_sem);
+	down(&mapping->host->i_sem);
 	current->flags |= PF_SYNCWRITE;
-	ret = filemap_fdatawrite(inode->i_mapping);
-	err = file->f_op->fsync(file, dentry, 0);
+	ret = filemap_fdatawrite(mapping);
+	err = file->f_op->fsync(file, file->f_dentry, 0);
 	if (!ret)
 		ret = err;
-	err = filemap_fdatawait(inode->i_mapping);
+	err = filemap_fdatawait(mapping);
 	if (!ret)
 		ret = err;
 	current->flags &= ~PF_SYNCWRITE;
-	up(&inode->i_sem);
+	up(&mapping->host->i_sem);
 
 out_putf:
 	fput(file);
@@ -354,8 +375,7 @@
 asmlinkage long sys_fdatasync(unsigned int fd)
 {
 	struct file * file;
-	struct dentry * dentry;
-	struct inode * inode;
+	struct address_space *mapping;
 	int ret, err;
 
 	ret = -EBADF;
@@ -363,24 +383,23 @@
 	if (!file)
 		goto out;
 
-	dentry = file->f_dentry;
-	inode = dentry->d_inode;
-
 	ret = -EINVAL;
 	if (!file->f_op || !file->f_op->fsync)
 		goto out_putf;
 
-	down(&inode->i_sem);
+	mapping = file->f_mapping;
+
+	down(&mapping->host->i_sem);
 	current->flags |= PF_SYNCWRITE;
-	ret = filemap_fdatawrite(inode->i_mapping);
-	err = file->f_op->fsync(file, dentry, 1);
+	ret = filemap_fdatawrite(mapping);
+	err = file->f_op->fsync(file, file->f_dentry, 1);
 	if (!ret)
 		ret = err;
-	err = filemap_fdatawait(inode->i_mapping);
+	err = filemap_fdatawait(mapping);
 	if (!ret)
 		ret = err;
 	current->flags &= ~PF_SYNCWRITE;
-	up(&inode->i_sem);
+	up(&mapping->host->i_sem);
 
 out_putf:
 	fput(file);
@@ -432,6 +451,7 @@
 	printk("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);
@@ -487,7 +507,7 @@
  */
 static void free_more_memory(void)
 {
-	struct zone *zone;
+	struct zone **zones;
 	pg_data_t *pgdat;
 
 	wakeup_bdflush(1024);
@@ -495,9 +515,9 @@
 	yield();
 
 	for_each_pgdat(pgdat) {
-		zone = pgdat->node_zonelists[GFP_NOFS&GFP_ZONEMASK].zones[0];
-		if (zone)
-			try_to_free_pages(zone, GFP_NOFS, 0);
+		zones = pgdat->node_zonelists[GFP_NOFS&GFP_ZONEMASK].zones;
+		if (*zones)
+			try_to_free_pages(zones, GFP_NOFS, 0);
 	}
 }
 
@@ -1296,9 +1316,12 @@
 	__brelse(bh);
 }
 
-static struct buffer_head *__bread_slow(struct buffer_head *bh)
+static struct buffer_head *__bread_slow_wq(struct buffer_head *bh,
+		wait_queue_t *wait)
 {
-	lock_buffer(bh);
+	if (-EIOCBRETRY == lock_buffer_wq(bh, wait))
+		return ERR_PTR(-EIOCBRETRY);
+
 	if (buffer_uptodate(bh)) {
 		unlock_buffer(bh);
 		return bh;
@@ -1308,7 +1331,8 @@
 		get_bh(bh);
 		bh->b_end_io = end_buffer_read_sync;
 		submit_bh(READ, bh);
-		wait_on_buffer(bh);
+		if (-EIOCBRETRY == wait_on_buffer_wq(bh, wait))
+			return ERR_PTR(-EIOCBRETRY);
 		if (buffer_uptodate(bh))
 			return bh;
 	}
@@ -1316,6 +1340,11 @@
 	return NULL;
 }
 
+static inline struct buffer_head *__bread_slow(struct buffer_head *bh)
+{
+	return __bread_slow_wq(bh, NULL);
+}
+
 /*
  * Per-cpu buffer LRU implementation.  To reduce the cost of __find_get_block().
  * The bhs[] array is sorted - newest buffer is at bhs[0].  Buffers have their
@@ -1503,6 +1532,18 @@
 }
 EXPORT_SYMBOL(__bread);
 
+struct buffer_head *
+__bread_wq(struct block_device *bdev, sector_t block, int size,
+	wait_queue_t *wait)
+{
+	struct buffer_head *bh = __getblk(bdev, block, size);
+
+	if (!buffer_uptodate(bh))
+		bh = __bread_slow_wq(bh, wait);
+	return bh;
+}
+EXPORT_SYMBOL(__bread_wq);
+
 /*
  * invalidate_bh_lrus() is called rarely - at unmount.  Because it is only for
  * unmount it only needs to ensure that all buffers from the target device are
@@ -1980,8 +2021,9 @@
 	/*
 	 * If we issued read requests - let them complete.
 	 */
-	while(wait_bh > wait) {
-		wait_on_buffer(*--wait_bh);
+	while (wait_bh > wait) {
+		if ((err = wait_on_buffer_wq(*--wait_bh, current->io_wait)))
+			return err;
 		if (!buffer_uptodate(*wait_bh))
 			return -EIO;
 	}
@@ -2823,7 +2865,7 @@
 		bh = bh->b_this_page;
 	} while (bh != head);
 
-	if (!was_uptodate && PageUptodate(page))
+	if (!was_uptodate && PageUptodate(page) && !PageError(page))
 		buffer_error();
 
 	do {
@@ -3039,6 +3081,7 @@
 EXPORT_SYMBOL(__bforget);
 EXPORT_SYMBOL(__brelse);
 EXPORT_SYMBOL(__wait_on_buffer);
+EXPORT_SYMBOL(__wait_on_buffer_wq);
 EXPORT_SYMBOL(block_commit_write);
 EXPORT_SYMBOL(block_prepare_write);
 EXPORT_SYMBOL(block_read_full_page);
--- diff/fs/char_dev.c	2003-11-25 15:24:59.000000000 +0000
+++ source/fs/char_dev.c	2003-12-29 09:30:41.000000000 +0000
@@ -434,7 +434,9 @@
 
 static struct kobject *base_probe(dev_t dev, int *part, void *data)
 {
-	request_module("char-major-%d-%d", MAJOR(dev), MINOR(dev));
+	if (request_module("char-major-%d-%d", MAJOR(dev), MINOR(dev)) > 0)
+		/* Make old-style 2.4 aliases work */
+		request_module("char-major-%d", MAJOR(dev));
 	return NULL;
 }
 
--- diff/fs/coda/file.c	2003-09-30 15:46:18.000000000 +0100
+++ source/fs/coda/file.c	2003-12-29 09:30:41.000000000 +0000
@@ -89,6 +89,7 @@
 
 	coda_inode = coda_file->f_dentry->d_inode;
 	host_inode = host_file->f_dentry->d_inode;
+	coda_file->f_mapping = host_file->f_mapping;
 	if (coda_inode->i_mapping == &coda_inode->i_data)
 		coda_inode->i_mapping = host_inode->i_mapping;
 
--- diff/fs/compat.c	2003-11-25 15:24:59.000000000 +0000
+++ source/fs/compat.c	2003-12-29 09:30:41.000000000 +0000
@@ -559,3 +559,96 @@
 	return compat_sys_fcntl64(fd, cmd, arg);
 }
 
+extern asmlinkage long sys_io_setup(unsigned nr_reqs, aio_context_t *ctx);
+
+asmlinkage long
+compat_sys_io_setup(unsigned nr_reqs, u32 *ctx32p)
+{
+	long ret;
+	aio_context_t ctx64;
+
+	mm_segment_t oldfs = get_fs();
+	if (unlikely(get_user(ctx64, ctx32p)))
+		return -EFAULT;
+
+	set_fs(KERNEL_DS);
+	ret = sys_io_setup(nr_reqs, &ctx64);
+	set_fs(oldfs);
+	/* truncating is ok because it's a user address */
+	if (!ret)
+		ret = put_user((u32) ctx64, ctx32p);
+	return ret;
+}
+
+extern asmlinkage long sys_io_getevents(aio_context_t ctx_id,
+					  long min_nr,
+					  long nr,
+					  struct io_event *events,
+					  struct timespec *timeout);
+
+asmlinkage long
+compat_sys_io_getevents(aio_context_t ctx_id,
+				 unsigned long min_nr,
+				 unsigned long nr,
+				 struct io_event *events,
+				 struct compat_timespec *timeout)
+{
+	long ret;
+	struct timespec t;
+	struct timespec *ut = NULL;
+
+	ret = -EFAULT;
+	if (unlikely(!access_ok(VERIFY_WRITE, events,
+				nr * sizeof(struct io_event))))
+		goto out;
+	if (timeout) {
+		if (get_compat_timespec(&t, timeout))
+			goto out;
+
+		ut = compat_alloc_user_space(sizeof(*ut));
+		if (copy_to_user(ut, &t, sizeof(t)) )
+			goto out;
+	}
+	ret = sys_io_getevents(ctx_id, min_nr, nr, events, ut);
+out:
+	return ret;
+}
+
+extern asmlinkage long sys_io_submit(aio_context_t, long,
+				struct iocb __user **);
+
+static inline long
+copy_iocb(long nr, u32 *ptr32, u64 *ptr64)
+{
+	compat_uptr_t uptr;
+	int i;
+
+	for (i = 0; i < nr; ++i) {
+		if (get_user(uptr, ptr32 + i))
+			return -EFAULT;
+		if (put_user((u64)compat_ptr(uptr), ptr64 + i))
+			return -EFAULT;
+	}
+	return 0;
+}
+
+#define MAX_AIO_SUBMITS 	(PAGE_SIZE/sizeof(struct iocb *))
+
+asmlinkage long
+compat_sys_io_submit(aio_context_t ctx_id, int nr, u32 *iocb)
+{
+	struct iocb **iocb64;
+	long ret;
+
+	if (unlikely(nr < 0))
+		return -EINVAL;
+
+	if (nr > MAX_AIO_SUBMITS)
+		nr = MAX_AIO_SUBMITS;
+
+	iocb64 = compat_alloc_user_space(nr * sizeof(*iocb64));
+	ret = copy_iocb(nr, iocb, (u64 *) iocb64);
+	if (!ret)
+		ret = sys_io_submit(ctx_id, nr, iocb64);
+	return ret;
+}
--- diff/fs/compat_ioctl.c	2003-10-27 09:20:38.000000000 +0000
+++ source/fs/compat_ioctl.c	2003-12-29 09:30:41.000000000 +0000
@@ -63,6 +63,8 @@
 #include <linux/ctype.h>
 #include <linux/ioctl32.h>
 #include <linux/ncp_fs.h>
+#include <linux/i2c.h>
+#include <linux/i2c-dev.h>
 
 #include <net/sock.h>          /* siocdevprivate_ioctl */
 #include <net/bluetooth/bluetooth.h>
@@ -128,7 +130,7 @@
 	set_fs (KERNEL_DS);
 	err = sys_ioctl(fd, cmd, (unsigned long)&val);
 	set_fs (old_fs);
-	if (!err && put_user(val, (u32 *)arg))
+	if (!err && put_user(val, (u32 *)compat_ptr(arg)))
 		return -EFAULT;
 	return err;
 }
@@ -136,15 +138,16 @@
 static int rw_long(unsigned int fd, unsigned int cmd, unsigned long arg)
 {
 	mm_segment_t old_fs = get_fs();
+	u32 *argptr = compat_ptr(arg);
 	int err;
 	unsigned long val;
 	
-	if(get_user(val, (u32 *)arg))
+	if(get_user(val, argptr))
 		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))
+	if (!err && put_user(val, argptr))
 		return -EFAULT;
 	return err;
 }
@@ -1701,7 +1704,7 @@
 	set_fs(old_fs);
 
 	if (err >= 0)
-		err = put_user(kuid, (compat_pid_t *)arg);
+		err = put_user(kuid, (compat_uid_t *)arg);
 
 	return err;
 }
@@ -2869,6 +2872,105 @@
 
         return err;
 }
+
+/*
+ * I2C layer ioctls
+ */
+
+struct i2c_msg32 {
+	u16 addr;
+	u16 flags;
+	u16 len;
+	compat_caddr_t buf;
+};
+
+struct i2c_rdwr_ioctl_data32 {
+	compat_caddr_t msgs; /* struct i2c_msg __user *msgs */
+	u32 nmsgs;
+};
+
+struct i2c_smbus_ioctl_data32 {
+	u8 read_write;
+	u8 command;
+	u32 size;
+	compat_caddr_t data; /* union i2c_smbus_data *data */
+};
+
+static int do_i2c_rdwr_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
+{
+	struct i2c_rdwr_ioctl_data	*tdata;
+	struct i2c_rdwr_ioctl_data32	*udata;
+	struct i2c_msg			*tmsgs;
+	struct i2c_msg32		*umsgs;
+	compat_caddr_t			datap;
+	int				nmsgs, i;
+
+	tdata = compat_alloc_user_space(sizeof(*tdata));
+	if (tdata == NULL)
+		return -ENOMEM;
+	if (verify_area(VERIFY_WRITE, tdata, sizeof(*tdata)))
+		return -EFAULT;
+
+	udata = (struct i2c_rdwr_ioctl_data32 *)compat_ptr(arg);
+	if (verify_area(VERIFY_READ, udata, sizeof(*udata)))
+		return -EFAULT;
+	if (__get_user(nmsgs, &udata->nmsgs) || __put_user(nmsgs, &tdata->nmsgs))
+		return -EFAULT;
+	if (nmsgs > I2C_RDRW_IOCTL_MAX_MSGS)
+		return -EINVAL;
+	if (__get_user(datap, &udata->msgs))
+		return -EFAULT;
+	umsgs = (struct i2c_msg32 *)compat_ptr(datap);
+	if (verify_area(VERIFY_READ, umsgs, sizeof(struct i2c_msg) * nmsgs))
+		return -EFAULT;
+
+	tmsgs = compat_alloc_user_space(sizeof(struct i2c_msg) * nmsgs);
+	if (tmsgs == NULL)
+		return -ENOMEM;
+	if (verify_area(VERIFY_WRITE, tmsgs, sizeof(struct i2c_msg) * nmsgs))
+		return -EFAULT;
+	if (__put_user(tmsgs, &tdata->msgs))
+		return -ENOMEM;
+	for (i = 0; i < nmsgs; i++) {
+		if (__copy_in_user(&tmsgs[i].addr,
+				   &umsgs[i].addr,
+				   3 * sizeof(u16)))
+			return -EFAULT;
+		if (__get_user(datap, &umsgs[i].buf) ||
+		    __put_user(compat_ptr(datap), &tmsgs[i].buf))
+			return -EFAULT;
+	}
+	return sys_ioctl(fd, cmd, (unsigned long)tdata);
+}
+
+static int do_i2c_smbus_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
+{
+	struct i2c_smbus_ioctl_data	*tdata;
+	struct i2c_smbus_ioctl_data32	*udata;
+	compat_caddr_t			datap;
+
+	tdata = compat_alloc_user_space(sizeof(*tdata));
+	if (tdata == NULL)
+		return -ENOMEM;
+	if (verify_area(VERIFY_WRITE, tdata, sizeof(*tdata)))
+		return -EFAULT;
+
+	udata = (struct i2c_smbus_ioctl_data32 *)compat_ptr(arg);
+	if (verify_area(VERIFY_READ, udata, sizeof(*udata)))
+		return -EFAULT;
+
+	if (__copy_in_user(&tdata->read_write, &udata->read_write, 2 * sizeof(u8)))
+		return -EFAULT;
+	if (__copy_in_user(&tdata->size, &udata->size, 2 * sizeof(u32)))
+		return -EFAULT;
+	if (__get_user(datap, &udata->data) ||
+	    __put_user(compat_ptr(datap), &tdata->data))
+		return -EFAULT;
+
+	return sys_ioctl(fd, cmd, (unsigned long)tdata);
+}
+
+
 #undef CODE
 #endif
 
@@ -2979,7 +3081,7 @@
 HANDLE_IOCTL(VIDIOCGFREQ32, do_video_ioctl)
 HANDLE_IOCTL(VIDIOCSFREQ32, do_video_ioctl)
 /* One SMB ioctl needs translations. */
-#define SMB_IOC_GETMOUNTUID_32 _IOR('u', 1, compat_pid_t)
+#define SMB_IOC_GETMOUNTUID_32 _IOR('u', 1, compat_uid_t)
 HANDLE_IOCTL(SMB_IOC_GETMOUNTUID_32, do_smb_getmountuid)
 HANDLE_IOCTL(ATM_GETLINKRATE32, do_atm_ioctl)
 HANDLE_IOCTL(ATM_GETNAMES32, do_atm_ioctl)
@@ -3027,5 +3129,10 @@
 HANDLE_IOCTL(USBDEVFS_REAPURB32, do_usbdevfs_reapurb)
 HANDLE_IOCTL(USBDEVFS_REAPURBNDELAY32, do_usbdevfs_reapurb)
 HANDLE_IOCTL(USBDEVFS_DISCSIGNAL32, do_usbdevfs_discsignal)
+/* i2c */
+HANDLE_IOCTL(I2C_FUNCS, w_long)
+HANDLE_IOCTL(I2C_RDWR, do_i2c_rdwr_ioctl)
+HANDLE_IOCTL(I2C_SMBUS, do_i2c_smbus_ioctl)
+
 #undef DECLARES
 #endif
--- diff/fs/cramfs/inode.c	2003-11-25 15:24:59.000000000 +0000
+++ source/fs/cramfs/inode.c	2003-12-29 09:30:41.000000000 +0000
@@ -112,8 +112,8 @@
  */
 static void *cramfs_read(struct super_block *sb, unsigned int offset, unsigned int len)
 {
-	struct buffer_head * bh_array[BLKS_PER_BUF];
-	struct buffer_head * read_array[BLKS_PER_BUF];
+	struct address_space *mapping = sb->s_bdev->bd_inode->i_mapping;
+	struct page *pages[BLKS_PER_BUF];
 	unsigned i, blocknr, buffer, unread;
 	unsigned long devsize;
 	char *data;
@@ -138,33 +138,36 @@
 		return read_buffers[i] + blk_offset;
 	}
 
-	devsize = sb->s_bdev->bd_inode->i_size >> 12;
-	if (!devsize)
-		devsize = ~0UL;
+	devsize = mapping->host->i_size >> PAGE_CACHE_SHIFT;
 
 	/* Ok, read in BLKS_PER_BUF pages completely first. */
 	unread = 0;
 	for (i = 0; i < BLKS_PER_BUF; i++) {
-		struct buffer_head *bh;
+		struct page *page = NULL;
 
-		bh = NULL;
 		if (blocknr + i < devsize) {
-			bh = sb_getblk(sb, blocknr + i);
-			if (!buffer_uptodate(bh))
-				read_array[unread++] = bh;
+			page = read_cache_page(mapping, blocknr + i,
+				(filler_t *)mapping->a_ops->readpage,
+				NULL);
+			/* synchronous error? */
+			if (IS_ERR(page))
+				page = NULL;
 		}
-		bh_array[i] = bh;
+		pages[i] = page;
 	}
 
-	if (unread) {
-		ll_rw_block(READ, unread, read_array);
-		do {
-			unread--;
-			wait_on_buffer(read_array[unread]);
-		} while (unread);
+	for (i = 0; i < BLKS_PER_BUF; i++) {
+		struct page *page = pages[i];
+		if (page) {
+			wait_on_page_locked(page);
+			if (!PageUptodate(page)) {
+				/* asynchronous error */
+				page_cache_release(page);
+				pages[i] = NULL;
+			}
+		}
 	}
 
-	/* Ok, copy them to the staging area without sleeping. */
 	buffer = next_buffer;
 	next_buffer = NEXT_BUFFER(buffer);
 	buffer_blocknr[buffer] = blocknr;
@@ -172,10 +175,11 @@
 
 	data = read_buffers[buffer];
 	for (i = 0; i < BLKS_PER_BUF; i++) {
-		struct buffer_head * bh = bh_array[i];
-		if (bh) {
-			memcpy(data, bh->b_data, PAGE_CACHE_SIZE);
-			brelse(bh);
+		struct page *page = pages[i];
+		if (page) {
+			memcpy(data, kmap(page), PAGE_CACHE_SIZE);
+			kunmap(page);
+			page_cache_release(page);
 		} else
 			memset(data, 0, PAGE_CACHE_SIZE);
 		data += PAGE_CACHE_SIZE;
@@ -202,8 +206,6 @@
 	sb->s_fs_info = sbi;
 	memset(sbi, 0, sizeof(struct cramfs_sb_info));
 
-	sb_set_blocksize(sb, PAGE_CACHE_SIZE);
-
 	/* Invalidate the read buffers on mount: think disk change.. */
 	down(&read_mutex);
 	for (i = 0; i < READ_BUFFERS; i++)
--- diff/fs/dcache.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/dcache.c	2003-12-29 09:30:41.000000000 +0000
@@ -639,24 +639,9 @@
 
 /*
  * This is called from kswapd when we think we need some more memory.
- *
- * We don't want the VM to steal _all_ unused dcache.  Because that leads to
- * the VM stealing all unused inodes, which shoots down recently-used
- * pagecache.  So what we do is to tell fibs to the VM about how many reapable
- * objects there are in this cache.   If the number of unused dentries is
- * less than half of the total dentry count then return zero.  The net effect
- * is that the number of unused dentries will be, at a minimum, equal to the
- * number of used ones.
- *
- * If unused_ratio is set to 5, the number of unused dentries will not fall
- * below 5* the number of used ones.
  */
 static int shrink_dcache_memory(int nr, unsigned int gfp_mask)
 {
-	int nr_used;
-	int nr_unused;
-	const int unused_ratio = 1;
-
 	if (nr) {
 		/*
 		 * Nasty deadlock avoidance.
@@ -672,11 +657,7 @@
 		if (gfp_mask & __GFP_FS)
 			prune_dcache(nr);
 	}
-	nr_unused = dentry_stat.nr_unused;
-	nr_used = dentry_stat.nr_dentry - nr_unused;
-	if (nr_unused < nr_used * unused_ratio)
-		return 0;
-	return nr_unused - nr_used * unused_ratio;
+	return dentry_stat.nr_unused;
 }
 
 #define NAME_ALLOC_LEN(len)	((len+16) & ~15)
--- diff/fs/devfs/base.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/devfs/base.c	2003-12-29 09:30:41.000000000 +0000
@@ -1955,15 +1955,9 @@
     return 0;
 }   /*  End Function devfs_notify_change  */
 
-static void devfs_clear_inode (struct inode *inode)
-{
-    if ( S_ISBLK (inode->i_mode) ) bdput (inode->i_bdev);
-}   /*  End Function devfs_clear_inode  */
-
 static struct super_operations devfs_sops =
 { 
     .drop_inode    = generic_delete_inode,
-    .clear_inode   = devfs_clear_inode,
     .statfs        = simple_statfs,
 };
 
@@ -2015,11 +2009,7 @@
 	inode->i_rdev = de->u.cdev.dev;
     }
     else if ( S_ISBLK (de->mode) )
-    {
-	inode->i_rdev = de->u.bdev.dev;
-	if (bd_acquire (inode) != 0)
-		PRINTK ("(%d): no block device from bdget()\n",(int)inode->i_ino);
-    }
+	init_special_inode(inode, de->mode, de->u.bdev.dev);
     else if ( S_ISFIFO (de->mode) )
     	inode->i_fop = &def_fifo_fops;
     else if ( S_ISDIR (de->mode) )
@@ -2118,11 +2108,7 @@
     if (de == NULL) return -ENODEV;
     if ( S_ISDIR (de->mode) ) return 0;
     file->private_data = de->info;
-    if ( S_ISBLK (inode->i_mode) )
-    {
-	file->f_op = &def_blk_fops;
-	err = def_blk_fops.open (inode, file); /* Module refcount unchanged */
-    } else if (S_ISCHR(inode->i_mode)) {
+    if (S_ISCHR(inode->i_mode)) {
 	ops = devfs_get_ops (de);  /*  Now have module refcount  */
 	file->f_op = ops;
 	if (file->f_op)
--- diff/fs/direct-io.c	2003-11-25 15:24:59.000000000 +0000
+++ source/fs/direct-io.c	2003-12-29 09:30:41.000000000 +0000
@@ -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 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
@@ -204,8 +209,10 @@
  */
 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);
 }
 
 /*
@@ -218,8 +225,14 @@
 		if (dio->is_async) {
 			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 != -ENOTBLK) {
+				aio_complete(dio->iocb, dio->result, 0);
+				kfree(dio);
+			} else {
+				if (dio->waiter)
+					wake_up_process(dio->waiter);
+			}
 		}
 	}
 }
@@ -449,6 +462,7 @@
 	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 +480,19 @@
 		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 +799,10 @@
 			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,23 +868,21 @@
 	return ret;
 }
 
+/*
+ * Releases both i_sem and i_alloc_sem
+ */
 static int
 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;
 	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;
@@ -864,7 +891,6 @@
 	dio->start_zero_done = 0;
 	dio->block_in_file = offset >> blkbits;
 	dio->blocks_available = 0;
-
 	dio->cur_page = NULL;
 
 	dio->boundary = 0;
@@ -947,14 +973,51 @@
 		dio_bio_submit(dio);
 
 	/*
+	 * It is possible that, we return short IO due to end of file.
+	 * In that case, we need to release all the pages we got hold on.
+	 */
+	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) {
 		if (ret == 0)
 			ret = dio->result;	/* Bytes written */
+		if (ret == -ENOTBLK) {
+			/*
+			 * The request will be reissued via buffered I/O
+			 * when we return; Any I/O already issued
+			 * effectively becomes redundant.
+			 */
+			dio->result = ret;
+			dio->waiter = current;
+		}
 		finished_one_bio(dio);		/* This can free the dio */
 		blk_run_queues();
+		if (ret == -ENOTBLK) {
+			/*
+			 * 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
+			 */
+			set_current_state(TASK_UNINTERRUPTIBLE);
+			while (atomic_read(&dio->bio_count)) {
+				io_schedule();
+				set_current_state(TASK_UNINTERRUPTIBLE);
+			}
+			set_current_state(TASK_RUNNING);
+			dio->waiter = NULL;
+		}
 	} else {
 		finished_one_bio(dio);
 		ret2 = dio_await_completion(dio);
@@ -974,6 +1037,9 @@
 				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) && (ret != -ENOTBLK))
+			aio_complete(iocb, ret, 0);
 		kfree(dio);
 	}
 	return ret;
@@ -981,11 +1047,17 @@
 
 /*
  * 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, 
+__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;
@@ -994,6 +1066,9 @@
 	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));
@@ -1010,6 +1085,7 @@
 	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;
@@ -1019,10 +1095,43 @@
 		}
 	}
 
-	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) {
+			down(&inode->i_sem);
+			retval = filemap_write_and_wait(inode->i_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/dquot.c	2003-11-25 15:24:59.000000000 +0000
+++ source/fs/dquot.c	2003-12-29 09:30:41.000000000 +0000
@@ -192,6 +192,8 @@
 
 struct dqstats dqstats;
 
+static void dqput(struct dquot *dquot);
+
 static inline int const hashfn(struct super_block *sb, unsigned int id, int type)
 {
 	return((((unsigned long)sb>>L1_CACHE_SHIFT) ^ id) * (MAXQUOTAS - type)) % NR_DQHASH;
@@ -339,8 +341,11 @@
 			continue;
 		if (!dquot_dirty(dquot))
 			continue;
+		atomic_inc(&dquot->dq_count);
+		dqstats.lookups++;
 		spin_unlock(&dq_list_lock);
-		sb->dq_op->sync_dquot(dquot);
+		sb->dq_op->write_dquot(dquot);
+		dqput(dquot);
 		goto restart;
 	}
 	spin_unlock(&dq_list_lock);
@@ -427,7 +432,7 @@
 	}
 	if (dquot_dirty(dquot)) {
 		spin_unlock(&dq_list_lock);
-		commit_dqblk(dquot);
+		dquot->dq_sb->dq_op->write_dquot(dquot);
 		goto we_slept;
 	}
 	atomic_dec(&dquot->dq_count);
@@ -1083,7 +1088,7 @@
 	.free_space	= dquot_free_space,
 	.free_inode	= dquot_free_inode,
 	.transfer	= dquot_transfer,
-	.sync_dquot	= commit_dqblk
+	.write_dquot	= commit_dqblk
 };
 
 /* Function used by filesystems for initializing the dquot_operations structure */
@@ -1207,9 +1212,9 @@
 	error = -EINVAL;
 	if (!fmt->qf_ops->check_quota_file(sb, type))
 		goto out_file_init;
-	/* We don't want quota on quota files */
+	/* We don't want quota and atime on quota files (deadlocks possible) */
 	dquot_drop_nolock(inode);
-	inode->i_flags |= S_NOQUOTA;
+	inode->i_flags |= S_NOQUOTA | S_NOATIME;
 
 	dqopt->ops[type] = fmt->qf_ops;
 	dqopt->info[type].dqi_format = fmt;
--- diff/fs/eventpoll.c	2003-10-09 09:47:17.000000000 +0100
+++ source/fs/eventpoll.c	2003-12-29 09:30:41.000000000 +0000
@@ -740,6 +740,7 @@
 	d_add(dentry, inode);
 	file->f_vfsmnt = mntget(eventpoll_mnt);
 	file->f_dentry = dget(dentry);
+	file->f_mapping = inode->i_mapping;
 
 	file->f_pos = 0;
 	file->f_flags = O_RDONLY;
--- diff/fs/exec.c	2003-10-27 09:20:38.000000000 +0000
+++ source/fs/exec.c	2003-12-29 09:30:41.000000000 +0000
@@ -779,6 +779,7 @@
 {
 	char * name;
 	int i, ch, retval;
+	struct files_struct *files;
 
 	/*
 	 * Make sure we have a private signal table and that
@@ -789,15 +790,26 @@
 		goto out;
 
 	/*
+	 * Make sure we have private file handles. Ask the
+	 * fork helper to do the work for us and the exit
+	 * helper to do the cleanup of the old one.
+	 */
+	files = current->files;		/* refcounted so safe to hold */
+	retval = unshare_files();
+	if (retval)
+		goto out;
+	/*
 	 * Release all of the old mmap stuff
 	 */
 	retval = exec_mmap(bprm->mm);
 	if (retval)
-		goto out;
+		goto mmap_failed;
 
 	bprm->mm = NULL;		/* We're using it now */
 
 	/* This is the point of no return */
+	steal_locks(files);
+	put_files_struct(files);
 
 	current->sas_ss_sp = current->sas_ss_size = 0;
 
@@ -830,6 +842,9 @@
 
 	return 0;
 
+mmap_failed:
+	put_files_struct(current->files);
+	current->files = files;
 out:
 	return retval;
 }
@@ -1070,6 +1085,7 @@
 	struct linux_binprm bprm;
 	struct file *file;
 	int retval;
+	int i;
 
 	sched_balance_exec();
 
@@ -1138,7 +1154,11 @@
 
 out:
 	/* Something went wrong, return the inode and free the argument pages*/
-	free_arg_pages(&bprm);
+	for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
+		struct page * page = bprm.page[i];
+		if (page)
+			__free_page(page);
+	}
 
 	if (bprm.security)
 		security_bprm_free(&bprm);
--- diff/fs/ext2/acl.c	2003-10-27 09:20:38.000000000 +0000
+++ source/fs/ext2/acl.c	2003-12-29 09:30:41.000000000 +0000
@@ -322,7 +322,7 @@
 
 check_capabilities:
 	/* Allowed to override Discretionary Access Control? */
-	if ((mask & (MAY_READ|MAY_WRITE)) || (inode->i_mode & S_IXUGO))
+	if (!(mask & MAY_EXEC) || (inode->i_mode & S_IXUGO))
 		if (capable(CAP_DAC_OVERRIDE))
 			return 0;
 	/* Read and search granted if capable(CAP_DAC_READ_SEARCH) */
--- diff/fs/ext2/inode.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/ext2/inode.c	2003-12-29 09:30:41.000000000 +0000
@@ -257,11 +257,12 @@
  *	or when it reads all @depth-1 indirect blocks successfully and finds
  *	the whole chain, all way to the data (returns %NULL, *err == 0).
  */
-static Indirect *ext2_get_branch(struct inode *inode,
+static Indirect *ext2_get_branch_wq(struct inode *inode,
 				 int depth,
 				 int *offsets,
 				 Indirect chain[4],
-				 int *err)
+				 int *err,
+				 wait_queue_t *wait)
 {
 	struct super_block *sb = inode->i_sb;
 	Indirect *p = chain;
@@ -273,8 +274,8 @@
 	if (!p->key)
 		goto no_block;
 	while (--depth) {
-		bh = sb_bread(sb, le32_to_cpu(p->key));
-		if (!bh)
+		bh = sb_bread_wq(sb, le32_to_cpu(p->key), wait);
+		if (!bh || IS_ERR(bh))
 			goto failure;
 		read_lock(&EXT2_I(inode)->i_meta_lock);
 		if (!verify_chain(chain, p))
@@ -292,11 +293,21 @@
 	*err = -EAGAIN;
 	goto no_block;
 failure:
-	*err = -EIO;
+	*err = IS_ERR(bh) ? PTR_ERR(bh) : -EIO;
 no_block:
 	return p;
 }
 
+static Indirect *ext2_get_branch(struct inode *inode,
+				 int depth,
+				 int *offsets,
+				 Indirect chain[4],
+				 int *err)
+{
+	return ext2_get_branch_wq(inode, depth, offsets, chain,
+		err, NULL);
+}
+
 /**
  *	ext2_find_near - find a place for allocation with sufficient locality
  *	@inode: owner
@@ -536,7 +547,8 @@
  * reachable from inode.
  */
 
-static int ext2_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create)
+static int ext2_get_block_wq(struct inode *inode, sector_t iblock,
+	struct buffer_head *bh_result, int create, wait_queue_t *wait)
 {
 	int err = -EIO;
 	int offsets[4];
@@ -551,7 +563,8 @@
 		goto out;
 
 reread:
-	partial = ext2_get_branch(inode, depth, offsets, chain, &err);
+	partial = ext2_get_branch_wq(inode, depth, offsets, chain, &err,
+		wait);
 
 	/* Simplest case - block found, no allocation needed */
 	if (!partial) {
@@ -565,7 +578,7 @@
 	}
 
 	/* Next simple case - plain lookup or failed read of indirect block */
-	if (!create || err == -EIO) {
+	if (!create || err == -EIO || err == -EIOCBRETRY) {
 cleanup:
 		while (partial > chain) {
 			brelse(partial->bh);
@@ -606,6 +619,19 @@
 	goto reread;
 }
 
+static int ext2_get_block_async(struct inode *inode, sector_t iblock,
+	struct buffer_head *bh_result, int create)
+{
+	return ext2_get_block_wq(inode, iblock, bh_result, create,
+		current->io_wait);
+}
+
+static int ext2_get_block(struct inode *inode, sector_t iblock,
+	struct buffer_head *bh_result, int create)
+{
+	return ext2_get_block_wq(inode, iblock, bh_result, create, NULL);
+}
+
 static int ext2_writepage(struct page *page, struct writeback_control *wbc)
 {
 	return block_write_full_page(page, ext2_get_block, wbc);
@@ -627,7 +653,7 @@
 ext2_prepare_write(struct file *file, struct page *page,
 			unsigned from, unsigned to)
 {
-	return block_prepare_write(page,from,to,ext2_get_block);
+	return block_prepare_write(page,from,to,ext2_get_block_async);
 }
 
 static int
@@ -659,7 +685,7 @@
 			loff_t offset, unsigned long nr_segs)
 {
 	struct file *file = iocb->ki_filp;
-	struct inode *inode = file->f_dentry->d_inode->i_mapping->host;
+	struct inode *inode = file->f_mapping->host;
 
 	return blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov,
 				offset, nr_segs, ext2_get_blocks, NULL);
--- diff/fs/ext3/acl.c	2003-10-27 09:20:38.000000000 +0000
+++ source/fs/ext3/acl.c	2003-12-29 09:30:41.000000000 +0000
@@ -327,7 +327,7 @@
 
 check_capabilities:
 	/* Allowed to override Discretionary Access Control? */
-	if ((mask & (MAY_READ|MAY_WRITE)) || (inode->i_mode & S_IXUGO))
+	if (!(mask & MAY_EXEC) || (inode->i_mode & S_IXUGO))
 		if (capable(CAP_DAC_OVERRIDE))
 			return 0;
 	/* Read and search granted if capable(CAP_DAC_READ_SEARCH) */
--- diff/fs/ext3/balloc.c	2003-10-09 09:47:17.000000000 +0100
+++ source/fs/ext3/balloc.c	2003-12-29 09:30:41.000000000 +0000
@@ -517,7 +517,7 @@
 		sbi->s_resuid != current->fsuid &&
 		(sbi->s_resgid == 0 || !in_group_p (sbi->s_resgid))) {
 		*errp = -ENOSPC;
-		return 0;
+		goto out;
 	}
 
 	/*
--- diff/fs/ext3/inode.c	2003-10-27 09:20:38.000000000 +0000
+++ source/fs/ext3/inode.c	2003-12-29 09:30:41.000000000 +0000
@@ -1532,7 +1532,7 @@
 			unsigned long nr_segs)
 {
 	struct file *file = iocb->ki_filp;
-	struct inode *inode = file->f_dentry->d_inode->i_mapping->host;
+	struct inode *inode = file->f_mapping->host;
 	struct ext3_inode_info *ei = EXT3_I(inode);
 	handle_t *handle = NULL;
 	int ret;
--- diff/fs/ext3/super.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/ext3/super.c	2003-12-29 09:30:41.000000000 +0000
@@ -340,6 +340,7 @@
  */
 static int ext3_blkdev_put(struct block_device *bdev)
 {
+	bd_release(bdev);
 	return blkdev_put(bdev, BDEV_FS);
 }
 
@@ -1480,6 +1481,13 @@
 	if (bdev == NULL)
 		return NULL;
 
+	if (bd_claim(bdev, sb)) {
+		printk(KERN_ERR
+		        "EXT3: failed to claim external journal device.\n");
+		blkdev_put(bdev, BDEV_FS);
+		return NULL;
+	}
+
 	blocksize = sb->s_blocksize;
 	hblock = bdev_hardsect_size(bdev);
 	if (blocksize < hblock) {
@@ -1944,9 +1952,9 @@
 /* Blocks: quota info + (4 pointer blocks + 1 entry block) * (3 indirect + 1 descriptor + 1 bitmap) + superblock */
 #define EXT3_V0_QFMT_BLOCKS 27
 
-static int (*old_sync_dquot)(struct dquot *dquot);
+static int (*old_write_dquot)(struct dquot *dquot);
 
-static int ext3_sync_dquot(struct dquot *dquot)
+static int ext3_write_dquot(struct dquot *dquot)
 {
 	int nblocks;
 	int ret;
@@ -1971,7 +1979,7 @@
 		ret = PTR_ERR(handle);
 		goto out;
 	}
-	ret = old_sync_dquot(dquot);
+	ret = old_write_dquot(dquot);
 	err = ext3_journal_stop(handle);
 	if (ret == 0)
 		ret = err;
@@ -2004,8 +2012,8 @@
 		goto out1;
 #ifdef CONFIG_QUOTA
 	init_dquot_operations(&ext3_qops);
-	old_sync_dquot = ext3_qops.sync_dquot;
-	ext3_qops.sync_dquot = ext3_sync_dquot;
+	old_write_dquot = ext3_qops.write_dquot;
+	ext3_qops.write_dquot = ext3_write_dquot;
 #endif
         err = register_filesystem(&ext3_fs_type);
 	if (err)
--- diff/fs/fat/file.c	2003-09-30 15:46:18.000000000 +0100
+++ source/fs/fat/file.c	2003-12-29 09:30:41.000000000 +0000
@@ -20,6 +20,8 @@
 	.write		= fat_file_write,
 	.mmap		= generic_file_mmap,
 	.fsync		= file_fsync,
+	.readv		= generic_file_readv,
+	.writev		= generic_file_writev,
 	.sendfile	= generic_file_sendfile,
 };
 
--- diff/fs/fat/inode.c	2003-11-25 15:24:59.000000000 +0000
+++ source/fs/fat/inode.c	2003-12-29 09:30:41.000000000 +0000
@@ -191,9 +191,9 @@
 	int isvfat = opts->isvfat;
 
 	if (opts->fs_uid != 0)
-		seq_printf(m, ",uid=%d", opts->fs_uid);
+		seq_printf(m, ",uid=%u", opts->fs_uid);
 	if (opts->fs_gid != 0)
-		seq_printf(m, ",gid=%d", opts->fs_gid);
+		seq_printf(m, ",gid=%u", opts->fs_gid);
 	seq_printf(m, ",fmask=%04o", opts->fs_fmask);
 	seq_printf(m, ",dmask=%04o", opts->fs_dmask);
 	if (sbi->nls_disk)
@@ -765,8 +765,9 @@
 	struct buffer_head *bh;
 	struct fat_boot_sector *b;
 	struct msdos_sb_info *sbi;
-	int logical_sector_size, fat_clusters, debug, cp, first;
-	unsigned int total_sectors, rootdir_sectors;
+	u16 logical_sector_size;
+	u32 total_sectors, total_clusters, fat_clusters, rootdir_sectors;
+	int debug, cp, first;
 	unsigned int media;
 	long error;
 	char buf[50];
@@ -831,14 +832,13 @@
 		brelse(bh);
 		goto out_invalid;
 	}
-	logical_sector_size =
-		CF_LE_W(get_unaligned((unsigned short *) &b->sector_size));
+	logical_sector_size = CF_LE_W(get_unaligned((u16 *)&b->sector_size));
 	if (!logical_sector_size
 	    || (logical_sector_size & (logical_sector_size - 1))
 	    || (logical_sector_size < 512)
 	    || (PAGE_CACHE_SIZE < logical_sector_size)) {
 		if (!silent)
-			printk(KERN_ERR "FAT: bogus logical sector size %d\n",
+			printk(KERN_ERR "FAT: bogus logical sector size %u\n",
 			       logical_sector_size);
 		brelse(bh);
 		goto out_invalid;
@@ -847,7 +847,7 @@
 	if (!sbi->sec_per_clus
 	    || (sbi->sec_per_clus & (sbi->sec_per_clus - 1))) {
 		if (!silent)
-			printk(KERN_ERR "FAT: bogus sectors per cluster %d\n",
+			printk(KERN_ERR "FAT: bogus sectors per cluster %u\n",
 			       sbi->sec_per_clus);
 		brelse(bh);
 		goto out_invalid;
@@ -855,7 +855,7 @@
 
 	if (logical_sector_size < sb->s_blocksize) {
 		printk(KERN_ERR "FAT: logical sector size too small for device"
-		       " (logical sector size = %d)\n", logical_sector_size);
+		       " (logical sector size = %u)\n", logical_sector_size);
 		brelse(bh);
 		goto out_fail;
 	}
@@ -863,7 +863,7 @@
 		brelse(bh);
 
 		if (!sb_set_blocksize(sb, logical_sector_size)) {
-			printk(KERN_ERR "FAT: unable to set blocksize %d\n",
+			printk(KERN_ERR "FAT: unable to set blocksize %u\n",
 			       logical_sector_size);
 			goto out_fail;
 		}
@@ -885,7 +885,7 @@
 	sbi->fat_length = CF_LE_W(b->fat_length);
 	sbi->root_cluster = 0;
 	sbi->free_clusters = -1;	/* Don't know yet */
-	sbi->prev_free = 0;
+	sbi->prev_free = -1;
 
 	if (!sbi->fat_length && b->fat32_length) {
 		struct fat_boot_fsinfo *fsinfo;
@@ -932,10 +932,11 @@
 	sbi->dir_per_block_bits = ffs(sbi->dir_per_block) - 1;
 
 	sbi->dir_start = sbi->fat_start + sbi->fats * sbi->fat_length;
-	sbi->dir_entries =
-		CF_LE_W(get_unaligned((unsigned short *)&b->dir_entries));
+	sbi->dir_entries = CF_LE_W(get_unaligned((u16 *)&b->dir_entries));
 	if (sbi->dir_entries & (sbi->dir_per_block - 1)) {
-		printk(KERN_ERR "FAT: bogus directroy-entries per block\n");
+		if (!silent)
+			printk(KERN_ERR "FAT: bogus directroy-entries per block"
+			       " (%u)\n", sbi->dir_entries);
 		brelse(bh);
 		goto out_invalid;
 	}
@@ -943,18 +944,27 @@
 	rootdir_sectors = sbi->dir_entries
 		* sizeof(struct msdos_dir_entry) / sb->s_blocksize;
 	sbi->data_start = sbi->dir_start + rootdir_sectors;
-	total_sectors = CF_LE_W(get_unaligned((unsigned short *)&b->sectors));
+	total_sectors = CF_LE_W(get_unaligned((u16 *)&b->sectors));
 	if (total_sectors == 0)
 		total_sectors = CF_LE_L(b->total_sect);
-	sbi->clusters = (total_sectors - sbi->data_start) / sbi->sec_per_clus;
+
+	total_clusters = (total_sectors - sbi->data_start) / sbi->sec_per_clus;
 
 	if (sbi->fat_bits != 32)
-		sbi->fat_bits = (sbi->clusters > MSDOS_FAT12) ? 16 : 12;
+		sbi->fat_bits = (total_clusters > MAX_FAT12) ? 16 : 12;
 
 	/* check that FAT table does not overflow */
 	fat_clusters = sbi->fat_length * sb->s_blocksize * 8 / sbi->fat_bits;
-	if (sbi->clusters > fat_clusters - 2)
-		sbi->clusters = fat_clusters - 2;
+	total_clusters = min(total_clusters, fat_clusters - 2);
+	if (total_clusters > MAX_FAT(sb)) {
+		if (!silent)
+			printk(KERN_ERR "FAT: count of clusters too big (%u)\n",
+			       total_clusters);
+		brelse(bh);
+		goto out_invalid;
+	}
+
+	sbi->clusters = total_clusters;
 
 	brelse(bh);
 
@@ -968,6 +978,8 @@
 		/* all is as it should be */
 	} else if (media == 0xf8 && FAT_FIRST_ENT(sb, 0xfe) == first) {
 		/* bad, reported on pc9800 */
+	} else if (media == 0xf0 && FAT_FIRST_ENT(sb, 0xf8) == first) {
+		/* bad, reported with a MO disk on win95/me */
 	} else if (first == 0) {
 		/* bad, reported with a SmartMedia card */
 	} else {
@@ -1047,7 +1059,7 @@
 
 int fat_statfs(struct super_block *sb, struct kstatfs *buf)
 {
-	int free, nr;
+	int free, nr, ret;
        
 	if (MSDOS_SB(sb)->free_clusters != -1)
 		free = MSDOS_SB(sb)->free_clusters;
@@ -1057,9 +1069,14 @@
 			free = MSDOS_SB(sb)->free_clusters;
 		else {
 			free = 0;
-			for (nr = 2; nr < MSDOS_SB(sb)->clusters + 2; nr++)
-				if (fat_access(sb, nr, -1) == FAT_ENT_FREE)
+			for (nr = 2; nr < MSDOS_SB(sb)->clusters + 2; nr++) {
+				ret = fat_access(sb, nr, -1);
+				if (ret < 0) {
+					unlock_fat(sb);
+					return ret;
+				} else if (ret == FAT_ENT_FREE)
 					free++;
+			}
 			MSDOS_SB(sb)->free_clusters = free;
 		}
 		unlock_fat(sb);
@@ -1209,10 +1226,10 @@
 	}
 	lock_kernel();
 	if (!(bh = sb_bread(sb, i_pos >> MSDOS_SB(sb)->dir_per_block_bits))) {
-		fat_fs_panic(sb, "unable to read i-node block (i_pos %lld)",
-			     i_pos);
+		printk(KERN_ERR "FAT: unable to read inode block "
+		       "for updating (i_pos %lld)", i_pos);
 		unlock_kernel();
-		return;
+		return /* -EIO */;
 	}
 	spin_lock(&fat_inode_lock);
 	if (i_pos != MSDOS_I(inode)->i_pos) {
--- diff/fs/fat/misc.c	2003-08-20 14:16:32.000000000 +0100
+++ source/fs/fat/misc.c	2003-12-29 09:30:41.000000000 +0000
@@ -74,7 +74,7 @@
 	} else {
 		if (sbi->free_clusters != -1)
 			fsinfo->free_clusters = CF_LE_L(sbi->free_clusters);
-		if (sbi->prev_free)
+		if (sbi->prev_free != -1)
 			fsinfo->next_cluster = CF_LE_L(sbi->prev_free);
 		mark_buffer_dirty(bh);
 	}
@@ -88,7 +88,7 @@
 int fat_add_cluster(struct inode *inode)
 {
 	struct super_block *sb = inode->i_sb;
-	int count, limit, new_dclus, new_fclus, last;
+	int ret, count, limit, new_dclus, new_fclus, last;
 	int cluster_bits = MSDOS_SB(sb)->cluster_bits;
 	
 	/* 
@@ -123,7 +123,12 @@
 		new_dclus = new_dclus % limit;
 		if (new_dclus < 2)
 			new_dclus = 2;
-		if (fat_access(sb, new_dclus, -1) == FAT_ENT_FREE)
+
+		ret = fat_access(sb, new_dclus, -1);
+		if (ret < 0) {
+			unlock_fat(sb);
+			return ret;
+		} else if (ret == FAT_ENT_FREE)
 			break;
 	}
 	if (count >= MSDOS_SB(sb)->clusters) {
@@ -131,9 +136,14 @@
 		unlock_fat(sb);
 		return -ENOSPC;
 	}
-	MSDOS_SB(sb)->prev_free = new_dclus;
 
-	fat_access(sb, new_dclus, FAT_ENT_EOF);
+	ret = fat_access(sb, new_dclus, FAT_ENT_EOF);
+	if (ret < 0) {
+		unlock_fat(sb);
+		return ret;
+	}
+
+	MSDOS_SB(sb)->prev_free = new_dclus;
 	if (MSDOS_SB(sb)->free_clusters != -1)
 		MSDOS_SB(sb)->free_clusters--;
 	fat_clusters_flush(sb);
@@ -142,7 +152,9 @@
 
 	/* add new one to the last of the cluster chain */
 	if (last) {
-		fat_access(sb, last, new_dclus);
+		ret = fat_access(sb, last, new_dclus);
+		if (ret < 0)
+			return ret;
 		fat_cache_add(inode, new_fclus, new_dclus);
 	} else {
 		MSDOS_I(inode)->i_start = new_dclus;
--- diff/fs/fcntl.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/fcntl.c	2003-12-29 09:30:41.000000000 +0000
@@ -229,8 +229,8 @@
 		   arg |= O_NONBLOCK;
 
 	if (arg & O_DIRECT) {
-		if (!inode->i_mapping || !inode->i_mapping->a_ops ||
-			!inode->i_mapping->a_ops->direct_IO)
+		if (!filp->f_mapping || !filp->f_mapping->a_ops ||
+			!filp->f_mapping->a_ops->direct_IO)
 				return -EINVAL;
 	}
 
--- diff/fs/file_table.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/file_table.c	2003-12-29 09:30:41.000000000 +0000
@@ -120,6 +120,7 @@
 	filp->f_mode   = (flags+1) & O_ACCMODE;
 	atomic_set(&filp->f_count, 1);
 	filp->f_dentry = dentry;
+	filp->f_mapping = dentry->d_inode->i_mapping;
 	filp->f_uid    = current->fsuid;
 	filp->f_gid    = current->fsgid;
 	filp->f_op     = dentry->d_inode->i_fop;
@@ -183,9 +184,9 @@
 	fops_put(file->f_op);
 	if (file->f_mode & FMODE_WRITE)
 		put_write_access(inode);
+	file_kill(file);
 	file->f_dentry = NULL;
 	file->f_vfsmnt = NULL;
-	file_kill(file);
 	file_free(file);
 	dput(dentry);
 	mntput(mnt);
--- diff/fs/fs-writeback.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/fs-writeback.c	2003-12-29 09:30:41.000000000 +0000
@@ -514,7 +514,7 @@
  *    OSYNC_INODE:    the inode itself
  */
 
-int generic_osync_inode(struct inode *inode, int what)
+int generic_osync_inode(struct inode *inode, struct address_space *mapping, int what)
 {
 	int err = 0;
 	int need_write_inode_now = 0;
@@ -522,14 +522,14 @@
 
 	current->flags |= PF_SYNCWRITE;
 	if (what & OSYNC_DATA)
-		err = filemap_fdatawrite(inode->i_mapping);
+		err = filemap_fdatawrite(mapping);
 	if (what & (OSYNC_METADATA|OSYNC_DATA)) {
-		err2 = sync_mapping_buffers(inode->i_mapping);
+		err2 = sync_mapping_buffers(mapping);
 		if (!err)
 			err = err2;
 	}
 	if (what & OSYNC_DATA) {
-		err2 = filemap_fdatawait(inode->i_mapping);
+		err2 = filemap_fdatawait(mapping);
 		if (!err)
 			err = err2;
 	}
--- diff/fs/hugetlbfs/inode.c	2003-10-27 09:20:44.000000000 +0000
+++ source/fs/hugetlbfs/inode.c	2003-12-29 09:30:41.000000000 +0000
@@ -165,7 +165,7 @@
 	pagevec_init(&pvec, 0);
 	next = start;
 	while (1) {
-		if (!pagevec_lookup(&pvec, mapping, next, PAGEVEC_SIZE)) {
+		if (!pagevec_lookup(&pvec, mapping, &next, PAGEVEC_SIZE)) {
 			if (next == start)
 				break;
 			next = start;
@@ -176,9 +176,6 @@
 			struct page *page = pvec.pages[i];
 
 			lock_page(page);
-			if (page->index > next)
-				next = page->index;
-			++next;
 			truncate_huge_page(page);
 			unlock_page(page);
 			hugetlb_put_quota(mapping);
@@ -194,6 +191,7 @@
 
 	hlist_del_init(&inode->i_hash);
 	list_del_init(&inode->i_list);
+	list_del_init(&inode->i_sb_list);
 	inode->i_state |= I_FREEING;
 	inodes_stat.nr_inodes--;
 	spin_unlock(&inode_lock);
@@ -236,6 +234,7 @@
 	hlist_del_init(&inode->i_hash);
 out_truncate:
 	list_del_init(&inode->i_list);
+	list_del_init(&inode->i_sb_list);
 	inode->i_state |= I_FREEING;
 	inodes_stat.nr_inodes--;
 	spin_unlock(&inode_lock);
@@ -788,6 +787,7 @@
 	inode->i_nlink = 0;
 	file->f_vfsmnt = mntget(hugetlbfs_vfsmount);
 	file->f_dentry = dentry;
+	file->f_mapping = inode->i_mapping;
 	file->f_op = &hugetlbfs_file_operations;
 	file->f_mode = FMODE_WRITE | FMODE_READ;
 	return file;
--- diff/fs/inode.c	2003-10-27 09:20:38.000000000 +0000
+++ source/fs/inode.c	2003-12-29 09:30:41.000000000 +0000
@@ -160,7 +160,7 @@
 	if (inode_has_buffers(inode))
 		BUG();
 	security_inode_free(inode);
-	if (inode->i_sb->s_op->destroy_inode)
+	if (inode->i_sb && inode->i_sb->s_op->destroy_inode)
 		inode->i_sb->s_op->destroy_inode(inode);
 	else
 		kmem_cache_free(inode_cachep, (inode));
@@ -183,6 +183,7 @@
 	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);
 	init_MUTEX(&inode->i_data.i_shared_sem);
@@ -285,7 +286,7 @@
 /*
  * Invalidate all inodes for a device.
  */
-static int invalidate_list(struct list_head *head, struct super_block * sb, struct list_head * dispose)
+static int invalidate_list(struct list_head *head, struct list_head *dispose)
 {
 	struct list_head *next;
 	int busy = 0, count = 0;
@@ -298,13 +299,12 @@
 		next = next->next;
 		if (tmp == head)
 			break;
-		inode = list_entry(tmp, struct inode, i_list);
-		if (inode->i_sb != sb)
-			continue;
+		inode = list_entry(tmp, struct inode, i_sb_list);
 		invalidate_inode_buffers(inode);
 		if (!atomic_read(&inode->i_count)) {
 			hlist_del_init(&inode->i_hash);
 			list_del(&inode->i_list);
+			list_del(&inode->i_sb_list);
 			list_add(&inode->i_list, dispose);
 			inode->i_state |= I_FREEING;
 			count++;
@@ -340,10 +340,7 @@
 
 	down(&iprune_sem);
 	spin_lock(&inode_lock);
-	busy = invalidate_list(&inode_in_use, sb, &throw_away);
-	busy |= invalidate_list(&inode_unused, sb, &throw_away);
-	busy |= invalidate_list(&sb->s_dirty, sb, &throw_away);
-	busy |= invalidate_list(&sb->s_io, sb, &throw_away);
+	busy = invalidate_list(&sb->s_inodes, &throw_away);
 	spin_unlock(&inode_lock);
 
 	dispose_list(&throw_away);
@@ -443,6 +440,7 @@
 				continue;
 		}
 		hlist_del_init(&inode->i_hash);
+		list_del_init(&inode->i_sb_list);
 		list_move(&inode->i_list, &freeable);
 		inode->i_state |= I_FREEING;
 		nr_pruned++;
@@ -553,6 +551,7 @@
 		spin_lock(&inode_lock);
 		inodes_stat.nr_inodes++;
 		list_add(&inode->i_list, &inode_in_use);
+		list_add(&inode->i_sb_list, &sb->s_inodes);
 		inode->i_ino = ++last_ino;
 		inode->i_state = 0;
 		spin_unlock(&inode_lock);
@@ -601,6 +600,7 @@
 
 			inodes_stat.nr_inodes++;
 			list_add(&inode->i_list, &inode_in_use);
+			list_add(&inode->i_sb_list, &sb->s_inodes);
 			hlist_add_head(&inode->i_hash, head);
 			inode->i_state = I_LOCK|I_NEW;
 			spin_unlock(&inode_lock);
@@ -649,6 +649,7 @@
 			inode->i_ino = ino;
 			inodes_stat.nr_inodes++;
 			list_add(&inode->i_list, &inode_in_use);
+			list_add(&inode->i_sb_list, &sb->s_inodes);
 			hlist_add_head(&inode->i_hash, head);
 			inode->i_state = I_LOCK|I_NEW;
 			spin_unlock(&inode_lock);
@@ -984,6 +985,7 @@
 	struct super_operations *op = inode->i_sb->s_op;
 
 	list_del_init(&inode->i_list);
+	list_del_init(&inode->i_sb_list);
 	inode->i_state|=I_FREEING;
 	inodes_stat.nr_inodes--;
 	spin_unlock(&inode_lock);
@@ -1031,6 +1033,7 @@
 		hlist_del_init(&inode->i_hash);
 	}
 	list_del_init(&inode->i_list);
+	list_del_init(&inode->i_sb_list);
 	inode->i_state|=I_FREEING;
 	inodes_stat.nr_inodes--;
 	spin_unlock(&inode_lock);
@@ -1084,13 +1087,13 @@
 void iput(struct inode *inode)
 {
 	if (inode) {
-		struct super_operations *op = inode->i_sb->s_op;
+		struct super_block *sb = inode->i_sb;
 
 		if (inode->i_state == I_CLEAR)
 			BUG();
 
-		if (op && op->put_inode)
-			op->put_inode(inode);
+		if (sb && sb->s_op && sb->s_op->put_inode)
+			sb->s_op->put_inode(inode);
 
 		if (atomic_dec_and_lock(&inode->i_count, &inode_lock))
 			iput_final(inode);
@@ -1221,34 +1224,17 @@
 void remove_dquot_ref(struct super_block *sb, int type)
 {
 	struct inode *inode;
-	struct list_head *act_head;
 	LIST_HEAD(tofree_head);
 
 	if (!sb->dq_op)
 		return;	/* nothing to do */
 	spin_lock(&inode_lock);	/* This lock is for inodes code */
 	/* We don't have to lock against quota code - test IS_QUOTAINIT is just for speedup... */
- 
-	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);
-	}
-	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);
-	}
-	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);
-	}
-	list_for_each(act_head, &sb->s_io) {
-		inode = list_entry(act_head, struct inode, i_list);
+
+	list_for_each_entry(inode, &sb->s_inodes, i_sb_list)
 		if (IS_QUOTAINIT(inode))
 			remove_inode_dquot_ref(inode, type, &tofree_head);
-	}
+
 	spin_unlock(&inode_lock);
 
 	put_dquot_list(&tofree_head);
--- diff/fs/intermezzo/file.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/intermezzo/file.c	2003-12-29 09:30:41.000000000 +0000
@@ -336,7 +336,7 @@
                                 unlock_kernel();
                                 return; 
                         }
-                        error = presto_journal_close(&rec, fset, file,
+                        error = presto_journal_close(&rec, fset, fdata,
                                                      file->f_dentry,
                                                      &fdata->fd_version,
                                                      &new_file_ver);
--- diff/fs/intermezzo/intermezzo_fs.h	2003-10-09 09:47:17.000000000 +0100
+++ source/fs/intermezzo/intermezzo_fs.h	2003-12-29 09:30:41.000000000 +0000
@@ -603,7 +603,7 @@
 int presto_journal_open(struct rec_info *, struct presto_file_set *,
                         struct dentry *, struct presto_version *old_ver);
 int presto_journal_close(struct rec_info *rec, struct presto_file_set *,
-                         struct file *, struct dentry *,
+                         struct presto_file_data *, struct dentry *,
                          struct presto_version *old_file_ver,
                          struct presto_version *new_file_ver);
 int presto_write_lml_close(struct rec_info *rec,
--- diff/fs/intermezzo/journal.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/intermezzo/journal.c	2003-12-29 09:30:41.000000000 +0000
@@ -2103,12 +2103,11 @@
 
 int
 presto_journal_close(struct rec_info *rec, struct presto_file_set *fset,
-                     struct file *file, struct dentry *dentry,
+                     struct presto_file_data *fd, struct dentry *dentry,
                      struct presto_version *old_file_ver,
                      struct presto_version *new_file_ver)
 {
         int opcode = KML_OPCODE_CLOSE;
-        struct presto_file_data *fd;
         char *buffer, *path, *logrecord, record[316];
         struct dentry *root;
         int error, size, i;
@@ -2137,7 +2136,6 @@
 
         root = fset->fset_dentry;
 
-        fd = (struct presto_file_data *)file->private_data;
         if (fd) {
                 open_ngroups = fd->fd_ngroups;
                 for (i = 0; i < fd->fd_ngroups; i++)
--- diff/fs/intermezzo/presto.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/intermezzo/presto.c	2003-12-29 09:30:41.000000000 +0000
@@ -259,11 +259,8 @@
 
 
         if (info->flags & LENTO_FL_WRITE_KML) {
-                struct file file;
-                file.private_data = NULL;
-                file.f_dentry = dentry; 
                 presto_getversion(&new_ver, dentry->d_inode);
-                error = presto_journal_close(&rec, fset, &file, dentry, 
+                error = presto_journal_close(&rec, fset, NULL, dentry,
                                              &new_ver);
                 if ( error ) {
                         EXIT; 
--- diff/fs/intermezzo/vfs.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/intermezzo/vfs.c	2003-12-29 09:30:41.000000000 +0000
@@ -321,7 +321,7 @@
         }
 
         if (fdata->fd_info.flags & LENTO_FL_KML) 
-                rc = presto_journal_close(&rec, fset, file, file->f_dentry,
+                rc = presto_journal_close(&rec, fset, fdata, file->f_dentry,
                                           &fdata->fd_version, 
                                           &fdata->fd_info.remote_version);
         if (rc) { 
@@ -431,14 +431,11 @@
 
         if ( presto_do_kml(info, dentry) ) {
                 if ((iattr->ia_valid & ATTR_SIZE) && (old_size != inode->i_size)) {
-                        struct file file;
                         /* Journal a close whenever we see a potential truncate
                         * At the receiving end, lento should explicitly remove
                         * ATTR_SIZE from the list of valid attributes */
                         presto_getversion(&new_ver, inode);
-                        file.private_data = NULL;
-                        file.f_dentry = dentry;
-                        error = presto_journal_close(&rec, fset, &file, dentry,
+                        error = presto_journal_close(&rec, fset, NULL, dentry,
                                                      &old_ver, &new_ver);
                 }
 
@@ -2086,7 +2083,9 @@
                 }
         }
 
+	/* XXX: where the fuck is ->f_vfsmnt? */
         f->f_dentry = dentry;
+        f->f_mapping = dentry->d_inode->i_mapping;
         f->f_pos = 0;
         //f->f_reada = 0;
         f->f_op = NULL;
--- diff/fs/ioctl.c	2003-07-22 18:54:27.000000000 +0100
+++ source/fs/ioctl.c	2003-12-29 09:30:41.000000000 +0000
@@ -22,7 +22,7 @@
 	switch (cmd) {
 		case FIBMAP:
 		{
-			struct address_space *mapping = inode->i_mapping;
+			struct address_space *mapping = filp->f_mapping;
 			int res;
 			/* do we support this mess? */
 			if (!mapping->a_ops->bmap)
--- diff/fs/isofs/inode.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/isofs/inode.c	2003-12-29 09:30:41.000000000 +0000
@@ -1463,4 +1463,5 @@
 module_init(init_iso9660_fs)
 module_exit(exit_iso9660_fs)
 MODULE_LICENSE("GPL");
-
+/* Actual filesystem name is iso9660, as requested in filesystems.c */
+MODULE_ALIAS("iso9660");
--- diff/fs/jbd/commit.c	2003-10-27 09:20:44.000000000 +0000
+++ source/fs/jbd/commit.c	2003-12-29 09:30:41.000000000 +0000
@@ -177,8 +177,14 @@
 		 * leave undo-committed data.
 		 */
 		if (jh->b_committed_data) {
-			kfree(jh->b_committed_data);
-			jh->b_committed_data = NULL;
+			struct buffer_head *bh = jh2bh(jh);
+
+			jbd_lock_bh_state(bh);
+			if (jh->b_committed_data) {
+				kfree(jh->b_committed_data);
+				jh->b_committed_data = NULL;
+			}
+			jbd_unlock_bh_state(bh);
 		}
 		journal_refile_buffer(journal, jh);
 	}
@@ -264,6 +270,16 @@
 				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;
+					spin_unlock(&journal->j_list_lock);
+					cond_resched();
+					goto write_out_data;
+				}
 			}
 		}
 		if (bufs == ARRAY_SIZE(wbuf)) {
@@ -284,8 +300,7 @@
 		cond_resched();
 		journal_brelse_array(wbuf, bufs);
 		spin_lock(&journal->j_list_lock);
-		if (bufs)
-			goto write_out_data_locked;
+		goto write_out_data_locked;
 	}
 
 	/*
--- diff/fs/jffs/intrep.c	2003-09-30 15:46:18.000000000 +0100
+++ source/fs/jffs/intrep.c	2003-12-29 09:30:41.000000000 +0000
@@ -3337,18 +3337,16 @@
 	int result = 0;
 	D1(int i = 1);
 
+	daemonize("jffs_gcd");
+
 	c->gc_task = current;
 
 	lock_kernel();
-	exit_mm(c->gc_task);
-
-	set_special_pids(1, 1);
 	init_completion(&c->gc_thread_comp); /* barrier */ 
 	spin_lock_irq(&current->sighand->siglock);
 	siginitsetinv (&current->blocked, sigmask(SIGHUP) | sigmask(SIGKILL) | sigmask(SIGSTOP) | sigmask(SIGCONT));
 	recalc_sigpending();
 	spin_unlock_irq(&current->sighand->siglock);
-	strcpy(current->comm, "jffs_gcd");
 
 	D1(printk (KERN_NOTICE "jffs_garbage_collect_thread(): Starting infinite loop.\n"));
 
--- diff/fs/jfs/acl.c	2003-10-09 09:47:17.000000000 +0100
+++ source/fs/jfs/acl.c	2003-12-29 09:30:41.000000000 +0000
@@ -191,7 +191,7 @@
 	 * Read/write DACs are always overridable.
 	 * Executable DACs are overridable if at least one exec bit is set.
 	 */
-	if ((mask & (MAY_READ|MAY_WRITE)) || (inode->i_mode & S_IXUGO))
+	if (!(mask & MAY_EXEC) || (inode->i_mode & S_IXUGO))
 		if (capable(CAP_DAC_OVERRIDE))
 			return 0;
 
--- diff/fs/jfs/inode.c	2003-10-27 09:20:38.000000000 +0000
+++ source/fs/jfs/inode.c	2003-12-29 09:30:41.000000000 +0000
@@ -306,7 +306,7 @@
 			loff_t offset, unsigned long nr_segs)
 {
 	struct file *file = iocb->ki_filp;
-	struct inode *inode = file->f_dentry->d_inode->i_mapping->host;
+	struct inode *inode = file->f_mapping->host;
 
 	return blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov,
 				offset, nr_segs, jfs_get_blocks, NULL);
--- diff/fs/jfs/namei.c	2003-11-25 15:24:59.000000000 +0000
+++ source/fs/jfs/namei.c	2003-12-29 09:30:41.000000000 +0000
@@ -1439,14 +1439,18 @@
 struct dentry *jfs_get_parent(struct dentry *dentry)
 {
 	struct super_block *sb = dentry->d_inode->i_sb;
-	struct dentry *parent = ERR_PTR(-EACCES);
+	struct dentry *parent = ERR_PTR(-ENOENT);
 	struct inode *inode;
+	unsigned long parent_ino;
 
-	inode = iget(sb, JFS_IP(dentry->d_inode)->i_dtroot.header.idotdot);
+	parent_ino =
+		le32_to_cpu(JFS_IP(dentry->d_inode)->i_dtroot.header.idotdot);
+	inode = iget(sb, parent_ino);
 	if (inode) {
-		if (is_bad_inode(inode))
+		if (is_bad_inode(inode)) {
 			iput(inode);
-		else {
+			parent = ERR_PTR(-EACCES);
+		} else {
 			parent = d_alloc_anon(inode);
 			if (!parent) {
 				parent = ERR_PTR(-ENOMEM);
--- diff/fs/locks.c	2003-10-27 09:20:39.000000000 +0000
+++ source/fs/locks.c	2003-12-29 09:30:41.000000000 +0000
@@ -1454,7 +1454,7 @@
 	 */
 	if (IS_MANDLOCK(inode) &&
 	    (inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID) {
-		struct address_space *mapping = inode->i_mapping;
+		struct address_space *mapping = filp->f_mapping;
 
 		if (!list_empty(&mapping->i_mmap_shared)) {
 			error = -EAGAIN;
@@ -1592,7 +1592,7 @@
 	 */
 	if (IS_MANDLOCK(inode) &&
 	    (inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID) {
-		struct address_space *mapping = inode->i_mapping;
+		struct address_space *mapping = filp->f_mapping;
 
 		if (!list_empty(&mapping->i_mmap_shared)) {
 			error = -EAGAIN;
@@ -1983,6 +1983,24 @@
 
 EXPORT_SYMBOL(lock_may_write);
 
+void steal_locks(fl_owner_t from)
+{
+	struct list_head *tmp;
+
+	if (from == current->files)
+		return;
+
+	lock_kernel();
+	list_for_each(tmp, &file_lock_list) {
+		struct file_lock *fl = list_entry(tmp, struct file_lock, fl_link);
+		if (fl->fl_owner == from)
+			fl->fl_owner = current->files;
+	}
+	unlock_kernel();
+}
+
+EXPORT_SYMBOL(steal_locks);
+
 static int __init filelock_init(void)
 {
 	filelock_cache = kmem_cache_create("file_lock_cache",
--- diff/fs/msdos/namei.c	2003-08-20 14:16:14.000000000 +0100
+++ source/fs/msdos/namei.c	2003-12-29 09:30:41.000000000 +0000
@@ -244,13 +244,14 @@
 	 */
 	dir->i_ctime = dir->i_mtime = CURRENT_TIME;
 	mark_inode_dirty(dir);
-	memcpy((*de)->name,name,MSDOS_NAME);
+
+	memcpy((*de)->name, name, MSDOS_NAME);
 	(*de)->attr = is_dir ? ATTR_DIR : ATTR_ARCH;
 	if (is_hid)
 		(*de)->attr |= ATTR_HIDDEN;
 	(*de)->start = 0;
 	(*de)->starthi = 0;
-	fat_date_unix2dos(dir->i_mtime.tv_sec,&(*de)->time,&(*de)->date);
+	fat_date_unix2dos(dir->i_mtime.tv_sec, &(*de)->time, &(*de)->date);
 	(*de)->size = 0;
 	mark_buffer_dirty(*bh);
 	return 0;
@@ -393,7 +394,6 @@
 	return res;
 
 mkdir_error:
-	printk(KERN_WARNING "msdos_mkdir: error=%d, attempting cleanup\n", res);
 	inode->i_nlink = 0;
 	inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
 	dir->i_nlink--;
@@ -468,13 +468,9 @@
 			if (error)
 				goto out;
 		}
-		error = fat_scan(old_inode, MSDOS_DOTDOT, &dotdot_bh,
-				&dotdot_de, &dotdot_i_pos);
-		if (error < 0) {
-			printk(KERN_WARNING
-				"MSDOS: %s/%s, get dotdot failed, ret=%d\n",
-				old_dentry->d_parent->d_name.name,
-				old_dentry->d_name.name, error);
+		if (fat_scan(old_inode, MSDOS_DOTDOT, &dotdot_bh,
+			     &dotdot_de, &dotdot_i_pos) < 0) {
+			error = -EIO;
 			goto out;
 		}
 	}
--- diff/fs/namei.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/namei.c	2003-12-29 09:30:41.000000000 +0000
@@ -190,7 +190,7 @@
 	 * Read/write DACs are always overridable.
 	 * Executable DACs are overridable if at least one exec bit is set.
 	 */
-	if ((mask & (MAY_READ|MAY_WRITE)) || (inode->i_mode & S_IXUGO))
+	if (!(mask & MAY_EXEC) || (inode->i_mode & S_IXUGO))
 		if (capable(CAP_DAC_OVERRIDE))
 			return 0;
 
--- diff/fs/namespace.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/namespace.c	2003-12-29 09:30:41.000000000 +0000
@@ -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;
--- diff/fs/ncpfs/Kconfig	2002-11-11 11:09:38.000000000 +0000
+++ source/fs/ncpfs/Kconfig	2003-12-29 09:30:41.000000000 +0000
@@ -65,6 +65,7 @@
 config NCPFS_NLS
 	bool "Use Native Language Support"
 	depends on NCP_FS
+	select NLS
 	help
 	  Allows you to use codepages and I/O charsets for file name
 	  translation between the server file system and input/output. This
--- diff/fs/ncpfs/mmap.c	2002-10-16 04:28:30.000000000 +0100
+++ source/fs/ncpfs/mmap.c	2003-12-29 09:30:41.000000000 +0000
@@ -26,7 +26,7 @@
  * Fill in the supplied page for mmap
  */
 static struct page* ncp_file_mmap_nopage(struct vm_area_struct *area,
-				     unsigned long address, int write_access)
+				     unsigned long address, int *type)
 {
 	struct file *file = area->vm_file;
 	struct dentry *dentry = file->f_dentry;
@@ -85,6 +85,15 @@
 		memset(pg_addr + already_read, 0, PAGE_SIZE - already_read);
 	flush_dcache_page(page);
 	kunmap(page);
+
+	/*
+	 * If I understand ncp_read_kernel() properly, the above always
+	 * fetches from the network, here the analogue of disk.
+	 * -- wli
+	 */
+	if (type)
+		*type = VM_FAULT_MAJOR;
+	inc_page_state(pgmajfault);
 	return page;
 }
 
--- diff/fs/nfs/file.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/nfs/file.c	2003-12-29 09:30:41.000000000 +0000
@@ -266,7 +266,7 @@
 int
 nfs_lock(struct file *filp, int cmd, struct file_lock *fl)
 {
-	struct inode * inode = filp->f_dentry->d_inode;
+	struct inode * inode = filp->f_mapping->host;
 	int	status = 0;
 	int	status2;
 
@@ -309,13 +309,13 @@
 	 * Flush all pending writes before doing anything
 	 * with locks..
 	 */
-	status = filemap_fdatawrite(inode->i_mapping);
+	status = filemap_fdatawrite(filp->f_mapping);
 	down(&inode->i_sem);
 	status2 = nfs_wb_all(inode);
 	if (!status)
 		status = status2;
 	up(&inode->i_sem);
-	status2 = filemap_fdatawait(inode->i_mapping);
+	status2 = filemap_fdatawait(filp->f_mapping);
 	if (!status)
 		status = status2;
 	if (status < 0)
@@ -335,11 +335,11 @@
 	 */
  out_ok:
 	if ((IS_SETLK(cmd) || IS_SETLKW(cmd)) && fl->fl_type != F_UNLCK) {
-		filemap_fdatawrite(inode->i_mapping);
+		filemap_fdatawrite(filp->f_mapping);
 		down(&inode->i_sem);
 		nfs_wb_all(inode);      /* we may have slept */
 		up(&inode->i_sem);
-		filemap_fdatawait(inode->i_mapping);
+		filemap_fdatawait(filp->f_mapping);
 		nfs_zap_caches(inode);
 	}
 	return status;
--- diff/fs/nls/Kconfig	2002-11-11 11:09:38.000000000 +0000
+++ source/fs/nls/Kconfig	2003-12-29 09:30:41.000000000 +0000
@@ -1,24 +1,25 @@
 #
 # Native language support configuration
 #
-# smb wants NLS
-config SMB_NLS
-	bool
-	depends on SMB_FS
-	default y
 
-# msdos and Joliet want NLS
+menu "Native Language Support"
+
 config NLS
-	bool
-	depends on JOLIET || FAT_FS || NTFS_FS || NCPFS_NLS || SMB_NLS || JFS_FS || CIFS || BEFS_FS
-	default y
+	tristate "Base native language support"
+	---help---
+	  The base Native Language Support. A number of filesystems
+	  depend on it (e.g. FAT, JOLIET, NT, BEOS filesystems), as well
+	  as the ability of some filesystems to use native languages
+	  (NCP, SMB).
 
+	  If unsure, say Y.
 
-menu "Native Language Support"
-	depends on NLS
+	  To compile this code as a module, choose M here: the module
+	  will be called nls_base.
 
 config NLS_DEFAULT
 	string "Default NLS Option"
+	depends on NLS
 	default "iso8859-1"
 	---help---
 	  The default NLS used when mounting file system. Note, that this is
@@ -38,6 +39,7 @@
 
 config NLS_CODEPAGE_437
 	tristate "Codepage 437 (United States, Canada)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored
@@ -50,6 +52,7 @@
 
 config NLS_CODEPAGE_737
 	tristate "Codepage 737 (Greek)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored
@@ -62,6 +65,7 @@
 
 config NLS_CODEPAGE_775
 	tristate "Codepage 775 (Baltic Rim)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored
@@ -75,6 +79,7 @@
 
 config NLS_CODEPAGE_850
 	tristate "Codepage 850 (Europe)"
+	depends on NLS
 	---help---
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -91,6 +96,7 @@
 
 config NLS_CODEPAGE_852
 	tristate "Codepage 852 (Central/Eastern Europe)"
+	depends on NLS
 	---help---
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -106,6 +112,7 @@
 
 config NLS_CODEPAGE_855
 	tristate "Codepage 855 (Cyrillic)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -117,6 +124,7 @@
 
 config NLS_CODEPAGE_857
 	tristate "Codepage 857 (Turkish)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -128,6 +136,7 @@
 
 config NLS_CODEPAGE_860
 	tristate "Codepage 860 (Portuguese)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -139,6 +148,7 @@
 
 config NLS_CODEPAGE_861
 	tristate "Codepage 861 (Icelandic)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -150,6 +160,7 @@
 
 config NLS_CODEPAGE_862
 	tristate "Codepage 862 (Hebrew)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -161,6 +172,7 @@
 
 config NLS_CODEPAGE_863
 	tristate "Codepage 863 (Canadian French)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -173,6 +185,7 @@
 
 config NLS_CODEPAGE_864
 	tristate "Codepage 864 (Arabic)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -184,6 +197,7 @@
 
 config NLS_CODEPAGE_865
 	tristate "Codepage 865 (Norwegian, Danish)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -196,6 +210,7 @@
 
 config NLS_CODEPAGE_866
 	tristate "Codepage 866 (Cyrillic/Russian)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -208,6 +223,7 @@
 
 config NLS_CODEPAGE_869
 	tristate "Codepage 869 (Greek)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -219,6 +235,7 @@
 
 config NLS_CODEPAGE_936
 	tristate "Simplified Chinese charset (CP936, GB2312)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -231,6 +248,7 @@
 
 config NLS_CODEPAGE_950
 	tristate "Traditional Chinese charset (Big5)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -243,6 +261,7 @@
 
 config NLS_CODEPAGE_932
 	tristate "Japanese charsets (Shift-JIS, EUC-JP)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -256,6 +275,7 @@
 
 config NLS_CODEPAGE_949
 	tristate "Korean charset (CP949, EUC-KR)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -267,6 +287,7 @@
 
 config NLS_CODEPAGE_874
 	tristate "Thai charset (CP874, TIS-620)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -278,6 +299,7 @@
 
 config NLS_ISO8859_8
 	tristate "Hebrew charsets (ISO-8859-8, CP1255)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -287,6 +309,7 @@
 
 config NLS_CODEPAGE_1250
 	tristate "Windows CP1250 (Slavic/Central European Languages)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CDROMs
@@ -298,6 +321,7 @@
 
 config NLS_CODEPAGE_1251
 	tristate "Windows CP1251 (Bulgarian, Belarusian)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -310,6 +334,7 @@
 
 config NLS_ISO8859_1
 	tristate "NLS ISO 8859-1  (Latin 1; Western European Languages)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -322,6 +347,7 @@
 
 config NLS_ISO8859_2
 	tristate "NLS ISO 8859-2  (Latin 2; Slavic/Central European Languages)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -333,6 +359,7 @@
 
 config NLS_ISO8859_3
 	tristate "NLS ISO 8859-3  (Latin 3; Esperanto, Galician, Maltese, Turkish)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -343,6 +370,7 @@
 
 config NLS_ISO8859_4
 	tristate "NLS ISO 8859-4  (Latin 4; old Baltic charset)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -353,6 +381,7 @@
 
 config NLS_ISO8859_5
 	tristate "NLS ISO 8859-5  (Cyrillic)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -364,6 +393,7 @@
 
 config NLS_ISO8859_6
 	tristate "NLS ISO 8859-6  (Arabic)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -373,6 +403,7 @@
 
 config NLS_ISO8859_7
 	tristate "NLS ISO 8859-7  (Modern Greek)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -382,6 +413,7 @@
 
 config NLS_ISO8859_9
 	tristate "NLS ISO 8859-9  (Latin 5; Turkish)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -392,6 +424,7 @@
 
 config NLS_ISO8859_13
 	tristate "NLS ISO 8859-13 (Latin 7; Baltic)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -402,6 +435,7 @@
 
 config NLS_ISO8859_14
 	tristate "NLS ISO 8859-14 (Latin 8; Celtic)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -413,6 +447,7 @@
 
 config NLS_ISO8859_15
 	tristate "NLS ISO 8859-15 (Latin 9; Western European Languages with Euro)"
+	depends on NLS
 	---help---
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -429,6 +464,7 @@
 
 config NLS_KOI8_R
 	tristate "NLS KOI8-R (Russian)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -438,6 +474,7 @@
 
 config NLS_KOI8_U
 	tristate "NLS KOI8-U/RU (Ukrainian, Belarusian)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -447,6 +484,7 @@
 
 config NLS_UTF8
 	tristate "NLS UTF8"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
--- diff/fs/nls/nls_base.c	2003-09-30 15:46:19.000000000 +0100
+++ source/fs/nls/nls_base.c	2003-12-29 09:30:41.000000000 +0000
@@ -99,6 +99,7 @@
 			}
 		} else {
 			*op++ = *ip++;
+			n--;
 		}
 	}
 	return (op - pwcs);
@@ -480,7 +481,7 @@
 	if (default_nls != NULL)
 		return default_nls;
 	else
-               return &default_table;
+		return &default_table;
 }
 
 EXPORT_SYMBOL(register_nls);
@@ -492,3 +493,5 @@
 EXPORT_SYMBOL(utf8_mbstowcs);
 EXPORT_SYMBOL(utf8_wctomb);
 EXPORT_SYMBOL(utf8_wcstombs);
+
+MODULE_LICENSE("Dual BSD/GPL");
--- diff/fs/open.c	2003-10-27 09:20:39.000000000 +0000
+++ source/fs/open.c	2003-12-29 09:30:41.000000000 +0000
@@ -192,7 +192,9 @@
 	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;
 }
@@ -776,7 +778,8 @@
 			goto cleanup_file;
 	}
 
-	file_ra_state_init(&f->f_ra, inode->i_mapping);
+	f->f_mapping = inode->i_mapping;
+	file_ra_state_init(&f->f_ra, f->f_mapping);
 	f->f_dentry = dentry;
 	f->f_vfsmnt = mnt;
 	f->f_pos = 0;
@@ -792,8 +795,8 @@
 
 	/* NB: we're sure to have correct a_ops only after f_op->open */
 	if (f->f_flags & O_DIRECT) {
-		if (!inode->i_mapping || !inode->i_mapping->a_ops ||
-			!inode->i_mapping->a_ops->direct_IO) {
+		if (!f->f_mapping || !f->f_mapping->a_ops ||
+			!f->f_mapping->a_ops->direct_IO) {
 				fput(f);
 				f = ERR_PTR(-EINVAL);
 		}
--- diff/fs/pipe.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/pipe.c	2003-12-29 09:30:41.000000000 +0000
@@ -13,6 +13,7 @@
 #include <linux/fs.h>
 #include <linux/mount.h>
 #include <linux/pipe_fs_i.h>
+#include <linux/uio.h>
 #include <asm/uaccess.h>
 #include <asm/ioctls.h>
 
@@ -43,19 +44,63 @@
 	down(PIPE_SEM(*inode));
 }
 
+static inline int
+pipe_iov_copy_from_user(void *to, struct iovec *iov, unsigned long len)
+{
+	unsigned long copy;
+
+	while (len > 0) {
+		while (!iov->iov_len)
+			iov++;
+		copy = min_t(unsigned long, len, iov->iov_len);
+
+		if (copy_from_user(to, iov->iov_base, copy))
+			return -EFAULT;
+		to += copy;
+		len -= copy;
+		iov->iov_base += copy;
+		iov->iov_len -= copy;
+	}
+	return 0;
+}
+
+static inline int
+pipe_iov_copy_to_user(struct iovec *iov, const void *from, unsigned long len)
+{
+	unsigned long copy;
+
+	while (len > 0) {
+		while (!iov->iov_len)
+			iov++;
+		copy = min_t(unsigned long, len, iov->iov_len);
+
+		if (copy_to_user(iov->iov_base, from, copy))
+			return -EFAULT;
+		from += copy;
+		len -= copy;
+		iov->iov_base += copy;
+		iov->iov_len -= copy;
+	}
+	return 0;
+}
+
 static ssize_t
-pipe_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
+pipe_readv(struct file *filp, const struct iovec *_iov,
+	   unsigned long nr_segs, loff_t *ppos)
 {
 	struct inode *inode = filp->f_dentry->d_inode;
 	int do_wakeup;
 	ssize_t ret;
+	struct iovec *iov = (struct iovec *)_iov;
+	size_t total_len;
 
 	/* pread is not allowed on pipes. */
 	if (unlikely(ppos != &filp->f_pos))
 		return -ESPIPE;
-	
+
+	total_len = iov_length(iov, nr_segs);
 	/* Null read succeeds. */
-	if (unlikely(count == 0))
+	if (unlikely(total_len == 0))
 		return 0;
 
 	do_wakeup = 0;
@@ -67,12 +112,12 @@
 			char *pipebuf = PIPE_BASE(*inode) + PIPE_START(*inode);
 			ssize_t chars = PIPE_MAX_RCHUNK(*inode);
 
-			if (chars > count)
-				chars = count;
+			if (chars > total_len)
+				chars = total_len;
 			if (chars > size)
 				chars = size;
 
-			if (copy_to_user(buf, pipebuf, chars)) {
+			if (pipe_iov_copy_to_user(iov, pipebuf, chars)) {
 				if (!ret) ret = -EFAULT;
 				break;
 			}
@@ -81,12 +126,11 @@
 			PIPE_START(*inode) += chars;
 			PIPE_START(*inode) &= (PIPE_SIZE - 1);
 			PIPE_LEN(*inode) -= chars;
-			count -= chars;
-			buf += chars;
+			total_len -= chars;
 			do_wakeup = 1;
+			if (!total_len)
+				break;	/* common path: read succeeded */
 		}
-		if (!count)
-			break;	/* common path: read succeeded */
 		if (PIPE_LEN(*inode)) /* test for cyclic buffers */
 			continue;
 		if (!PIPE_WRITERS(*inode))
@@ -126,24 +170,35 @@
 }
 
 static ssize_t
-pipe_write(struct file *filp, const char __user *buf, size_t count, loff_t *ppos)
+pipe_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
+{
+	struct iovec iov = { .iov_base = buf, .iov_len = count };
+	return pipe_readv(filp, &iov, 1, ppos);
+}
+
+static ssize_t
+pipe_writev(struct file *filp, const struct iovec *_iov,
+	    unsigned long nr_segs, loff_t *ppos)
 {
 	struct inode *inode = filp->f_dentry->d_inode;
 	ssize_t ret;
 	size_t min;
 	int do_wakeup;
+	struct iovec *iov = (struct iovec *)_iov;
+	size_t total_len;
 
 	/* pwrite is not allowed on pipes. */
 	if (unlikely(ppos != &filp->f_pos))
 		return -ESPIPE;
-	
+
+	total_len = iov_length(iov, nr_segs);
 	/* Null write succeeds. */
-	if (unlikely(count == 0))
+	if (unlikely(total_len == 0))
 		return 0;
 
 	do_wakeup = 0;
 	ret = 0;
-	min = count;
+	min = total_len;
 	if (min > PIPE_BUF)
 		min = 1;
 	down(PIPE_SEM(*inode));
@@ -164,23 +219,22 @@
 			 * syscall merging.
 			 */
 			do_wakeup = 1;
-			if (chars > count)
-				chars = count;
+			if (chars > total_len)
+				chars = total_len;
 			if (chars > free)
 				chars = free;
 
-			if (copy_from_user(pipebuf, buf, chars)) {
+			if (pipe_iov_copy_from_user(pipebuf, iov, chars)) {
 				if (!ret) ret = -EFAULT;
 				break;
 			}
-
 			ret += chars;
+
 			PIPE_LEN(*inode) += chars;
-			count -= chars;
-			buf += chars;
+			total_len -= chars;
+			if (!total_len)
+				break;
 		}
-		if (!count)
-			break;
 		if (PIPE_FREE(*inode) && ret) {
 			/* handle cyclic data buffers */
 			min = 1;
@@ -214,6 +268,14 @@
 }
 
 static ssize_t
+pipe_write(struct file *filp, const char __user *buf,
+	   size_t count, loff_t *ppos)
+{
+	struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = count };
+	return pipe_writev(filp, &iov, 1, ppos);
+}
+
+static ssize_t
 bad_pipe_r(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
 {
 	return -EBADF;
@@ -405,6 +467,7 @@
 struct file_operations read_fifo_fops = {
 	.llseek		= no_llseek,
 	.read		= pipe_read,
+	.readv		= pipe_readv,
 	.write		= bad_pipe_w,
 	.poll		= fifo_poll,
 	.ioctl		= pipe_ioctl,
@@ -417,6 +480,7 @@
 	.llseek		= no_llseek,
 	.read		= bad_pipe_r,
 	.write		= pipe_write,
+	.writev		= pipe_writev,
 	.poll		= fifo_poll,
 	.ioctl		= pipe_ioctl,
 	.open		= pipe_write_open,
@@ -427,7 +491,9 @@
 struct file_operations rdwr_fifo_fops = {
 	.llseek		= no_llseek,
 	.read		= pipe_read,
+	.readv		= pipe_readv,
 	.write		= pipe_write,
+	.writev		= pipe_writev,
 	.poll		= fifo_poll,
 	.ioctl		= pipe_ioctl,
 	.open		= pipe_rdwr_open,
@@ -438,6 +504,7 @@
 struct file_operations read_pipe_fops = {
 	.llseek		= no_llseek,
 	.read		= pipe_read,
+	.readv		= pipe_readv,
 	.write		= bad_pipe_w,
 	.poll		= pipe_poll,
 	.ioctl		= pipe_ioctl,
@@ -450,6 +517,7 @@
 	.llseek		= no_llseek,
 	.read		= bad_pipe_r,
 	.write		= pipe_write,
+	.writev		= pipe_writev,
 	.poll		= pipe_poll,
 	.ioctl		= pipe_ioctl,
 	.open		= pipe_write_open,
@@ -460,7 +528,9 @@
 struct file_operations rdwr_pipe_fops = {
 	.llseek		= no_llseek,
 	.read		= pipe_read,
+	.readv		= pipe_readv,
 	.write		= pipe_write,
+	.writev		= pipe_writev,
 	.poll		= pipe_poll,
 	.ioctl		= pipe_ioctl,
 	.open		= pipe_rdwr_open,
@@ -580,6 +650,7 @@
 	d_add(dentry, inode);
 	f1->f_vfsmnt = f2->f_vfsmnt = mntget(mntget(pipe_mnt));
 	f1->f_dentry = f2->f_dentry = dget(dentry);
+	f1->f_mapping = f2->f_mapping = inode->i_mapping;
 
 	/* read file */
 	f1->f_pos = f2->f_pos = 0;
--- diff/fs/proc/base.c	2003-12-19 09:51:11.000000000 +0000
+++ source/fs/proc/base.c	2003-12-29 09:30:41.000000000 +0000
@@ -277,15 +277,50 @@
 	return result;
 }
 
+#define MAY_PTRACE(task) \
+	(task == current || \
+	(task->parent == current && \
+	(task->ptrace & PT_PTRACED) &&  task->state == TASK_STOPPED && \
+	 security_ptrace(current,task) == 0))
+
+static int may_ptrace_attach(struct task_struct *task)
+{
+	int retval = 0;
+
+	task_lock(task);
+
+	if (!task->mm)
+		goto out;
+	if (((current->uid != task->euid) ||
+	     (current->uid != task->suid) ||
+	     (current->uid != task->uid) ||
+	     (current->gid != task->egid) ||
+	     (current->gid != task->sgid) ||
+	     (current->gid != task->gid)) && !capable(CAP_SYS_PTRACE))
+		goto out;
+	rmb();
+	if (!task->mm->dumpable && !capable(CAP_SYS_PTRACE))
+		goto out;
+	if (security_ptrace(current, task))
+		goto out;
+
+	retval = 1;
+out:
+	task_unlock(task);
+	return retval;
+}
+
 static int proc_pid_environ(struct task_struct *task, char * buffer)
 {
 	int res = 0;
 	struct mm_struct *mm = get_task_mm(task);
 	if (mm) {
-		int len = mm->env_end - mm->env_start;
+		unsigned int len = mm->env_end - mm->env_start;
 		if (len > PAGE_SIZE)
 			len = PAGE_SIZE;
 		res = access_process_vm(task, mm->env_start, buffer, len, 0);
+		if (!may_ptrace_attach(task))
+			res = -ESRCH;
 		mmput(mm);
 	}
 	return res;
@@ -294,7 +329,7 @@
 static int proc_pid_cmdline(struct task_struct *task, char * buffer)
 {
 	int res = 0;
-	int len;
+	unsigned int len;
 	struct mm_struct *mm = get_task_mm(task);
 	if (!mm)
 		goto out;
@@ -521,10 +556,6 @@
 	.read		= proc_info_read,
 };
 
-#define MAY_PTRACE(p) \
-(p==current||(p->parent==current&&(p->ptrace & PT_PTRACED)&&p->state==TASK_STOPPED&&security_ptrace(current,p)==0))
-
-
 static int mem_open(struct inode* inode, struct file* file)
 {
 	file->private_data = (void*)((long)current->self_exec_id);
@@ -540,7 +571,7 @@
 	int ret = -ESRCH;
 	struct mm_struct *mm;
 
-	if (!MAY_PTRACE(task))
+	if (!MAY_PTRACE(task) || !may_ptrace_attach(task))
 		goto out;
 
 	ret = -ENOMEM;
@@ -566,7 +597,7 @@
 
 		this_len = (count > PAGE_SIZE) ? PAGE_SIZE : count;
 		retval = access_process_vm(task, src, page, this_len, 0);
-		if (!retval) {
+		if (!retval || !MAY_PTRACE(task) || !may_ptrace_attach(task)) {
 			if (!ret)
 				ret = -EIO;
 			break;
@@ -604,7 +635,7 @@
 	struct task_struct *task = proc_task(file->f_dentry->d_inode);
 	unsigned long dst = *ppos;
 
-	if (!MAY_PTRACE(task))
+	if (!MAY_PTRACE(task) || !may_ptrace_attach(task))
 		return -ESRCH;
 
 	page = (char *)__get_free_page(GFP_USER);
@@ -1524,6 +1555,7 @@
 	struct inode *inode;
 	struct proc_inode *ei;
 	unsigned tgid;
+	int died;
 
 	if (dentry->d_name.len == 4 && !memcmp(dentry->d_name.name,"self",4)) {
 		inode = new_inode(dir->i_sb);
@@ -1567,12 +1599,21 @@
 
 	dentry->d_op = &pid_base_dentry_operations;
 
+	died = 0;
+	d_add(dentry, inode);
 	spin_lock(&task->proc_lock);
 	task->proc_dentry = dentry;
-	d_add(dentry, inode);
+	if (!pid_alive(task)) {
+		dentry = proc_pid_unhash(task);
+		died = 1;
+	}
 	spin_unlock(&task->proc_lock);
 
 	put_task_struct(task);
+	if (died) {
+		proc_pid_flush(dentry);
+		goto out;
+	}
 	return NULL;
 out:
 	return ERR_PTR(-ENOENT);
@@ -1612,10 +1653,7 @@
 
 	dentry->d_op = &pid_base_dentry_operations;
 
-	spin_lock(&task->proc_lock);
-	task->proc_dentry = dentry;
 	d_add(dentry, inode);
-	spin_unlock(&task->proc_lock);
 
 	put_task_struct(task);
 	return NULL;
--- diff/fs/proc/generic.c	2003-09-30 15:46:19.000000000 +0100
+++ source/fs/proc/generic.c	2003-12-29 09:30:41.000000000 +0000
@@ -567,12 +567,12 @@
 	return ent;
 }
 
-struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent)
+struct proc_dir_entry *proc_mkdir_mode(const char *name, mode_t mode,
+		struct proc_dir_entry *parent)
 {
 	struct proc_dir_entry *ent;
 
-	ent = proc_create(&parent,name,
-			  (S_IFDIR | S_IRUGO | S_IXUGO),2);
+	ent = proc_create(&parent, name, S_IFDIR | mode, 2);
 	if (ent) {
 		ent->proc_fops = &proc_dir_operations;
 		ent->proc_iops = &proc_dir_inode_operations;
@@ -585,6 +585,12 @@
 	return ent;
 }
 
+struct proc_dir_entry *proc_mkdir(const char *name,
+		struct proc_dir_entry *parent)
+{
+	return proc_mkdir_mode(name, S_IRUGO | S_IXUGO, parent);
+}
+
 struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,
 					 struct proc_dir_entry *parent)
 {
--- diff/fs/proc/proc_misc.c	2003-10-09 09:47:17.000000000 +0100
+++ source/fs/proc/proc_misc.c	2003-12-29 09:30:41.000000000 +0000
@@ -473,30 +473,46 @@
 	return proc_calc_metrics(page, start, off, count, eof, len);
 }
 
-extern int show_interrupts(struct seq_file *p, void *v);
-static int interrupts_open(struct inode *inode, struct file *file)
+/*
+ * /proc/interrupts
+ */
+static void *int_seq_start(struct seq_file *f, loff_t *pos)
+{
+	return (*pos <= NR_IRQS) ? pos : NULL;
+}
+
+static void *int_seq_next(struct seq_file *f, void *v, loff_t *pos)
+{
+	(*pos)++;
+	if (*pos > NR_IRQS)
+		return NULL;
+	return pos;
+}
+
+static void int_seq_stop(struct seq_file *f, void *v)
 {
-	unsigned size = 4096 * (1 + num_online_cpus() / 8);
-	char *buf = kmalloc(size, GFP_KERNEL);
-	struct seq_file *m;
-	int res;
-
-	if (!buf)
-		return -ENOMEM;
-	res = single_open(file, show_interrupts, NULL);
-	if (!res) {
-		m = file->private_data;
-		m->buf = buf;
-		m->size = size;
-	} else
-		kfree(buf);
-	return res;
+	/* Nothing to do */
 }
+
+
+extern int show_interrupts(struct seq_file *f, void *v); /* In arch code */
+static struct seq_operations int_seq_ops = {
+	.start = int_seq_start,
+	.next  = int_seq_next,
+	.stop  = int_seq_stop,
+	.show  = show_interrupts
+};
+
+int interrupts_open(struct inode *inode, struct file *filp)
+{
+	return seq_open(filp, &int_seq_ops);
+}
+
 static struct file_operations proc_interrupts_operations = {
 	.open		= interrupts_open,
 	.read		= seq_read,
 	.llseek		= seq_lseek,
-	.release	= single_release,
+	.release	= seq_release,
 };
 
 static int filesystems_read_proc(char *page, char **start, off_t off,
@@ -638,6 +654,36 @@
 		entry->proc_fops = f;
 }
 
+#ifdef CONFIG_LOCKMETER
+extern ssize_t get_lockmeter_info(char *, size_t, loff_t *);
+extern ssize_t put_lockmeter_info(const char *, size_t);
+extern int get_lockmeter_info_size(void);
+
+/*
+ * This function accesses lock metering information.
+ */
+static ssize_t read_lockmeter(struct file *file, char *buf,
+			      size_t count, loff_t *ppos)
+{
+	return get_lockmeter_info(buf, count, ppos);
+}
+
+/*
+ * Writing to /proc/lockmeter resets the counters
+ */
+static ssize_t write_lockmeter(struct file * file, const char * buf,
+			       size_t count, loff_t *ppos)
+{
+	return put_lockmeter_info(buf, count);
+}
+
+static struct file_operations proc_lockmeter_operations = {
+	NULL,           /* lseek */
+	read:		read_lockmeter,
+	write:		write_lockmeter,
+};
+#endif  /* CONFIG_LOCKMETER */
+
 void __init proc_misc_init(void)
 {
 	struct proc_dir_entry *entry;
@@ -705,6 +751,13 @@
 	if (entry)
 		entry->proc_fops = &proc_sysrq_trigger_operations;
 #endif
+#ifdef CONFIG_LOCKMETER
+	entry = create_proc_entry("lockmeter", S_IWUSR | S_IRUGO, NULL);
+	if (entry) {
+		entry->proc_fops = &proc_lockmeter_operations;
+		entry->size = get_lockmeter_info_size();
+	}
+#endif
 #ifdef CONFIG_PPC32
 	{
 		extern struct file_operations ppc_htab_operations;
--- diff/fs/proc/proc_tty.c	2003-12-19 09:51:02.000000000 +0000
+++ source/fs/proc/proc_tty.c	2003-12-29 09:30:41.000000000 +0000
@@ -229,7 +229,13 @@
 	if (!proc_mkdir("tty", 0))
 		return;
 	proc_tty_ldisc = proc_mkdir("tty/ldisc", 0);
-	proc_tty_driver = proc_mkdir("tty/driver", 0);
+	/*
+	 * /proc/tty/driver/serial reveals the exact character counts for
+	 * serial links which is just too easy to abuse for inferring
+	 * password lengths and inter-keystroke timings during password
+	 * entry.
+	 */
+	proc_tty_driver = proc_mkdir_mode("tty/driver", S_IRUSR | S_IXUSR, 0);
 
 	create_proc_read_entry("tty/ldiscs", 0, 0, tty_ldiscs_read_proc,NULL);
 	entry = create_proc_entry("tty/drivers", 0, NULL);
--- diff/fs/proc/task_mmu.c	2003-09-17 12:28:11.000000000 +0100
+++ source/fs/proc/task_mmu.c	2003-12-29 09:30:41.000000000 +0000
@@ -1,6 +1,7 @@
 #include <linux/mm.h>
 #include <linux/hugetlb.h>
 #include <linux/seq_file.h>
+#include <asm/elf.h>
 #include <asm/uaccess.h>
 
 char *task_mem(struct mm_struct *mm, char *buffer)
@@ -75,6 +76,22 @@
 	return size;
 }
 
+#ifdef AT_SYSINFO_EHDR
+
+static struct vm_area_struct gate_vmarea = {
+	/* Do _not_ mark this area as readable, cuz not the entire range may be readable
+	   (e.g., due to execute-only pages or holes) and the tools that read
+	   /proc/PID/maps should read the interesting bits from the gate-DSO file
+	   instead.  */
+	.vm_start = FIXADDR_USER_START,
+	.vm_end = FIXADDR_USER_END
+};
+
+# define gate_map()	&gate_vmarea
+#else
+# define gate_map()	NULL
+#endif
+
 static int show_map(struct seq_file *m, void *v)
 {
 	struct vm_area_struct *map = v;
@@ -105,7 +122,7 @@
 		if (len < 1)
 			len = 1;
 		seq_printf(m, "%*c", len, ' ');
-		seq_path(m, file->f_vfsmnt, file->f_dentry, " \t\n\\");
+		seq_path(m, file->f_vfsmnt, file->f_dentry, "");
 	}
 	seq_putc(m, '\n');
 	return 0;
@@ -128,6 +145,8 @@
 	if (!map) {
 		up_read(&mm->mmap_sem);
 		mmput(mm);
+		if (l == -1)
+			map = gate_map();
 	}
 	return map;
 }
@@ -135,7 +154,7 @@
 static void m_stop(struct seq_file *m, void *v)
 {
 	struct vm_area_struct *map = v;
-	if (map) {
+	if (map && map != gate_map()) {
 		struct mm_struct *mm = map->vm_mm;
 		up_read(&mm->mmap_sem);
 		mmput(mm);
@@ -149,6 +168,8 @@
 	if (map->vm_next)
 		return map->vm_next;
 	m_stop(m, v);
+	if (map != gate_map())
+		return gate_map();
 	return NULL;
 }
 
--- diff/fs/read_write.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/read_write.c	2003-12-29 09:30:41.000000000 +0000
@@ -28,7 +28,7 @@
 loff_t generic_file_llseek(struct file *file, loff_t offset, int origin)
 {
 	long long retval;
-	struct inode *inode = file->f_dentry->d_inode->i_mapping->host;
+	struct inode *inode = file->f_mapping->host;
 
 	down(&inode->i_sem);
 	switch (origin) {
--- diff/fs/reiserfs/file.c	2003-09-30 15:46:19.000000000 +0100
+++ source/fs/reiserfs/file.c	2003-12-29 09:30:41.000000000 +0000
@@ -1052,7 +1052,7 @@
     /* Check if we can write to specified region of file, file
        is not overly big and this kind of stuff. Adjust pos and
        count, if needed */
-    res = generic_write_checks(inode, file, &pos, &count, 0);
+    res = generic_write_checks(file, &pos, &count, 0);
     if (res)
 	goto out;
 
@@ -1179,7 +1179,7 @@
     }
 
     if ((file->f_flags & O_SYNC) || IS_SYNC(inode))
-	res = generic_osync_inode(inode, OSYNC_METADATA|OSYNC_DATA);
+	res = generic_osync_inode(inode, file->f_mapping, OSYNC_METADATA|OSYNC_DATA);
 
     up(&inode->i_sem);
     return (already_written != 0)?already_written:res;
--- diff/fs/reiserfs/inode.c	2003-09-30 15:46:19.000000000 +0100
+++ source/fs/reiserfs/inode.c	2003-12-29 09:30:41.000000000 +0000
@@ -2375,7 +2375,7 @@
 			      loff_t offset, unsigned long nr_segs)
 {
     struct file *file = iocb->ki_filp;
-    struct inode *inode = file->f_dentry->d_inode->i_mapping->host;
+    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);
--- diff/fs/reiserfs/journal.c	2003-09-30 15:46:19.000000000 +0100
+++ source/fs/reiserfs/journal.c	2003-12-29 09:30:41.000000000 +0000
@@ -1937,18 +1937,13 @@
 
 	journal -> j_dev_file = filp_open( jdev_name, 0, 0 );
 	if( !IS_ERR( journal -> j_dev_file ) ) {
-		struct inode *jdev_inode;
-
-		jdev_inode = journal -> j_dev_file -> f_dentry -> d_inode;
-		journal -> j_dev_bd = jdev_inode -> i_bdev;
+		struct inode *jdev_inode = journal->j_dev_file->f_mapping->host;
 		if( !S_ISBLK( jdev_inode -> i_mode ) ) {
 			printk( "journal_init_dev: '%s' is not a block device\n", jdev_name );
 			result = -ENOTBLK;
-		} else if( jdev_inode -> i_bdev == NULL ) {
-			printk( "journal_init_dev: bdev uninitialized for '%s'\n", jdev_name );
-			result = -ENOMEM;
 		} else  {
 			/* ok */
+			journal->j_dev_bd = I_BDEV(jdev_inode);
 			set_blocksize(journal->j_dev_bd, super->s_blocksize);
 		}
 	} else {
--- diff/fs/stat.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/stat.c	2003-12-29 09:30:41.000000000 +0000
@@ -106,7 +106,7 @@
 EXPORT_SYMBOL(vfs_fstat);
 
 #if !defined(__alpha__) && !defined(__sparc__) && !defined(__ia64__) \
-  && !defined(CONFIG_ARCH_S390) && !defined(__hppa__) && !defined(__x86_64__) \
+  && !defined(CONFIG_ARCH_S390) && !defined(__hppa__) \
   && !defined(__arm__) && !defined(CONFIG_V850) && !defined(__powerpc64__)
 
 /*
--- diff/fs/super.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/super.c	2003-12-29 09:30:41.000000000 +0000
@@ -66,6 +66,7 @@
 		INIT_LIST_HEAD(&s->s_files);
 		INIT_LIST_HEAD(&s->s_instances);
 		INIT_HLIST_HEAD(&s->s_anon);
+		INIT_LIST_HEAD(&s->s_inodes);
 		init_rwsem(&s->s_umount);
 		sema_init(&s->s_lock, 1);
 		down_write(&s->s_umount);
--- diff/fs/sysfs/dir.c	2003-10-09 09:47:17.000000000 +0100
+++ source/fs/sysfs/dir.c	2003-12-29 09:30:41.000000000 +0000
@@ -83,7 +83,8 @@
 	struct dentry * parent = dget(d->d_parent);
 	down(&parent->d_inode->i_sem);
 	d_delete(d);
-	simple_rmdir(parent->d_inode,d);
+	if (d->d_inode)
+		simple_rmdir(parent->d_inode,d);
 
 	pr_debug(" o %s removing done (%d)\n",d->d_name.name,
 		 atomic_read(&d->d_count));
@@ -122,8 +123,8 @@
 	node = dentry->d_subdirs.next;
 	while (node != &dentry->d_subdirs) {
 		struct dentry * d = list_entry(node,struct dentry,d_child);
-		list_del_init(node);
 
+		node = node->next;
 		pr_debug(" o %s (%d): ",d->d_name.name,atomic_read(&d->d_count));
 		if (d->d_inode) {
 			d = dget_locked(d);
@@ -139,9 +140,7 @@
 			spin_lock(&dcache_lock);
 		}
 		pr_debug(" done\n");
-		node = dentry->d_subdirs.next;
 	}
-	list_del_init(&dentry->d_child);
 	spin_unlock(&dcache_lock);
 	up(&dentry->d_inode->i_sem);
 
--- diff/fs/udf/super.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/udf/super.c	2003-12-29 09:30:41.000000000 +0000
@@ -414,7 +414,7 @@
 		case Opt_utf8:
 			uopt->flags |= (1 << UDF_FLAG_UTF8);
 			break;
-#ifdef CONFIG_NLS
+#if defined(CONFIG_NLS) || defined(CONFIG_NLS_MODULE)
 		case Opt_iocharset:
 			uopt->nls_map = load_nls(args[0].from);
 			uopt->flags |= (1 << UDF_FLAG_NLS_MAP);
@@ -1510,7 +1510,7 @@
 			"utf8 cannot be combined with iocharset\n");
 		goto error_out;
 	}
-#ifdef CONFIG_NLS
+#if defined(CONFIG_NLS) || defined(CONFIG_NLS_MODULE)
 	if ((uopt.flags & (1 << UDF_FLAG_NLS_MAP)) && !uopt.nls_map)
 	{
 		uopt.nls_map = load_nls_default();
@@ -1674,7 +1674,7 @@
 				udf_release_data(UDF_SB_TYPESPAR(sb, UDF_SB_PARTITION(sb)).s_spar_map[i]);
 		}
 	}
-#ifdef CONFIG_NLS
+#if defined(CONFIG_NLS) || defined(CONFIG_NLS_MODULE)
 	if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP))
 		unload_nls(UDF_SB(sb)->s_nls_map);
 #endif
@@ -1766,7 +1766,7 @@
 				udf_release_data(UDF_SB_TYPESPAR(sb, UDF_SB_PARTITION(sb)).s_spar_map[i]);
 		}
 	}
-#ifdef CONFIG_NLS
+#if defined(CONFIG_NLS) || defined(CONFIG_NLS_MODULE)
 	if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP))
 		unload_nls(UDF_SB(sb)->s_nls_map);
 #endif
--- diff/fs/vfat/namei.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/vfat/namei.c	2003-12-29 09:30:41.000000000 +0000
@@ -25,23 +25,6 @@
 #include <linux/buffer_head.h>
 #include <linux/namei.h>
 
-#define DEBUG_LEVEL 0
-#if (DEBUG_LEVEL >= 1)
-#  define PRINTK1(x) printk x
-#else
-#  define PRINTK1(x)
-#endif
-#if (DEBUG_LEVEL >= 2)
-#  define PRINTK2(x) printk x
-#else
-#  define PRINTK2(x)
-#endif
-#if (DEBUG_LEVEL >= 3)
-#  define PRINTK3(x) printk x
-#else
-#  define PRINTK3(x)
-#endif
-
 static int vfat_hashi(struct dentry *parent, struct qstr *qstr);
 static int vfat_hash(struct dentry *parent, struct qstr *qstr);
 static int vfat_cmpi(struct dentry *dentry, struct qstr *a, struct qstr *b);
@@ -573,13 +556,18 @@
 	int charlen;
 
 	if (utf8) {
+		int name_len = strlen(name);
+
 		*outlen = utf8_mbstowcs((wchar_t *)outname, name, PAGE_SIZE);
-		if (name[len-1] == '.')
-			*outlen-=2;
+
+		/*
+		 * We stripped '.'s before and set len appropriately,
+		 * but utf8_mbstowcs doesn't care about len
+		 */
+		*outlen -= (name_len-len);
+
 		op = &outname[*outlen * sizeof(wchar_t)];
 	} else {
-		if (name[len-1] == '.') 
-			len--;
 		if (nls) {
 			for (i = 0, ip = name, op = outname, *outlen = 0;
 			     i < len && *outlen <= 260; *outlen += 1)
@@ -694,7 +682,6 @@
 	for (cksum = i = 0; i < 11; i++) {
 		cksum = (((cksum&1)<<7)|((cksum&0xfe)>>1)) + msdos_name[i];
 	}
-	PRINTK3(("vfat_fill_slots 3: slots=%d\n",*slots));
 
 	for (ps = ds, slot = *slots; slot > 0; slot--, ps++) {
 		ps->id = slot;
@@ -711,7 +698,6 @@
 	de = (struct msdos_dir_entry *) ps;
 
 shortname:
-	PRINTK3(("vfat_fill_slots 9\n"));
 	/* build the entry of 8.3 alias name */
 	(*slots)++;
 	memcpy(de->name, msdos_name, MSDOS_NAME);
@@ -734,18 +720,22 @@
 {
 	struct msdos_dir_slot *dir_slots;
 	loff_t offset;
-	int slots, slot;
-	int res;
+	int res, slots, slot;
+	unsigned int len;
 	struct msdos_dir_entry *dummy_de;
 	struct buffer_head *dummy_bh;
 	loff_t dummy_i_pos;
 
-	dir_slots = (struct msdos_dir_slot *)
+	len = vfat_striptail_len(qname);
+	if (len == 0)
+		return -ENOENT;
+
+	dir_slots =
 	       kmalloc(sizeof(struct msdos_dir_slot) * MSDOS_SLOTS, GFP_KERNEL);
 	if (dir_slots == NULL)
 		return -ENOMEM;
 
-	res = vfat_build_slots(dir, qname->name, vfat_striptail_len(qname),
+	res = vfat_build_slots(dir, qname->name, len,
 			       dir_slots, &slots, is_dir);
 	if (res < 0)
 		goto cleanup;
@@ -796,11 +786,16 @@
 {
 	struct super_block *sb = dir->i_sb;
 	loff_t offset;
+	unsigned int len;
 	int res;
 
-	res = fat_search_long(dir, qname->name, vfat_striptail_len(qname),
-			(MSDOS_SB(sb)->options.name_check != 's'),
-			&offset,&sinfo->longname_offset);
+	len = vfat_striptail_len(qname);
+	if (len == 0)
+		return -ENOENT;
+
+	res = fat_search_long(dir, qname->name, len,
+			      (MSDOS_SB(sb)->options.name_check != 's'),
+			      &offset, &sinfo->longname_offset);
 	if (res>0) {
 		sinfo->long_slots = res-1;
 		if (fat_get_entry(dir,&offset,last_bh,last_de,&sinfo->i_pos)>=0)
@@ -820,9 +815,6 @@
 	struct msdos_dir_entry *de;
 	int table;
 	
-	PRINTK2(("vfat_lookup: name=%s, len=%d\n", 
-		 dentry->d_name.name, dentry->d_name.len));
-
 	lock_kernel();
 	table = (MSDOS_SB(dir->i_sb)->options.name_check == 's') ? 2 : 0;
 	dentry->d_op = &vfat_dentry_ops[table];
@@ -955,7 +947,6 @@
 	struct buffer_head *bh = NULL;
 	struct msdos_dir_entry *de;
 
-	PRINTK1(("vfat_unlink: %s\n", dentry->d_name.name));
 	lock_kernel();
 	res = vfat_find(dir,&dentry->d_name,&sinfo,&bh,&de);
 	if (res < 0) {
@@ -1036,14 +1027,18 @@
 	new_inode = new_dentry->d_inode;
 	lock_kernel();
 	res = vfat_find(old_dir,&old_dentry->d_name,&old_sinfo,&old_bh,&old_de);
-	PRINTK3(("vfat_rename 2\n"));
-	if (res < 0) goto rename_done;
+	if (res < 0)
+		goto rename_done;
 
 	is_dir = S_ISDIR(old_inode->i_mode);
 
-	if (is_dir && (res = fat_scan(old_inode,MSDOS_DOTDOT,&dotdot_bh,
-				&dotdot_de,&dotdot_i_pos)) < 0)
-		goto rename_done;
+	if (is_dir) {
+		if (fat_scan(old_inode, MSDOS_DOTDOT, &dotdot_bh,
+			     &dotdot_de, &dotdot_i_pos) < 0) {
+			res = -EIO;
+			goto rename_done;
+		}
+	}
 
 	if (new_dentry->d_inode) {
 		res = vfat_find(new_dir,&new_dentry->d_name,&sinfo,&new_bh,
--- diff/fs/xfs/linux/xfs_aops.c	2003-10-27 09:20:39.000000000 +0000
+++ source/fs/xfs/linux/xfs_aops.c	2003-12-29 09:30:41.000000000 +0000
@@ -974,7 +974,7 @@
 	unsigned long		nr_segs)
 {
 	struct file	*file = iocb->ki_filp;
-	struct inode	*inode = file->f_dentry->d_inode->i_mapping->host;
+	struct inode	*inode = file->f_mapping->host;
 	vnode_t		*vp = LINVFS_GET_VP(inode);
 	page_buf_bmap_t	pbmap;
 	int		maps = 1;
@@ -984,7 +984,8 @@
 	if (error)
 		return -error;
 
-        return blockdev_direct_IO(rw, iocb, inode, pbmap.pbm_target->pbr_bdev,
+        return blockdev_direct_IO_no_locking(rw, iocb, inode,
+		pbmap.pbm_target->pbr_bdev,
 		iov, offset, nr_segs,
 		linvfs_get_blocks_direct,
 		linvfs_unwritten_convert_direct);
--- diff/fs/xfs/linux/xfs_file.c	2003-10-27 09:20:39.000000000 +0000
+++ source/fs/xfs/linux/xfs_file.c	2003-12-29 09:30:41.000000000 +0000
@@ -112,7 +112,7 @@
 {
 	struct iovec	iov = {(void *)buf, count};
 	struct file	*file = iocb->ki_filp;
-	struct inode	*inode = file->f_dentry->d_inode->i_mapping->host;
+	struct inode	*inode = file->f_mapping->host;
 	vnode_t		*vp = LINVFS_GET_VP(inode);
 	int		error;
 
@@ -160,7 +160,7 @@
 	unsigned long		nr_segs,
 	loff_t			*ppos)
 {
-	struct inode	*inode = file->f_dentry->d_inode->i_mapping->host;
+	struct inode	*inode = file->f_mapping->host;
 	vnode_t		*vp = LINVFS_GET_VP(inode);
 	struct		kiocb kiocb;
 	int		error;
@@ -207,7 +207,7 @@
 	unsigned long		nr_segs,
 	loff_t			*ppos)
 {
-	struct inode	*inode = file->f_dentry->d_inode->i_mapping->host;
+	struct inode	*inode = file->f_mapping->host;
 	vnode_t		*vp = LINVFS_GET_VP(inode);
 	struct		kiocb kiocb;
 	int		error;
--- diff/fs/xfs/pagebuf/page_buf.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/xfs/pagebuf/page_buf.c	2003-12-29 09:30:41.000000000 +0000
@@ -1395,7 +1395,6 @@
 			break;
 
 		offset = 0;
-
 		sector += nbytes >> BBSHIFT;
 		size -= nbytes;
 		total_nr_pages--;
@@ -1403,15 +1402,11 @@
 
 submit_io:
 	if (likely(bio->bi_size)) {
-		if (pb->pb_flags & PBF_READ) {
-			submit_bio(READ, bio);
-		} else {
-			submit_bio(WRITE, bio);
-		}
-
+		submit_bio((pb->pb_flags & PBF_READ) ? READ : WRITE, bio);
 		if (size)
 			goto next_chunk;
 	} else {
+		bio_put(bio);
 		pagebuf_ioerror(pb, EIO);
 	}
 
--- diff/fs/xfs/xfs_inode.c	2003-10-27 09:20:39.000000000 +0000
+++ source/fs/xfs/xfs_inode.c	2003-12-29 09:30:41.000000000 +0000
@@ -3722,7 +3722,7 @@
 	 * Read/write DACs are always overridable.
 	 * Executable DACs are overridable if at least one exec bit is set.
 	 */
-	if ((orgmode & (S_IRUSR|S_IWUSR)) || (inode->i_mode & S_IXUGO))
+	if (!(orgmode & S_IXUSR) || (inode->i_mode & S_IXUGO))
 		if (capable_cred(cr, CAP_DAC_OVERRIDE))
 			return 0;
 
--- diff/fs/xfs/xfs_vfsops.c	2003-10-27 09:20:39.000000000 +0000
+++ source/fs/xfs/xfs_vfsops.c	2003-12-29 09:30:41.000000000 +0000
@@ -1598,8 +1598,9 @@
 #define MNTOPT_NORECOVERY   "norecovery"   /* don't run XFS recovery */
 #define MNTOPT_NOLOGFLUSH   "nologflush"   /* don't hard flush on log writes */
 #define MNTOPT_OSYNCISOSYNC "osyncisosync" /* o_sync is REALLY o_sync */
-#define MNTOPT_64BITINODE   "inode64"  /* inodes can be allocated anywhere */
-#define MNTOPT_IKEEP	"ikeep"		/* free empty inode clusters */
+#define MNTOPT_64BITINODE   "inode64"	/* inodes can be allocated anywhere */
+#define MNTOPT_IKEEP	"ikeep"		/* do not free empty inode clusters */
+#define MNTOPT_NOIKEEP	"noikeep"	/* free empty inode clusters */
 
 
 int
@@ -1614,7 +1615,9 @@
 	int			dsunit, dswidth, vol_dsunit, vol_dswidth;
 	int			iosize;
 
+#if 0	/* XXX: off by default, until some remaining issues ironed out */
 	args->flags |= XFSMNT_IDELETE; /* default to on */
+#endif
 
 	if (!options)
 		return 0;
@@ -1722,6 +1725,8 @@
 			args->flags |= XFSMNT_NOLOGFLUSH;
 		} else if (!strcmp(this_char, MNTOPT_IKEEP)) {
 			args->flags &= ~XFSMNT_IDELETE;
+		} else if (!strcmp(this_char, MNTOPT_NOIKEEP)) {
+			args->flags |= XFSMNT_IDELETE;
 		} else if (!strcmp(this_char, "osyncisdsync")) {
 			/* no-op, this is now the default */
 printk("XFS: osyncisdsync is now the default, option is deprecated.\n");
--- diff/include/acpi/acconfig.h	2003-10-27 09:20:39.000000000 +0000
+++ source/include/acpi/acconfig.h	2003-12-29 09:30:41.000000000 +0000
@@ -64,7 +64,7 @@
 
 /* Version string */
 
-#define ACPI_CA_VERSION                 0x20031002
+#define ACPI_CA_VERSION                 0x20031203
 
 /* Maximum objects in the various object caches */
 
--- diff/include/acpi/acevents.h	2003-06-09 14:18:20.000000000 +0100
+++ source/include/acpi/acevents.h	2003-12-29 09:30:41.000000000 +0000
@@ -182,6 +182,17 @@
 	union acpi_operand_object      *region_obj,
 	u8                              acpi_ns_is_locked);
 
+acpi_status
+acpi_ev_execute_reg_method (
+	union acpi_operand_object      *region_obj,
+	u32                             function);
+
+acpi_status
+acpi_ev_reg_run (
+	acpi_handle                     obj_handle,
+	u32                             level,
+	void                            *context,
+	void                            **return_value);
 
 /*
  * Evregini - Region initialization and setup
--- diff/include/acpi/acglobal.h	2003-06-30 10:07:34.000000000 +0100
+++ source/include/acpi/acglobal.h	2003-12-29 09:30:41.000000000 +0000
@@ -106,6 +106,9 @@
 ACPI_EXTERN u8                                  acpi_gbl_integer_bit_width;
 ACPI_EXTERN u8                                  acpi_gbl_integer_byte_width;
 ACPI_EXTERN u8                                  acpi_gbl_integer_nybble_width;
+
+/* Keep local copies of these FADT-based registers */
+
 ACPI_EXTERN struct acpi_generic_address         acpi_gbl_xpm1a_enable;
 ACPI_EXTERN struct acpi_generic_address         acpi_gbl_xpm1b_enable;
 
--- diff/include/acpi/acmacros.h	2003-06-09 14:18:20.000000000 +0100
+++ source/include/acpi/acmacros.h	2003-12-29 09:30:41.000000000 +0000
@@ -48,7 +48,6 @@
 /*
  * Data manipulation macros
  */
-
 #define ACPI_LOWORD(l)                  ((u16)(u32)(l))
 #define ACPI_HIWORD(l)                  ((u16)((((u32)(l)) >> 16) & 0xFFFF))
 #define ACPI_LOBYTE(l)                  ((u8)(u16)(l))
@@ -94,10 +93,18 @@
 #endif
 #endif
 
- /*
-  * Extract a byte of data using a pointer.  Any more than a byte and we
-  * get into potential aligment issues -- see the STORE macros below
-  */
+/*
+ * printf() format helpers
+ */
+
+/* Split 64-bit integer into two 32-bit values. use with %8,8_x%8.8X */
+
+#define ACPI_FORMAT_UINT64(i)           ACPI_HIDWORD(i),ACPI_LODWORD(i)
+
+/*
+ * Extract a byte of data using a pointer.  Any more than a byte and we
+ * get into potential aligment issues -- see the STORE macros below
+ */
 #define ACPI_GET8(addr)                 (*(u8*)(addr))
 
 /* Pointer arithmetic */
@@ -129,7 +136,6 @@
  * If the hardware supports the transfer of unaligned data, just do the store.
  * Otherwise, we have to move one byte at a time.
  */
-
 #ifdef ACPI_BIG_ENDIAN
 /*
  * Macros for big-endian machines
@@ -299,7 +305,6 @@
 /*
  * Fast power-of-two math macros for non-optimized compilers
  */
-
 #define _ACPI_DIV(value,power_of2)      ((u32) ((value) >> (power_of2)))
 #define _ACPI_MUL(value,power_of2)      ((u32) ((value) << (power_of2)))
 #define _ACPI_MOD(value,divisor)        ((u32) ((value) & ((divisor) -1)))
@@ -443,7 +448,6 @@
 /*
  * Reporting macros that are never compiled out
  */
-
 #define ACPI_PARAM_LIST(pl)                 pl
 
 /*
@@ -451,7 +455,6 @@
  * _THIS_MODULE gets compiled out when ACPI_DEBUG_OUTPUT isn't defined, only
  * use it in debug mode.
  */
-
 #ifdef ACPI_DEBUG_OUTPUT
 
 #define ACPI_REPORT_INFO(fp)                {acpi_ut_report_info(_THIS_MODULE,__LINE__,_COMPONENT); \
@@ -490,7 +493,6 @@
 /*
  * Debug macros that are conditionally compiled
  */
-
 #ifdef ACPI_DEBUG_OUTPUT
 
 #define ACPI_MODULE_NAME(name)               static char ACPI_UNUSED_VAR *_THIS_MODULE = name;
@@ -500,7 +502,6 @@
  * The first parameter should be the procedure name as a quoted string.  This is declared
  * as a local string ("_proc_name) so that it can be also used by the function exit macros below.
  */
-
 #define ACPI_FUNCTION_NAME(a)               struct acpi_debug_print_info _dbg; \
 												_dbg.component_id = _COMPONENT; \
 												_dbg.proc_name   = a; \
@@ -562,7 +563,6 @@
 /*
  * Generate INT3 on ACPI_ERROR (Debug only!)
  */
-
 #define ACPI_ERROR_BREAK
 #ifdef  ACPI_ERROR_BREAK
 #define ACPI_BREAK_ON_ERROR(lvl)        if ((lvl)&ACPI_ERROR) \
@@ -577,7 +577,6 @@
  *    1) Debug print for the current component is enabled
  *    2) Debug error level or trace level for the print statement is enabled
  */
-
 #define ACPI_DEBUG_PRINT(pl)            acpi_ut_debug_print ACPI_PARAM_LIST(pl)
 #define ACPI_DEBUG_PRINT_RAW(pl)        acpi_ut_debug_print_raw ACPI_PARAM_LIST(pl)
 
@@ -587,7 +586,6 @@
  * This is the non-debug case -- make everything go away,
  * leaving no executable debug code!
  */
-
 #define ACPI_MODULE_NAME(name)
 #define _THIS_MODULE ""
 
@@ -662,7 +660,6 @@
 /*
  * Memory allocation tracking (DEBUG ONLY)
  */
-
 #ifndef ACPI_DBG_TRACK_ALLOCATIONS
 
 /* Memory allocation */
--- diff/include/acpi/acobject.h	2003-06-09 14:18:20.000000000 +0100
+++ source/include/acpi/acobject.h	2003-12-29 09:30:41.000000000 +0000
@@ -114,7 +114,7 @@
 #define ACPI_COMMON_NOTIFY_INFO \
 	union acpi_operand_object               *system_notify;     /* Handler for system notifies */\
 	union acpi_operand_object               *device_notify;     /* Handler for driver notifies */\
-	union acpi_operand_object               *address_space;     /* Handler for Address space */
+	union acpi_operand_object               *handler;           /* Handler for Address space */
 
 
 /******************************************************************************
@@ -214,7 +214,7 @@
 	ACPI_OBJECT_COMMON_HEADER
 
 	u8                                      space_id;
-	union acpi_operand_object               *address_space;     /* Handler for region access */
+	union acpi_operand_object               *handler;           /* Handler for region access */
 	struct acpi_namespace_node              *node;              /* containing object */
 	union acpi_operand_object               *next;
 	u32                                     length;
@@ -464,21 +464,22 @@
 
 /* Object descriptor types */
 
-#define ACPI_DESC_TYPE_CACHED           0x11        /* Used only when object is cached */
-#define ACPI_DESC_TYPE_STATE            0x20
-#define ACPI_DESC_TYPE_STATE_UPDATE     0x21
-#define ACPI_DESC_TYPE_STATE_PACKAGE    0x22
-#define ACPI_DESC_TYPE_STATE_CONTROL    0x23
-#define ACPI_DESC_TYPE_STATE_RPSCOPE    0x24
-#define ACPI_DESC_TYPE_STATE_PSCOPE     0x25
-#define ACPI_DESC_TYPE_STATE_WSCOPE     0x26
-#define ACPI_DESC_TYPE_STATE_RESULT     0x27
-#define ACPI_DESC_TYPE_STATE_NOTIFY     0x28
-#define ACPI_DESC_TYPE_STATE_THREAD     0x29
-#define ACPI_DESC_TYPE_WALK             0x44
-#define ACPI_DESC_TYPE_PARSER           0x66
-#define ACPI_DESC_TYPE_OPERAND          0x88
-#define ACPI_DESC_TYPE_NAMED            0xAA
+#define ACPI_DESC_TYPE_CACHED           0x01        /* Used only when object is cached */
+#define ACPI_DESC_TYPE_STATE            0x02
+#define ACPI_DESC_TYPE_STATE_UPDATE     0x03
+#define ACPI_DESC_TYPE_STATE_PACKAGE    0x04
+#define ACPI_DESC_TYPE_STATE_CONTROL    0x05
+#define ACPI_DESC_TYPE_STATE_RPSCOPE    0x06
+#define ACPI_DESC_TYPE_STATE_PSCOPE     0x07
+#define ACPI_DESC_TYPE_STATE_WSCOPE     0x08
+#define ACPI_DESC_TYPE_STATE_RESULT     0x09
+#define ACPI_DESC_TYPE_STATE_NOTIFY     0x0A
+#define ACPI_DESC_TYPE_STATE_THREAD     0x0B
+#define ACPI_DESC_TYPE_WALK             0x0C
+#define ACPI_DESC_TYPE_PARSER           0x0D
+#define ACPI_DESC_TYPE_OPERAND          0x0E
+#define ACPI_DESC_TYPE_NAMED            0x0F
+#define ACPI_DESC_TYPE_MAX              0x0F
 
 
 union acpi_descriptor
--- diff/include/acpi/acpi_drivers.h	2003-09-30 15:45:48.000000000 +0100
+++ source/include/acpi/acpi_drivers.h	2003-12-29 09:30:41.000000000 +0000
@@ -53,10 +53,6 @@
 
 #define ACPI_PCI_COMPONENT		0x00400000
 
-/* ACPI PCI Root Bridge (pci_root.c) */
-
-void acpi_pci_get_translations (struct acpi_pci_id* id, u64* mem_tra, u64* io_tra);
-
 /* ACPI PCI Interrupt Link (pci_link.c) */
 
 int acpi_pci_link_check (void);
--- diff/include/acpi/acutils.h	2003-06-09 14:18:20.000000000 +0100
+++ source/include/acpi/acutils.h	2003-12-29 09:30:41.000000000 +0000
@@ -125,6 +125,14 @@
 	acpi_object_type                type);
 
 char *
+acpi_ut_get_node_name (
+	void                            *object);
+
+char *
+acpi_ut_get_descriptor_name (
+	void                            *object);
+
+char *
 acpi_ut_get_object_type_name (
 	union acpi_operand_object       *obj_desc);
 
--- diff/include/asm-alpha/spinlock.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/asm-alpha/spinlock.h	2003-12-29 09:30:41.000000000 +0000
@@ -6,6 +6,10 @@
 #include <linux/kernel.h>
 #include <asm/current.h>
 
+#ifdef CONFIG_LOCKMETER
+#undef DEBUG_SPINLOCK
+#undef DEBUG_RWLOCK
+#endif
 
 /*
  * Simple spin lock operations.  There are two variants, one clears IRQ's
@@ -95,9 +99,18 @@
 
 typedef struct {
 	volatile int write_lock:1, read_counter:31;
+#ifdef CONFIG_LOCKMETER
+	/* required for LOCKMETER since all bits in lock are used */
+	/* need this storage for CPU and lock INDEX ............. */
+	unsigned magic;
+#endif
 } /*__attribute__((aligned(32)))*/ rwlock_t;
 
+#ifdef CONFIG_LOCKMETER
+#define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0, 0 }
+#else
 #define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0 }
+#endif
 
 #define rwlock_init(x)	do { *(x) = RW_LOCK_UNLOCKED; } while(0)
 #define rwlock_is_locked(x)	(*(volatile int *)(x) != 0)
@@ -169,4 +182,41 @@
 	: "m" (*lock) : "memory");
 }
 
+#ifdef CONFIG_LOCKMETER
+static inline int _raw_write_trylock(rwlock_t *lock)
+{
+	long temp,result;
+
+	__asm__ __volatile__(
+	"	ldl_l %1,%0\n"
+	"	mov $31,%2\n"
+	"	bne %1,1f\n"
+	"	or $31,1,%2\n"
+	"	stl_c %2,%0\n"
+	"1:	mb\n"
+	: "=m" (*(volatile int *)lock), "=&r" (temp), "=&r" (result)
+	: "m" (*(volatile int *)lock)
+	);
+
+	return (result);
+}
+
+static inline int _raw_read_trylock(rwlock_t *lock)
+{
+	unsigned long temp,result;
+
+	__asm__ __volatile__(
+	"	ldl_l %1,%0\n"
+	"	mov $31,%2\n"
+	"	blbs %1,1f\n"
+	"	subl %1,2,%2\n"
+	"	stl_c %2,%0\n"
+	"1:	mb\n"
+	: "=m" (*(volatile int *)lock), "=&r" (temp), "=&r" (result)
+	: "m" (*(volatile int *)lock)
+	);
+	return (result);
+}
+#endif /* CONFIG_LOCKMETER */
+
 #endif /* _ALPHA_SPINLOCK_H */
--- diff/include/asm-cris/arch-v10/byteorder.h	2003-07-11 09:39:50.000000000 +0100
+++ source/include/asm-cris/arch-v10/byteorder.h	2003-12-29 09:30:41.000000000 +0000
@@ -2,20 +2,21 @@
 #define _CRIS_ARCH_BYTEORDER_H
 
 #include <asm/types.h>
+#include <linux/compiler.h>
 
 /* we just define these two (as we can do the swap in a single
  * asm instruction in CRIS) and the arch-independent files will put
  * them together into ntohl etc.
  */
 
-extern __inline__ __const__ __u32 ___arch__swab32(__u32 x)
+extern __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x)
 {
 	__asm__ ("swapwb %0" : "=r" (x) : "0" (x));
   
 	return(x);
 }
 
-extern __inline__ __const__ __u16 ___arch__swab16(__u16 x)
+extern __inline__ __attribute_const__ __u16 ___arch__swab16(__u16 x)
 {
 	__asm__ ("swapb %0" : "=r" (x) : "0" (x));
 	
--- diff/include/asm-generic/cpumask_arith.h	2003-09-30 15:46:19.000000000 +0100
+++ source/include/asm-generic/cpumask_arith.h	2003-12-29 09:30:41.000000000 +0000
@@ -17,6 +17,7 @@
 #define cpus_complement(map)		do { map = ~(map); } while (0)
 #define cpus_equal(map1, map2)		((map1) == (map2))
 #define cpus_empty(map)			((map) == 0)
+#define cpus_addr(map)			(&(map))
 
 #if BITS_PER_LONG == 32
 #define cpus_weight(map)		hweight32(map)
--- diff/include/asm-generic/cpumask_array.h	2003-09-30 15:46:19.000000000 +0100
+++ source/include/asm-generic/cpumask_array.h	2003-12-29 09:30:41.000000000 +0000
@@ -20,6 +20,7 @@
 #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)
+#define cpus_addr(map)		((map).mask)
 #define cpus_weight(map)		bitmap_weight((map).mask, NR_CPUS)
 #define cpus_shift_right(d, s, n)	bitmap_shift_right((d).mask, (s).mask, n, NR_CPUS)
 #define cpus_shift_left(d, s, n)	bitmap_shift_left((d).mask, (s).mask, n, NR_CPUS)
--- diff/include/asm-generic/cpumask_const_value.h	2003-08-26 10:00:54.000000000 +0100
+++ source/include/asm-generic/cpumask_const_value.h	2003-12-29 09:30:41.000000000 +0000
@@ -3,7 +3,7 @@
 
 typedef const cpumask_t cpumask_const_t;
 
-#define mk_cpumask_const(map)		((cpumask_const_t)(map))
+#define mk_cpumask_const(map)		(map)
 #define cpu_isset_const(cpu, map)	cpu_isset(cpu, map)
 #define cpus_and_const(dst,src1,src2)	cpus_and(dst, src1, src2)
 #define cpus_or_const(dst,src1,src2)	cpus_or(dst, src1, src2)
--- diff/include/asm-generic/cpumask_up.h	2003-09-30 15:46:19.000000000 +0100
+++ source/include/asm-generic/cpumask_up.h	2003-12-29 09:30:42.000000000 +0000
@@ -33,6 +33,7 @@
 
 #define cpus_equal(map1, map2)		(cpus_coerce(map1) == cpus_coerce(map2))
 #define cpus_empty(map)			(cpus_coerce(map) == 0UL)
+#define cpus_addr(map)			(&(map))
 #define cpus_weight(map)		(cpus_coerce(map) ? 1UL : 0UL)
 #define cpus_shift_right(d, s, n)	do { cpus_coerce(d) = 0UL; } while (0)
 #define cpus_shift_left(d, s, n)	do { cpus_coerce(d) = 0UL; } while (0)
--- diff/include/asm-generic/statfs.h	2003-06-30 10:07:34.000000000 +0100
+++ source/include/asm-generic/statfs.h	2003-12-29 09:30:42.000000000 +0000
@@ -34,4 +34,18 @@
 	__u32 f_spare[5];
 };
 
+struct compat_statfs64 {
+	__u32 f_type;
+	__u32 f_bsize;
+	__u64 f_blocks;
+	__u64 f_bfree;
+	__u64 f_bavail;
+	__u64 f_files;
+	__u64 f_ffree;
+	__kernel_fsid_t f_fsid;
+	__u32 f_namelen;
+	__u32 f_frsize;
+	__u32 f_spare[5];
+};
+
 #endif
--- diff/include/asm-h8300/bitops.h	2003-08-26 10:00:54.000000000 +0100
+++ source/include/asm-h8300/bitops.h	2003-12-29 09:30:42.000000000 +0000
@@ -23,25 +23,22 @@
  */
 static __inline__ unsigned long ffz(unsigned long word)
 {
-	register unsigned long result asm("er0");
-	register unsigned long _word asm("er1");
+	unsigned long result;
 
-	_word = word;
-	__asm__("sub.l %0,%0\n\t"
-		"dec.l #1,%0\n"
-		"1:\n\t"
-		"shlr.l %1\n\t"
+	result = -1;
+	__asm__("1:\n\t"
+		"shlr.l %2\n\t"
 		"adds #1,%0\n\t"
 		"bcs 1b"
-		: "=r" (result) : "r" (_word));
+		: "=r" (result)
+		: "0"  (result),"r" (word));
 	return result;
 }
 
 static __inline__ void set_bit(int nr, volatile unsigned long* addr)
 {
 	volatile unsigned char *b_addr;
-	b_addr = &(((volatile unsigned char *) addr)
-	          [((nr >> 3) & ~3) + 3 - ((nr >> 3) & 3)]);
+	b_addr = (volatile unsigned char *)addr + ((nr >> 3) ^ 3);
 	__asm__("mov.l %1,er0\n\t"
 		"bset r0l,%0"
 		:"+m"(*b_addr)
@@ -61,8 +58,7 @@
 static __inline__ void clear_bit(int nr, volatile unsigned long* addr)
 {
 	volatile unsigned char *b_addr;
-	b_addr = &(((volatile unsigned char *) addr)
-	          [((nr >> 3) & ~3) + 3 - ((nr >> 3) & 3)]);
+	b_addr = (volatile unsigned char *)addr + ((nr >> 3) ^ 3);
 	__asm__("mov.l %1,er0\n\t"
 		"bclr r0l,%0"
 		:"+m"(*b_addr)
@@ -75,8 +71,7 @@
 static __inline__ void change_bit(int nr, volatile unsigned long* addr)
 {
 	volatile unsigned char *b_addr;
-	b_addr = &(((volatile unsigned char *) addr)
-	          [((nr >> 3) & ~3) + 3 - ((nr >> 3) & 3)]);
+	b_addr = (volatile unsigned char *)addr + ((nr >> 3) ^ 3);
 	__asm__("mov.l %1,er0\n\t"
 		"bnot r0l,%0"
 		:"+m"(*b_addr)
@@ -88,22 +83,18 @@
 
 static __inline__ int test_bit(int nr, const unsigned long* addr)
 {
-	return ((1UL << (nr & 7)) & 
-               (((const volatile unsigned char *) addr)
-               [((nr >> 3) & ~3) + 3 - ((nr >> 3) & 3)])) != 0;
+	return (*((volatile unsigned char *)addr + ((nr >> 3) ^ 3)) & (1UL << (nr & 7))) != 0;
 }
 
 #define __test_bit(nr, addr) test_bit(nr, addr)
 
 static __inline__ int test_and_set_bit(int nr, volatile unsigned long* addr)
 {
-	register int retval __asm__("er0");
+	int retval = 0;
 	volatile unsigned char *a;
-	a = (volatile unsigned char *)addr;
 
-	a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
-	__asm__("mov.l %2,er3\n\t"
-		"sub.l %0,%0\n\t"
+	a = (volatile unsigned char *)addr += ((nr >> 3) ^ 3);             \
+	__asm__("mov.l %4,er3\n\t"
 		"stc ccr,r3h\n\t"
 		"orc #0x80,ccr\n\t"
 		"btst r3l,%1\n\t"
@@ -112,37 +103,35 @@
 		"inc.l #1,%0\n\t"
 		"1:"
 		"ldc r3h,ccr"
-		: "=r"(retval),"+m"(*a) :"g"(nr & 7):"er3","memory");
+		: "=r"(retval),"+m"(*a)
+		: "0" (retval),"m" (*a),"g"(nr & 7):"er3","memory");
 	return retval;
 }
 
 static __inline__ int __test_and_set_bit(int nr, volatile unsigned long* addr)
 {
-	register int retval __asm__("er0");
+	int retval = 0;
 	volatile unsigned char *a;
-	a = (volatile unsigned char *)addr;
 
-	a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
-	__asm__("mov.l %2,er3\n\t"
-		"sub.l %0,%0\n\t"
+	a = (volatile unsigned char *)addr += ((nr >> 3) ^ 3);             \
+	__asm__("mov.l %4,er3\n\t"
 		"btst r3l,%1\n\t"
 		"bset r3l,%1\n\t"
 		"beq 1f\n\t"
 		"inc.l #1,%0\n\t"
 		"1:"
-		: "=r"(retval),"+m"(*a) :"g"(nr & 7):"er3","memory");
+		: "=r"(retval),"+m"(*a)
+		: "0" (retval),"m" (*a),"g"(nr & 7):"er3","memory");
 	return retval;
 }
 
 static __inline__ int test_and_clear_bit(int nr, volatile unsigned long* addr)
 {
-	register int retval __asm__("er0");
+	int retval = 0;
 	volatile unsigned char *a;
-	a = (volatile unsigned char *)addr;
 
-	a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
-	__asm__("mov.l %2,er3\n\t"
-		"sub.l %0,%0\n\t"
+	a = (volatile unsigned char *)addr += ((nr >> 3) ^ 3);             \
+	__asm__("mov.l %4,er3\n\t"
 		"stc ccr,r3h\n\t"
 		"orc #0x80,ccr\n\t"
 		"btst r3l,%1\n\t"
@@ -151,37 +140,35 @@
 		"inc.l #1,%0\n\t"
 		"1:"
 		"ldc r3h,ccr"
-		: "=r"(retval),"=m"(*a) :"g"(nr & 7):"er3","memory");
+		: "=r"(retval),"+m"(*a)
+		: "0" (retval),"m" (*a),"g"(nr & 7):"er3","memory");
 	return retval;
 }
 
 static __inline__ int __test_and_clear_bit(int nr, volatile unsigned long* addr)
 {
-	register int retval __asm__("er0");
+	int retval = 0;
 	volatile unsigned char *a;
-	a = (volatile unsigned char *)addr;
 
-	a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
-	__asm__("mov.l %2,er3\n\t"
-		"sub.l %0,%0\n\t"
+	a = (volatile unsigned char *)addr += ((nr >> 3) ^ 3);             \
+	__asm__("mov.l %4,er3\n\t"
 		"btst r3l,%1\n\t"
 		"bclr r3l,%1\n\t"
 		"beq 1f\n\t"
 		"inc.l #1,%0\n\t"
 		"1:"
-		: "=r"(retval),"+m"(*a) :"g"(nr & 7):"er3","memory");
+		: "=r"(retval),"+m"(*a)
+		: "0" (retval),"m" (*a),"g"(nr & 7):"er3","memory");
 	return retval;
 }
 
 static __inline__ int test_and_change_bit(int nr, volatile unsigned long* addr)
 {
-	register int retval __asm__("er0");
+	int retval = 0;
 	volatile unsigned char *a;
-	a = (volatile unsigned char *)addr;
 
-	a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
-	__asm__("mov.l %2,er3\n\t"
-		"sub.l %0,%0\n\t"
+	a = (volatile unsigned char *)addr += ((nr >> 3) ^ 3);             \
+	__asm__("mov.l %4,er3\n\t"
 		"stc ccr,r3h\n\t"
 		"orc #0x80,ccr\n\t"
 		"btst r3l,%1\n\t"
@@ -190,25 +177,25 @@
 		"inc.l #1,%0\n\t"
 		"1:"
 		"ldc r3h,ccr"
-		: "=r"(retval),"+m"(*a) :"g"(nr & 7):"er3","memory");
+		: "=r"(retval),"+m"(*a)
+		: "0" (retval),"m" (*a),"g"(nr & 7):"er3","memory");
 	return retval;
 }
 
 static __inline__ int __test_and_change_bit(int nr, volatile unsigned long* addr)
 {
-	register int retval __asm__("er0");
+	int retval = 0;
 	volatile unsigned char *a;
-	a = (volatile unsigned char *)addr;
 
-	a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
-	__asm__("mov.l %2,er3\n\t"
-		"sub.l %0,%0\n\t"
+	a = (volatile unsigned char *)addr += ((nr >> 3) ^ 3);             \
+	__asm__("mov.l %4,er3\n\t"
 		"btst r3l,%1\n\t"
 		"bnot r3l,%1\n\t"
 		"beq 1f\n\t"
 		"inc.l #1,%0\n\t"
 		"1:"
-		: "=r"(retval),"+m"(*a) :"g"(nr & 7):"er3","memory");
+		: "=r"(retval),"+m"(*a)
+		: "0" (retval),"m" (*a),"g"(nr & 7):"er3","memory");
 	return retval;
 }
 
@@ -251,27 +238,21 @@
 	return result + ffz(tmp);
 }
 
-static __inline__ unsigned long ffs(unsigned long word)
+static __inline__ unsigned long __ffs(unsigned long word)
 {
-	register unsigned long result asm("er0");
-	register unsigned long _word asm("er1");
+	unsigned long result;
 
-	_word = word;
-	__asm__("sub.l %0,%0\n\t"
-		"dec.l #1,%0\n"
-		"1:\n\t"
-		"shlr.l %1\n\t"
+	result = -1;
+	__asm__("1:\n\t"
+		"shlr.l %2\n\t"
 		"adds #1,%0\n\t"
 		"bcc 1b"
-		: "=r" (result) : "r"(_word));
+		: "=r" (result)
+		: "0"(result),"r"(word));
 	return result;
 }
 
-#define __ffs(x) ffs(x)
-
-/*
- * fls: find last bit set.
- */
+#define ffs(x) generic_ffs(x)
 #define fls(x) generic_fls(x)
 
 /*
@@ -316,6 +297,7 @@
 	local_irq_restore(flags);
 	return retval;
 }
+#define ext2_set_bit_atomic(lock, nr, addr) ext2_set_bit(nr, addr)
 
 static __inline__ int ext2_clear_bit(int nr, volatile void * addr)
 {
@@ -331,6 +313,7 @@
 	local_irq_restore(flags);
 	return retval;
 }
+#define ext2_clear_bit_atomic(lock, nr, addr) ext2_set_bit(nr, addr)
 
 static __inline__ int ext2_test_bit(int nr, const volatile void * addr)
 {
@@ -402,17 +385,6 @@
 #define minix_test_bit(nr,addr) test_bit(nr,addr)
 #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size)
 
-/**
- * hweightN - returns the hamming weight of a N-bit word
- * @x: the word to weigh
- *
- * The Hamming Weight of a number is the total number of bits set in it.
- */
-
-#define hweight32(x) generic_hweight32(x)
-#define hweight16(x) generic_hweight16(x)
-#define hweight8(x) generic_hweight8(x)
-
 #endif /* __KERNEL__ */
 
 #endif /* _H8300_BITOPS_H */
--- diff/include/asm-i386/acpi.h	2003-09-30 15:45:48.000000000 +0100
+++ source/include/asm-i386/acpi.h	2003-12-29 09:30:42.000000000 +0000
@@ -109,7 +109,7 @@
 #ifdef CONFIG_ACPI_BOOT 
 extern int acpi_lapic;
 extern int acpi_ioapic;
-
+extern int acpi_noirq;
 
 /* Fixmap pages to reserve for ACPI boot-time tables (see fixmap.h) */
 #define FIX_ACPI_PAGES 4
@@ -139,6 +139,14 @@
 
 #endif
 
+#ifdef CONFIG_ACPI_PCI
+static inline void acpi_noirq_set(void) { acpi_noirq = 1; }
+extern int acpi_irq_balance_set(char *str);
+#else
+static inline void acpi_noirq_set(void) { }
+static inline int acpi_irq_balance_set(char *str) { return 0; }
+#endif
+
 #ifdef CONFIG_ACPI_SLEEP
 
 /* routines for saving/restoring kernel state */
--- diff/include/asm-i386/bugs.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/asm-i386/bugs.h	2003-12-29 09:30:42.000000000 +0000
@@ -1,11 +1,11 @@
 /*
  *  include/asm-i386/bugs.h
  *
- *  Copyright (C) 1994  Linus Torvalds
+ *  Copyright (C) 1994	Linus Torvalds
  *
  *  Cyrix stuff, June 1998 by:
  *	- Rafael R. Reilova (moved everything from head.S),
- *        <rreilova@ececs.uc.edu>
+ *	  <rreilova@ececs.uc.edu>
  *	- Channing Corn (tests & fixes),
  *	- Andrew D. Balsa (code cleanup).
  *
@@ -25,7 +25,20 @@
 #include <asm/processor.h>
 #include <asm/i387.h>
 #include <asm/msr.h>
-
+#ifdef CONFIG_KGDB
+/*
+ * Provied the command line "gdb" initial break
+ */
+int __init kgdb_initial_break(char * str)
+{
+	if (*str == '\0'){
+		breakpoint();
+		return 1;
+	}
+	return 0;
+}
+__setup("gdb",kgdb_initial_break);
+#endif
 static int __init no_halt(char *s)
 {
 	boot_cpu_data.hlt_works_ok = 0;
@@ -140,7 +153,7 @@
 	  : "ecx", "edi" );
 	/* If this fails, it means that any user program may lock the CPU hard. Too bad. */
 	if (res != 12345678) printk( "Buggy.\n" );
-		        else printk( "OK.\n" );
+			else printk( "OK.\n" );
 #endif
 }
 
--- diff/include/asm-i386/byteorder.h	2002-10-16 04:28:24.000000000 +0100
+++ source/include/asm-i386/byteorder.h	2003-12-29 09:30:42.000000000 +0000
@@ -2,6 +2,7 @@
 #define _I386_BYTEORDER_H
 
 #include <asm/types.h>
+#include <linux/compiler.h>
 
 #ifdef __GNUC__
 
@@ -10,7 +11,7 @@
 #include <linux/config.h>
 #endif
 
-static __inline__ __const__ __u32 ___arch__swab32(__u32 x)
+static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x)
 {
 #ifdef CONFIG_X86_BSWAP
 	__asm__("bswap %0" : "=r" (x) : "0" (x));
@@ -24,18 +25,7 @@
 	return x;
 }
 
-/* gcc should generate this for open coded C now too. May be worth switching to 
-   it because inline assembly cannot be scheduled. -AK */
-static __inline__ __const__ __u16 ___arch__swab16(__u16 x)
-{
-	__asm__("xchgb %b0,%h0"		/* swap bytes		*/
-		: "=q" (x)
-		:  "0" (x));
-		return x;
-}
-
-
-static inline __u64 ___arch__swab64(__u64 val) 
+static __inline__ __attribute_const__ __u64 ___arch__swab64(__u64 val)
 { 
 	union { 
 		struct { __u32 a,b; } s;
@@ -54,9 +44,11 @@
 	return v.u;	
 } 
 
+/* Do not define swab16.  Gcc is smart enough to recognize "C" version and
+   convert it into rotation or exhange.  */
+
 #define __arch__swab64(x) ___arch__swab64(x)
 #define __arch__swab32(x) ___arch__swab32(x)
-#define __arch__swab16(x) ___arch__swab16(x)
 
 #define __BYTEORDER_HAS_U64__
 
--- diff/include/asm-i386/checksum.h	2003-11-25 15:24:59.000000000 +0000
+++ source/include/asm-i386/checksum.h	2003-12-29 09:30:42.000000000 +0000
@@ -25,7 +25,7 @@
  * better 64-bit) boundary
  */
 
-asmlinkage unsigned int csum_partial_copy_generic( const char *src, char *dst, int len, int sum,
+asmlinkage unsigned int direct_csum_partial_copy_generic( const char *src, char *dst, int len, int sum,
 						   int *src_err_ptr, int *dst_err_ptr);
 
 /*
@@ -39,14 +39,19 @@
 unsigned int csum_partial_copy_nocheck ( const char *src, char *dst,
 					int len, int sum)
 {
-	return csum_partial_copy_generic ( src, dst, len, sum, NULL, NULL);
+	/*
+	 * The direct function is OK for kernel-space => kernel-space copies:
+	 */
+	return direct_csum_partial_copy_generic ( src, dst, len, sum, NULL, NULL);
 }
 
 static __inline__
 unsigned int csum_partial_copy_from_user ( const char *src, char *dst,
 						int len, int sum, int *err_ptr)
 {
-	return csum_partial_copy_generic ( src, dst, len, sum, err_ptr, NULL);
+	if (copy_from_user(dst, src, len))
+		*err_ptr = -EFAULT;
+	return csum_partial(dst, len, sum);
 }
 
 /*
@@ -172,11 +177,26 @@
  *	Copy and checksum to user
  */
 #define HAVE_CSUM_COPY_USER
-static __inline__ unsigned int csum_and_copy_to_user(const char *src, char *dst,
+static __inline__ unsigned int direct_csum_and_copy_to_user(const char *src, char *dst,
 				    int len, int sum, int *err_ptr)
 {
 	if (access_ok(VERIFY_WRITE, dst, len))
-		return csum_partial_copy_generic(src, dst, len, sum, NULL, err_ptr);
+		return direct_csum_partial_copy_generic(src, dst, len, sum, NULL, err_ptr);
+
+	if (len)
+		*err_ptr = -EFAULT;
+
+	return -1; /* invalid checksum */
+}
+
+static __inline__ unsigned int csum_and_copy_to_user(const char *src, char *dst,
+				    int len, int sum, int *err_ptr)
+{
+	if (access_ok(VERIFY_WRITE, dst, len)) {
+		if (copy_to_user(dst, src, len))
+			*err_ptr = -EFAULT;
+		return csum_partial(src, len, sum);
+	}
 
 	if (len)
 		*err_ptr = -EFAULT;
--- diff/include/asm-i386/desc.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/asm-i386/desc.h	2003-12-29 09:30:42.000000000 +0000
@@ -21,6 +21,13 @@
 
 extern struct Xgt_desc_struct idt_descr, cpu_gdt_descr[NR_CPUS];
 
+extern void trap_init_virtual_IDT(void);
+extern void trap_init_virtual_GDT(void);
+
+asmlinkage int system_call(void);
+asmlinkage void lcall7(void);
+asmlinkage void lcall27(void);
+
 #define load_TR_desc() __asm__ __volatile__("ltr %%ax"::"a" (GDT_ENTRY_TSS*8))
 #define load_LDT_desc() __asm__ __volatile__("lldt %%ax"::"a" (GDT_ENTRY_LDT*8))
 
@@ -30,6 +37,7 @@
  */
 extern struct desc_struct default_ldt[];
 extern void set_intr_gate(unsigned int irq, void * addr);
+extern void set_trap_gate(unsigned int n, void *addr);
 
 #define _set_tssldt_desc(n,addr,limit,type) \
 __asm__ __volatile__ ("movw %w3,0(%2)\n\t" \
@@ -90,31 +98,8 @@
 #undef C
 }
 
-static inline void clear_LDT(void)
-{
-	int cpu = get_cpu();
-
-	set_ldt_desc(cpu, &default_ldt[0], 5);
-	load_LDT_desc();
-	put_cpu();
-}
-
-/*
- * load one particular LDT into the current CPU
- */
-static inline void load_LDT_nolock(mm_context_t *pc, int cpu)
-{
-	void *segments = pc->ldt;
-	int count = pc->size;
-
-	if (likely(!count)) {
-		segments = &default_ldt[0];
-		count = 5;
-	}
-		
-	set_ldt_desc(cpu, segments, count);
-	load_LDT_desc();
-}
+extern struct page *default_ldt_page;
+extern void load_LDT_nolock(mm_context_t *pc, int cpu);
 
 static inline void load_LDT(mm_context_t *pc)
 {
@@ -123,6 +108,6 @@
 	put_cpu();
 }
 
-#endif /* !__ASSEMBLY__ */
 
+#endif /* !__ASSEMBLY__ */
 #endif
--- diff/include/asm-i386/fixmap.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/asm-i386/fixmap.h	2003-12-29 09:30:42.000000000 +0000
@@ -18,17 +18,15 @@
 #include <asm/acpi.h>
 #include <asm/apicdef.h>
 #include <asm/page.h>
-#ifdef CONFIG_HIGHMEM
 #include <linux/threads.h>
 #include <asm/kmap_types.h>
-#endif
 
 /*
  * Here we define all the compile-time 'special' virtual
  * addresses. The point is to have a constant address at
  * compile time, but to set the physical address only
- * in the boot process. We allocate these special addresses
- * from the end of virtual memory (0xfffff000) backwards.
+ * in the boot process. We allocate these special  addresses
+ * from the end of virtual memory (0xffffe000) backwards.
  * Also this lets us do fail-safe vmalloc(), we
  * can guarantee that these special addresses and
  * vmalloc()-ed addresses never overlap.
@@ -41,11 +39,20 @@
  * TLB entries of such buffers will not be flushed across
  * task switches.
  */
+
+/*
+ * on UP currently we will have no trace of the fixmap mechanizm,
+ * no page table allocations, etc. This might change in the
+ * future, say framebuffers for the console driver(s) could be
+ * fix-mapped?
+ */
 enum fixed_addresses {
 	FIX_HOLE,
 	FIX_VSYSCALL,
 #ifdef CONFIG_X86_LOCAL_APIC
 	FIX_APIC_BASE,	/* local (CPU) APIC) -- required for SMP or not */
+#else
+	FIX_VSTACK_HOLE_1,
 #endif
 #ifdef CONFIG_X86_IO_APIC
 	FIX_IO_APIC_BASE_0,
@@ -57,16 +64,21 @@
 	FIX_LI_PCIA,	/* Lithium PCI Bridge A */
 	FIX_LI_PCIB,	/* Lithium PCI Bridge B */
 #endif
-#ifdef CONFIG_X86_F00F_BUG
-	FIX_F00F_IDT,	/* Virtual mapping for IDT */
-#endif
+	FIX_IDT,
+	FIX_GDT_1,
+	FIX_GDT_0,
+	FIX_TSS_3,
+	FIX_TSS_2,
+	FIX_TSS_1,
+	FIX_TSS_0,
+	FIX_ENTRY_TRAMPOLINE_1,
+	FIX_ENTRY_TRAMPOLINE_0,
 #ifdef CONFIG_X86_CYCLONE_TIMER
 	FIX_CYCLONE_TIMER, /*cyclone timer register*/
+	FIX_VSTACK_HOLE_2,
 #endif 
-#ifdef CONFIG_HIGHMEM
 	FIX_KMAP_BEGIN,	/* reserved pte's for temporary kernel mappings */
 	FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,
-#endif
 #ifdef CONFIG_ACPI_BOOT
 	FIX_ACPI_BEGIN,
 	FIX_ACPI_END = FIX_ACPI_BEGIN + FIX_ACPI_PAGES - 1,
@@ -95,12 +107,15 @@
 		__set_fixmap(idx, 0, __pgprot(0))
 
 /*
- * used by vmalloc.c.
+ * used by vmalloc.c and various other places.
  *
  * Leave one empty page between vmalloc'ed areas and
  * the start of the fixmap.
+ *
+ * IMPORTANT: dont change FIXADDR_TOP without adjusting KM_VSTACK0
+ * and KM_VSTACK1 so that the virtual stack is 8K aligned.
  */
-#define FIXADDR_TOP	(0xfffff000UL)
+#define FIXADDR_TOP	(0xffffe000UL)
 #define __FIXADDR_SIZE	(__end_of_permanent_fixed_addresses << PAGE_SHIFT)
 #define FIXADDR_START	(FIXADDR_TOP - __FIXADDR_SIZE)
 
--- diff/include/asm-i386/highmem.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/asm-i386/highmem.h	2003-12-29 09:30:42.000000000 +0000
@@ -25,26 +25,19 @@
 #include <linux/threads.h>
 #include <asm/kmap_types.h>
 #include <asm/tlbflush.h>
+#include <asm/atomic_kmap.h>
 
 /* declarations for highmem.c */
 extern unsigned long highstart_pfn, highend_pfn;
 
-extern pte_t *kmap_pte;
-extern pgprot_t kmap_prot;
 extern pte_t *pkmap_page_table;
-
-extern void kmap_init(void);
+extern void kmap_init(void) __init;
 
 /*
  * Right now we initialize only a single pte table. It can be extended
  * easily, subsequent pte tables have to be allocated in one physical
  * chunk of RAM.
  */
-#if NR_CPUS <= 32
-#define PKMAP_BASE (0xff800000UL)
-#else
-#define PKMAP_BASE (0xff600000UL)
-#endif
 #ifdef CONFIG_X86_PAE
 #define LAST_PKMAP 512
 #else
--- diff/include/asm-i386/hw_irq.h	2003-10-27 09:20:44.000000000 +0000
+++ source/include/asm-i386/hw_irq.h	2003-12-29 09:30:42.000000000 +0000
@@ -41,6 +41,7 @@
 asmlinkage void error_interrupt(void);
 asmlinkage void spurious_interrupt(void);
 asmlinkage void thermal_interrupt(struct pt_regs);
+#define platform_legacy_irq(irq)	((irq) < 16)
 #endif
 
 void mask_irq(unsigned int irq);
--- diff/include/asm-i386/io_apic.h	2003-08-26 10:00:54.000000000 +0100
+++ source/include/asm-i386/io_apic.h	2003-12-29 09:30:42.000000000 +0000
@@ -13,6 +13,46 @@
 
 #ifdef CONFIG_X86_IO_APIC
 
+#ifdef CONFIG_PCI_USE_VECTOR
+static inline int use_pci_vector(void)	{return 1;}
+static inline void disable_edge_ioapic_vector(unsigned int vector) { }
+static inline void mask_and_ack_level_ioapic_vector(unsigned int vector) { }
+static inline void end_edge_ioapic_vector (unsigned int vector) { }
+#define startup_level_ioapic	startup_level_ioapic_vector
+#define shutdown_level_ioapic	mask_IO_APIC_vector
+#define enable_level_ioapic	unmask_IO_APIC_vector
+#define disable_level_ioapic	mask_IO_APIC_vector
+#define mask_and_ack_level_ioapic mask_and_ack_level_ioapic_vector
+#define end_level_ioapic	end_level_ioapic_vector
+#define set_ioapic_affinity	set_ioapic_affinity_vector
+
+#define startup_edge_ioapic 	startup_edge_ioapic_vector
+#define shutdown_edge_ioapic 	disable_edge_ioapic_vector
+#define enable_edge_ioapic 	unmask_IO_APIC_vector
+#define disable_edge_ioapic 	disable_edge_ioapic_vector
+#define ack_edge_ioapic 	ack_edge_ioapic_vector
+#define end_edge_ioapic 	end_edge_ioapic_vector
+#else
+static inline int use_pci_vector(void)	{return 0;}
+static inline void disable_edge_ioapic_irq(unsigned int irq) { }
+static inline void mask_and_ack_level_ioapic_irq(unsigned int irq) { }
+static inline void end_edge_ioapic_irq (unsigned int irq) { }
+#define startup_level_ioapic	startup_level_ioapic_irq
+#define shutdown_level_ioapic	mask_IO_APIC_irq
+#define enable_level_ioapic	unmask_IO_APIC_irq
+#define disable_level_ioapic	mask_IO_APIC_irq
+#define mask_and_ack_level_ioapic mask_and_ack_level_ioapic_irq
+#define end_level_ioapic	end_level_ioapic_irq
+#define set_ioapic_affinity	set_ioapic_affinity_irq
+
+#define startup_edge_ioapic 	startup_edge_ioapic_irq
+#define shutdown_edge_ioapic 	disable_edge_ioapic_irq
+#define enable_edge_ioapic 	unmask_IO_APIC_irq
+#define disable_edge_ioapic 	disable_edge_ioapic_irq
+#define ack_edge_ioapic 	ack_edge_ioapic_irq
+#define end_edge_ioapic 	end_edge_ioapic_irq
+#endif
+
 #define APIC_MISMATCH_DEBUG
 
 #define IO_APIC_BASE(idx) \
@@ -177,4 +217,6 @@
 #define io_apic_assign_pci_irqs 0
 #endif
 
+extern int assign_irq_vector(int irq);
+
 #endif
--- diff/include/asm-i386/ioctl.h	2003-09-17 12:28:12.000000000 +0100
+++ source/include/asm-i386/ioctl.h	2003-12-29 09:30:42.000000000 +0000
@@ -53,7 +53,7 @@
 	 ((size) << _IOC_SIZESHIFT))
 
 /* provoke compile error for invalid uses of size argument */
-extern int __invalid_size_argument_for_IOC;
+extern unsigned int __invalid_size_argument_for_IOC;
 #define _IOC_TYPECHECK(t) \
 	((sizeof(t) == sizeof(t[1]) && \
 	  sizeof(t) < (1 << _IOC_SIZEBITS)) ? \
--- diff/include/asm-i386/kmap_types.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/asm-i386/kmap_types.h	2003-12-29 09:30:42.000000000 +0000
@@ -3,30 +3,36 @@
 
 #include <linux/config.h>
 
-#ifdef CONFIG_DEBUG_HIGHMEM
-# define D(n) __KM_FENCE_##n ,
-#else
-# define D(n)
-#endif
-
 enum km_type {
-D(0)	KM_BOUNCE_READ,
-D(1)	KM_SKB_SUNRPC_DATA,
-D(2)	KM_SKB_DATA_SOFTIRQ,
-D(3)	KM_USER0,
-D(4)	KM_USER1,
-D(5)	KM_BIO_SRC_IRQ,
-D(6)	KM_BIO_DST_IRQ,
-D(7)	KM_PTE0,
-D(8)	KM_PTE1,
-D(9)	KM_PTE2,
-D(10)	KM_IRQ0,
-D(11)	KM_IRQ1,
-D(12)	KM_SOFTIRQ0,
-D(13)	KM_SOFTIRQ1,
-D(14)	KM_TYPE_NR
-};
-
-#undef D
+	/*
+	 * IMPORTANT: don't move these 3 entries, and only add entries in
+	 * pairs: the 4G/4G virtual stack must be 8K aligned on each cpu.
+	 */
+	KM_BOUNCE_READ,
+	KM_VSTACK1,
+	KM_VSTACK0,
 
+	KM_LDT_PAGE15,
+	KM_LDT_PAGE0 = KM_LDT_PAGE15 + 16-1,
+	KM_USER_COPY,
+	KM_VSTACK_HOLE,
+	KM_SKB_SUNRPC_DATA,
+	KM_SKB_DATA_SOFTIRQ,
+	KM_USER0,
+	KM_USER1,
+	KM_BIO_SRC_IRQ,
+	KM_BIO_DST_IRQ,
+	KM_PTE0,
+	KM_PTE1,
+	KM_PTE2,
+	KM_IRQ0,
+	KM_IRQ1,
+	KM_SOFTIRQ0,
+	KM_SOFTIRQ1,
+	/*
+	 * Add new entries in pairs:
+	 * the 4G/4G virtual stack must be 8K aligned on each cpu.
+	 */
+	KM_TYPE_NR
+};
 #endif
--- diff/include/asm-i386/mach-default/irq_vectors.h	2003-10-27 09:20:44.000000000 +0000
+++ source/include/asm-i386/mach-default/irq_vectors.h	2003-12-29 09:30:42.000000000 +0000
@@ -76,6 +76,18 @@
  * Since vectors 0x00-0x1f are used/reserved for the CPU,
  * the usable vector space is 0x20-0xff (224 vectors)
  */
+
+/*
+ * The maximum number of vectors supported by i386 processors
+ * is limited to 256. For processors other than i386, NR_VECTORS
+ * should be changed accordingly.
+ */
+#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)
@@ -87,6 +99,7 @@
 #define NR_IRQS 16
 #define NR_IRQ_VECTORS NR_IRQS
 #endif
+#endif
 
 #define FPU_IRQ			13
 
--- diff/include/asm-i386/mach-default/mach_apic.h	2003-09-30 15:46:19.000000000 +0100
+++ source/include/asm-i386/mach-default/mach_apic.h	2003-12-29 09:30:42.000000000 +0000
@@ -5,12 +5,12 @@
 
 #define APIC_DFR_VALUE	(APIC_DFR_FLAT)
 
-static inline cpumask_t target_cpus(void)
+static inline cpumask_const_t target_cpus(void)
 { 
 #ifdef CONFIG_SMP
-	return cpu_online_map;
+	return mk_cpumask_const(cpu_online_map);
 #else
-	return cpumask_of_cpu(0);
+	return mk_cpumask_const(cpumask_of_cpu(0));
 #endif
 } 
 #define TARGET_CPUS (target_cpus())
--- diff/include/asm-i386/mach-es7000/mach_apic.h	2003-08-26 10:00:54.000000000 +0100
+++ source/include/asm-i386/mach-es7000/mach_apic.h	2003-12-29 09:30:42.000000000 +0000
@@ -39,6 +39,7 @@
 #endif
 
 #define APIC_BROADCAST_ID	(0xff)
+#define NO_IOAPIC_CHECK (0)
 
 static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid)
 { 
--- diff/include/asm-i386/mach-summit/mach_mpparse.h	2003-08-26 10:00:54.000000000 +0100
+++ source/include/asm-i386/mach-summit/mach_mpparse.h	2003-12-29 09:30:42.000000000 +0000
@@ -5,11 +5,11 @@
 
 extern int use_cyclone;
 
-#ifdef CONFIG_NUMA
+#ifdef CONFIG_X86_SUMMIT_NUMA
 extern void setup_summit(void);
-#else /* !CONFIG_NUMA */
+#else
 #define setup_summit()	{}
-#endif /* CONFIG_NUMA */
+#endif
 
 static inline void mpc_oem_bus_info(struct mpc_config_bus *m, char *name, 
 				struct mpc_config_translation *translation)
@@ -110,9 +110,9 @@
 	LookOutBWPEG  = 7,  /* LookOut WPEG                        */
 } node_type;
 
-static inline int is_WPEG(node_type type){
-	return (type == CompatWPEG || type == AltWPEG ||
-		type == LookOutAWPEG || type == LookOutBWPEG);
+static inline int is_WPEG(struct rio_detail *rio){
+	return (rio->type == CompatWPEG || rio->type == AltWPEG ||
+		rio->type == LookOutAWPEG || rio->type == LookOutBWPEG);
 }
 
 #endif /* __ASM_MACH_MPPARSE_H */
--- diff/include/asm-i386/mmu.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/asm-i386/mmu.h	2003-12-29 09:30:42.000000000 +0000
@@ -8,10 +8,13 @@
  *
  * cpu_vm_mask is used to optimize ldt flushing.
  */
+
+#define MAX_LDT_PAGES 16
+
 typedef struct { 
 	int size;
 	struct semaphore sem;
-	void *ldt;
+	struct page *ldt_pages[MAX_LDT_PAGES];
 } mm_context_t;
 
 #endif
--- diff/include/asm-i386/mmu_context.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/asm-i386/mmu_context.h	2003-12-29 09:30:42.000000000 +0000
@@ -29,6 +29,10 @@
 {
 	int cpu = smp_processor_id();
 
+#ifdef CONFIG_X86_SWITCH_PAGETABLES
+	if (tsk->mm)
+		tsk->thread_info->user_pgd = (void *)__pa(tsk->mm->pgd);
+#endif
 	if (likely(prev != next)) {
 		/* stop flush ipis for the previous mm */
 		cpu_clear(cpu, prev->cpu_vm_mask);
@@ -39,12 +43,14 @@
 		cpu_set(cpu, next->cpu_vm_mask);
 
 		/* Re-load page tables */
+#if !defined(CONFIG_X86_SWITCH_PAGETABLES)
 		load_cr3(next->pgd);
+#endif
 
 		/*
 		 * load the LDT, if the LDT is different:
 		 */
-		if (unlikely(prev->context.ldt != next->context.ldt))
+		if (unlikely(prev->context.size + next->context.size))
 			load_LDT_nolock(&next->context, cpu);
 	}
 #ifdef CONFIG_SMP
@@ -56,7 +62,9 @@
 			/* We were in lazy tlb mode and leave_mm disabled 
 			 * tlb flush IPI delivery. We must reload %cr3.
 			 */
+#if !defined(CONFIG_X86_SWITCH_PAGETABLES)
 			load_cr3(next->pgd);
+#endif
 			load_LDT_nolock(&next->context, cpu);
 		}
 	}
@@ -67,6 +75,6 @@
 	asm("movl %0,%%fs ; movl %0,%%gs": :"r" (0))
 
 #define activate_mm(prev, next) \
-	switch_mm((prev),(next),NULL)
+	switch_mm((prev),(next),current)
 
 #endif
--- diff/include/asm-i386/mpspec.h	2003-09-30 15:45:48.000000000 +0100
+++ source/include/asm-i386/mpspec.h	2003-12-29 09:30:42.000000000 +0000
@@ -27,10 +27,6 @@
 extern int pic_mode;
 extern int using_apic_timer;
 
-#ifdef CONFIG_X86_SUMMIT
-extern void setup_summit (void);
-#endif
-
 #ifdef CONFIG_ACPI_BOOT
 extern void mp_register_lapic (u8 id, u8 enabled);
 extern void mp_register_lapic_address (u64 address);
--- diff/include/asm-i386/page.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/asm-i386/page.h	2003-12-29 09:30:42.000000000 +0000
@@ -1,6 +1,8 @@
 #ifndef _I386_PAGE_H
 #define _I386_PAGE_H
 
+#include <linux/config.h>
+
 /* PAGE_SHIFT determines the page size */
 #define PAGE_SHIFT	12
 #define PAGE_SIZE	(1UL << PAGE_SHIFT)
@@ -9,11 +11,10 @@
 #define LARGE_PAGE_MASK (~(LARGE_PAGE_SIZE-1))
 #define LARGE_PAGE_SIZE (1UL << PMD_SHIFT)
 
-#ifdef __KERNEL__
-#ifndef __ASSEMBLY__
-
 #include <linux/config.h>
 
+#ifdef __KERNEL__
+#ifndef __ASSEMBLY__
 #ifdef CONFIG_X86_USE_3DNOW
 
 #include <asm/mmx.h>
@@ -88,8 +89,19 @@
  *
  * If you want more physical memory than this then see the CONFIG_HIGHMEM4G
  * and CONFIG_HIGHMEM64G options in the kernel configuration.
+ *
+ * Note: on PAE the kernel must never go below 32 MB, we use the
+ * first 8 entries of the 2-level boot pgd for PAE magic.
  */
 
+#ifdef CONFIG_X86_4G_VM_LAYOUT
+#define __PAGE_OFFSET		(0x02000000)
+#define TASK_SIZE		(0xff000000)
+#else
+#define __PAGE_OFFSET		(0xc0000000)
+#define TASK_SIZE		(0xc0000000)
+#endif
+
 /*
  * This much address space is reserved for vmalloc() and iomap()
  * as well as fixmap mappings.
@@ -114,16 +126,10 @@
 
 #endif /* __ASSEMBLY__ */
 
-#ifdef __ASSEMBLY__
-#define __PAGE_OFFSET		(0xC0000000)
-#else
-#define __PAGE_OFFSET		(0xC0000000UL)
-#endif
-
-
 #define PAGE_OFFSET		((unsigned long)__PAGE_OFFSET)
 #define VMALLOC_RESERVE		((unsigned long)__VMALLOC_RESERVE)
-#define MAXMEM			(-__PAGE_OFFSET-__VMALLOC_RESERVE)
+#define __MAXMEM		(-__PAGE_OFFSET-__VMALLOC_RESERVE)
+#define MAXMEM			((unsigned long)(-PAGE_OFFSET-VMALLOC_RESERVE))
 #define __pa(x)			((unsigned long)(x)-PAGE_OFFSET)
 #define __va(x)			((void *)((unsigned long)(x)+PAGE_OFFSET))
 #define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
--- diff/include/asm-i386/pgtable.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/asm-i386/pgtable.h	2003-12-29 09:30:42.000000000 +0000
@@ -32,16 +32,17 @@
 #define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
 extern unsigned long empty_zero_page[1024];
 extern pgd_t swapper_pg_dir[1024];
-extern kmem_cache_t *pgd_cache;
-extern kmem_cache_t *pmd_cache;
+extern kmem_cache_t *pgd_cache, *pmd_cache, *kpmd_cache;
 extern spinlock_t pgd_lock;
 extern struct list_head pgd_list;
 
 void pmd_ctor(void *, kmem_cache_t *, unsigned long);
+void kpmd_ctor(void *, kmem_cache_t *, unsigned long);
 void pgd_ctor(void *, kmem_cache_t *, unsigned long);
 void pgd_dtor(void *, kmem_cache_t *, unsigned long);
 void pgtable_cache_init(void);
 void paging_init(void);
+void setup_identity_mappings(pgd_t *pgd_base, unsigned long start, unsigned long end);
 
 #endif /* !__ASSEMBLY__ */
 
@@ -51,6 +52,11 @@
  * newer 3-level PAE-mode page tables.
  */
 #ifndef __ASSEMBLY__
+
+extern void set_system_gate(unsigned int n, void *addr);
+extern void init_entry_mappings(void);
+extern void entry_trampoline_setup(void);
+
 #ifdef CONFIG_X86_PAE
 # include <asm/pgtable-3level.h>
 #else
@@ -63,7 +69,12 @@
 #define PGDIR_SIZE	(1UL << PGDIR_SHIFT)
 #define PGDIR_MASK	(~(PGDIR_SIZE-1))
 
-#define USER_PTRS_PER_PGD	(TASK_SIZE/PGDIR_SIZE)
+#if defined(CONFIG_X86_PAE) && defined(CONFIG_X86_4G_VM_LAYOUT)
+# define USER_PTRS_PER_PGD	4
+#else
+# define USER_PTRS_PER_PGD	((TASK_SIZE/PGDIR_SIZE) + ((TASK_SIZE % PGDIR_SIZE) + PGDIR_SIZE-1)/PGDIR_SIZE)
+#endif
+
 #define FIRST_USER_PGD_NR	0
 
 #define USER_PGD_PTRS (PAGE_OFFSET >> PGDIR_SHIFT)
@@ -233,6 +244,7 @@
 
 #define mk_pte(page, pgprot)	pfn_pte(page_to_pfn(page), (pgprot))
 #define mk_pte_huge(entry) ((entry).pte_low |= _PAGE_PRESENT | _PAGE_PSE)
+#define mk_pte_phys(physpage, pgprot) pfn_pte((physpage) >> PAGE_SHIFT, pgprot)
 
 static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
 {
--- diff/include/asm-i386/processor.h	2003-10-27 09:20:39.000000000 +0000
+++ source/include/asm-i386/processor.h	2003-12-29 09:30:42.000000000 +0000
@@ -291,11 +291,6 @@
 extern unsigned int BIOS_revision;
 extern unsigned int mca_pentium_flag;
 
-/*
- * User space process size: 3GB (default).
- */
-#define TASK_SIZE	(PAGE_OFFSET)
-
 /* This decides where the kernel will search for a free chunk of vm
  * space during mmap's.
  */
@@ -406,7 +401,9 @@
 struct thread_struct {
 /* cached TLS descriptors. */
 	struct desc_struct tls_array[GDT_ENTRY_TLS_ENTRIES];
+	void *stack_page0, *stack_page1;
 	unsigned long	esp0;
+	unsigned long	sysenter_cs;
 	unsigned long	eip;
 	unsigned long	esp;
 	unsigned long	fs;
@@ -428,6 +425,7 @@
 
 #define INIT_THREAD  {							\
 	.vm86_info = NULL,						\
+	.sysenter_cs = __KERNEL_CS,					\
 	.io_bitmap_ptr = NULL,						\
 }
 
@@ -447,21 +445,14 @@
 	.io_bitmap	= { [ 0 ... IO_BITMAP_LONGS] = ~0 },		\
 }
 
-static inline void load_esp0(struct tss_struct *tss, unsigned long esp0)
+static inline void
+load_esp0(struct tss_struct *tss, struct thread_struct *thread)
 {
-	tss->esp0 = esp0;
+	tss->esp0 = thread->esp0;
 	/* This can only happen when SEP is enabled, no need to test "SEP"arately */
-	if ((unlikely(tss->ss1 != __KERNEL_CS))) {
-		tss->ss1 = __KERNEL_CS;
-		wrmsr(MSR_IA32_SYSENTER_CS, __KERNEL_CS, 0);
-	}
-}
-
-static inline void disable_sysenter(struct tss_struct *tss)
-{
-	if (cpu_has_sep)  {
-		tss->ss1 = 0;
-		wrmsr(MSR_IA32_SYSENTER_CS, 0, 0);
+	if (unlikely(tss->ss1 != thread->sysenter_cs)) {
+		tss->ss1 = thread->sysenter_cs;
+		wrmsr(MSR_IA32_SYSENTER_CS, thread->sysenter_cs, 0);
 	}
 }
 
@@ -491,6 +482,23 @@
  */
 extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
 
+#ifdef CONFIG_X86_HIGH_ENTRY
+#define virtual_esp0(tsk) \
+	((unsigned long)(tsk)->thread_info->virtual_stack + ((tsk)->thread.esp0 - (unsigned long)(tsk)->thread_info->real_stack))
+#else
+# define virtual_esp0(tsk) ((tsk)->thread.esp0)
+#endif
+
+#define load_virtual_esp0(tss, task)					\
+	do {								\
+		tss->esp0 = virtual_esp0(task);				\
+		if (likely(cpu_has_sep) && unlikely(tss->ss1 != task->thread.sysenter_cs)) {	\
+			tss->ss1 = task->thread.sysenter_cs;		\
+			wrmsr(MSR_IA32_SYSENTER_CS,			\
+				task->thread.sysenter_cs, 0);		\
+		}							\
+	} while (0)
+
 extern unsigned long thread_saved_pc(struct task_struct *tsk);
 void show_trace(struct task_struct *task, unsigned long *stack);
 
--- diff/include/asm-i386/rwlock.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/asm-i386/rwlock.h	2003-12-29 09:30:42.000000000 +0000
@@ -20,28 +20,52 @@
 #define RW_LOCK_BIAS		 0x01000000
 #define RW_LOCK_BIAS_STR	"0x01000000"
 
-#define __build_read_lock_ptr(rw, helper)   \
-	asm volatile(LOCK "subl $1,(%0)\n\t" \
-		     "js 2f\n" \
-		     "1:\n" \
-		     LOCK_SECTION_START("") \
-		     "2:\tcall " helper "\n\t" \
-		     "jmp 1b\n" \
-		     LOCK_SECTION_END \
-		     ::"a" (rw) : "memory")
-
-#define __build_read_lock_const(rw, helper)   \
-	asm volatile(LOCK "subl $1,%0\n\t" \
-		     "js 2f\n" \
-		     "1:\n" \
-		     LOCK_SECTION_START("") \
-		     "2:\tpushl %%eax\n\t" \
-		     "leal %0,%%eax\n\t" \
-		     "call " helper "\n\t" \
-		     "popl %%eax\n\t" \
-		     "jmp 1b\n" \
-		     LOCK_SECTION_END \
-		     :"=m" (*(volatile int *)rw) : : "memory")
+#ifdef CONFIG_SPINLINE
+
+	#define __build_read_lock_ptr(rw, helper)   \
+		asm volatile(LOCK "subl $1,(%0)\n\t" \
+			     "jns 1f\n\t" \
+			     "call " helper "\n\t" \
+			     "1:\t" \
+			     ::"a" (rw) : "memory")
+
+	#define __build_read_lock_const(rw, helper)   \
+		asm volatile(LOCK "subl $1,%0\n\t" \
+			     "jns 1f\n\t" \
+			     "pushl %%eax\n\t" \
+			     "leal %0,%%eax\n\t" \
+			     "call " helper "\n\t" \
+			     "popl %%eax\n\t" \
+			     "1:\t" \
+			     :"=m" (*(volatile int *)rw) : : "memory")
+
+#else /* !CONFIG_SPINLINE */
+
+	#define __build_read_lock_ptr(rw, helper)   \
+		asm volatile(LOCK "subl $1,(%0)\n\t" \
+			     "js 2f\n" \
+			     "1:\n" \
+			     LOCK_SECTION_START("") \
+			     "2:\tcall " helper "\n\t" \
+			     "jmp 1b\n" \
+			     LOCK_SECTION_END \
+			     ::"a" (rw) : "memory")
+
+	#define __build_read_lock_const(rw, helper)   \
+		asm volatile(LOCK "subl $1,%0\n\t" \
+			     "js 2f\n" \
+			     "1:\n" \
+			     LOCK_SECTION_START("") \
+			     "2:\tpushl %%eax\n\t" \
+			     "leal %0,%%eax\n\t" \
+			     "call " helper "\n\t" \
+			     "popl %%eax\n\t" \
+			     "jmp 1b\n" \
+			     LOCK_SECTION_END \
+			     :"=m" (*(volatile int *)rw) : : "memory")
+
+#endif /* CONFIG_SPINLINE */
+
 
 #define __build_read_lock(rw, helper)	do { \
 						if (__builtin_constant_p(rw)) \
@@ -50,28 +74,51 @@
 							__build_read_lock_ptr(rw, helper); \
 					} while (0)
 
-#define __build_write_lock_ptr(rw, helper) \
-	asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",(%0)\n\t" \
-		     "jnz 2f\n" \
-		     "1:\n" \
-		     LOCK_SECTION_START("") \
-		     "2:\tcall " helper "\n\t" \
-		     "jmp 1b\n" \
-		     LOCK_SECTION_END \
-		     ::"a" (rw) : "memory")
-
-#define __build_write_lock_const(rw, helper) \
-	asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",%0\n\t" \
-		     "jnz 2f\n" \
-		     "1:\n" \
-		     LOCK_SECTION_START("") \
-		     "2:\tpushl %%eax\n\t" \
-		     "leal %0,%%eax\n\t" \
-		     "call " helper "\n\t" \
-		     "popl %%eax\n\t" \
-		     "jmp 1b\n" \
-		     LOCK_SECTION_END \
-		     :"=m" (*(volatile int *)rw) : : "memory")
+#ifdef CONFIG_SPINLINE
+
+	#define __build_write_lock_ptr(rw, helper) \
+		asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",(%0)\n\t" \
+			     "jz 1f\n\t" \
+			     "call " helper "\n\t" \
+			     "1:\n" \
+			     ::"a" (rw) : "memory")
+
+	#define __build_write_lock_const(rw, helper) \
+		asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",%0\n\t" \
+			     "jz 1f\n\t" \
+			     "pushl %%eax\n\t" \
+			     "leal %0,%%eax\n\t" \
+			     "call " helper "\n\t" \
+			     "popl %%eax\n\t" \
+			     "1:\n" \
+			     :"=m" (*(volatile int *)rw) : : "memory")
+
+#else /* !CONFIG_SPINLINE */
+
+	#define __build_write_lock_ptr(rw, helper) \
+		asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",(%0)\n\t" \
+			     "jnz 2f\n" \
+			     "1:\n" \
+			     LOCK_SECTION_START("") \
+			     "2:\tcall " helper "\n\t" \
+			     "jmp 1b\n" \
+			     LOCK_SECTION_END \
+			     ::"a" (rw) : "memory")
+
+	#define __build_write_lock_const(rw, helper) \
+		asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",%0\n\t" \
+			     "jnz 2f\n" \
+			     "1:\n" \
+			     LOCK_SECTION_START("") \
+			     "2:\tpushl %%eax\n\t" \
+			     "leal %0,%%eax\n\t" \
+			     "call " helper "\n\t" \
+			     "popl %%eax\n\t" \
+			     "jmp 1b\n" \
+			     LOCK_SECTION_END \
+			     :"=m" (*(volatile int *)rw) : : "memory")
+
+#endif /* CONFIG_SPINLINE */
 
 #define __build_write_lock(rw, helper)	do { \
 						if (__builtin_constant_p(rw)) \
--- diff/include/asm-i386/setup.h	2003-09-30 15:46:19.000000000 +0100
+++ source/include/asm-i386/setup.h	2003-12-29 09:30:42.000000000 +0000
@@ -29,6 +29,11 @@
 #define IST_INFO   (*(struct ist_info *) (PARAM+0x60))
 #define DRIVE_INFO (*(struct drive_info_struct *) (PARAM+0x80))
 #define SYS_DESC_TABLE (*(struct sys_desc_table_struct*)(PARAM+0xa0))
+#define EFI_SYSTAB ((efi_system_table_t *) *((unsigned long *)(PARAM+0x1c4)))
+#define EFI_MEMDESC_SIZE (*((unsigned long *) (PARAM+0x1c8)))
+#define EFI_MEMDESC_VERSION (*((unsigned long *) (PARAM+0x1cc)))
+#define EFI_MEMMAP ((efi_memory_desc_t *) *((unsigned long *)(PARAM+0x1d0)))
+#define EFI_MEMMAP_SIZE (*((unsigned long *) (PARAM+0x1d4)))
 #define MOUNT_ROOT_RDONLY (*(unsigned short *) (PARAM+0x1F2))
 #define RAMDISK_FLAGS (*(unsigned short *) (PARAM+0x1F8))
 #define VIDEO_MODE (*(unsigned short *) (PARAM+0x1FA))
--- diff/include/asm-i386/spinlock.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/asm-i386/spinlock.h	2003-12-29 09:30:42.000000000 +0000
@@ -43,18 +43,35 @@
 #define spin_is_locked(x)	(*(volatile signed char *)(&(x)->lock) <= 0)
 #define spin_unlock_wait(x)	do { barrier(); } while(spin_is_locked(x))
 
-#define spin_lock_string \
-	"\n1:\t" \
-	"lock ; decb %0\n\t" \
-	"js 2f\n" \
-	LOCK_SECTION_START("") \
-	"2:\t" \
-	"rep;nop\n\t" \
-	"cmpb $0,%0\n\t" \
-	"jle 2b\n\t" \
-	"jmp 1b\n" \
-	LOCK_SECTION_END
+#ifdef CONFIG_SPINLINE
 
+	#define spin_lock_string \
+		"\n1:\t" \
+		"lock ; decb %0\n\t" \
+		"js 2f\n" \
+		"jmp 3f\n" \
+		"2:\t" \
+		"rep;nop\n\t" \
+		"cmpb $0,%0\n\t" \
+		"jle 2b\n\t" \
+		"jmp 1b\n" \
+		"3:\t"
+
+#else /* !CONFIG_SPINLINE */
+
+	#define spin_lock_string \
+		"\n1:\t" \
+		"lock ; decb %0\n\t" \
+		"js 2f\n" \
+		LOCK_SECTION_START("") \
+		"2:\t" \
+		"rep;nop\n\t" \
+		"cmpb $0,%0\n\t" \
+		"jle 2b\n\t" \
+		"jmp 1b\n" \
+		LOCK_SECTION_END
+
+#endif /* CONFIG_SPINLINE */
 /*
  * This works. Despite all the confusion.
  * (except on PPro SMP or if we are using OOSTORE)
@@ -138,6 +155,11 @@
  */
 typedef struct {
 	volatile unsigned int lock;
+#ifdef CONFIG_LOCKMETER
+	/* required for LOCKMETER since all bits in lock are used */
+	/* and we need this storage for CPU and lock INDEX        */
+	unsigned lockmeter_magic;
+#endif
 #ifdef CONFIG_DEBUG_SPINLOCK
 	unsigned magic;
 #endif
@@ -145,11 +167,19 @@
 
 #define RWLOCK_MAGIC	0xdeaf1eed
 
+#ifdef CONFIG_LOCKMETER
+#ifdef CONFIG_DEBUG_SPINLOCK
+#define RWLOCK_MAGIC_INIT	, 0, RWLOCK_MAGIC
+#else
+#define RWLOCK_MAGIC_INIT	, 0
+#endif
+#else /* !CONFIG_LOCKMETER */
 #ifdef CONFIG_DEBUG_SPINLOCK
 #define RWLOCK_MAGIC_INIT	, RWLOCK_MAGIC
 #else
 #define RWLOCK_MAGIC_INIT	/* */
 #endif
+#endif /* !CONFIG_LOCKMETER */
 
 #define RW_LOCK_UNLOCKED (rwlock_t) { RW_LOCK_BIAS RWLOCK_MAGIC_INIT }
 
@@ -196,4 +226,60 @@
 	return 0;
 }
 
+#ifdef CONFIG_LOCKMETER
+static inline int _raw_read_trylock(rwlock_t *lock)
+{
+/* FIXME -- replace with assembler */
+	atomic_t *count = (atomic_t *)lock;
+	atomic_dec(count);
+	if (count->counter > 0)
+		return 1;
+	atomic_inc(count);
+	return 0;
+}
+#endif
+
+#if defined(CONFIG_LOCKMETER) && defined(CONFIG_HAVE_DEC_LOCK)
+extern void _metered_spin_lock  (spinlock_t *lock);
+extern void _metered_spin_unlock(spinlock_t *lock);
+
+/*
+ *  Matches what is in arch/i386/lib/dec_and_lock.c, except this one is
+ *  "static inline" so that the spin_lock(), if actually invoked, is charged
+ *  against the real caller, not against the catch-all atomic_dec_and_lock
+ */
+static inline int atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
+{
+	int counter;
+	int newcount;
+
+repeat:
+	counter = atomic_read(atomic);
+	newcount = counter-1;
+
+	if (!newcount)
+		goto slow_path;
+
+	asm volatile("lock; cmpxchgl %1,%2"
+		:"=a" (newcount)
+		:"r" (newcount), "m" (atomic->counter), "0" (counter));
+
+	/* If the above failed, "eax" will have changed */
+	if (newcount != counter)
+		goto repeat;
+	return 0;
+
+slow_path:
+	preempt_disable();
+	_metered_spin_lock(lock);
+	if (atomic_dec_and_test(atomic))
+		return 1;
+	_metered_spin_unlock(lock);
+	preempt_enable();
+	return 0;
+}
+
+#define ATOMIC_DEC_AND_LOCK
+#endif
+
 #endif /* __ASM_SPINLOCK_H */
--- diff/include/asm-i386/string.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/asm-i386/string.h	2003-12-29 09:30:42.000000000 +0000
@@ -56,6 +56,29 @@
 return dest;
 }
 
+/*
+ * This is a more generic variant of strncpy_count() suitable for
+ * implementing string-access routines with all sorts of return
+ * code semantics. It's used by mm/usercopy.c.
+ */
+static inline size_t strncpy_count(char * dest,const char *src,size_t count)
+{
+	__asm__ __volatile__(
+
+	"1:\tdecl %0\n\t"
+	"js 2f\n\t"
+	"lodsb\n\t"
+	"stosb\n\t"
+	"testb %%al,%%al\n\t"
+	"jne 1b\n\t"
+	"2:"
+	"incl %0"
+	: "=c" (count)
+	:"S" (src),"D" (dest),"0" (count) : "memory");
+
+	return count;
+}
+
 #define __HAVE_ARCH_STRCAT
 static inline char * strcat(char * dest,const char * src)
 {
@@ -291,7 +314,7 @@
 #define struct_cpy(x,y) 			\
 ({						\
 	if (sizeof(*(x)) != sizeof(*(y))) 	\
-		__struct_cpy_bug;		\
+		__struct_cpy_bug();		\
 	memcpy(x, y, sizeof(*(x)));		\
 })
 
@@ -299,14 +322,9 @@
 static inline void * memmove(void * dest,const void * src, size_t n)
 {
 int d0, d1, d2;
-if (dest<src)
-__asm__ __volatile__(
-	"rep\n\t"
-	"movsb"
-	: "=&c" (d0), "=&S" (d1), "=&D" (d2)
-	:"0" (n),"1" (src),"2" (dest)
-	: "memory");
-else
+if (dest<src) {
+	memcpy(dest,src,n);
+} else
 __asm__ __volatile__(
 	"std\n\t"
 	"rep\n\t"
--- diff/include/asm-i386/system.h	2003-06-09 14:18:20.000000000 +0100
+++ source/include/asm-i386/system.h	2003-12-29 09:30:42.000000000 +0000
@@ -470,6 +470,7 @@
 
 extern unsigned long dmi_broken;
 extern int is_sony_vaio_laptop;
+extern int es7000_plat;
 
 #define BROKEN_ACPI_Sx		0x0001
 #define BROKEN_INIT_AFTER_S1	0x0002
--- diff/include/asm-i386/thread_info.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/asm-i386/thread_info.h	2003-12-29 09:30:42.000000000 +0000
@@ -33,23 +33,12 @@
 					 	   0-0xBFFFFFFF for user-thead
 						   0-0xFFFFFFFF for kernel-thread
 						*/
-	struct restart_block    restart_block;
+	void *real_stack, *virtual_stack, *user_pgd;
 
+	struct restart_block    restart_block;
 	__u8			supervisor_stack[0];
 };
 
-#else /* !__ASSEMBLY__ */
-
-/* offsets into the thread_info struct for assembly code access */
-#define TI_TASK		0x00000000
-#define TI_EXEC_DOMAIN	0x00000004
-#define TI_FLAGS	0x00000008
-#define TI_STATUS	0x0000000C
-#define TI_CPU		0x00000010
-#define TI_PRE_COUNT	0x00000014
-#define TI_ADDR_LIMIT	0x00000018
-#define TI_RESTART_BLOCK 0x000001C
-
 #endif
 
 #define PREEMPT_ACTIVE		0x4000000
@@ -61,7 +50,7 @@
  */
 #ifndef __ASSEMBLY__
 
-#define INIT_THREAD_INFO(tsk)			\
+#define INIT_THREAD_INFO(tsk, thread_info)	\
 {						\
 	.task		= &tsk,			\
 	.exec_domain	= &default_exec_domain,	\
@@ -72,6 +61,7 @@
 	.restart_block = {			\
 		.fn = do_no_restart_syscall,	\
 	},					\
+	.real_stack	= &thread_info,		\
 }
 
 #define init_thread_info	(init_thread_union.thread_info)
@@ -113,6 +103,7 @@
 #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_DB7			6	/* has debug registers */
 #define TIF_POLLING_NRFLAG	16	/* true if poll_idle() is polling TIF_NEED_RESCHED */
 
 #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
@@ -121,6 +112,7 @@
 #define _TIF_NEED_RESCHED	(1<<TIF_NEED_RESCHED)
 #define _TIF_SINGLESTEP		(1<<TIF_SINGLESTEP)
 #define _TIF_IRET		(1<<TIF_IRET)
+#define _TIF_DB7		(1<<TIF_DB7)
 #define _TIF_POLLING_NRFLAG	(1<<TIF_POLLING_NRFLAG)
 
 #define _TIF_WORK_MASK		0x0000FFFE	/* work to do on interrupt/exception return */
--- diff/include/asm-i386/timer.h	2003-09-30 15:46:19.000000000 +0100
+++ source/include/asm-i386/timer.h	2003-12-29 09:30:42.000000000 +0000
@@ -11,6 +11,7 @@
  *	last timer intruupt.
  */
 struct timer_opts{
+	char* name;
 	int (*init)(char *override);
 	void (*mark_offset)(void);
 	unsigned long (*get_offset)(void);
@@ -39,9 +40,13 @@
 #endif
 
 extern unsigned long calibrate_tsc(void);
+extern void init_cpu_khz(void);
 #ifdef CONFIG_HPET_TIMER
 extern struct timer_opts timer_hpet;
 extern unsigned long calibrate_tsc_hpet(unsigned long *tsc_hpet_quotient_ptr);
 #endif
 
+#ifdef CONFIG_X86_PM_TIMER
+extern struct timer_opts timer_pmtmr;
+#endif
 #endif
--- diff/include/asm-i386/tlbflush.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/asm-i386/tlbflush.h	2003-12-29 09:30:42.000000000 +0000
@@ -85,22 +85,28 @@
 
 static inline void flush_tlb_mm(struct mm_struct *mm)
 {
+#ifndef CONFIG_X86_SWITCH_PAGETABLES
 	if (mm == current->active_mm)
 		__flush_tlb();
+#endif
 }
 
 static inline void flush_tlb_page(struct vm_area_struct *vma,
 	unsigned long addr)
 {
+#ifndef CONFIG_X86_SWITCH_PAGETABLES
 	if (vma->vm_mm == current->active_mm)
 		__flush_tlb_one(addr);
+#endif
 }
 
 static inline void flush_tlb_range(struct vm_area_struct *vma,
 	unsigned long start, unsigned long end)
 {
+#ifndef CONFIG_X86_SWITCH_PAGETABLES
 	if (vma->vm_mm == current->active_mm)
 		__flush_tlb();
+#endif
 }
 
 #else
@@ -111,11 +117,10 @@
 	__flush_tlb()
 
 extern void flush_tlb_all(void);
-extern void flush_tlb_current_task(void);
 extern void flush_tlb_mm(struct mm_struct *);
 extern void flush_tlb_page(struct vm_area_struct *, unsigned long);
 
-#define flush_tlb()	flush_tlb_current_task()
+#define flush_tlb()	flush_tlb_all()
 
 static inline void flush_tlb_range(struct vm_area_struct * vma, unsigned long start, unsigned long end)
 {
--- diff/include/asm-i386/uaccess.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/asm-i386/uaccess.h	2003-12-29 09:30:42.000000000 +0000
@@ -26,7 +26,7 @@
 
 
 #define KERNEL_DS	MAKE_MM_SEG(0xFFFFFFFFUL)
-#define USER_DS		MAKE_MM_SEG(PAGE_OFFSET)
+#define USER_DS		MAKE_MM_SEG(TASK_SIZE)
 
 #define get_ds()	(KERNEL_DS)
 #define get_fs()	(current_thread_info()->addr_limit)
@@ -149,6 +149,45 @@
 		:"=a" (ret),"=d" (x) \
 		:"0" (ptr))
 
+extern int get_user_size(unsigned int size, void *val, const void *ptr);
+extern int put_user_size(unsigned int size, const void *val, void *ptr);
+extern int zero_user_size(unsigned int size, void *ptr);
+extern int copy_str_fromuser_size(unsigned int size, void *val, const void *ptr);
+extern int strlen_fromuser_size(unsigned int size, const void *ptr);
+
+
+# define indirect_get_user(x,ptr)					\
+({	int __ret_gu,__val_gu;						\
+	__typeof__(ptr) __ptr_gu = (ptr);				\
+	__ret_gu = get_user_size(sizeof(*__ptr_gu), &__val_gu,__ptr_gu) ? -EFAULT : 0;\
+	(x) = (__typeof__(*__ptr_gu))__val_gu;				\
+	__ret_gu;							\
+})
+#define indirect_put_user(x,ptr)					\
+({									\
+	__typeof__(*(ptr)) *__ptr_pu = (ptr), __x_pu = (x);		\
+	put_user_size(sizeof(*__ptr_pu), &__x_pu, __ptr_pu) ? -EFAULT : 0; \
+})
+#define __indirect_put_user indirect_put_user
+#define __indirect_get_user indirect_get_user
+
+#define indirect_copy_from_user(to,from,n) get_user_size(n,to,from)
+#define indirect_copy_to_user(to,from,n) put_user_size(n,from,to)
+
+#define __indirect_copy_from_user indirect_copy_from_user
+#define __indirect_copy_to_user indirect_copy_to_user
+
+#define indirect_strncpy_from_user(dst, src, count) \
+		copy_str_fromuser_size(count, dst, src)
+
+extern int strlen_fromuser_size(unsigned int size, const void *ptr);
+#define indirect_strnlen_user(str, n) strlen_fromuser_size(n, str)
+#define indirect_strlen_user(str) indirect_strnlen_user(str, ~0UL >> 1)
+
+extern int zero_user_size(unsigned int size, void *ptr);
+
+#define indirect_clear_user(mem, len) zero_user_size(len, mem)
+#define __indirect_clear_user clear_user
 
 /* Careful: we have to cast the result to the type of the pointer for sign reasons */
 /**
@@ -168,7 +207,7 @@
  * Returns zero on success, or -EFAULT on error.
  * On error, the variable @x is set to zero.
  */
-#define get_user(x,ptr)							\
+#define direct_get_user(x,ptr)						\
 ({	int __ret_gu,__val_gu;						\
 	switch(sizeof (*(ptr))) {					\
 	case 1:  __get_user_x(1,__ret_gu,__val_gu,ptr); break;		\
@@ -198,7 +237,7 @@
  *
  * Returns zero on success, or -EFAULT on error.
  */
-#define put_user(x,ptr)							\
+#define direct_put_user(x,ptr)						\
   __put_user_check((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)))
 
 
@@ -222,7 +261,7 @@
  * Returns zero on success, or -EFAULT on error.
  * On error, the variable @x is set to zero.
  */
-#define __get_user(x,ptr) \
+#define __direct_get_user(x,ptr) \
   __get_user_nocheck((x),(ptr),sizeof(*(ptr)))
 
 
@@ -245,7 +284,7 @@
  *
  * Returns zero on success, or -EFAULT on error.
  */
-#define __put_user(x,ptr) \
+#define __direct_put_user(x,ptr) \
   __put_user_nocheck((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)))
 
 #define __put_user_nocheck(x,ptr,size)				\
@@ -396,7 +435,7 @@
  * On success, this will be zero.
  */
 static inline unsigned long
-__copy_to_user(void __user *to, const void *from, unsigned long n)
+__direct_copy_to_user(void __user *to, const void *from, unsigned long n)
 {
 	if (__builtin_constant_p(n)) {
 		unsigned long ret;
@@ -434,7 +473,7 @@
  * data to the requested size using zero bytes.
  */
 static inline unsigned long
-__copy_from_user(void *to, const void __user *from, unsigned long n)
+__direct_copy_from_user(void *to, const void __user *from, unsigned long n)
 {
 	if (__builtin_constant_p(n)) {
 		unsigned long ret;
@@ -468,11 +507,11 @@
  * On success, this will be zero.
  */
 static inline unsigned long
-copy_to_user(void __user *to, const void *from, unsigned long n)
+direct_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);
+		n = __direct_copy_to_user(to, from, n);
 	return n;
 }
 
@@ -493,11 +532,11 @@
  * data to the requested size using zero bytes.
  */
 static inline unsigned long
-copy_from_user(void *to, const void __user *from, unsigned long n)
+direct_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);
+		n = __direct_copy_from_user(to, from, n);
 	else
 		memset(to, 0, n);
 	return n;
@@ -520,10 +559,68 @@
  * If there is a limit on the length of a valid string, you may wish to
  * consider using strnlen_user() instead.
  */
-#define strlen_user(str) strnlen_user(str, ~0UL >> 1)
 
-long strnlen_user(const char __user *str, long n);
-unsigned long clear_user(void __user *mem, unsigned long len);
-unsigned long __clear_user(void __user *mem, unsigned long len);
+long direct_strncpy_from_user(char *dst, const char *src, long count);
+long __direct_strncpy_from_user(char *dst, const char *src, long count);
+#define direct_strlen_user(str) direct_strnlen_user(str, ~0UL >> 1)
+long direct_strnlen_user(const char *str, long n);
+unsigned long direct_clear_user(void *mem, unsigned long len);
+unsigned long __direct_clear_user(void *mem, unsigned long len);
+
+extern int indirect_uaccess;
+
+#ifdef CONFIG_X86_UACCESS_INDIRECT
+
+/*
+ * Return code and zeroing semantics:
+
+ __clear_user          0                      <-> bytes not done
+ clear_user            0                      <-> bytes not done
+ __copy_to_user        0                      <-> bytes not done
+ copy_to_user          0                      <-> bytes not done
+ __copy_from_user      0                      <-> bytes not done, zero rest
+ copy_from_user        0                      <-> bytes not done, zero rest
+ __get_user            0                      <-> -EFAULT
+ get_user              0                      <-> -EFAULT
+ __put_user            0                      <-> -EFAULT
+ put_user              0                      <-> -EFAULT
+ strlen_user           strlen + 1             <-> 0
+ strnlen_user          strlen + 1 (or n+1)    <-> 0
+ strncpy_from_user     strlen (or n)          <-> -EFAULT
+
+ */
+
+#define __clear_user(mem,len) __indirect_clear_user(mem,len)
+#define clear_user(mem,len) indirect_clear_user(mem,len)
+#define __copy_to_user(to,from,n) __indirect_copy_to_user(to,from,n)
+#define copy_to_user(to,from,n) indirect_copy_to_user(to,from,n)
+#define __copy_from_user(to,from,n) __indirect_copy_from_user(to,from,n)
+#define copy_from_user(to,from,n) indirect_copy_from_user(to,from,n)
+#define __get_user(val,ptr) __indirect_get_user(val,ptr)
+#define get_user(val,ptr) indirect_get_user(val,ptr)
+#define __put_user(val,ptr) __indirect_put_user(val,ptr)
+#define put_user(val,ptr) indirect_put_user(val,ptr)
+#define strlen_user(str) indirect_strlen_user(str)
+#define strnlen_user(src,count) indirect_strnlen_user(src,count)
+#define strncpy_from_user(dst,src,count) \
+			indirect_strncpy_from_user(dst,src,count)
+
+#else
+
+#define __clear_user __direct_clear_user
+#define clear_user direct_clear_user
+#define __copy_to_user __direct_copy_to_user
+#define copy_to_user direct_copy_to_user
+#define __copy_from_user __direct_copy_from_user
+#define copy_from_user direct_copy_from_user
+#define __get_user __direct_get_user
+#define get_user direct_get_user
+#define __put_user __direct_put_user
+#define put_user direct_put_user
+#define strlen_user direct_strlen_user
+#define strnlen_user direct_strnlen_user
+#define strncpy_from_user direct_strncpy_from_user
+
+#endif /* CONFIG_X86_UACCESS_INDIRECT */
 
 #endif /* __i386_UACCESS_H */
--- diff/include/asm-ia64/byteorder.h	2003-08-26 10:00:54.000000000 +0100
+++ source/include/asm-ia64/byteorder.h	2003-12-29 09:30:42.000000000 +0000
@@ -8,8 +8,9 @@
 
 #include <asm/types.h>
 #include <asm/intrinsics.h>
+#include <linux/compiler.h>
 
-static __inline__ __const__ __u64
+static __inline__ __attribute_const__ __u64
 __ia64_swab64 (__u64 x)
 {
 	__u64 result;
@@ -18,13 +19,13 @@
 	return result;
 }
 
-static __inline__ __const__ __u32
+static __inline__ __attribute_const__ __u32
 __ia64_swab32 (__u32 x)
 {
 	return __ia64_swab64(x) >> 32;
 }
 
-static __inline__ __const__ __u16
+static __inline__ __attribute_const__ __u16
 __ia64_swab16(__u16 x)
 {
 	return __ia64_swab64(x) >> 48;
--- diff/include/asm-ia64/spinlock.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/asm-ia64/spinlock.h	2003-12-29 09:30:42.000000000 +0000
@@ -110,8 +110,18 @@
 typedef struct {
 	volatile int read_counter	: 31;
 	volatile int write_lock		:  1;
+#ifdef CONFIG_LOCKMETER
+	/* required for LOCKMETER since all bits in lock are used */
+	/* and we need this storage for CPU and lock INDEX        */
+	unsigned lockmeter_magic;
+#endif
 } rwlock_t;
+
+#ifdef CONFIG_LOCKMETER
+#define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0, 0 }
+#else
 #define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0 }
+#endif
 
 #define rwlock_init(x)		do { *(x) = RW_LOCK_UNLOCKED; } while(0)
 #define rwlock_is_locked(x)	(*(volatile int *) (x) != 0)
@@ -127,6 +137,48 @@
 	}										\
 } while (0)
 
+#ifdef CONFIG_LOCKMETER
+/*
+ * HACK: This works, but still have a timing window that affects performance:
+ * we see that no one owns the Write lock, then someone * else grabs for Write
+ * lock before we do a read_lock().
+ * This means that on rare occasions our read_lock() will stall and spin-wait
+ * until we acquire for Read, instead of simply returning a trylock failure.
+ */
+static inline int _raw_read_trylock(rwlock_t *rw)
+{
+	if (rw->write_lock) {
+		return 0;
+	} else {
+		_raw_read_lock(rw);
+		return 1;
+	}
+}
+
+static inline int _raw_write_trylock(rwlock_t *rw)
+{
+	if (!(rw->write_lock)) {
+	    /* isn't currently write-locked... that looks promising... */
+	    if (test_and_set_bit(31, rw) == 0) {
+		/* now it is write-locked by me... */
+		if (rw->read_counter) {
+		    /* really read-locked, so release write-lock and fail */
+		    clear_bit(31, rw);
+		} else {
+		    /* we've the the write-lock, no read-lockers... success! */
+		    barrier();
+		    return 1;
+		}
+
+	    }
+	}
+
+	/* falls through ... fails to write-lock */
+	barrier();
+	return 0;
+}
+#endif
+
 #define _raw_read_unlock(rw)					\
 do {								\
 	rwlock_t *__read_lock_ptr = (rw);			\
@@ -190,4 +242,25 @@
 	clear_bit(31, (x));								\
 })
 
+#ifdef CONFIG_LOCKMETER
+extern void _metered_spin_lock  (spinlock_t *lock);
+extern void _metered_spin_unlock(spinlock_t *lock);
+
+/*
+ *  Use a less efficient, and inline, atomic_dec_and_lock() if lockmetering
+ *  so we can see the callerPC of who is actually doing the spin_lock().
+ *  Otherwise, all we see is the generic rollup of all locks done by
+ *  atomic_dec_and_lock().
+ */
+static inline int atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
+{
+	_metered_spin_lock(lock);
+	if (atomic_dec_and_test(atomic))
+		return 1;
+	_metered_spin_unlock(lock);
+	return 0;
+}
+#define ATOMIC_DEC_AND_LOCK
+#endif
+
 #endif /*  _ASM_IA64_SPINLOCK_H */
--- diff/include/asm-ia64/statfs.h	2003-08-20 14:16:33.000000000 +0100
+++ source/include/asm-ia64/statfs.h	2003-12-29 09:30:42.000000000 +0000
@@ -43,5 +43,18 @@
 	long f_spare[5];
 };
 
+struct compat_statfs64 {
+	__u32 f_type;
+	__u32 f_bsize;
+	__u64 f_blocks;
+	__u64 f_bfree;
+	__u64 f_bavail;
+	__u64 f_files;
+	__u64 f_ffree;
+	__kernel_fsid_t f_fsid;
+	__u32 f_namelen;
+	__u32 f_frsize;
+	__u32 f_spare[5];
+} __attribute__((packed));
 
 #endif /* _ASM_IA64_STATFS_H */
--- diff/include/asm-m68k/byteorder.h	2002-10-16 04:27:54.000000000 +0100
+++ source/include/asm-m68k/byteorder.h	2003-12-29 09:30:42.000000000 +0000
@@ -2,10 +2,11 @@
 #define _M68K_BYTEORDER_H
 
 #include <asm/types.h>
+#include <linux/compiler.h>
 
 #ifdef __GNUC__
 
-static __inline__ __const__ __u32 ___arch__swab32(__u32 val)
+static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 val)
 {
 	__asm__("rolw #8,%0; swap %0; rolw #8,%0" : "=d" (val) : "0" (val));
 	return val;
--- diff/include/asm-mips/spinlock.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/asm-mips/spinlock.h	2003-12-29 09:30:42.000000000 +0000
@@ -91,9 +91,18 @@
 
 typedef struct {
 	volatile unsigned int lock;
+#ifdef CONFIG_LOCKMETER
+	/* required for LOCKMETER since all bits in lock are used */
+	/* and we need this storage for CPU and lock INDEX        */
+	unsigned lockmeter_magic;
+#endif
 } rwlock_t;
 
+#ifdef CONFIG_LOCKMETER
+#define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0 }
+#else
 #define RW_LOCK_UNLOCKED (rwlock_t) { 0 }
+#endif
 
 #define rwlock_init(x)  do { *(x) = RW_LOCK_UNLOCKED; } while(0)
 
--- diff/include/asm-mips/statfs.h	2003-08-20 14:16:33.000000000 +0100
+++ source/include/asm-mips/statfs.h	2003-12-29 09:30:42.000000000 +0000
@@ -75,6 +75,20 @@
 	long		f_spare[6];
 };
 
+struct compat_statfs64 {
+	__u32 f_type;
+	__u32 f_bsize;
+	__u64 f_blocks;
+	__u64 f_bfree;
+	__u64 f_bavail;
+	__u64 f_files;
+	__u64 f_ffree;
+	__kernel_fsid_t f_fsid;
+	__u32 f_namelen;
+	__u32 f_frsize;
+	__u32 f_spare[5];
+};
+
 #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */
 
 #endif /* _ASM_STATFS_H */
--- diff/include/asm-parisc/byteorder.h	2003-09-30 15:46:19.000000000 +0100
+++ source/include/asm-parisc/byteorder.h	2003-12-29 09:30:42.000000000 +0000
@@ -2,10 +2,11 @@
 #define _PARISC_BYTEORDER_H
 
 #include <asm/types.h>
+#include <linux/compiler.h>
 
 #ifdef __GNUC__
 
-static __inline__ __const__ __u16 ___arch__swab16(__u16 x)
+static __inline__ __attribute_const__ __u16 ___arch__swab16(__u16 x)
 {
 	__asm__("dep %0, 15, 8, %0\n\t"		/* deposit 00ab -> 0bab */
 		"shd %%r0, %0, 8, %0"		/* shift 000000ab -> 00ba */
@@ -14,7 +15,7 @@
 	return x;
 }
 
-static __inline__ __const__ __u32 ___arch__swab24(__u32 x)
+static __inline__ __attribute_const__ __u32 ___arch__swab24(__u32 x)
 {
 	__asm__("shd %0, %0, 8, %0\n\t"		/* shift xabcxabc -> cxab */
 		"dep %0, 15, 8, %0\n\t"		/* deposit cxab -> cbab */
@@ -24,7 +25,7 @@
 	return x;
 }
 
-static __inline__ __const__ __u32 ___arch__swab32(__u32 x)
+static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x)
 {
 	unsigned int temp;
 	__asm__("shd %0, %0, 16, %1\n\t"	/* shift abcdabcd -> cdab */
@@ -47,7 +48,7 @@
 **      HSHR    67452301 -> *6*4*2*0 into %0
 **      OR      %0 | %1  -> 76543210 into %0 (all done!)
 */
-static __inline__ __const__ __u64 ___arch__swab64(__u64 x) {
+static __inline__ __attribute_const__ __u64 ___arch__swab64(__u64 x) {
 	__u64 temp;
 	__asm__("permh,3210 %0, %0\n\t"
 		"hshl %0, 8, %1\n\t"
@@ -60,7 +61,7 @@
 #define __arch__swab64(x) ___arch__swab64(x)
 #define __BYTEORDER_HAS_U64__
 #elif !defined(__STRICT_ANSI__)
-static __inline__ __const__ __u64 ___arch__swab64(__u64 x)
+static __inline__ __attribute_const__ __u64 ___arch__swab64(__u64 x)
 {
 	__u32 t1 = ___arch__swab32((__u32) x);
 	__u32 t2 = ___arch__swab32((__u32) (x >> 32));
--- diff/include/asm-parisc/ioctl.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/asm-parisc/ioctl.h	2003-12-29 09:30:42.000000000 +0000
@@ -45,7 +45,7 @@
 	 ((size) << _IOC_SIZESHIFT))
 
 /* provoke compile error for invalid uses of size argument */
-extern int __invalid_size_argument_for_IOC;
+extern unsigned int __invalid_size_argument_for_IOC;
 #define _IOC_TYPECHECK(t) \
 	((sizeof(t) == sizeof(t[1]) && \
 	  sizeof(t) < (1 << _IOC_SIZEBITS)) ? \
--- diff/include/asm-parisc/statfs.h	2003-06-30 10:07:34.000000000 +0100
+++ source/include/asm-parisc/statfs.h	2003-12-29 09:30:42.000000000 +0000
@@ -41,4 +41,18 @@
 	long f_spare[5];
 };
 
+struct compat_statfs64 {
+	__u32 f_type;
+	__u32 f_bsize;
+	__u64 f_blocks;
+	__u64 f_bfree;
+	__u64 f_bavail;
+	__u64 f_files;
+	__u64 f_ffree;
+	__kernel_fsid_t f_fsid;
+	__u32 f_namelen;
+	__u32 f_frsize;
+	__u32 f_spare[5];
+};
+
 #endif
--- diff/include/asm-ppc/byteorder.h	2002-10-16 04:28:19.000000000 +0100
+++ source/include/asm-ppc/byteorder.h	2003-12-29 09:30:42.000000000 +0000
@@ -2,6 +2,7 @@
 #define _PPC_BYTEORDER_H
 
 #include <asm/types.h>
+#include <linux/compiler.h>
 
 #ifdef __GNUC__
 #ifdef __KERNEL__
@@ -32,7 +33,7 @@
 	__asm__ __volatile__ ("stwbrx %1,0,%2" : "=m" (*addr) : "r" (val), "r" (addr));
 }
 
-static __inline__ __const__ __u16 ___arch__swab16(__u16 value)
+static __inline__ __attribute_const__ __u16 ___arch__swab16(__u16 value)
 {
 	__u16 result;
 
@@ -40,7 +41,7 @@
 	return result;
 }
 
-static __inline__ __const__ __u32 ___arch__swab32(__u32 value)
+static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 value)
 {
 	__u32 result;
 
--- diff/include/asm-ppc/highmem.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/asm-ppc/highmem.h	2003-12-29 09:30:42.000000000 +0000
@@ -81,6 +81,7 @@
 	unsigned int idx;
 	unsigned long vaddr;
 
+	/* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
 	inc_preempt_count();
 	if (page < highmem_start_page)
 		return page_address(page);
@@ -105,6 +106,7 @@
 
 	if (vaddr < KMAP_FIX_BEGIN) { // FIXME
 		dec_preempt_count();
+		preempt_check_resched();
 		return;
 	}
 
@@ -119,6 +121,7 @@
 	flush_tlb_page(0, vaddr);
 #endif
 	dec_preempt_count();
+	preempt_check_resched();
 }
 
 static inline struct page *kmap_atomic_to_page(void *ptr)
--- diff/include/asm-ppc/ioctl.h	2003-09-30 15:46:19.000000000 +0100
+++ source/include/asm-ppc/ioctl.h	2003-12-29 09:30:42.000000000 +0000
@@ -38,7 +38,7 @@
 	 ((size) << _IOC_SIZESHIFT))
 
 /* provoke compile error for invalid uses of size argument */
-extern int __invalid_size_argument_for_IOC;
+extern unsigned int __invalid_size_argument_for_IOC;
 #define _IOC_TYPECHECK(t) \
 	((sizeof(t) == sizeof(t[1]) && \
 	  sizeof(t) < (1 << _IOC_SIZEBITS)) ? \
--- diff/include/asm-ppc64/byteorder.h	2002-10-16 04:29:06.000000000 +0100
+++ source/include/asm-ppc64/byteorder.h	2003-12-29 09:30:42.000000000 +0000
@@ -9,6 +9,7 @@
  */
 
 #include <asm/types.h>
+#include <linux/compiler.h>
 
 #ifdef __GNUC__
 #ifdef __KERNEL__
@@ -40,7 +41,7 @@
 }
 
 #if 0
-static __inline__ __const__ __u16 ___arch__swab16(__u16 value)
+static __inline__ __attribute_const__ __u16 ___arch__swab16(__u16 value)
 {
 	__u16 result;
 
@@ -50,7 +51,7 @@
 	return result;
 }
 
-static __inline__ __const__ __u32 ___arch__swab32(__u32 value)
+static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 value)
 {
 	__u32 result;
 
@@ -62,7 +63,7 @@
 	return result;
 }
 
-static __inline__ __const__ __u64 ___arch__swab64(__u64 value)
+static __inline__ __attribute_const__ __u64 ___arch__swab64(__u64 value)
 {
 	__u64 result;
 #error implement me
--- diff/include/asm-ppc64/ioctl.h	2003-09-30 15:46:19.000000000 +0100
+++ source/include/asm-ppc64/ioctl.h	2003-12-29 09:30:42.000000000 +0000
@@ -43,7 +43,7 @@
 	 ((size) << _IOC_SIZESHIFT))
 
 /* provoke compile error for invalid uses of size argument */
-extern int __invalid_size_argument_for_IOC;
+extern unsigned int __invalid_size_argument_for_IOC;
 #define _IOC_TYPECHECK(t) \
        ((sizeof(t) == sizeof(t[1]) && \
          sizeof(t) < (1 << _IOC_SIZEBITS)) ? \
--- diff/include/asm-ppc64/page.h	2003-09-30 15:46:19.000000000 +0100
+++ source/include/asm-ppc64/page.h	2003-12-29 09:30:42.000000000 +0000
@@ -41,6 +41,7 @@
 	( ((addr > (TASK_HPAGE_BASE-len)) && (addr < TASK_HPAGE_END)) || \
 	  ((current->mm->context & CONTEXT_LOW_HPAGES) && \
 	   (addr > (TASK_HPAGE_BASE_32-len)) && (addr < TASK_HPAGE_END_32)) )
+#define hugetlb_free_pgtables free_pgtables
 #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
 
 #define in_hugepage_area(context, addr) \
--- diff/include/asm-ppc64/statfs.h	2003-06-30 10:07:34.000000000 +0100
+++ source/include/asm-ppc64/statfs.h	2003-12-29 09:30:42.000000000 +0000
@@ -44,4 +44,18 @@
 	long f_spare[5];
 };
 
+struct compat_statfs64 {
+	__u32 f_type;
+	__u32 f_bsize;
+	__u64 f_blocks;
+	__u64 f_bfree;
+	__u64 f_bavail;
+	__u64 f_files;
+	__u64 f_ffree;
+	__kernel_fsid_t f_fsid;
+	__u32 f_namelen;
+	__u32 f_frsize;
+	__u32 f_spare[5];
+};
+
 #endif  /* _PPC64_STATFS_H */
--- diff/include/asm-s390/byteorder.h	2003-05-21 11:50:10.000000000 +0100
+++ source/include/asm-s390/byteorder.h	2003-12-29 09:30:42.000000000 +0000
@@ -10,11 +10,12 @@
  */
 
 #include <asm/types.h>
+#include <linux/compiler.h>
 
 #ifdef __GNUC__
 
 #ifdef __s390x__
-static __inline__ __const__ __u64 ___arch__swab64p(__u64 *x)
+static __inline__ __attribute_pure__ __u64 ___arch__swab64p(__const__ __u64 *x)
 {
 	__u64 result;
 
@@ -24,7 +25,7 @@
 	return result;
 }
 
-static __inline__ __const__ __u64 ___arch__swab64(__u64 x)
+static __inline__ __attribute_const__ __u64 ___arch__swab64(__u64 x)
 {
 	__u64 result;
 
@@ -40,7 +41,7 @@
 }
 #endif /* __s390x__ */
 
-static __inline__ __const__ __u32 ___arch__swab32p(__u32 *x)
+static __inline__ __attribute_pure__ __u32 ___arch__swab32p(__const__ __u32 *x)
 {
 	__u32 result;
 	
@@ -58,7 +59,7 @@
 	return result;
 }
 
-static __inline__ __const__ __u32 ___arch__swab32(__u32 x)
+static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x)
 {
 #ifndef __s390x__
 	return ___arch__swab32p(&x);
@@ -77,7 +78,7 @@
 	*x = ___arch__swab32p(x);
 }
 
-static __inline__ __const__ __u16 ___arch__swab16p(__u16 *x)
+static __inline__ __attribute_pure__ __u16 ___arch__swab16p(__const__ __u16 *x)
 {
 	__u16 result;
 	
@@ -93,7 +94,7 @@
 	return result;
 }
 
-static __inline__ __const__ __u16 ___arch__swab16(__u16 x)
+static __inline__ __attribute_const__ __u16 ___arch__swab16(__u16 x)
 {
 	return ___arch__swab16p(&x);
 }
--- diff/include/asm-s390/statfs.h	2003-07-08 09:55:19.000000000 +0100
+++ source/include/asm-s390/statfs.h	2003-12-29 09:30:42.000000000 +0000
@@ -53,5 +53,19 @@
 	int  f_spare[5];
 };
 
+struct compat_statfs64 {
+	__u32 f_type;
+	__u32 f_bsize;
+	__u64 f_blocks;
+	__u64 f_bfree;
+	__u64 f_bavail;
+	__u64 f_files;
+	__u64 f_ffree;
+	__kernel_fsid_t f_fsid;
+	__u32 f_namelen;
+	__u32 f_frsize;
+	__u32 f_spare[5];
+};
+
 #endif /* __s390x__ */
 #endif
--- diff/include/asm-sh/byteorder.h	2003-07-08 09:55:19.000000000 +0100
+++ source/include/asm-sh/byteorder.h	2003-12-29 09:30:42.000000000 +0000
@@ -6,8 +6,9 @@
  */
 
 #include <asm/types.h>
+#include <linux/compiler.h>
 
-static __inline__ __const__ __u32 ___arch__swab32(__u32 x)
+static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x)
 {
 	__asm__("swap.b	%0, %0\n\t"
 		"swap.w %0, %0\n\t"
@@ -17,7 +18,7 @@
 	return x;
 }
 
-static __inline__ __const__ __u16 ___arch__swab16(__u16 x)
+static __inline__ __attribute_const__ __u16 ___arch__swab16(__u16 x)
 {
 	__asm__("swap.b %0, %0"
 		: "=r" (x)
--- diff/include/asm-sparc64/spinlock.h	2003-11-25 15:24:59.000000000 +0000
+++ source/include/asm-sparc64/spinlock.h	2003-12-29 09:30:42.000000000 +0000
@@ -30,15 +30,23 @@
 
 #ifndef CONFIG_DEBUG_SPINLOCK
 
-typedef unsigned char spinlock_t;
-#define SPIN_LOCK_UNLOCKED	0
+typedef struct {
+	unsigned char lock;
+	unsigned int  index;
+} spinlock_t;
 
-#define spin_lock_init(lock)	(*((unsigned char *)(lock)) = 0)
-#define spin_is_locked(lock)	(*((volatile unsigned char *)(lock)) != 0)
+#ifdef CONFIG_LOCKMETER
+#define SPIN_LOCK_UNLOCKED	(spinlock_t) {0, 0}
+#else
+#define SPIN_LOCK_UNLOCKED	(spinlock_t) { 0 }
+#endif
 
-#define spin_unlock_wait(lock)	\
+#define spin_lock_init(__lock)	do { *(__lock) = SPIN_LOCK_UNLOCKED; } while(0)
+#define spin_is_locked(__lock)	(*((volatile unsigned char *)(&((__lock)->lock))) != 0)
+
+#define spin_unlock_wait(__lock)	\
 do {	membar("#LoadLoad");	\
-} while(*((volatile unsigned char *)lock))
+} while(*((volatile unsigned char *)(&(((spinlock_t *)__lock)->lock))))
 
 static __inline__ void _raw_spin_lock(spinlock_t *lock)
 {
@@ -109,17 +117,31 @@
 
 #ifndef CONFIG_DEBUG_SPINLOCK
 
-typedef unsigned int rwlock_t;
-#define RW_LOCK_UNLOCKED	0
-#define rwlock_init(lp) do { *(lp) = RW_LOCK_UNLOCKED; } while(0)
-#define rwlock_is_locked(x) (*(x) != RW_LOCK_UNLOCKED)
+#ifdef CONFIG_LOCKMETER
+typedef struct {
+	unsigned int lock;
+	unsigned int index;
+	unsigned int cpu;
+} rwlock_t;
+#define RW_LOCK_UNLOCKED       (rwlock_t) { 0, 0, 0xff }
+#else
+typedef struct {
+	unsigned int lock;
+} rwlock_t;
+#define RW_LOCK_UNLOCKED        (rwlock_t) { 0 }
+#endif
+
+#define rwlock_init(lp)		do { *(lp) = RW_LOCK_UNLOCKED; } while(0)
+#define rwlock_is_locked(x)	((x)->lock != 0)
 
+extern int __read_trylock(rwlock_t *);
 extern void __read_lock(rwlock_t *);
 extern void __read_unlock(rwlock_t *);
 extern void __write_lock(rwlock_t *);
 extern void __write_unlock(rwlock_t *);
 extern int __write_trylock(rwlock_t *);
 
+#define _raw_read_trylock(p)	__read_trylock(p)
 #define _raw_read_lock(p)	__read_lock(p)
 #define _raw_read_unlock(p)	__read_unlock(p)
 #define _raw_write_lock(p)	__write_lock(p)
--- diff/include/asm-sparc64/statfs.h	2003-06-30 10:07:34.000000000 +0100
+++ source/include/asm-sparc64/statfs.h	2003-12-29 09:30:42.000000000 +0000
@@ -38,4 +38,18 @@
 	long f_spare[5];
 };
 
+struct compat_statfs64 {
+	__u32 f_type;
+	__u32 f_bsize;
+	__u64 f_blocks;
+	__u64 f_bfree;
+	__u64 f_bavail;
+	__u64 f_files;
+	__u64 f_ffree;
+	__kernel_fsid_t f_fsid;
+	__u32 f_namelen;
+	__u32 f_frsize;
+	__u32 f_spare[5];
+};
+
 #endif
--- diff/include/asm-v850/byteorder.h	2002-11-11 11:09:43.000000000 +0000
+++ source/include/asm-v850/byteorder.h	2003-12-29 09:30:42.000000000 +0000
@@ -15,17 +15,18 @@
 #define __V850_BYTEORDER_H__
 
 #include <asm/types.h>
+#include <linux/compiler.h>
 
 #ifdef __GNUC__
 
-static __inline__ __const__ __u32 ___arch__swab32 (__u32 word)
+static __inline__ __attribute_const__ __u32 ___arch__swab32 (__u32 word)
 {
 	__u32 res;
 	__asm__ ("bsw %1, %0" : "=r" (res) : "r" (word));
 	return res;
 }
 
-static __inline__ __const__ __u16 ___arch__swab16 (__u16 half_word)
+static __inline__ __attribute_const__ __u16 ___arch__swab16 (__u16 half_word)
 {
 	__u16 res;
 	__asm__ ("bsh %1, %0" : "=r" (res) : "r" (half_word));
--- diff/include/asm-x86_64/a.out.h	2002-10-16 04:27:55.000000000 +0100
+++ source/include/asm-x86_64/a.out.h	2003-12-29 09:30:42.000000000 +0000
@@ -1,13 +1,11 @@
 #ifndef __X8664_A_OUT_H__
 #define __X8664_A_OUT_H__
 
-
-/* Note: a.out is not supported in 64bit mode. This is just here to 
-   still let some old things compile. */ 
+/* 32bit a.out */
 
 struct exec
 {
-  unsigned long a_info;		/* Use macros N_MAGIC, etc for access */
+  unsigned int a_info;		/* Use macros N_MAGIC, etc for access */
   unsigned a_text;		/* length of text, in bytes */
   unsigned a_data;		/* length of data, in bytes */
   unsigned a_bss;		/* length of uninitialized data area for file, in bytes */
@@ -23,7 +21,7 @@
 
 #ifdef __KERNEL__
 
-#define STACK_TOP	TASK_SIZE
+#define STACK_TOP	0xc0000000
 
 #endif
 
--- diff/include/asm-x86_64/acpi.h	2003-09-30 15:45:48.000000000 +0100
+++ source/include/asm-x86_64/acpi.h	2003-12-29 09:30:42.000000000 +0000
@@ -104,25 +104,26 @@
         :"0"(n_hi), "1"(n_lo))
 
 
-#ifndef CONFIG_ACPI_BOOT
-#define acpi_lapic 0
-#define acpi_ioapic 0
-#else
-#ifdef CONFIG_X86_LOCAL_APIC
+#ifdef CONFIG_ACPI_BOOT
 extern int acpi_lapic;
-#else
-#define acpi_lapic 0
-#endif
-#ifdef CONFIG_X86_IO_APIC
 extern int acpi_ioapic;
-#else
-#define acpi_ioapic 0
-#endif
+extern int acpi_noirq;
 
 /* Fixmap pages to reserve for ACPI boot-time tables (see fixmap.h) */
 #define FIX_ACPI_PAGES 4
 
-#endif /*CONFIG_ACPI_BOOT*/
+#else	/* !CONFIG_ACPI_BOOT */
+#define acpi_lapic 0
+#define acpi_ioapic 0
+#endif /* !CONFIG_ACPI_BOOT */
+
+#ifdef CONFIG_ACPI_PCI
+static inline void acpi_noirq_set(void) { acpi_noirq = 1; }
+extern int acpi_irq_balance_set(char *str);
+#else
+static inline void acpi_noirq_set(void) { }
+static inline int acpi_irq_balance_set(char *str) { return 0; }
+#endif
 
 #ifdef CONFIG_ACPI_SLEEP
 
--- diff/include/asm-x86_64/byteorder.h	2003-05-21 11:50:10.000000000 +0100
+++ source/include/asm-x86_64/byteorder.h	2003-12-29 09:30:42.000000000 +0000
@@ -2,16 +2,17 @@
 #define _X86_64_BYTEORDER_H
 
 #include <asm/types.h>
+#include <linux/compiler.h>
 
 #ifdef __GNUC__
 
-static __inline__ __const__ __u64 ___arch__swab64(__u64 x)
+static __inline__ __attribute_const__ __u64 ___arch__swab64(__u64 x)
 {
 	__asm__("bswapq %0" : "=r" (x) : "0" (x));
 	return x;
 }
 
-static __inline__ __const__ __u32 ___arch__swab32(__u32 x)
+static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x)
 {
 	__asm__("bswapl %0" : "=r" (x) : "0" (x));
 	return x;
--- diff/include/asm-x86_64/hw_irq.h	2003-11-25 15:24:59.000000000 +0000
+++ source/include/asm-x86_64/hw_irq.h	2003-12-29 09:30:42.000000000 +0000
@@ -173,6 +173,8 @@
 static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) {}
 #endif
 
+#define platform_legacy_irq(irq)	((irq) < 16)
+
 #endif
 
 #endif /* _ASM_HW_IRQ_H */
--- diff/include/asm-x86_64/io_apic.h	2003-08-26 10:00:54.000000000 +0100
+++ source/include/asm-x86_64/io_apic.h	2003-12-29 09:30:42.000000000 +0000
@@ -174,6 +174,25 @@
 #define io_apic_assign_pci_irqs 0
 #endif
 
+static inline int use_pci_vector(void)	{return 0;}
+static inline void disable_edge_ioapic_irq(unsigned int irq) { }
+static inline void mask_and_ack_level_ioapic_irq(unsigned int irq) { }
+static inline void end_edge_ioapic_irq (unsigned int irq) { }
+#define startup_level_ioapic	startup_level_ioapic_irq
+#define shutdown_level_ioapic	mask_IO_APIC_irq
+#define enable_level_ioapic	unmask_IO_APIC_irq
+#define disable_level_ioapic	mask_IO_APIC_irq
+#define mask_and_ack_level_ioapic mask_and_ack_level_ioapic_irq
+#define end_level_ioapic	end_level_ioapic_irq
+#define set_ioapic_affinity	set_ioapic_affinity_irq
+
+#define startup_edge_ioapic 	startup_edge_ioapic_irq
+#define shutdown_edge_ioapic 	disable_edge_ioapic_irq
+#define enable_edge_ioapic 	unmask_IO_APIC_irq
+#define disable_edge_ioapic 	disable_edge_ioapic_irq
+#define ack_edge_ioapic 	ack_edge_ioapic_irq
+#define end_edge_ioapic 	end_edge_ioapic_irq
+
 void enable_NMI_through_LVT0 (void * dummy);
 
 #endif
--- diff/include/asm-x86_64/stat.h	2002-11-18 10:11:55.000000000 +0000
+++ source/include/asm-x86_64/stat.h	2003-12-29 09:30:42.000000000 +0000
@@ -26,4 +26,19 @@
   	long		__unused[3];
 };
 
+/* For 32bit emulation */
+struct __old_kernel_stat {
+	unsigned short st_dev;
+	unsigned short st_ino;
+	unsigned short st_mode;
+	unsigned short st_nlink;
+	unsigned short st_uid;
+	unsigned short st_gid;
+	unsigned short st_rdev;
+	unsigned int  st_size;
+	unsigned int  st_atime;
+	unsigned int  st_mtime;
+	unsigned int  st_ctime;
+};
+
 #endif
--- diff/include/asm-x86_64/statfs.h	2003-06-30 10:07:34.000000000 +0100
+++ source/include/asm-x86_64/statfs.h	2003-12-29 09:30:42.000000000 +0000
@@ -41,4 +41,18 @@
 	long f_spare[5];
 };
 
+struct compat_statfs64 {
+	__u32 f_type;
+	__u32 f_bsize;
+	__u64 f_blocks;
+	__u64 f_bfree;
+	__u64 f_bavail;
+	__u64 f_files;
+	__u64 f_ffree;
+	__kernel_fsid_t f_fsid;
+	__u32 f_namelen;
+	__u32 f_frsize;
+	__u32 f_spare[5];
+} __attribute__((packed));
+
 #endif
--- diff/include/linux/aio.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/linux/aio.h	2003-12-29 09:30:42.000000000 +0000
@@ -29,21 +29,26 @@
 #define KIF_LOCKED		0
 #define KIF_KICKED		1
 #define KIF_CANCELLED		2
+#define KIF_SYNCED		3
 
 #define kiocbTryLock(iocb)	test_and_set_bit(KIF_LOCKED, &(iocb)->ki_flags)
 #define kiocbTryKick(iocb)	test_and_set_bit(KIF_KICKED, &(iocb)->ki_flags)
+#define kiocbTrySync(iocb)	test_and_set_bit(KIF_SYNCED, &(iocb)->ki_flags)
 
 #define kiocbSetLocked(iocb)	set_bit(KIF_LOCKED, &(iocb)->ki_flags)
 #define kiocbSetKicked(iocb)	set_bit(KIF_KICKED, &(iocb)->ki_flags)
 #define kiocbSetCancelled(iocb)	set_bit(KIF_CANCELLED, &(iocb)->ki_flags)
+#define kiocbSetSynced(iocb)	set_bit(KIF_SYNCED, &(iocb)->ki_flags)
 
 #define kiocbClearLocked(iocb)	clear_bit(KIF_LOCKED, &(iocb)->ki_flags)
 #define kiocbClearKicked(iocb)	clear_bit(KIF_KICKED, &(iocb)->ki_flags)
 #define kiocbClearCancelled(iocb)	clear_bit(KIF_CANCELLED, &(iocb)->ki_flags)
+#define kiocbClearSynced(iocb)	clear_bit(KIF_SYNCED, &(iocb)->ki_flags)
 
 #define kiocbIsLocked(iocb)	test_bit(KIF_LOCKED, &(iocb)->ki_flags)
 #define kiocbIsKicked(iocb)	test_bit(KIF_KICKED, &(iocb)->ki_flags)
 #define kiocbIsCancelled(iocb)	test_bit(KIF_CANCELLED, &(iocb)->ki_flags)
+#define kiocbIsSynced(iocb)	test_bit(KIF_SYNCED, &(iocb)->ki_flags)
 
 struct kiocb {
 	struct list_head	ki_run_list;
@@ -54,7 +59,7 @@
 	struct file		*ki_filp;
 	struct kioctx		*ki_ctx;	/* may be NULL for sync ops */
 	int			(*ki_cancel)(struct kiocb *, struct io_event *);
-	long			(*ki_retry)(struct kiocb *);
+	ssize_t			(*ki_retry)(struct kiocb *);
 
 	struct list_head	ki_list;	/* the aio core uses this
 						 * for cancellation */
@@ -63,6 +68,16 @@
 	__u64			ki_user_data;	/* user's data for completion */
 	loff_t			ki_pos;
 
+	/* State that we remember to be able to restart/retry  */
+	unsigned short		ki_opcode;
+	size_t			ki_nbytes; 	/* copy of iocb->aio_nbytes */
+	char 			*ki_buf;	/* remaining iocb->aio_buf */
+	size_t			ki_left; 	/* remaining bytes */
+	wait_queue_t		ki_wait;
+	long			ki_retried; 	/* just for testing */
+	long			ki_kicked; 	/* just for testing */
+	long			ki_queued; 	/* just for testing */
+
 	char			private[KIOCB_PRIVATE_SIZE];
 };
 
@@ -77,6 +92,8 @@
 		(x)->ki_ctx = &tsk->active_mm->default_kioctx;	\
 		(x)->ki_cancel = NULL;			\
 		(x)->ki_user_obj = tsk;			\
+		(x)->ki_user_data = 0;			\
+		init_wait((&(x)->ki_wait));		\
 	} while (0)
 
 #define AIO_RING_MAGIC			0xa10a10a1
@@ -159,6 +176,17 @@
 #define get_ioctx(kioctx)	do { if (unlikely(atomic_read(&(kioctx)->users) <= 0)) BUG(); atomic_inc(&(kioctx)->users); } while (0)
 #define put_ioctx(kioctx)	do { if (unlikely(atomic_dec_and_test(&(kioctx)->users))) __put_ioctx(kioctx); else if (unlikely(atomic_read(&(kioctx)->users) < 0)) BUG(); } while (0)
 
+#define in_aio() !is_sync_wait(current->io_wait)
+/* may be used for debugging */
+#define warn_if_async()	if (in_aio()) {\
+	printk(KERN_ERR "%s(%s:%d) called in async context!\n", \
+	__FUNCTION__, __FILE__, __LINE__); \
+	dump_stack(); \
+	}
+
+#define io_wait_to_kiocb(wait) container_of(wait, struct kiocb, ki_wait)
+#define is_retried_kiocb(iocb) ((iocb)->ki_retried > 1)
+
 #include <linux/aio_abi.h>
 
 static inline struct kiocb *list_kiocb(struct list_head *h)
@@ -167,6 +195,7 @@
 }
 
 /* for sysctl: */
-extern unsigned aio_max_nr, aio_max_size, aio_max_pinned;
+extern atomic_t aio_nr;
+extern unsigned aio_max_nr;
 
 #endif /* __LINUX__AIO_H */
--- diff/include/linux/bio.h	2003-09-30 15:46:20.000000000 +0100
+++ source/include/linux/bio.h	2003-12-29 09:30:42.000000000 +0000
@@ -162,7 +162,7 @@
  */
 
 #define __BVEC_END(bio)		bio_iovec_idx((bio), (bio)->bi_vcnt - 1)
-#define __BVEC_START(bio)	bio_iovec_idx((bio), 0)
+#define __BVEC_START(bio)	bio_iovec_idx((bio), (bio)->bi_idx)
 #define BIOVEC_PHYS_MERGEABLE(vec1, vec2)	\
 	((bvec_to_phys((vec1)) + (vec1)->bv_len) == bvec_to_phys((vec2)))
 #define BIOVEC_VIRT_MERGEABLE(vec1, vec2)	\
--- diff/include/linux/blkdev.h	2003-12-19 09:51:11.000000000 +0000
+++ source/include/linux/blkdev.h	2003-12-29 09:30:42.000000000 +0000
@@ -195,11 +195,6 @@
 	__REQ_PM_SUSPEND,	/* suspend request */
 	__REQ_PM_RESUME,	/* resume request */
 	__REQ_PM_SHUTDOWN,	/* shutdown request */
-	__REQ_IDETAPE_PC1,	/* packet command (first stage) */
-	__REQ_IDETAPE_PC2,	/* packet command (second stage) */
-	__REQ_IDETAPE_READ,
-	__REQ_IDETAPE_WRITE,
-	__REQ_IDETAPE_READ_BUFFER,
 	__REQ_NR_BITS,		/* stops here */
 };
 
@@ -225,11 +220,6 @@
 #define REQ_PM_SUSPEND	(1 << __REQ_PM_SUSPEND)
 #define REQ_PM_RESUME	(1 << __REQ_PM_RESUME)
 #define REQ_PM_SHUTDOWN	(1 << __REQ_PM_SHUTDOWN)
-#define REQ_IDETAPE_PC1 (1 << __REQ_IDETAPE_PC1)
-#define REQ_IDETAPE_PC2 (1 << __REQ_IDETAPE_PC2)
-#define REQ_IDETAPE_READ	(1 << __REQ_IDETAPE_READ)
-#define REQ_IDETAPE_WRITE	(1 << __REQ_IDETAPE_WRITE)
-#define REQ_IDETAPE_READ_BUFFER	(1 << __REQ_IDETAPE_READ_BUFFER)
 
 /*
  * State information carried for REQ_PM_SUSPEND and REQ_PM_RESUME
@@ -597,6 +587,7 @@
 extern int blk_queue_resize_tags(request_queue_t *, int);
 extern void blk_queue_invalidate_tags(request_queue_t *);
 extern void blk_congestion_wait(int rw, long timeout);
+extern int blk_congestion_wait_wq(int rw, long timeout, wait_queue_t *wait);
 
 extern void blk_rq_bio_prep(request_queue_t *, struct request *, struct bio *);
 extern void blk_rq_prep_restart(struct request *);
--- diff/include/linux/buffer_head.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/linux/buffer_head.h	2003-12-29 09:30:42.000000000 +0000
@@ -162,6 +162,7 @@
 void invalidate_bdev(struct block_device *, int);
 int sync_blockdev(struct block_device *bdev);
 void __wait_on_buffer(struct buffer_head *);
+int __wait_on_buffer_wq(struct buffer_head *, wait_queue_t *wait);
 wait_queue_head_t *bh_waitq_head(struct buffer_head *bh);
 void wake_up_buffer(struct buffer_head *bh);
 int fsync_bdev(struct block_device *);
@@ -173,6 +174,8 @@
 void __bforget(struct buffer_head *);
 void __breadahead(struct block_device *, sector_t block, int size);
 struct buffer_head *__bread(struct block_device *, sector_t block, int size);
+struct buffer_head *__bread_wq(struct block_device *, sector_t block,
+	int size, wait_queue_t *wait);
 struct buffer_head *alloc_buffer_head(int gfp_flags);
 void free_buffer_head(struct buffer_head * bh);
 void FASTCALL(unlock_buffer(struct buffer_head *bh));
@@ -207,12 +210,6 @@
 int nobh_commit_write(struct file *, struct page *, unsigned, unsigned);
 int nobh_truncate_page(struct address_space *, loff_t);
 
-#define OSYNC_METADATA	(1<<0)
-#define OSYNC_DATA	(1<<1)
-#define OSYNC_INODE	(1<<2)
-int generic_osync_inode(struct inode *, int);
-
-
 /*
  * inline definitions
  */
@@ -230,13 +227,13 @@
 
 static inline void brelse(struct buffer_head *bh)
 {
-	if (bh)
+	if (bh && !IS_ERR(bh))
 		__brelse(bh);
 }
 
 static inline void bforget(struct buffer_head *bh)
 {
-	if (bh)
+	if (bh && !IS_ERR(bh))
 		__bforget(bh);
 }
 
@@ -253,7 +250,12 @@
 }
 
 static inline struct buffer_head *
-sb_getblk(struct super_block *sb, sector_t block)
+sb_bread_wq(struct super_block *sb, sector_t block, wait_queue_t *wait)
+{
+	return __bread_wq(sb->s_bdev, block, sb->s_blocksize, wait);
+}
+
+static inline struct buffer_head *sb_getblk(struct super_block *sb, sector_t block)
 {
 	return __getblk(sb->s_bdev, block, sb->s_blocksize);
 }
@@ -277,16 +279,34 @@
  * __wait_on_buffer() just to trip a debug check.  Because debug code in inline
  * functions is bloaty.
  */
-static inline void wait_on_buffer(struct buffer_head *bh)
+
+static inline int wait_on_buffer_wq(struct buffer_head *bh, wait_queue_t *wait)
 {
 	if (buffer_locked(bh) || atomic_read(&bh->b_count) == 0)
-		__wait_on_buffer(bh);
+		return __wait_on_buffer_wq(bh, wait);
+
+	return 0;
+}
+
+static inline void wait_on_buffer(struct buffer_head *bh)
+{
+	wait_on_buffer_wq(bh, NULL);
+}
+
+static inline int lock_buffer_wq(struct buffer_head *bh, wait_queue_t *wait)
+{
+	while (test_set_buffer_locked(bh)) {
+		int ret = __wait_on_buffer_wq(bh, wait);
+		if (ret)
+			return ret;
+	}
+
+	return 0;
 }
 
 static inline void lock_buffer(struct buffer_head *bh)
 {
-	while (test_set_buffer_locked(bh))
-		__wait_on_buffer(bh);
+	lock_buffer_wq(bh, NULL);
 }
 
 #endif /* _LINUX_BUFFER_HEAD_H */
--- diff/include/linux/byteorder/swab.h	2002-10-16 04:29:06.000000000 +0100
+++ source/include/linux/byteorder/swab.h	2003-12-29 09:30:42.000000000 +0000
@@ -15,6 +15,8 @@
  *
  */
 
+#include <linux/compiler.h>
+
 /* casts are necessary for constants, because we never know how for sure
  * how U/UL/ULL map to __u16, __u32, __u64. At least not in a portable way.
  */
@@ -128,7 +130,7 @@
 #endif /* OPTIMIZE */
 
 
-static __inline__ __const__ __u16 __fswab16(__u16 x)
+static __inline__ __attribute_const__ __u16 __fswab16(__u16 x)
 {
 	return __arch__swab16(x);
 }
@@ -141,7 +143,7 @@
 	__arch__swab16s(addr);
 }
 
-static __inline__ __const__ __u32 __fswab32(__u32 x)
+static __inline__ __attribute_const__ __u32 __fswab32(__u32 x)
 {
 	return __arch__swab32(x);
 }
@@ -155,7 +157,7 @@
 }
 
 #ifdef __BYTEORDER_HAS_U64__
-static __inline__ __const__ __u64 __fswab64(__u64 x)
+static __inline__ __attribute_const__ __u64 __fswab64(__u64 x)
 {
 #  ifdef __SWAB_64_THRU_32__
 	__u32 h = x >> 32;
--- diff/include/linux/cdrom.h	2003-07-08 09:55:19.000000000 +0100
+++ source/include/linux/cdrom.h	2003-12-29 09:30:42.000000000 +0000
@@ -5,7 +5,7 @@
  *               1994, 1995   Eberhard Moenkeberg, emoenke@gwdg.de
  *               1996         David van Leeuwen, david@tm.tno.nl
  *               1997, 1998   Erik Andersen, andersee@debian.org
- *               1998-2000    Jens Axboe, axboe@suse.de
+ *               1998-2002    Jens Axboe, axboe@suse.de
  */
  
 #ifndef	_LINUX_CDROM_H
@@ -388,6 +388,9 @@
 #define CDC_DVD_R		0x10000	/* drive can write DVD-R */
 #define CDC_DVD_RAM		0x20000	/* drive can write DVD-RAM */
 #define CDC_MO_DRIVE		0x40000 /* drive is an MO device */
+#define CDC_MRW			0x80000 /* drive can read MRW */
+#define CDC_MRW_W		0x100000 /* drive can write MRW */
+#define CDC_RAM			0x200000 /* ok to open for WRITE */
 
 /* drive status possibilities returned by CDROM_DRIVE_STATUS ioctl */
 #define CDS_NO_INFO		0	/* if not implemented */
@@ -715,92 +718,57 @@
 	__u8 asb[46];
 };
 
-#ifdef __KERNEL__
-#include <linux/fs.h>		/* not really needed, later.. */
-#include <linux/device.h>
-
-struct cdrom_write_settings {
-	unsigned char fpacket;		/* fixed/variable packets */
-	unsigned long packet_size;	/* write out this number of packets */
-	unsigned long nwa;		/* next writeable address */
-	unsigned char writeable;	/* cdrom is writeable */
-};
-
-/* Uniform cdrom data structures for cdrom.c */
-struct cdrom_device_info {
-	struct cdrom_device_ops  *ops;  /* link to device_ops */
-	struct cdrom_device_info *next; /* next device_info for this major */
-	void *handle;		        /* driver-dependent data */
-/* specifications */
-	int mask;                       /* mask of capability: disables them */
-	int speed;			/* maximum speed for reading data */
-	int capacity;			/* number of discs in jukebox */
-/* device-related storage */
-	int options		: 30;	/* options flags */
-	unsigned mc_flags	: 2;	/* media change buffer flags */
-    	int use_count;                  /* number of times device opened */
-    	char name[20];                  /* name of the device type */
-/* per-device flags */
-        __u8 sanyo_slot		: 2;	/* Sanyo 3 CD changer support */
-        __u8 reserved		: 6;	/* not used yet */
-	struct cdrom_write_settings write;
-};
-
-struct cdrom_device_ops {
-/* routines */
-	int (*open) (struct cdrom_device_info *, int);
-	void (*release) (struct cdrom_device_info *);
-	int (*drive_status) (struct cdrom_device_info *, int);
-	int (*media_changed) (struct cdrom_device_info *, int);
-	int (*tray_move) (struct cdrom_device_info *, int);
-	int (*lock_door) (struct cdrom_device_info *, int);
-	int (*select_speed) (struct cdrom_device_info *, int);
-	int (*select_disc) (struct cdrom_device_info *, int);
-	int (*get_last_session) (struct cdrom_device_info *,
-				 struct cdrom_multisession *);
-	int (*get_mcn) (struct cdrom_device_info *,
-			struct cdrom_mcn *);
-	/* hard reset device */
-	int (*reset) (struct cdrom_device_info *);
-	/* play stuff */
-	int (*audio_ioctl) (struct cdrom_device_info *,unsigned int, void *);
-	/* dev-specific */
- 	int (*dev_ioctl) (struct cdrom_device_info *,
-			  unsigned int, unsigned long);
-/* driver specifications */
-	const int capability;   /* capability flags */
-	int n_minors;           /* number of active minor devices */
-	/* handle uniform packets for scsi type devices (scsi,atapi) */
-	int (*generic_packet) (struct cdrom_device_info *,
-			       struct cdrom_generic_command *);
-};
+/*
+ * feature profile
+ */
+#define CDF_MRW		0x28
 
-/* the general block_device operations structure: */
-extern int cdrom_open(struct cdrom_device_info *, struct inode *, struct file *);
-extern int cdrom_release(struct cdrom_device_info *, struct file *);
-extern int cdrom_ioctl(struct cdrom_device_info *, struct inode *, unsigned, unsigned long);
-extern int cdrom_media_changed(struct cdrom_device_info *);
+/*
+ * media status bits
+ */
+#define CDM_MRW_NOTMRW			0
+#define CDM_MRW_BGFORMAT_INACTIVE	1
+#define CDM_MRW_BGFORMAT_ACTIVE		2
+#define CDM_MRW_BGFORMAT_COMPLETE	3
 
-extern int register_cdrom(struct cdrom_device_info *cdi);
-extern int unregister_cdrom(struct cdrom_device_info *cdi);
+/*
+ * mrw address spaces
+ */
+#define MRW_LBA_DMA			0
+#define MRW_LBA_GAA			1
 
-typedef struct {
-    int data;
-    int audio;
-    int cdi;
-    int xa;
-    long error;
-} tracktype;
+/*
+ * mrw mode pages (first is deprecated) -- probed at init time and
+ * cdi->mrw_mode_page is set
+ */
+#define MRW_MODE_PC_PRE1		0x2c
+#define MRW_MODE_PC			0x03
 
-extern int cdrom_get_last_written(struct cdrom_device_info *cdi, long *last_written);
-extern int cdrom_number_of_slots(struct cdrom_device_info *cdi);
-extern int cdrom_mode_select(struct cdrom_device_info *cdi,
-			     struct cdrom_generic_command *cgc);
-extern int cdrom_mode_sense(struct cdrom_device_info *cdi,
-			    struct cdrom_generic_command *cgc,
-			    int page_code, int page_control);
-extern void init_cdrom_command(struct cdrom_generic_command *cgc,
-			       void *buffer, int len, int type);
+struct mrw_feature_desc {
+	__u16 feature_code;
+#if defined(__BIG_ENDIAN_BITFIELD)
+	__u8 reserved1		: 2;
+	__u8 feature_version	: 4;
+	__u8 persistent		: 1;
+	__u8 curr		: 1;
+#elif defined(__LITTLE_ENDIAN_BITFIELD)
+	__u8 curr		: 1;
+	__u8 persistent		: 1;
+	__u8 feature_version	: 4;
+	__u8 reserved1		: 2;
+#endif
+	__u8 add_len;
+#if defined(__BIG_ENDIAN_BITFIELD)
+	__u8 reserved2		: 7;
+	__u8 write		: 1;
+#elif defined(__LITTLE_ENDIAN_BITFIELD)
+	__u8 write		: 1;
+	__u8 reserved2		: 7;
+#endif
+	__u8 reserved3;
+	__u8 reserved4;
+	__u8 reserved5;
+};
 
 typedef struct {
 	__u16 disc_information_length;
@@ -825,9 +793,13 @@
 	__u8 did_v			: 1;
         __u8 dbc_v			: 1;
         __u8 uru			: 1;
-        __u8 reserved2			: 5;
+        __u8 reserved2			: 2;
+	__u8 dbit			: 1;
+	__u8 mrw_status			: 2;
 #elif defined(__LITTLE_ENDIAN_BITFIELD)
-        __u8 reserved2			: 5;
+	__u8 mrw_status			: 2;
+	__u8 dbit			: 1;
+        __u8 reserved2			: 2;
         __u8 uru			: 1;
         __u8 dbc_v			: 1;
 	__u8 did_v			: 1;
@@ -884,6 +856,104 @@
 	__u32 last_rec_address;
 } track_information;
 
+struct feature_header {
+	__u32 data_len;
+	__u8 reserved1;
+	__u8 reserved2;
+	__u16 curr_profile;
+};
+
+struct mode_page_header {
+	__u16 mode_data_length;
+	__u8 medium_type;
+	__u8 reserved1;
+	__u8 reserved2;
+	__u8 reserved3;
+	__u16 desc_length;
+};
+
+#ifdef __KERNEL__
+#include <linux/fs.h>		/* not really needed, later.. */
+#include <linux/device.h>
+
+/* Uniform cdrom data structures for cdrom.c */
+struct cdrom_device_info {
+	struct cdrom_device_ops  *ops;  /* link to device_ops */
+	struct cdrom_device_info *next; /* next device_info for this major */
+	void *handle;		        /* driver-dependent data */
+/* specifications */
+	int mask;                       /* mask of capability: disables them */
+	int speed;			/* maximum speed for reading data */
+	int capacity;			/* number of discs in jukebox */
+/* device-related storage */
+	int options		: 30;	/* options flags */
+	unsigned mc_flags	: 2;	/* media change buffer flags */
+    	int use_count;                  /* number of times device opened */
+    	char name[20];                  /* name of the device type */
+/* per-device flags */
+        __u8 sanyo_slot		: 2;	/* Sanyo 3 CD changer support */
+        __u8 reserved		: 6;	/* not used yet */
+	int for_data;
+	int (*exit)(struct cdrom_device_info *);
+	int mrw_mode_page;
+};
+
+struct cdrom_device_ops {
+/* routines */
+	int (*open) (struct cdrom_device_info *, int);
+	void (*release) (struct cdrom_device_info *);
+	int (*drive_status) (struct cdrom_device_info *, int);
+	int (*media_changed) (struct cdrom_device_info *, int);
+	int (*tray_move) (struct cdrom_device_info *, int);
+	int (*lock_door) (struct cdrom_device_info *, int);
+	int (*select_speed) (struct cdrom_device_info *, int);
+	int (*select_disc) (struct cdrom_device_info *, int);
+	int (*get_last_session) (struct cdrom_device_info *,
+				 struct cdrom_multisession *);
+	int (*get_mcn) (struct cdrom_device_info *,
+			struct cdrom_mcn *);
+	/* hard reset device */
+	int (*reset) (struct cdrom_device_info *);
+	/* play stuff */
+	int (*audio_ioctl) (struct cdrom_device_info *,unsigned int, void *);
+	/* dev-specific */
+ 	int (*dev_ioctl) (struct cdrom_device_info *,
+			  unsigned int, unsigned long);
+/* driver specifications */
+	const int capability;   /* capability flags */
+	int n_minors;           /* number of active minor devices */
+	/* handle uniform packets for scsi type devices (scsi,atapi) */
+	int (*generic_packet) (struct cdrom_device_info *,
+			       struct cdrom_generic_command *);
+};
+
+/* the general block_device operations structure: */
+extern int cdrom_open(struct cdrom_device_info *, struct block_device *, struct file *);
+extern int cdrom_release(struct cdrom_device_info *);
+extern int cdrom_ioctl(struct cdrom_device_info *, struct block_device *, unsigned, unsigned long);
+extern int cdrom_media_changed(struct cdrom_device_info *);
+
+extern int register_cdrom(struct cdrom_device_info *cdi);
+extern int unregister_cdrom(struct cdrom_device_info *cdi);
+
+typedef struct {
+    int data;
+    int audio;
+    int cdi;
+    int xa;
+    long error;
+} tracktype;
+
+extern int cdrom_get_last_written(struct cdrom_device_info *cdi, long *last_written);
+extern int cdrom_number_of_slots(struct cdrom_device_info *cdi);
+extern int cdrom_mode_select(struct cdrom_device_info *cdi,
+			     struct cdrom_generic_command *cgc);
+extern int cdrom_mode_sense(struct cdrom_device_info *cdi,
+			    struct cdrom_generic_command *cgc,
+			    int page_code, int page_control);
+extern void init_cdrom_command(struct cdrom_generic_command *cgc,
+			       void *buffer, int len, int type);
+
 /* The SCSI spec says there could be 256 slots. */
 #define CDROM_MAX_SLOTS	256
 
@@ -934,15 +1004,6 @@
 	mechtype_cartridge_changer  = 5
 } mechtype_t;
 
-struct mode_page_header {
-	__u16 mode_data_length;
-	__u8 medium_type;
-	__u8 reserved1;
-	__u8 reserved2;
-	__u8 reserved3;
-	__u16 desc_length;
-};
-
 typedef struct {
 #if defined(__BIG_ENDIAN_BITFIELD)
 	__u8 ps			: 1;
@@ -1032,6 +1093,41 @@
 	__u8 reserved3;
 } rpc_state_t;
 
+struct event_header {
+	__u16 data_len;
+#if defined(__BIG_ENDIAN_BITFIELD)
+	__u8 nea		: 1;
+	__u8 reserved1		: 4;
+	__u8 notification_class	: 3;
+#elif defined(__LITTLE_ENDIAN_BITFIELD)
+	__u8 notification_class	: 3;
+	__u8 reserved1		: 4;
+	__u8 nea		: 1;
+#endif
+	__u8 supp_event_class;
+};
+
+struct media_event_desc {
+#if defined(__BIG_ENDIAN_BITFIELD)
+	__u8 reserved1		: 4;
+	__u8 media_event_code	: 4;
+	__u8 reserved2		: 6;
+	__u8 media_present	: 1;
+	__u8 door_open		: 1;
+#elif defined(__LITTLE_ENDIAN_BITFIELD)
+	__u8 media_event_code	: 4;
+	__u8 reserved1		: 4;
+	__u8 door_open		: 1;
+	__u8 media_present	: 1;
+	__u8 reserved2		: 6;
+#endif
+	__u8 start_slot;
+	__u8 end_slot;
+};
+
+extern int cdrom_get_media_event(struct cdrom_device_info *cdi, struct media_event_desc *med);
+extern int cdrom_is_mrw(struct cdrom_device_info *cdi, int *write);
+
 #endif  /* End of kernel only stuff */ 
 
 #endif  /* _LINUX_CDROM_H */
--- diff/include/linux/compat.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/linux/compat.h	2003-12-29 09:30:42.000000000 +0000
@@ -44,8 +44,8 @@
 } compat_sigset_t;
 
 extern int cp_compat_stat(struct kstat *, struct compat_stat *);
-extern int get_compat_timespec(struct timespec *, struct compat_timespec *);
-extern int put_compat_timespec(struct timespec *, struct compat_timespec *);
+extern int get_compat_timespec(struct timespec *, const struct compat_timespec *);
+extern int put_compat_timespec(struct timespec *, const struct compat_timespec *);
 
 struct compat_iovec {
 	compat_uptr_t	iov_base;
@@ -76,20 +76,6 @@
 	compat_long_t	ru_nivcsw;
 };
 
-struct compat_statfs64 {
-	__u32 f_type;
-	__u32 f_bsize;
-	__u64 f_blocks;
-	__u64 f_bfree;
-	__u64 f_bavail;
-	__u64 f_files;
-	__u64 f_ffree;
-	__kernel_fsid_t f_fsid;
-	__u32 f_namelen;
-	__u32 f_frsize;
-	__u32 f_spare[5];
-};
-
 struct compat_dirent {
 	u32		d_ino;
 	compat_off_t	d_off;
--- diff/include/linux/compat_ioctl.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/linux/compat_ioctl.h	2003-12-29 09:30:42.000000000 +0000
@@ -678,3 +678,10 @@
 COMPATIBLE_IOCTL(NBD_PRINT_DEBUG)
 COMPATIBLE_IOCTL(NBD_SET_SIZE_BLOCKS)
 COMPATIBLE_IOCTL(NBD_DISCONNECT)
+/* i2c */
+COMPATIBLE_IOCTL(I2C_SLAVE)
+COMPATIBLE_IOCTL(I2C_SLAVE_FORCE)
+COMPATIBLE_IOCTL(I2C_TENBIT)
+COMPATIBLE_IOCTL(I2C_PEC)
+COMPATIBLE_IOCTL(I2C_RETRIES)
+COMPATIBLE_IOCTL(I2C_TIMEOUT)
--- diff/include/linux/compiler-gcc+.h	2003-09-30 15:46:20.000000000 +0100
+++ source/include/linux/compiler-gcc+.h	2003-12-29 09:30:42.000000000 +0000
@@ -12,3 +12,4 @@
 #define __deprecated		__attribute__((deprecated))
 #define __attribute_used__	__attribute__((__used__))
 #define __attribute_pure__	__attribute__((pure))
+#define __attribute_const__	__attribute__((__const__))
--- diff/include/linux/compiler-gcc.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/linux/compiler-gcc.h	2003-12-29 09:30:42.000000000 +0000
@@ -13,5 +13,5 @@
    shouldn't recognize the original var, and make assumptions about it */
 #define RELOC_HIDE(ptr, off)					\
   ({ unsigned long __ptr;					\
-    __asm__ ("" : "=g"(__ptr) : "0"(ptr));		\
+	__asm__ ("" : "=r"(__ptr) : "0"(ptr));			\
     (typeof(ptr)) (__ptr + (off)); })
--- diff/include/linux/compiler-gcc2.h	2003-09-30 15:46:20.000000000 +0100
+++ source/include/linux/compiler-gcc2.h	2003-12-29 09:30:42.000000000 +0000
@@ -20,4 +20,5 @@
  */
 #if __GNUC_MINOR__ >= 96
 # define __attribute_pure__	__attribute__((pure))
+# define __attribute_const__	__attribute__((__const__))
 #endif
--- diff/include/linux/compiler-gcc3.h	2003-09-30 15:46:20.000000000 +0100
+++ source/include/linux/compiler-gcc3.h	2003-12-29 09:30:42.000000000 +0000
@@ -20,3 +20,4 @@
 #endif
 
 #define __attribute_pure__	__attribute__((pure))
+#define __attribute_const__	__attribute__((__const__))
--- diff/include/linux/compiler.h	2003-11-25 15:24:59.000000000 +0000
+++ source/include/linux/compiler.h	2003-12-29 09:30:42.000000000 +0000
@@ -76,6 +76,24 @@
 # define __attribute_pure__	/* unimplemented */
 #endif
 
+/*
+ * From the GCC manual:
+ *
+ * Many functions do not examine any values except their arguments,
+ * and have no effects except the return value.  Basically this is
+ * just slightly more strict class than the `pure' attribute above,
+ * since function is not allowed to read global memory.
+ *
+ * Note that a function that has pointer arguments and examines the
+ * data pointed to must _not_ be declared `const'.  Likewise, a
+ * function that calls a non-`const' function usually must not be
+ * `const'.  It does not make sense for a `const' function to return
+ * `void'.
+ */
+#ifndef __attribute_const__
+# define __attribute_const__	/* unimplemented */
+#endif
+
 /* Optimization barrier */
 #ifndef barrier
 # define barrier() __memory_barrier()
--- diff/include/linux/config.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/linux/config.h	2003-12-29 09:30:42.000000000 +0000
@@ -2,5 +2,8 @@
 #define _LINUX_CONFIG_H
 
 #include <linux/autoconf.h>
+#if defined(__i386__) && !defined(IN_BOOTLOADER)
+#include <asm/kgdb.h>
+#endif
 
 #endif
--- diff/include/linux/cpumask.h	2003-08-26 10:00:54.000000000 +0100
+++ source/include/linux/cpumask.h	2003-12-29 09:30:42.000000000 +0000
@@ -1,42 +1,9 @@
 #ifndef __LINUX_CPUMASK_H
 #define __LINUX_CPUMASK_H
 
-#include <linux/config.h>
-#include <linux/kernel.h>
 #include <linux/threads.h>
-#include <linux/types.h>
-#include <linux/bitmap.h>
-
-#if NR_CPUS > BITS_PER_LONG && NR_CPUS != 1
-#define CPU_ARRAY_SIZE		BITS_TO_LONGS(NR_CPUS)
-
-struct cpumask
-{
-	unsigned long mask[CPU_ARRAY_SIZE];
-};
-
-typedef struct cpumask cpumask_t;
-
-#else
-typedef unsigned long cpumask_t;
-#endif
-
-#ifdef CONFIG_SMP
-#if NR_CPUS > BITS_PER_LONG
-#include <asm-generic/cpumask_array.h>
-#else
-#include <asm-generic/cpumask_arith.h>
-#endif
-#else
-#include <asm-generic/cpumask_up.h>
-#endif
-
-#if NR_CPUS <= 4*BITS_PER_LONG
-#include <asm-generic/cpumask_const_value.h>
-#else
-#include <asm-generic/cpumask_const_reference.h>
-#endif
-
+#include <asm/cpumask.h>
+#include <asm/bug.h>
 
 #ifdef CONFIG_SMP
 
@@ -53,19 +20,31 @@
 static inline int next_online_cpu(int cpu, cpumask_t map)
 {
 	do
-		cpu = next_cpu_const(cpu, map);
+		cpu = next_cpu_const(cpu, mk_cpumask_const(map));
 	while (cpu < NR_CPUS && !cpu_online(cpu));
 	return cpu;
 }
 
 #define for_each_cpu(cpu, map)						\
-	for (cpu = first_cpu_const(map);				\
+	for (cpu = first_cpu_const(mk_cpumask_const(map));		\
 		cpu < NR_CPUS;						\
-		cpu = next_cpu_const(cpu,map))
+		cpu = next_cpu_const(cpu,mk_cpumask_const(map)))
 
 #define for_each_online_cpu(cpu, map)					\
-	for (cpu = first_cpu_const(map);				\
+	for (cpu = first_cpu_const(mk_cpumask_const(map));		\
 		cpu < NR_CPUS;						\
 		cpu = next_online_cpu(cpu,map))
 
+extern int __mask_snprintf_len(char *buf, unsigned int buflen,
+		const unsigned long *maskp, unsigned int maskbytes);
+
+#define cpumask_snprintf(buf, buflen, map)				\
+	__mask_snprintf_len(buf, buflen, cpus_addr(map), sizeof(map))
+
+extern int __mask_parse_len(const char __user *ubuf, unsigned int ubuflen,
+	unsigned long *maskp, unsigned int maskbytes);
+
+#define cpumask_parse(buf, buflen, map)					\
+	__mask_parse_len(buf, buflen, cpus_addr(map), sizeof(map))
+
 #endif /* __LINUX_CPUMASK_H */
--- diff/include/linux/device.h	2003-10-27 09:20:39.000000000 +0000
+++ source/include/linux/device.h	2003-12-29 09:30:42.000000000 +0000
@@ -372,7 +372,7 @@
 extern void platform_device_unregister(struct platform_device *);
 
 extern struct bus_type platform_bus_type;
-extern struct device legacy_bus;
+extern struct device platform_bus;
 
 /* drivers/base/power.c */
 extern void device_shutdown(void);
--- diff/include/linux/efi.h	2003-08-20 14:16:34.000000000 +0100
+++ source/include/linux/efi.h	2003-12-29 09:30:42.000000000 +0000
@@ -16,6 +16,8 @@
 #include <linux/time.h>
 #include <linux/types.h>
 #include <linux/proc_fs.h>
+#include <linux/rtc.h>
+#include <linux/ioport.h>
 
 #include <asm/page.h>
 #include <asm/system.h>
@@ -77,18 +79,23 @@
 #define EFI_MAX_MEMORY_TYPE		14
 
 /* Attribute values: */
-#define EFI_MEMORY_UC		0x0000000000000001	/* uncached */
-#define EFI_MEMORY_WC		0x0000000000000002	/* write-coalescing */
-#define EFI_MEMORY_WT		0x0000000000000004	/* write-through */
-#define EFI_MEMORY_WB		0x0000000000000008	/* write-back */
-#define EFI_MEMORY_WP		0x0000000000001000	/* write-protect */
-#define EFI_MEMORY_RP		0x0000000000002000	/* read-protect */
-#define EFI_MEMORY_XP		0x0000000000004000	/* execute-protect */
-#define EFI_MEMORY_RUNTIME	0x8000000000000000	/* range requires runtime mapping */
+#define EFI_MEMORY_UC		((u64)0x0000000000000001ULL)	/* uncached */
+#define EFI_MEMORY_WC		((u64)0x0000000000000002ULL)	/* write-coalescing */
+#define EFI_MEMORY_WT		((u64)0x0000000000000004ULL)	/* write-through */
+#define EFI_MEMORY_WB		((u64)0x0000000000000008ULL)	/* write-back */
+#define EFI_MEMORY_WP		((u64)0x0000000000001000ULL)	/* write-protect */
+#define EFI_MEMORY_RP		((u64)0x0000000000002000ULL)	/* read-protect */
+#define EFI_MEMORY_XP		((u64)0x0000000000004000ULL)	/* execute-protect */
+#define EFI_MEMORY_RUNTIME	((u64)0x8000000000000000ULL)	/* range requires runtime mapping */
 #define EFI_MEMORY_DESCRIPTOR_VERSION	1
 
 #define EFI_PAGE_SHIFT		12
 
+/*
+ * For current x86 implementations of EFI, there is
+ * additional padding in the mem descriptors.  This is not
+ * the case in ia64.  Need to have this fixed in the f/w.
+ */
 typedef struct {
 	u32 type;
 	u32 pad;
@@ -96,6 +103,9 @@
 	u64 virt_addr;
 	u64 num_pages;
 	u64 attribute;
+#if defined (__i386__)
+	u64 pad1;
+#endif
 } efi_memory_desc_t;
 
 typedef int efi_freemem_callback_t (unsigned long start, unsigned long end, void *arg);
@@ -132,11 +142,12 @@
  */
 #define EFI_RESET_COLD 0
 #define EFI_RESET_WARM 1
+#define EFI_RESET_SHUTDOWN 2
 
 /*
  * EFI Runtime Services table
  */
-#define EFI_RUNTIME_SERVICES_SIGNATURE 0x5652453544e5552
+#define EFI_RUNTIME_SERVICES_SIGNATURE ((u64)0x5652453544e5552ULL)
 #define EFI_RUNTIME_SERVICES_REVISION  0x00010000
 
 typedef struct {
@@ -169,6 +180,10 @@
 typedef efi_status_t efi_get_next_high_mono_count_t (u32 *count);
 typedef void efi_reset_system_t (int reset_type, efi_status_t status,
 				 unsigned long data_size, efi_char16_t *data);
+typedef efi_status_t efi_set_virtual_address_map_t (unsigned long memory_map_size,
+						unsigned long descriptor_size,
+						u32 descriptor_version,
+						efi_memory_desc_t *virtual_map);
 
 /*
  *  EFI Configuration Table and GUID definitions
@@ -194,12 +209,15 @@
 #define HCDP_TABLE_GUID	\
     EFI_GUID(  0xf951938d, 0x620b, 0x42ef, 0x82, 0x79, 0xa8, 0x4b, 0x79, 0x61, 0x78, 0x98 )
 
+#define UGA_IO_PROTOCOL_GUID \
+    EFI_GUID(  0x61a4d49e, 0x6f68, 0x4f1b, 0xb9, 0x22, 0xa8, 0x6e, 0xed, 0xb, 0x7, 0xa2 )
+
 typedef struct {
 	efi_guid_t guid;
 	unsigned long table;
 } efi_config_table_t;
 
-#define EFI_SYSTEM_TABLE_SIGNATURE 0x5453595320494249
+#define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL)
 #define EFI_SYSTEM_TABLE_REVISION  ((1 << 16) | 00)
 
 typedef struct {
@@ -218,6 +236,13 @@
 	unsigned long tables;
 } efi_system_table_t;
 
+struct efi_memory_map {
+	efi_memory_desc_t *phys_map;
+	efi_memory_desc_t *map;
+	int nr_map;
+	unsigned long desc_version;
+};
+
 /*
  * All runtime access to EFI goes through this structure:
  */
@@ -230,6 +255,7 @@
 	void *sal_systab;		/* SAL system table */
 	void *boot_info;		/* boot info table */
 	void *hcdp;			/* HCDP table */
+	void *uga;			/* UGA table */
 	efi_get_time_t *get_time;
 	efi_set_time_t *set_time;
 	efi_get_wakeup_time_t *get_wakeup_time;
@@ -239,6 +265,7 @@
 	efi_set_variable_t *set_variable;
 	efi_get_next_high_mono_count_t *get_next_high_mono_count;
 	efi_reset_system_t *reset_system;
+	efi_set_virtual_address_map_t *set_virtual_address_map;
 } efi;
 
 static inline int
@@ -260,12 +287,25 @@
 
 extern void efi_init (void);
 extern void efi_map_pal_code (void);
+extern void efi_map_memmap(void);
 extern void efi_memmap_walk (efi_freemem_callback_t callback, void *arg);
 extern void efi_gettimeofday (struct timespec *ts);
 extern void efi_enter_virtual_mode (void);	/* switch EFI to virtual mode, if possible */
 extern u64 efi_get_iobase (void);
 extern u32 efi_mem_type (unsigned long phys_addr);
 extern u64 efi_mem_attributes (unsigned long phys_addr);
+extern void efi_initialize_iomem_resources(struct resource *code_resource,
+					struct resource *data_resource);
+extern efi_status_t phys_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc);
+extern unsigned long inline __init efi_get_time(void);
+extern int inline __init efi_set_rtc_mmss(unsigned long nowtime);
+extern struct efi_memory_map memmap;
+
+#ifdef CONFIG_EFI
+extern int efi_enabled;
+#else
+#define efi_enabled 0
+#endif
 
 /*
  * Variable Attributes
--- diff/include/linux/elevator.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/linux/elevator.h	2003-12-29 09:30:42.000000000 +0000
@@ -94,6 +94,11 @@
  */
 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 inline int elv_rq_merge_ok(struct request *, struct bio *);
--- diff/include/linux/errno.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/linux/errno.h	2003-12-29 09:30:42.000000000 +0000
@@ -22,6 +22,7 @@
 #define EBADTYPE	527	/* Type not supported by server */
 #define EJUKEBOX	528	/* Request initiated, but will not complete before timeout */
 #define EIOCBQUEUED	529	/* iocb queued, will get completion event */
+#define EIOCBRETRY	530	/* iocb queued, will trigger a retry */
 
 #endif
 
--- diff/include/linux/fs.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/linux/fs.h	2003-12-29 09:30:42.000000000 +0000
@@ -369,6 +369,7 @@
 struct inode {
 	struct hlist_node	i_hash;
 	struct list_head	i_list;
+	struct list_head	i_sb_list;
 	struct list_head	i_dentry;
 	unsigned long		i_ino;
 	atomic_t		i_count;
@@ -388,6 +389,7 @@
 	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;
@@ -480,6 +482,8 @@
 	return MAJOR(inode->i_rdev);
 }
 
+extern struct block_device *I_BDEV(struct inode *inode);
+
 struct fown_struct {
 	rwlock_t lock;          /* protects pid, uid, euid fields */
 	int pid;		/* pid or -pgrp where SIGIO should be sent */
@@ -526,6 +530,7 @@
 	/* Used by fs/eventpoll.c to link all the hooks to this file */
 	struct list_head	f_ep_links;
 	spinlock_t		f_ep_lock;
+	struct address_space	*f_mapping;
 };
 extern spinlock_t files_lock;
 #define file_list_lock() spin_lock(&files_lock);
@@ -630,6 +635,7 @@
 extern void lease_get_mtime(struct inode *, struct timespec *time);
 extern int lock_may_read(struct inode *, loff_t start, unsigned long count);
 extern int lock_may_write(struct inode *, loff_t start, unsigned long count);
+extern void steal_locks(fl_owner_t from);
 
 struct fasync_struct {
 	int	magic;
@@ -687,6 +693,7 @@
 	atomic_t		s_active;
 	void                    *s_security;
 
+	struct list_head	s_inodes;	/* all inodes */
 	struct list_head	s_dirty;	/* dirty inodes */
 	struct list_head	s_io;		/* parked for writeback */
 	struct hlist_head	s_anon;		/* anonymous dentries for (nfs) exporting */
@@ -749,6 +756,11 @@
 #define DT_SOCK		12
 #define DT_WHT		14
 
+#define OSYNC_METADATA	(1<<0)
+#define OSYNC_DATA	(1<<1)
+#define OSYNC_INODE	(1<<2)
+int generic_osync_inode(struct inode *, struct address_space *, int);
+
 /*
  * This is the "filldir" function type, used by readdir() to let
  * the kernel specify what kind of dirent layout it wants to have.
@@ -758,9 +770,9 @@
 typedef int (*filldir_t)(void *, const char *, int, loff_t, ino_t, unsigned);
 
 struct block_device_operations {
-	int (*open) (struct inode *, struct file *);
-	int (*release) (struct inode *, struct file *);
-	int (*ioctl) (struct inode *, struct file *, unsigned, unsigned long);
+	int (*open) (struct block_device *, struct file *);
+	int (*release) (struct gendisk *);
+	int (*ioctl) (struct block_device *, struct file *, unsigned, unsigned long);
 	int (*media_changed) (struct gendisk *);
 	int (*revalidate_disk) (struct gendisk *);
 	struct module *owner;
@@ -1123,11 +1135,9 @@
 extern int register_blkdev(unsigned int, const char *);
 extern int unregister_blkdev(unsigned int, const char *);
 extern struct block_device *bdget(dev_t);
-extern int bd_acquire(struct inode *inode);
 extern void bd_forget(struct inode *inode);
 extern void bdput(struct block_device *);
 extern int blkdev_open(struct inode *, struct file *);
-extern int blkdev_close(struct inode *, struct file *);
 extern struct block_device *open_by_devnum(dev_t, unsigned, int);
 extern struct file_operations def_blk_fops;
 extern struct address_space_operations def_blk_aops;
@@ -1135,7 +1145,7 @@
 extern struct file_operations bad_sock_fops;
 extern struct file_operations def_fifo_fops;
 extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long);
-extern int blkdev_ioctl(struct inode *, struct file *, unsigned, unsigned long);
+extern int blkdev_ioctl(struct block_device *, struct file *, unsigned, unsigned long);
 extern int blkdev_get(struct block_device *, mode_t, unsigned, int);
 extern int blkdev_put(struct block_device *, int);
 extern int bd_claim(struct block_device *, void *);
@@ -1202,6 +1212,7 @@
 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);
@@ -1295,8 +1306,7 @@
 extern int file_read_actor(read_descriptor_t * desc, struct page *page, unsigned long offset, unsigned long size);
 extern int file_send_actor(read_descriptor_t * desc, struct page *page, unsigned long offset, unsigned long size);
 extern ssize_t generic_file_read(struct file *, char __user *, size_t, loff_t *);
-int generic_write_checks(struct inode *inode, struct file *file,
-			loff_t *pos, size_t *count, int isblk);
+int generic_write_checks(struct file *file, loff_t *pos, size_t *count, int isblk);
 extern ssize_t generic_file_write(struct file *, const char __user *, size_t, loff_t *);
 extern ssize_t generic_file_aio_read(struct kiocb *, char __user *, size_t, loff_t);
 extern ssize_t __generic_file_aio_read(struct kiocb *, const struct iovec *, unsigned long, loff_t *);
@@ -1314,9 +1324,6 @@
 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, 
@@ -1330,7 +1337,7 @@
 					read_descriptor_t * desc,
 					read_actor_t actor)
 {
-	do_generic_mapping_read(filp->f_dentry->d_inode->i_mapping,
+	do_generic_mapping_read(filp->f_mapping,
 				&filp->f_ra,
 				filp,
 				ppos,
@@ -1338,6 +1345,32 @@
 				actor);
 }
 
+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,
+	int needs_special_locking);
+
+/*
+ * For filesystems which need locking between buffered and direct access
+ */
+static inline 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)
+{
+	return __blockdev_direct_IO(rw, iocb, inode, bdev, iov, offset,
+				nr_segs, get_blocks, end_io, 1);
+}
+
+static inline int 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))
@@ -1408,5 +1441,8 @@
 	return res;
 }
 
+/* kernel/fork.c */
+extern int unshare_files(void);
+
 #endif /* __KERNEL__ */
 #endif /* _LINUX_FS_H */
--- diff/include/linux/hugetlb.h	2003-09-30 15:46:20.000000000 +0100
+++ source/include/linux/hugetlb.h	2003-12-29 09:30:42.000000000 +0000
@@ -39,6 +39,7 @@
 
 #ifndef ARCH_HAS_HUGEPAGE_ONLY_RANGE
 #define is_hugepage_only_range(addr, len)	0
+#define hugetlb_free_pgtables(tlb, prev, start, end) do { } while (0)
 #endif
 
 #else /* !CONFIG_HUGETLB_PAGE */
@@ -63,6 +64,7 @@
 #define is_aligned_hugepage_range(addr, len)	0
 #define pmd_huge(x)	0
 #define is_hugepage_only_range(addr, len)	0
+#define hugetlb_free_pgtables(tlb, prev, start, end) do { } while (0)
 
 #ifndef HPAGE_MASK
 #define HPAGE_MASK	0		/* Keep the compiler happy */
--- diff/include/linux/i2c-dev.h	2003-06-30 10:07:24.000000000 +0100
+++ source/include/linux/i2c-dev.h	2003-12-29 09:30:42.000000000 +0000
@@ -43,4 +43,6 @@
 	__u32 nmsgs;			/* number of i2c_msgs */
 };
 
+#define  I2C_RDRW_IOCTL_MAX_MSGS	42
+
 #endif /* _LINUX_I2C_DEV_H */
--- diff/include/linux/ide.h	2003-10-27 09:20:39.000000000 +0000
+++ source/include/linux/ide.h	2003-12-29 09:30:42.000000000 +0000
@@ -51,9 +51,6 @@
 #ifndef SUPPORT_VLB_SYNC		/* 1 to support weird 32-bit chips */
 #define SUPPORT_VLB_SYNC	1	/* 0 to reduce kernel size */
 #endif
-#ifndef DISK_RECOVERY_TIME		/* off=0; on=access_delay_time */
-#define DISK_RECOVERY_TIME	0	/*  for hardware that needs it */
-#endif
 #ifndef OK_TO_RESET_CONTROLLER		/* 1 needed for good error recovery */
 #define OK_TO_RESET_CONTROLLER	1	/* 0 for use with AH2372A/B interface */
 #endif
@@ -999,10 +996,6 @@
 	unsigned	dma_extra;	/* extra addr for dma ports */
 	unsigned long	config_data;	/* for use by chipset-specific code */
 	unsigned long	select_data;	/* for use by chipset-specific code */
-#if (DISK_RECOVERY_TIME > 0)
-	unsigned long	last_time;	/* time when previous rq was done */
-#endif
-
 
 	unsigned	noprobe    : 1;	/* don't probe for this interface */
 	unsigned	present    : 1;	/* this interface exists */
@@ -1693,6 +1686,8 @@
 #define GOOD_DMA_DRIVE		1
 
 #ifdef CONFIG_BLK_DEV_IDEDMA_PCI
+extern int ide_build_sglist(ide_drive_t *, struct request *);
+extern int ide_raw_build_sglist(ide_drive_t *, struct request *);
 extern int ide_build_dmatable(ide_drive_t *, struct request *);
 extern void ide_destroy_dmatable(ide_drive_t *);
 extern ide_startstop_t ide_dma_intr(ide_drive_t *);
--- diff/include/linux/init_task.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/linux/init_task.h	2003-12-29 09:30:42.000000000 +0000
@@ -108,6 +108,7 @@
 	.proc_lock	= SPIN_LOCK_UNLOCKED,				\
 	.switch_lock	= SPIN_LOCK_UNLOCKED,				\
 	.journal_info	= NULL,						\
+	.io_wait	= NULL,						\
 }
 
 
--- diff/include/linux/input.h	2003-09-30 15:46:20.000000000 +0100
+++ source/include/linux/input.h	2003-12-29 09:30:42.000000000 +0000
@@ -870,6 +870,7 @@
 	char *name;
 
 	struct input_device_id *id_table;
+	struct input_device_id *blacklist;
 
 	struct list_head	h_list;
 	struct list_head	node;
--- diff/include/linux/jiffies.h	2003-05-21 11:49:51.000000000 +0100
+++ source/include/linux/jiffies.h	2003-12-29 09:30:42.000000000 +0000
@@ -10,7 +10,7 @@
 
 /*
  * The 64-bit value is not volatile - you MUST NOT read it
- * without holding read_lock_irq(&xtime_lock).
+ * without sampling the sequence number in xtime_lock.
  * get_jiffies_64() will do this for you as appropriate.
  */
 extern u64 jiffies_64;
--- diff/include/linux/kernel.h	2003-10-27 09:20:44.000000000 +0000
+++ source/include/linux/kernel.h	2003-12-29 09:30:42.000000000 +0000
@@ -87,6 +87,8 @@
 asmlinkage int printk(const char * fmt, ...)
 	__attribute__ ((format (printf, 1, 2)));
 
+unsigned long int_sqrt(unsigned long);
+
 static inline void console_silent(void)
 {
 	console_loglevel = 0;
--- diff/include/linux/keyboard.h	2003-02-26 16:00:55.000000000 +0000
+++ source/include/linux/keyboard.h	2003-12-29 09:30:42.000000000 +0000
@@ -2,7 +2,6 @@
 #define __LINUX_KEYBOARD_H
 
 #include <linux/wait.h>
-#include <linux/input.h>
 
 #define KG_SHIFT	0
 #define KG_CTRL		2
@@ -17,7 +16,7 @@
 
 #define NR_SHIFT	9
 
-#define NR_KEYS		(KEY_MAX+1)
+#define NR_KEYS		255
 #define MAX_NR_KEYMAPS	256
 /* This means 128Kb if all keymaps are allocated. Only the superuser
 	may increase the number of keymaps beyond MAX_NR_OF_USER_KEYMAPS. */
--- diff/include/linux/kmod.h	2003-09-17 12:28:12.000000000 +0100
+++ source/include/linux/kmod.h	2003-12-29 09:30:42.000000000 +0000
@@ -24,6 +24,8 @@
 #include <linux/compiler.h>
 
 #ifdef CONFIG_KMOD
+/* modprobe exit status on success, -ve on error.  Return value
+ * usually useless though. */
 extern int request_module(const char * name, ...) __attribute__ ((format (printf, 1, 2)));
 #else
 static inline int request_module(const char * name, ...) { return -ENOSYS; }
--- diff/include/linux/list.h	2003-12-19 09:51:11.000000000 +0000
+++ source/include/linux/list.h	2003-12-29 09:30:42.000000000 +0000
@@ -142,8 +142,11 @@
  * Note: list_empty on entry does not return true after this, the entry is
  * in an undefined state.
  */
+#include <linux/kernel.h>	/* BUG_ON */
 static inline void list_del(struct list_head *entry)
 {
+	BUG_ON(entry->prev->next != entry);
+	BUG_ON(entry->next->prev != entry);
 	__list_del(entry->prev, entry->next);
 	entry->next = LIST_POISON1;
 	entry->prev = LIST_POISON2;
@@ -212,6 +215,12 @@
  * list_empty_careful - tests whether a list is
  * empty _and_ checks that no other CPU might be
  * in the process of still modifying either member
+ *
+ * NOTE: using list_empty_careful() without synchronization
+ * can only be safe if the only activity that can happen
+ * to the list entry is list_del_init(). Eg. it cannot be used
+ * if another CPU could re-list_add() it.
+ *
  * @head: the list to test.
  */
 static inline int list_empty_careful(const struct list_head *head)
--- diff/include/linux/loop.h	2003-08-20 14:16:34.000000000 +0100
+++ source/include/linux/loop.h	2003-12-29 09:30:42.000000000 +0000
@@ -34,8 +34,9 @@
 	loff_t		lo_sizelimit;
 	int		lo_flags;
 	int		(*transfer)(struct loop_device *, int cmd,
-				    char *raw_buf, char *loop_buf, int size,
-				    sector_t real_block);
+				    struct page *raw_page, unsigned raw_off,
+				    struct page *loop_page, unsigned loop_off,
+				    int size, sector_t real_block);
 	char		lo_file_name[LO_NAME_SIZE];
 	char		lo_crypt_name[LO_NAME_SIZE];
 	char		lo_encrypt_key[LO_KEY_SIZE];
@@ -70,8 +71,7 @@
 /*
  * Loop flags
  */
-#define LO_FLAGS_DO_BMAP	1
-#define LO_FLAGS_READ_ONLY	2
+#define LO_FLAGS_READ_ONLY	1
 
 #include <asm/posix_types.h>	/* for __kernel_old_dev_t */
 #include <asm/types.h>		/* for __u64 */
@@ -128,8 +128,10 @@
 /* Support for loadable transfer modules */
 struct loop_func_table {
 	int number;	/* filter type */ 
-	int (*transfer)(struct loop_device *lo, int cmd, char *raw_buf,
-			char *loop_buf, int size, sector_t real_block);
+	int (*transfer)(struct loop_device *lo, int cmd,
+			struct page *raw_page, unsigned raw_off,
+			struct page *loop_page, unsigned loop_off,
+			int size, sector_t real_block);
 	int (*init)(struct loop_device *, const struct loop_info64 *); 
 	/* release is called from loop_unregister_transfer or clr_fd */
 	int (*release)(struct loop_device *); 
--- diff/include/linux/miscdevice.h	2003-09-30 15:46:20.000000000 +0100
+++ source/include/linux/miscdevice.h	2003-12-29 09:30:42.000000000 +0000
@@ -36,12 +36,15 @@
 
 #define TUN_MINOR	     200
 
+struct device;
+
 struct miscdevice 
 {
 	int minor;
 	const char *name;
 	struct file_operations *fops;
 	struct list_head list;
+	struct device *dev;
 	char devfs_name[64];
 };
 
--- diff/include/linux/mm.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/linux/mm.h	2003-12-29 09:30:42.000000000 +0000
@@ -143,7 +143,7 @@
 struct vm_operations_struct {
 	void (*open)(struct vm_area_struct * area);
 	void (*close)(struct vm_area_struct * area);
-	struct page * (*nopage)(struct vm_area_struct * area, unsigned long address, int unused);
+	struct page * (*nopage)(struct vm_area_struct * area, unsigned long address, int *type);
 	int (*populate)(struct vm_area_struct * area, unsigned long address, unsigned long len, pgprot_t prot, unsigned long pgoff, int nonblock);
 };
 
@@ -322,8 +322,10 @@
 /*
  * The zone field is never updated after free_area_init_core()
  * sets it, so none of the operations on it need to be atomic.
+ * We'll have up to log2(MAX_NUMNODES * MAX_NR_ZONES) zones
+ * total, so we use NODES_SHIFT here to get enough bits.
  */
-#define ZONE_SHIFT (BITS_PER_LONG - 8)
+#define ZONE_SHIFT (BITS_PER_LONG - NODES_SHIFT - MAX_NR_ZONES_SHIFT)
 
 struct zone;
 extern struct zone *zone_table[];
@@ -405,7 +407,7 @@
 extern void show_free_areas(void);
 
 struct page *shmem_nopage(struct vm_area_struct * vma,
-			unsigned long address, int unused);
+			unsigned long address, int *type);
 struct file *shmem_file_setup(char * name, loff_t size, unsigned long flags);
 void shmem_lock(struct file * file, int lock);
 int shmem_zero_setup(struct vm_area_struct *);
@@ -563,7 +565,7 @@
 extern void truncate_inode_pages(struct address_space *, loff_t);
 
 /* generic vm_area_ops exported for stackable file systems */
-extern struct page *filemap_nopage(struct vm_area_struct *, unsigned long, int);
+struct page *filemap_nopage(struct vm_area_struct *, unsigned long, int *);
 
 /* mm/page-writeback.c */
 int write_one_page(struct page *page, int wait);
--- diff/include/linux/mmzone.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/linux/mmzone.h	2003-12-29 09:30:42.000000000 +0000
@@ -159,7 +159,10 @@
 #define ZONE_DMA		0
 #define ZONE_NORMAL		1
 #define ZONE_HIGHMEM		2
-#define MAX_NR_ZONES		3
+
+#define MAX_NR_ZONES		3	/* Sync this with MAX_NR_ZONES_SHIFT */
+#define MAX_NR_ZONES_SHIFT	2	/* ceil(log2(MAX_NR_ZONES)) */
+
 #define GFP_ZONEMASK	0x03
 
 /*
@@ -284,8 +287,6 @@
 struct file;
 int min_free_kbytes_sysctl_handler(struct ctl_table *, int, struct file *, 
 					  void *, size_t *);
-extern void setup_per_zone_pages_min(void);
-
 
 #ifdef CONFIG_NUMA
 #define MAX_NR_MEMBLKS	BITS_PER_LONG /* Max number of Memory Blocks */
--- diff/include/linux/msdos_fs.h	2003-08-20 14:16:34.000000000 +0100
+++ source/include/linux/msdos_fs.h	2003-12-29 09:30:42.000000000 +0000
@@ -4,13 +4,8 @@
 /*
  * The MS-DOS filesystem constants/structures
  */
-#include <linux/buffer_head.h>
-#include <linux/string.h>
 #include <asm/byteorder.h>
 
-struct statfs;
-
-
 #define SECTOR_SIZE	512		/* sector size (bytes) */
 #define SECTOR_BITS	9		/* log2(SECTOR_SIZE) */
 #define MSDOS_DPB	(MSDOS_DPS)	/* dir entries per block */
@@ -18,6 +13,9 @@
 #define MSDOS_DPS	(SECTOR_SIZE / sizeof(struct msdos_dir_entry))
 #define MSDOS_DPS_BITS	4		/* log2(MSDOS_DPS) */
 
+
+#define MSDOS_SUPER_MAGIC 0x4d44 /* MD */
+
 #define MSDOS_ROOT_INO	1	/* == MINIX_ROOT_INO */
 #define MSDOS_DIR_BITS	5	/* log2(sizeof(struct msdos_dir_entry)) */
 
@@ -25,8 +23,6 @@
 #define FAT_MAX_DIR_ENTRIES	(65536)
 #define FAT_MAX_DIR_SIZE	(FAT_MAX_DIR_ENTRIES << MSDOS_DIR_BITS)
 
-#define MSDOS_SUPER_MAGIC 0x4d44 /* MD */
-
 #define ATTR_NONE    0 /* no attribute bits */
 #define ATTR_RO      1  /* read-only */
 #define ATTR_HIDDEN  2  /* hidden */
@@ -35,10 +31,10 @@
 #define ATTR_DIR     16 /* directory */
 #define ATTR_ARCH    32 /* archived */
 
+/* attribute bits that are copied "as is" */
 #define ATTR_UNUSED  (ATTR_VOLUME | ATTR_ARCH | ATTR_SYS | ATTR_HIDDEN)
-	/* attribute bits that are copied "as is" */
+/* bits that are used by the Windows 95/Windows NT extended FAT */
 #define ATTR_EXT     (ATTR_RO | ATTR_HIDDEN | ATTR_SYS | ATTR_VOLUME)
-	/* bits that are used by the Windows 95/Windows NT extended FAT */
 
 #define CASE_LOWER_BASE 8	/* base is lower case */
 #define CASE_LOWER_EXT  16	/* extension is lower case */
@@ -46,8 +42,12 @@
 #define DELETED_FLAG 0xe5 /* marks file as deleted when in name[0] */
 #define IS_FREE(n) (!*(n) || *(n) == DELETED_FLAG)
 
+/* valid file mode bits */
 #define MSDOS_VALID_MODE (S_IFREG | S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO)
-	/* valid file mode bits */
+/* Convert attribute bits and a mask to the UNIX mode. */
+#define MSDOS_MKMODE(a, m) (m & (a & ATTR_RO ? S_IRUGO|S_IXUGO : S_IRWXUGO))
+/* Convert the UNIX mode to MS-DOS attribute bits. */
+#define MSDOS_MKATTR(m) ((m & S_IWUGO) ? ATTR_NONE : ATTR_RO)
 
 #define MSDOS_NAME 11 /* maximum name length */
 #define MSDOS_LONGNAME 256 /* maximum name length */
@@ -55,24 +55,29 @@
 #define MSDOS_DOT    ".          " /* ".", padded to MSDOS_NAME chars */
 #define MSDOS_DOTDOT "..         " /* "..", padded to MSDOS_NAME chars */
 
-#define MSDOS_FAT12 4084 /* maximum number of clusters in a 12 bit FAT */
-
 /* media of boot sector */
 #define FAT_VALID_MEDIA(x)	((0xF8 <= (x) && (x) <= 0xFF) || (x) == 0xF0)
 #define FAT_FIRST_ENT(s, x)	((MSDOS_SB(s)->fat_bits == 32 ? 0x0FFFFF00 : \
 	MSDOS_SB(s)->fat_bits == 16 ? 0xFF00 : 0xF00) | (x))
 
+/* maximum number of clusters */
+#define MAX_FAT12 0xFF4
+#define MAX_FAT16 0xFFF4
+#define MAX_FAT32 0x0FFFFFF6
+#define MAX_FAT(s) (MSDOS_SB(s)->fat_bits == 32 ? MAX_FAT32 : \
+	MSDOS_SB(s)->fat_bits == 16 ? MAX_FAT16 : MAX_FAT12)
+
 /* bad cluster mark */
 #define BAD_FAT12 0xFF7
 #define BAD_FAT16 0xFFF7
-#define BAD_FAT32 0xFFFFFF7
+#define BAD_FAT32 0x0FFFFFF7
 #define BAD_FAT(s) (MSDOS_SB(s)->fat_bits == 32 ? BAD_FAT32 : \
 	MSDOS_SB(s)->fat_bits == 16 ? BAD_FAT16 : BAD_FAT12)
 
 /* standard EOF */
 #define EOF_FAT12 0xFFF
 #define EOF_FAT16 0xFFFF
-#define EOF_FAT32 0xFFFFFFF
+#define EOF_FAT32 0x0FFFFFFF
 #define EOF_FAT(s) (MSDOS_SB(s)->fat_bits == 32 ? EOF_FAT32 : \
 	MSDOS_SB(s)->fat_bits == 16 ? EOF_FAT16 : EOF_FAT12)
 
@@ -80,8 +85,8 @@
 #define FAT_ENT_BAD	(BAD_FAT32)
 #define FAT_ENT_EOF	(EOF_FAT32)
 
-#define FAT_FSINFO_SIG1		0x41615252
-#define FAT_FSINFO_SIG2		0x61417272
+#define FAT_FSINFO_SIG1	0x41615252
+#define FAT_FSINFO_SIG2	0x61417272
 #define IS_FSINFO(x)	(CF_LE_L((x)->signature1) == FAT_FSINFO_SIG1	\
 			 && CF_LE_L((x)->signature2) == FAT_FSINFO_SIG2)
 
@@ -179,15 +184,10 @@
 	loff_t i_pos;		       /* on-disk position of directory entry */
 };
 
-/* Convert attribute bits and a mask to the UNIX mode. */
-#define MSDOS_MKMODE(a,m) (m & (a & ATTR_RO ? S_IRUGO|S_IXUGO : S_IRWXUGO))
-
-/* Convert the UNIX mode to MS-DOS attribute bits. */
-#define MSDOS_MKATTR(m) ((m & S_IWUGO) ? ATTR_NONE : ATTR_RO)
-
-
 #ifdef __KERNEL__
 
+#include <linux/buffer_head.h>
+#include <linux/string.h>
 #include <linux/nls.h>
 #include <linux/msdos_fs_i.h>
 #include <linux/msdos_fs_sb.h>
--- diff/include/linux/msdos_fs_sb.h	2003-08-20 14:16:14.000000000 +0100
+++ source/include/linux/msdos_fs_sb.h	2003-12-29 09:30:42.000000000 +0000
@@ -47,9 +47,9 @@
 	unsigned long data_start;    /* first data sector */
 	unsigned long clusters;      /* number of clusters */
 	unsigned long root_cluster;  /* first cluster of the root directory */
-	unsigned long fsinfo_sector; /* FAT32 fsinfo offset from start of disk */
+	unsigned long fsinfo_sector; /* sector number of FAT32 fsinfo */
 	struct semaphore fat_lock;
-	int prev_free;               /* previously returned free cluster number */
+	int prev_free;               /* previously allocated cluster number */
 	int free_clusters;           /* -1 if undefined */
 	struct fat_mount_options options;
 	struct nls_table *nls_disk;  /* Codepage used on disk */
--- diff/include/linux/nbd.h	2003-07-22 18:54:27.000000000 +0100
+++ source/include/linux/nbd.h	2003-12-29 09:30:42.000000000 +0000
@@ -35,6 +35,9 @@
 /* Define PARANOIA to include extra sanity checking code in here & driver */
 #define PARANOIA
 
+/* userspace doesn't need the nbd_device structure */
+#ifdef __KERNEL__
+
 struct nbd_device {
 	int flags;
 	int harderror;		/* Code of hard error			*/
@@ -53,6 +56,8 @@
 	u64 bytesize;
 };
 
+#endif
+
 /* This now IS in some kind of include file...	*/
 
 /* These are send over network in request/reply magic field */
--- diff/include/linux/netdevice.h	2003-11-25 15:24:59.000000000 +0000
+++ source/include/linux/netdevice.h	2003-12-29 09:30:42.000000000 +0000
@@ -456,6 +456,13 @@
 	/* bridge stuff */
 	struct net_bridge_port	*br_port;
 
+#ifdef CONFIG_KGDB
+	int			kgdb_is_trapped;
+#endif
+#ifdef CONFIG_NET_POLL_CONTROLLER
+	void			(*poll_controller)(struct net_device *);
+#endif
+
 #ifdef CONFIG_NET_FASTROUTE
 #define NETDEV_FASTROUTE_HMASK 0xF
 	/* Semi-private data. Keep it at the end of device struct. */
@@ -533,6 +540,11 @@
 extern struct net_device	*dev_get_by_index(int ifindex);
 extern struct net_device	*__dev_get_by_index(int ifindex);
 extern int		dev_restart(struct net_device *dev);
+#ifdef CONFIG_KGDB
+extern int		kgdb_eth_is_trapped(void);
+extern int		kgdb_net_interrupt(struct sk_buff *skb);
+extern void		kgdb_send_arp_request(void);
+#endif
 
 typedef int gifconf_func_t(struct net_device * dev, char * bufptr, int len);
 extern int		register_gifconf(unsigned int family, gifconf_func_t * gifconf);
@@ -591,12 +603,22 @@
 
 static inline void netif_wake_queue(struct net_device *dev)
 {
+#ifdef CONFIG_KGDB
+	if (kgdb_eth_is_trapped()) {
+		return;
+	}
+#endif
 	if (test_and_clear_bit(__LINK_STATE_XOFF, &dev->state))
 		__netif_schedule(dev);
 }
 
 static inline void netif_stop_queue(struct net_device *dev)
 {
+#ifdef CONFIG_KGDB
+	if (kgdb_eth_is_trapped()) {
+		return;
+	}
+#endif
 	set_bit(__LINK_STATE_XOFF, &dev->state);
 }
 
--- diff/include/linux/page-flags.h	2003-09-17 12:28:12.000000000 +0100
+++ source/include/linux/page-flags.h	2003-12-29 09:30:42.000000000 +0000
@@ -133,6 +133,7 @@
 
 #define inc_page_state(member)	mod_page_state(member, 1UL)
 #define dec_page_state(member)	mod_page_state(member, 0UL - 1)
+#define add_page_state(member,delta) mod_page_state(member, (delta))
 #define sub_page_state(member,delta) mod_page_state(member, 0UL - (delta))
 
 
--- diff/include/linux/pagemap.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/linux/pagemap.h	2003-12-29 09:30:42.000000000 +0000
@@ -8,7 +8,6 @@
 #include <linux/fs.h>
 #include <linux/list.h>
 #include <linux/highmem.h>
-#include <linux/pagemap.h>
 #include <asm/uaccess.h>
 #include <linux/gfp.h>
 
@@ -71,7 +70,7 @@
 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,
+				pgoff_t *next, unsigned int nr_pages,
 				struct page **pages);
 
 /*
@@ -153,17 +152,27 @@
 extern void FASTCALL(__lock_page(struct page *page));
 extern void FASTCALL(unlock_page(struct page *page));
 
-static inline void lock_page(struct page *page)
+
+extern int FASTCALL(__lock_page_wq(struct page *page, wait_queue_t *wait));
+static inline int lock_page_wq(struct page *page, wait_queue_t *wait)
 {
 	if (TestSetPageLocked(page))
-		__lock_page(page);
+		return __lock_page_wq(page, wait);
+	else
+		return 0;
+}
+
+static inline void lock_page(struct page *page)
+{
+	lock_page_wq(page, NULL);
 }
 	
 /*
  * This is exported only for wait_on_page_locked/wait_on_page_writeback.
  * Never use this directly!
  */
-extern void FASTCALL(wait_on_page_bit(struct page *page, int bit_nr));
+extern int FASTCALL(wait_on_page_bit_wq(struct page *page, int bit_nr,
+	wait_queue_t *wait));
 
 /* 
  * Wait for a page to be unlocked.
@@ -172,19 +181,33 @@
  * ie with increased "page->count" so that the page won't
  * go away during the wait..
  */
-static inline void wait_on_page_locked(struct page *page)
+static inline int wait_on_page_locked_wq(struct page *page, wait_queue_t *wait)
 {
 	if (PageLocked(page))
-		wait_on_page_bit(page, PG_locked);
+		return wait_on_page_bit_wq(page, PG_locked, wait);
+	return 0;
+}
+
+static inline int wait_on_page_writeback_wq(struct page *page,
+						wait_queue_t *wait)
+{
+	if (PageWriteback(page))
+		return wait_on_page_bit_wq(page, PG_writeback, wait);
+	return 0;
+}
+
+static inline void wait_on_page_locked(struct page *page)
+{
+	wait_on_page_locked_wq(page, NULL);
 }
 
 /* 
  * Wait for a page to complete writeback
  */
+
 static inline void wait_on_page_writeback(struct page *page)
 {
-	if (PageWriteback(page))
-		wait_on_page_bit(page, PG_writeback);
+	wait_on_page_writeback_wq(page, NULL);
 }
 
 extern void end_page_writeback(struct page *page);
--- diff/include/linux/pagevec.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/linux/pagevec.h	2003-12-29 09:30:42.000000000 +0000
@@ -23,7 +23,7 @@
 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);
+		pgoff_t *next, unsigned int nr_pages);
 
 static inline void pagevec_init(struct pagevec *pvec, int cold)
 {
--- diff/include/linux/parser.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/linux/parser.h	2003-12-29 09:30:42.000000000 +0000
@@ -1,3 +1,14 @@
+/*
+ * linux/include/linux/parser.h
+ *
+ * Header for lib/parser.c
+ * Intended use of these functions is parsing filesystem argument lists,
+ * but could potentially be used anywhere else that simple option=arg
+ * parsing is required.
+ */
+
+
+/* associates an integer enumerator with a pattern string. */
 struct match_token {
 	int token;
 	char *pattern;
@@ -5,15 +16,16 @@
 
 typedef struct match_token match_table_t[];
 
+/* Maximum number of arguments that match_token will find in a pattern */
 enum {MAX_OPT_ARGS = 3};
 
+/* Describe the location within a string of a substring */
 typedef struct {
 	char *from;
 	char *to;
 } substring_t;
 
-int match_token(char *s, match_table_t table, substring_t args[]);
-
+int match_token(char *, match_table_t table, substring_t args[]);
 int match_int(substring_t *, int *result);
 int match_octal(substring_t *, int *result);
 int match_hex(substring_t *, int *result);
--- diff/include/linux/pci.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/linux/pci.h	2003-12-29 09:30:42.000000000 +0000
@@ -36,6 +36,7 @@
 #define  PCI_COMMAND_WAIT 	0x80	/* Enable address/data stepping */
 #define  PCI_COMMAND_SERR	0x100	/* Enable SERR */
 #define  PCI_COMMAND_FAST_BACK	0x200	/* Enable back-to-back writes */
+#define  PCI_COMMAND_INTX_DISABLE 0x400 /* INTx Emulation Disable */
 
 #define PCI_STATUS		0x06	/* 16 bits */
 #define  PCI_STATUS_CAP_LIST	0x10	/* Support Capability List */
@@ -198,6 +199,8 @@
 #define  PCI_CAP_ID_MSI		0x05	/* Message Signalled Interrupts */
 #define  PCI_CAP_ID_CHSWP	0x06	/* CompactPCI HotSwap */
 #define  PCI_CAP_ID_PCIX	0x07	/* PCI-X */
+#define  PCI_CAP_ID_EXP 	0x10	/* PCI Express */
+#define  PCI_CAP_ID_MSIX	0x11	/* MSI-X */
 #define PCI_CAP_LIST_NEXT	1	/* Next capability in the list */
 #define PCI_CAP_FLAGS		2	/* Capability defined flags (16 bits) */
 #define PCI_CAP_SIZEOF		4
@@ -275,11 +278,13 @@
 #define  PCI_MSI_FLAGS_QSIZE	0x70	/* Message queue size configured */
 #define  PCI_MSI_FLAGS_QMASK	0x0e	/* Maximum queue size available */
 #define  PCI_MSI_FLAGS_ENABLE	0x01	/* MSI feature enabled */
+#define  PCI_MSI_FLAGS_MASKBIT	0x100	/* 64-bit mask bits allowed */
 #define PCI_MSI_RFU		3	/* Rest of capability flags */
 #define PCI_MSI_ADDRESS_LO	4	/* Lower 32 bits */
 #define PCI_MSI_ADDRESS_HI	8	/* Upper 32 bits (if PCI_MSI_FLAGS_64BIT set) */
 #define PCI_MSI_DATA_32		8	/* 16 bits of data for 32-bit devices */
 #define PCI_MSI_DATA_64		12	/* 16 bits of data for 64-bit devices */
+#define PCI_MSI_MASK_BIT	16	/* Mask bits register */
 
 /* CompactPCI Hotswap Register */
 
@@ -695,6 +700,18 @@
 extern struct pci_dev *isa_bridge;
 #endif
 
+#ifndef CONFIG_PCI_USE_VECTOR
+static inline void pci_scan_msi_device(struct pci_dev *dev) {}
+static inline int pci_enable_msi(struct pci_dev *dev) {return -1;}
+static inline void msi_remove_pci_irq_vectors(struct pci_dev *dev) {}
+#else
+extern void pci_scan_msi_device(struct pci_dev *dev);
+extern int pci_enable_msi(struct pci_dev *dev);
+extern void msi_remove_pci_irq_vectors(struct pci_dev *dev);
+extern int msi_alloc_vectors(struct pci_dev* dev, int *vector, int nvec);
+extern int msi_free_vectors(struct pci_dev* dev, int *vector, int nvec);
+#endif
+
 #endif /* CONFIG_PCI */
 
 /* Include architecture-dependent settings and functions */
--- diff/include/linux/pci_ids.h	2003-11-25 15:24:59.000000000 +0000
+++ source/include/linux/pci_ids.h	2003-12-29 09:30:42.000000000 +0000
@@ -882,6 +882,7 @@
 
 #define PCI_DEVICE_ID_SII_680		0x0680
 #define PCI_DEVICE_ID_SII_3112		0x3112
+#define PCI_DEVICE_ID_SII_3114		0x3114
 #define PCI_DEVICE_ID_SII_1210SA	0x0240
 
 #define PCI_VENDOR_ID_VISION		0x1098
@@ -900,6 +901,7 @@
 
 #define PCI_VENDOR_ID_SGI		0x10a9
 #define PCI_DEVICE_ID_SGI_IOC3		0x0003
+#define PCI_DEVICE_ID_SGI_IOC4		0x100a
 #define PCI_VENDOR_ID_SGI_LITHIUM	0x1002
 
 #define PCI_VENDOR_ID_ACC		0x10aa
@@ -2052,6 +2054,7 @@
 #define PCI_DEVICE_ID_INTEL_82443MX_3	0x719b
 #define PCI_DEVICE_ID_INTEL_82443GX_0	0x71a0
 #define PCI_DEVICE_ID_INTEL_82443GX_1	0x71a1
+#define PCI_DEVICE_ID_INTEL_82443GX_2	0x71a2
 #define PCI_DEVICE_ID_INTEL_82372FB_0	0x7600
 #define PCI_DEVICE_ID_INTEL_82372FB_1	0x7601
 #define PCI_DEVICE_ID_INTEL_82372FB_2	0x7602
--- diff/include/linux/percpu_counter.h	2003-05-21 11:50:16.000000000 +0100
+++ source/include/linux/percpu_counter.h	2003-12-29 09:30:42.000000000 +0000
@@ -8,17 +8,14 @@
 #include <linux/spinlock.h>
 #include <linux/smp.h>
 #include <linux/threads.h>
+#include <linux/percpu.h>
 
 #ifdef CONFIG_SMP
 
-struct __percpu_counter {
-	long count;
-} ____cacheline_aligned;
-
 struct percpu_counter {
 	spinlock_t lock;
 	long count;
-	struct __percpu_counter counters[NR_CPUS];
+	long *counters;
 };
 
 #if NR_CPUS >= 16
@@ -29,12 +26,14 @@
 
 static inline void percpu_counter_init(struct percpu_counter *fbc)
 {
-	int i;
-
 	spin_lock_init(&fbc->lock);
 	fbc->count = 0;
-	for (i = 0; i < NR_CPUS; i++)
-		fbc->counters[i].count = 0;
+	fbc->counters = alloc_percpu(long);
+}
+
+static inline void percpu_counter_destroy(struct percpu_counter *fbc)
+{
+	free_percpu(fbc->counters);
 }
 
 void percpu_counter_mod(struct percpu_counter *fbc, long amount);
@@ -69,6 +68,10 @@
 	fbc->count = 0;
 }
 
+static inline void percpu_counter_destroy(struct percpu_counter *fbc)
+{
+}
+
 static inline void
 percpu_counter_mod(struct percpu_counter *fbc, long amount)
 {
--- diff/include/linux/proc_fs.h	2003-09-30 15:46:20.000000000 +0100
+++ source/include/linux/proc_fs.h	2003-12-29 09:30:42.000000000 +0000
@@ -141,6 +141,8 @@
 extern struct proc_dir_entry *proc_symlink(const char *,
 		struct proc_dir_entry *, const char *);
 extern struct proc_dir_entry *proc_mkdir(const char *,struct proc_dir_entry *);
+extern struct proc_dir_entry *proc_mkdir_mode(const char *name, mode_t mode,
+			struct proc_dir_entry *parent);
 
 static inline struct proc_dir_entry *create_proc_read_entry(const char *name,
 	mode_t mode, struct proc_dir_entry *base, 
--- diff/include/linux/quota.h	2003-08-20 14:16:34.000000000 +0100
+++ source/include/linux/quota.h	2003-12-29 09:30:42.000000000 +0000
@@ -250,7 +250,7 @@
 	void (*free_space) (struct inode *, qsize_t);
 	void (*free_inode) (const struct inode *, unsigned long);
 	int (*transfer) (struct inode *, struct iattr *);
-	int (*sync_dquot) (struct dquot *);
+	int (*write_dquot) (struct dquot *);
 };
 
 /* Operations handling requests from userspace */
--- diff/include/linux/sched.h	2003-11-25 15:24:59.000000000 +0000
+++ source/include/linux/sched.h	2003-12-29 09:30:42.000000000 +0000
@@ -151,6 +151,7 @@
 
 extern void show_state(void);
 extern void show_regs(struct pt_regs *);
+extern void show_trace_task(task_t *tsk);
 
 /*
  * TASK is a pointer to the task whose backtrace we want to see (or NULL for current
@@ -205,7 +206,6 @@
 	unsigned long rss, total_vm, locked_vm;
 	unsigned long def_flags;
 	cpumask_t cpu_vm_mask;
-	unsigned long swap_address;
 
 	unsigned long saved_auxv[40]; /* for /proc/PID/auxv */
 
@@ -464,6 +464,13 @@
 
 	unsigned long ptrace_message;
 	siginfo_t *last_siginfo; /* For ptrace use.  */
+/*
+ * current io wait handle: wait queue entry to use for io waits
+ * If this thread is processing aio, this points at the waitqueue
+ * inside the currently handled kiocb. It may be NULL (i.e. default
+ * to a stack based synchronous wait) if its doing sync IO.
+ */
+	wait_queue_t *io_wait;
 };
 
 static inline pid_t process_group(struct task_struct *tsk)
--- diff/include/linux/serial_core.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/linux/serial_core.h	2003-12-29 09:30:42.000000000 +0000
@@ -158,7 +158,9 @@
 	unsigned char		x_char;			/* xon/xoff char */
 	unsigned char		regshift;		/* reg offset shift */
 	unsigned char		iotype;			/* io access style */
-
+#ifdef CONFIG_KGDB
+	int			kgdb;			/* in use by kgdb */
+#endif
 #define UPIO_PORT		(0)
 #define UPIO_HUB6		(1)
 #define UPIO_MEM		(2)
--- diff/include/linux/serio.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/linux/serio.h	2003-12-29 09:30:42.000000000 +0000
@@ -49,6 +49,7 @@
 	irqreturn_t (*interrupt)(struct serio *, unsigned char,
 			unsigned int, struct pt_regs *);
 	void (*connect)(struct serio *, struct serio_dev *dev);
+	int  (*reconnect)(struct serio *);
 	void (*disconnect)(struct serio *);
 	void (*cleanup)(struct serio *);
 
@@ -58,12 +59,15 @@
 int serio_open(struct serio *serio, struct serio_dev *dev);
 void serio_close(struct serio *serio);
 void serio_rescan(struct serio *serio);
+void serio_reconnect(struct serio *serio);
 irqreturn_t serio_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs);
 
 void serio_register_port(struct serio *serio);
-void serio_register_slave_port(struct serio *serio);
+void serio_register_port_delayed(struct serio *serio);
+void __serio_register_port(struct serio *serio);
 void serio_unregister_port(struct serio *serio);
-void serio_unregister_slave_port(struct serio *serio);
+void serio_unregister_port_delayed(struct serio *serio);
+void __serio_unregister_port(struct serio *serio);
 void serio_register_device(struct serio_dev *dev);
 void serio_unregister_device(struct serio_dev *dev);
 
--- diff/include/linux/spinlock.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/linux/spinlock.h	2003-12-29 09:30:42.000000000 +0000
@@ -15,6 +15,12 @@
 
 #include <asm/processor.h>	/* for cpu relax */
 #include <asm/system.h>
+#ifdef CONFIG_KGDB
+#include <asm/current.h>
+#define SET_WHO(x, him) (x)->who = him;
+#else
+#define SET_WHO(x, him)
+#endif
 
 /*
  * Must define these before including other files, inline functions need them
@@ -55,6 +61,9 @@
 	const char *module;
 	char *owner;
 	int oline;
+#ifdef CONFIG_KGDB
+	struct task_struct *who;
+#endif
 } spinlock_t;
 #define SPIN_LOCK_UNLOCKED (spinlock_t) { SPINLOCK_MAGIC, 0, 10, __FILE__ , NULL, 0}
 
@@ -66,6 +75,7 @@
 		(x)->module = __FILE__; \
 		(x)->owner = NULL; \
 		(x)->oline = 0; \
+                SET_WHO(x, NULL) \
 	} while (0)
 
 #define CHECK_LOCK(x) \
@@ -88,6 +98,7 @@
 		(x)->lock = 1; \
 		(x)->owner = __FILE__; \
 		(x)->oline = __LINE__; \
+                SET_WHO(x, current)       \
 	} while (0)
 
 /* without debugging, spin_is_locked on UP always says
@@ -118,6 +129,7 @@
 		(x)->lock = 1; \
 		(x)->owner = __FILE__; \
 		(x)->oline = __LINE__; \
+                SET_WHO(x, current)       \
 		1; \
 	})
 
@@ -184,6 +196,17 @@
 
 #endif /* !SMP */
 
+#ifdef CONFIG_LOCKMETER
+extern void _metered_spin_lock   (spinlock_t *lock);
+extern void _metered_spin_unlock (spinlock_t *lock);
+extern int  _metered_spin_trylock(spinlock_t *lock);
+extern void _metered_read_lock    (rwlock_t *lock);
+extern void _metered_read_unlock  (rwlock_t *lock);
+extern void _metered_write_lock   (rwlock_t *lock);
+extern void _metered_write_unlock (rwlock_t *lock);
+extern int  _metered_write_trylock(rwlock_t *lock);
+#endif
+
 /*
  * Define the various spin_lock and rw_lock methods.  Note we define these
  * regardless of whether CONFIG_SMP or CONFIG_PREEMPT are set. The various
@@ -389,6 +412,141 @@
 				_raw_spin_trylock(lock) ? 1 : \
 				({preempt_enable(); local_bh_enable(); 0;});})
 
+#ifdef CONFIG_LOCKMETER
+#undef spin_lock
+#undef spin_trylock
+#undef spin_unlock
+#undef spin_lock_irqsave
+#undef spin_lock_irq
+#undef spin_lock_bh
+#undef read_lock
+#undef read_unlock
+#undef write_lock
+#undef write_unlock
+#undef write_trylock
+#undef spin_unlock_bh
+#undef read_lock_irqsave
+#undef read_lock_irq
+#undef read_lock_bh
+#undef read_unlock_bh
+#undef write_lock_irqsave
+#undef write_lock_irq
+#undef write_lock_bh
+#undef write_unlock_bh
+
+#define spin_lock(lock) \
+do { \
+	preempt_disable(); \
+	_metered_spin_lock(lock); \
+} while(0)
+
+#define spin_trylock(lock)     ({preempt_disable(); _metered_spin_trylock(lock) ? \
+				1 : ({preempt_enable(); 0;});})
+#define spin_unlock(lock) \
+do { \
+	_metered_spin_unlock(lock); \
+	preempt_enable(); \
+} while (0)
+
+#define spin_lock_irqsave(lock, flags) \
+do { \
+	local_irq_save(flags); \
+	preempt_disable(); \
+	_metered_spin_lock(lock); \
+} while (0)
+
+#define spin_lock_irq(lock) \
+do { \
+	local_irq_disable(); \
+	preempt_disable(); \
+	_metered_spin_lock(lock); \
+} while (0)
+
+#define spin_lock_bh(lock) \
+do { \
+	local_bh_disable(); \
+	preempt_disable(); \
+	_metered_spin_lock(lock); \
+} while (0)
+
+#define spin_unlock_bh(lock) \
+do { \
+	_metered_spin_unlock(lock); \
+	preempt_enable(); \
+	local_bh_enable(); \
+} while (0)
+
+
+#define read_lock(lock)                ({preempt_disable(); _metered_read_lock(lock);})
+#define read_unlock(lock)      ({_metered_read_unlock(lock); preempt_enable();})
+#define write_lock(lock)       ({preempt_disable(); _metered_write_lock(lock);})
+#define write_unlock(lock)     ({_metered_write_unlock(lock); preempt_enable();})
+#define write_trylock(lock)    ({preempt_disable();_metered_write_trylock(lock) ? \
+				1 : ({preempt_enable(); 0;});})
+#define spin_unlock_no_resched(lock) \
+do { \
+	_metered_spin_unlock(lock); \
+	preempt_enable_no_resched(); \
+} while (0)
+
+#define read_lock_irqsave(lock, flags) \
+do { \
+	local_irq_save(flags); \
+	preempt_disable(); \
+	_metered_read_lock(lock); \
+} while (0)
+
+#define read_lock_irq(lock) \
+do { \
+	local_irq_disable(); \
+	preempt_disable(); \
+	_metered_read_lock(lock); \
+} while (0)
+
+#define read_lock_bh(lock) \
+do { \
+	local_bh_disable(); \
+	preempt_disable(); \
+	_metered_read_lock(lock); \
+} while (0)
+
+#define read_unlock_bh(lock) \
+do { \
+	_metered_read_unlock(lock); \
+	preempt_enable(); \
+	local_bh_enable(); \
+} while (0)
+
+#define write_lock_irqsave(lock, flags) \
+do { \
+	local_irq_save(flags); \
+	preempt_disable(); \
+	_metered_write_lock(lock); \
+} while (0)
+
+#define write_lock_irq(lock) \
+do { \
+	local_irq_disable(); \
+	preempt_disable(); \
+	_metered_write_lock(lock); \
+} while (0)
+
+#define write_lock_bh(lock) \
+do { \
+	local_bh_disable(); \
+	preempt_disable(); \
+	_metered_write_lock(lock); \
+} while (0)
+
+#define write_unlock_bh(lock) \
+do { \
+	_metered_write_unlock(lock); \
+	preempt_enable(); \
+	local_bh_enable(); \
+} while (0)
+
+#endif /* !CONFIG_LOCKMETER */
+
 /* "lock on reference count zero" */
 #ifndef ATOMIC_DEC_AND_LOCK
 #include <asm/atomic.h>
--- diff/include/linux/swap.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/linux/swap.h	2003-12-29 09:30:42.000000000 +0000
@@ -173,7 +173,7 @@
 extern void swap_setup(void);
 
 /* linux/mm/vmscan.c */
-extern int try_to_free_pages(struct zone *, unsigned int, unsigned int);
+extern int try_to_free_pages(struct zone **, unsigned int, unsigned int);
 extern int shrink_all_memory(int);
 extern int vm_swappiness;
 
--- diff/include/linux/sysctl.h	2003-11-25 15:24:59.000000000 +0000
+++ source/include/linux/sysctl.h	2003-12-29 09:30:42.000000000 +0000
@@ -601,6 +601,8 @@
 	FS_LEASE_TIME=15,	/* int: maximum time to wait for a lease break */
 	FS_DQSTATS=16,	/* disc quota usage statistics */
 	FS_XFS=17,	/* struct: control xfs parameters */
+	FS_AIO_NR=18,	/* current system-wide number of aio requests */
+	FS_AIO_MAX_NR=19,	/* system-wide maximum number of aio requests */
 };
 
 /* /proc/sys/fs/quota/ */
--- diff/include/linux/sysfs.h	2003-08-26 10:00:54.000000000 +0100
+++ source/include/linux/sysfs.h	2003-12-29 09:30:42.000000000 +0000
@@ -18,6 +18,12 @@
 	mode_t			mode;
 };
 
+struct attribute_group {
+	char			* name;
+	struct attribute	** attrs;
+};
+
+
 struct bin_attribute {
 	struct attribute	attr;
 	size_t			size;
@@ -25,14 +31,13 @@
 	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 @@
 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/wait.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/linux/wait.h	2003-12-29 09:30:42.000000000 +0000
@@ -80,6 +80,15 @@
 	return !list_empty(&q->task_list);
 }
 
+/*
+ * Used to distinguish between sync and async io wait context:
+ * sync i/o typically specifies a NULL wait queue entry or a wait
+ * queue entry bound to a task (current task) to wake up.
+ * aio specifies a wait queue entry with an async notification
+ * callback routine, not associated with any task.
+ */
+#define is_sync_wait(wait)	(!(wait) || ((wait)->task))
+
 extern void FASTCALL(add_wait_queue(wait_queue_head_t *q, wait_queue_t * wait));
 extern void FASTCALL(add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_t * wait));
 extern void FASTCALL(remove_wait_queue(wait_queue_head_t *q, wait_queue_t * wait));
--- diff/include/linux/writeback.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/linux/writeback.h	2003-12-29 09:30:42.000000000 +0000
@@ -84,9 +84,13 @@
 				      void __user *, size_t *);
 
 void page_writeback_init(void);
-void balance_dirty_pages_ratelimited(struct address_space *mapping);
+int balance_dirty_pages_ratelimited(struct address_space *mapping);
 int pdflush_operation(void (*fn)(unsigned long), unsigned long arg0);
 int do_writepages(struct address_space *mapping, struct writeback_control *wbc);
+ssize_t sync_page_range(struct inode *inode, struct address_space *mapping,
+			loff_t pos, size_t count);
+ssize_t sync_page_range_nolock(struct inode *inode, struct address_space
+		*mapping, loff_t pos, size_t count);
 
 /* pdflush.c */
 extern int nr_pdflush_threads;	/* Global so it can be exported to sysctl
--- diff/include/media/saa7146.h	2003-08-20 14:16:14.000000000 +0100
+++ source/include/media/saa7146.h	2003-12-29 09:30:42.000000000 +0000
@@ -87,6 +87,7 @@
 {
 	char	name[32];		/* name of the device */
 #define SAA7146_USE_I2C_IRQ	0x1
+#define SAA7146_I2C_SHORT_DELAY	0x2
 	int	flags;
 	
 	/* pairs of subvendor and subdevice ids for
@@ -162,9 +163,10 @@
 struct saa7146_format* format_by_fourcc(struct saa7146_dev *dev, int fourcc);
 int saa7146_pgtable_alloc(struct pci_dev *pci, struct saa7146_pgtable *pt);
 void saa7146_pgtable_free(struct pci_dev *pci, struct saa7146_pgtable *pt);
-void saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt, struct scatterlist *list, int length );
+int saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt, struct scatterlist *list, int length );
 char *saa7146_vmalloc_build_pgtable(struct pci_dev *pci, long length, struct saa7146_pgtable *pt);
 void saa7146_setgpio(struct saa7146_dev *dev, int port, u32 data);
+int saa7146_wait_for_debi_done(struct saa7146_dev *dev);
 
 /* some memory sizes */
 #define SAA7146_I2C_MEM		( 1*PAGE_SIZE)
@@ -187,6 +189,9 @@
 #define SAA7146_GPIO_OUTLO 0x40
 #define SAA7146_GPIO_OUTHI 0x50
 
+/* debi defines */
+#define DEBINOSWAP 0x000e0000
+
 /* define for the register programming sequencer (rps) */
 #define CMD_NOP		0x00000000  /* No operation */
 #define CMD_CLR_EVENT	0x00000000  /* Clear event */
--- diff/include/media/saa7146_vv.h	2003-10-27 09:20:39.000000000 +0000
+++ source/include/media/saa7146_vv.h	2003-12-29 09:30:42.000000000 +0000
@@ -149,7 +149,7 @@
 };
 
 /* flags */
-#define SAA7146_EXT_SWAP_ODD_EVEN       0x1     /* needs odd/even fields swapped */
+// #define SAA7146_EXT_SWAP_ODD_EVEN	0x1     /* needs odd/even fields swapped */
 #define SAA7146_USE_PORT_B_FOR_VBI	0x2     /* use input port b for vbi hardware bug workaround */
 
 struct saa7146_ext_vv
@@ -171,12 +171,10 @@
 
 struct saa7146_use_ops  {
         void (*init)(struct saa7146_dev *, struct saa7146_vv *);
-        void(*open)(struct saa7146_dev *, struct saa7146_fh *);
-        void (*release)(struct saa7146_dev *, struct saa7146_fh *,struct file *);
+        void(*open)(struct saa7146_dev *, struct file *);
+        void (*release)(struct saa7146_dev *, struct file *);
         void (*irq_done)(struct saa7146_dev *, unsigned long status);
 	ssize_t (*read)(struct file *, char *, size_t, loff_t *);
-        int (*capture_begin)(struct saa7146_fh *);
-        int (*capture_end)(struct saa7146_fh *);
 };
 
 /* from saa7146_fops.c */
--- diff/include/sound/i2c.h	2002-10-16 04:27:20.000000000 +0100
+++ source/include/sound/i2c.h	2003-12-29 09:30:42.000000000 +0000
@@ -58,7 +58,7 @@
 	snd_card_t *card;	/* card which I2C belongs to */
 	char name[32];		/* some useful label */
 
-	spinlock_t lock;
+	struct semaphore lock_mutex;
 
 	snd_i2c_bus_t *master;	/* master bus when SCK/SCL is shared */
 	struct list_head buses;	/* master: slave buses sharing SCK/SCL, slave: link list */
@@ -84,15 +84,15 @@
 
 static inline void snd_i2c_lock(snd_i2c_bus_t *bus) {
 	if (bus->master)
-		spin_lock(&bus->master->lock);
+		down(&bus->master->lock_mutex);
 	else
-		spin_lock(&bus->lock);
+		down(&bus->lock_mutex);
 }
 static inline void snd_i2c_unlock(snd_i2c_bus_t *bus) {
 	if (bus->master)
-		spin_unlock(&bus->master->lock);
+		up(&bus->master->lock_mutex);
 	else
-		spin_unlock(&bus->lock);
+		up(&bus->lock_mutex);
 }
 
 int snd_i2c_sendbytes(snd_i2c_device_t *device, unsigned char *bytes, int count);
--- diff/init/Kconfig	2003-09-30 15:46:21.000000000 +0100
+++ source/init/Kconfig	2003-12-29 09:30:42.000000000 +0000
@@ -43,7 +43,7 @@
 
 config STANDALONE
 	bool "Select only drivers that don't need compile-time external firmware" if EXPERIMENTAL
-	default y
+	default n
 	help
 	  Select this option if you don't have magic firmware for drivers that
 	  need it.
@@ -196,6 +196,19 @@
 
 source "drivers/block/Kconfig.iosched"
 
+config CC_OPTIMIZE_FOR_SIZE
+	bool "Optimize for size" if EMBEDDED
+	default y if ARM || H8300
+	default n
+	help
+	  Enabling this option will pass "-Os" instead of "-O2" to gcc
+	  resulting in a smaller kernel.
+
+	  WARNING: some versions of gcc may generate incorrect code with this
+	  option.  If problems are observed, a gcc upgrade may be needed.
+
+	  If unsure, say N.
+
 endmenu		# General setup
 
 
--- diff/init/do_mounts.c	2003-10-09 09:47:34.000000000 +0100
+++ source/init/do_mounts.c	2003-12-29 09:30:42.000000000 +0000
@@ -130,20 +130,22 @@
  *	Driverfs is used to check if something is a disk name - it has
  *	all known disks under bus/block/devices.  If the disk name
  *	contains slashes, name of driverfs node has them replaced with
- *	dots.  try_name() does the actual checks, assuming that driverfs
+ *	bangs.  try_name() does the actual checks, assuming that driverfs
  *	is mounted on rootfs /sys.
  */
 
-dev_t name_to_dev_t(char *name)
+dev_t __init name_to_dev_t(char *name)
 {
 	char s[32];
 	char *p;
 	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;
@@ -169,7 +171,7 @@
 	strcpy(s, name);
 	for (p = s; *p; p++)
 		if (*p == '/')
-			*p = '.';
+			*p = '!';
 	res = try_name(s, 0);
 	if (res)
 		goto done;
--- diff/init/main.c	2003-10-27 09:20:44.000000000 +0000
+++ source/init/main.c	2003-12-29 09:30:42.000000000 +0000
@@ -38,6 +38,7 @@
 #include <linux/moduleparam.h>
 #include <linux/writeback.h>
 #include <linux/cpu.h>
+#include <linux/efi.h>
 
 #include <asm/io.h>
 #include <asm/bugs.h>
@@ -107,9 +108,7 @@
 void (*late_time_init)(void) = NULL;
 extern void softirq_init(void);
 
-int rows, cols;
-
-char *execute_command;
+static char *execute_command;
 
 /* Setup configured maximum number of CPUs to activate */
 static unsigned int max_cpus = NR_CPUS;
@@ -374,7 +373,7 @@
 
 static void rest_init(void)
 {
-	kernel_thread(init, NULL, CLONE_KERNEL);
+	kernel_thread(init, NULL, CLONE_FS | CLONE_SIGHAND);
 	unlock_kernel();
  	cpu_idle();
 } 
@@ -395,7 +394,6 @@
 	lock_kernel();
 	printk(linux_banner);
 	setup_arch(&command_line);
-	setup_per_zone_pages_min();
 	setup_per_cpu_areas();
 
 	/*
@@ -443,6 +441,10 @@
 	pidmap_init();
 	pgtable_cache_init();
 	pte_chain_init();
+#ifdef CONFIG_X86
+	if (efi_enabled)
+		efi_enter_virtual_mode();
+#endif
 	fork_init(num_physpages);
 	proc_caches_init();
 	buffer_init();
@@ -470,7 +472,7 @@
 	rest_init();
 }
 
-int __initdata initcall_debug;
+static int __initdata initcall_debug;
 
 static int __init initcall_debug_setup(char *str)
 {
--- diff/ipc/sem.c	2003-10-09 09:47:17.000000000 +0100
+++ source/ipc/sem.c	2003-12-29 09:30:42.000000000 +0000
@@ -59,6 +59,8 @@
  * (c) 1999 Manfred Spraul <manfreds@colorfullife.com>
  * Enforced range limit on SEM_UNDO
  * (c) 2001 Red Hat Inc <alan@redhat.com>
+ * Lockless wakeup
+ * (c) 2003 Manfred Spraul <manfred@colorfullife.com>
  */
 
 #include <linux/config.h>
@@ -118,6 +120,40 @@
 #endif
 }
 
+/*
+ * Lockless wakeup algorithm:
+ * Without the check/retry algorithm a lockless wakeup is possible:
+ * - queue.status is initialized to -EINTR before blocking.
+ * - wakeup is performed by
+ *	* unlinking the queue entry from sma->sem_pending
+ *	* setting queue.status to IN_WAKEUP
+ *	  This is the notification for the blocked thread that a
+ *	  result value is imminent.
+ *	* call wake_up_process
+ *	* set queue.status to the final value.
+ * - the previously blocked thread checks queue.status:
+ *   	* if it's IN_WAKEUP, then it must wait until the value changes
+ *   	* if it's not -EINTR, then the operation was completed by
+ *   	  update_queue. semtimedop can return queue.status without
+ *   	  performing any operation on the semaphore array.
+ *   	* otherwise it must acquire the spinlock and check what's up.
+ *
+ * The two-stage algorithm is necessary to protect against the following
+ * races:
+ * - if queue.status is set after wake_up_process, then the woken up idle
+ *   thread could race forward and try (and fail) to acquire sma->lock
+ *   before update_queue had a chance to set queue.status
+ * - if queue.status is written before wake_up_process and if the
+ *   blocked process is woken up by a signal between writing
+ *   queue.status and the wake_up_process, then the woken up
+ *   process could return from semtimedop and die by calling
+ *   sys_exit before wake_up_process is called. Then wake_up_process
+ *   will oops, because the task structure is already invalid.
+ *   (yes, this happened on s390 with sysv msg).
+ *
+ */
+#define IN_WAKEUP	1
+
 static int newary (key_t key, int nsems, int semflg)
 {
 	int id;
@@ -331,16 +367,25 @@
 	int error;
 	struct sem_queue * q;
 
-	for (q = sma->sem_pending; q; q = q->next) {
-			
+	q = sma->sem_pending;
+	while(q) {
 		error = try_atomic_semop(sma, q->sops, q->nsops,
 					 q->undo, q->pid);
 
 		/* Does q->sleeper still need to sleep? */
 		if (error <= 0) {
-			q->status = error;
+			struct sem_queue *n;
 			remove_from_queue(sma,q);
+			n = q->next;
+			q->status = IN_WAKEUP;
 			wake_up_process(q->sleeper);
+			/* hands-off: q will disappear immediately after
+			 * writing q->status.
+			 */
+			q->status = error;
+			q = n;
+		} else {
+			q = q->next;
 		}
 	}
 }
@@ -409,10 +454,16 @@
 		un->semid = -1;
 
 	/* Wake up all pending processes and let them fail with EIDRM. */
-	for (q = sma->sem_pending; q; q = q->next) {
-		q->status = -EIDRM;
+	q = sma->sem_pending;
+	while(q) {
+		struct sem_queue *n;
+		/* lazy remove_from_queue: we are killing the whole queue */
 		q->prev = NULL;
+		n = q->next;
+		q->status = IN_WAKEUP;
 		wake_up_process(q->sleeper); /* doesn't sleep */
+		q->status = -EIDRM;	/* hands-off q */
+		q = n;
 	}
 
 	/* Remove the semaphore set from the ID array*/
@@ -1083,6 +1134,18 @@
 	else
 		schedule();
 
+	error = queue.status;
+	while(unlikely(error == IN_WAKEUP)) {
+		cpu_relax();
+		error = queue.status;
+	}
+
+	if (error != -EINTR) {
+		/* fast path: update_queue already obtained all requested
+		 * resources */
+		goto out_free;
+	}
+
 	sma = sem_lock(semid);
 	if(sma==NULL) {
 		if(queue.prev != NULL)
@@ -1095,7 +1158,7 @@
 	 * If queue.status != -EINTR we are woken up by another process
 	 */
 	error = queue.status;
-	if (queue.status != -EINTR) {
+	if (error != -EINTR) {
 		goto out_unlock_free;
 	}
 
--- diff/kernel/Makefile	2003-10-09 09:47:34.000000000 +0100
+++ source/kernel/Makefile	2003-12-29 09:30:42.000000000 +0000
@@ -11,6 +11,7 @@
 obj-$(CONFIG_FUTEX) += futex.o
 obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o
 obj-$(CONFIG_SMP) += cpu.o
+obj-$(CONFIG_LOCKMETER) += lockmeter.o
 obj-$(CONFIG_UID16) += uid16.o
 obj-$(CONFIG_MODULES) += module.o
 obj-$(CONFIG_KALLSYMS) += kallsyms.o
--- diff/kernel/compat.c	2003-09-17 12:28:12.000000000 +0100
+++ source/kernel/compat.c	2003-12-29 09:30:42.000000000 +0000
@@ -22,14 +22,14 @@
 
 #include <asm/uaccess.h>
 
-int get_compat_timespec(struct timespec *ts, struct compat_timespec *cts)
+int get_compat_timespec(struct timespec *ts, const struct compat_timespec *cts)
 {
 	return (verify_area(VERIFY_READ, cts, sizeof(*cts)) ||
 			__get_user(ts->tv_sec, &cts->tv_sec) ||
 			__get_user(ts->tv_nsec, &cts->tv_nsec)) ? -EFAULT : 0;
 }
 
-int put_compat_timespec(struct timespec *ts, struct compat_timespec *cts)
+int put_compat_timespec(struct timespec *ts, const struct compat_timespec *cts)
 {
 	return (verify_area(VERIFY_WRITE, cts, sizeof(*cts)) ||
 			__put_user(ts->tv_sec, &cts->tv_sec) ||
@@ -204,7 +204,8 @@
 	ret = sys_sigprocmask(how, set ? &s : NULL, oset ? &s : NULL);
 	set_fs(old_fs);
 	if (ret == 0)
-		ret = put_user(s, oset);
+		if (oset)
+			ret = put_user(s, oset);
 	return ret;
 }
 
--- diff/kernel/exit.c	2003-12-19 09:51:11.000000000 +0000
+++ source/kernel/exit.c	2003-12-29 09:30:42.000000000 +0000
@@ -472,21 +472,29 @@
 	if (!mm)
 		return;
 	/*
-	 * Serialize with any possible pending coredump:
+	 * Serialize with any possible pending coredump.
+	 * We must hold mmap_sem around checking core_waiters
+	 * and clearing tsk->mm.  The core-inducing thread
+	 * will increment core_waiters for each thread in the
+	 * group with ->mm != NULL.
 	 */
+	down_read(&mm->mmap_sem);
 	if (mm->core_waiters) {
+		up_read(&mm->mmap_sem);
 		down_write(&mm->mmap_sem);
 		if (!--mm->core_waiters)
 			complete(mm->core_startup_done);
 		up_write(&mm->mmap_sem);
 
 		wait_for_completion(&mm->core_done);
+		down_read(&mm->mmap_sem);
 	}
 	atomic_inc(&mm->mm_count);
 	if (mm != tsk->active_mm) BUG();
 	/* more a memory barrier than a real lock */
 	task_lock(tsk);
 	tsk->mm = NULL;
+	up_read(&mm->mmap_sem);
 	enter_lazy_tlb(mm, current);
 	task_unlock(tsk);
 	mmput(mm);
--- diff/kernel/fork.c	2003-12-19 09:51:11.000000000 +0000
+++ source/kernel/fork.c	2003-12-29 09:30:42.000000000 +0000
@@ -146,7 +146,12 @@
 	spin_lock_irqsave(&q->lock, flags);
 	if (list_empty(&wait->task_list))
 		__add_wait_queue(q, wait);
-	set_current_state(state);
+	/*
+	 * don't alter the task state if this is just going to
+	 * queue an async wait queue callback
+	 */
+	if (is_sync_wait(wait))
+		set_current_state(state);
 	spin_unlock_irqrestore(&q->lock, flags);
 }
 
@@ -161,7 +166,12 @@
 	spin_lock_irqsave(&q->lock, flags);
 	if (list_empty(&wait->task_list))
 		__add_wait_queue_tail(q, wait);
-	set_current_state(state);
+	/*
+	 * don't alter the task state if this is just going to
+ 	 * queue an async wait queue callback
+	 */
+	if (is_sync_wait(wait))
+		set_current_state(state);
 	spin_unlock_irqrestore(&q->lock, flags);
 }
 
@@ -316,9 +326,9 @@
 				atomic_dec(&inode->i_writecount);
       
 			/* insert tmp into the share list, just after mpnt */
-			down(&inode->i_mapping->i_shared_sem);
+			down(&file->f_mapping->i_shared_sem);
 			list_add_tail(&tmp->shared, &mpnt->shared);
-			up(&inode->i_mapping->i_shared_sem);
+			up(&file->f_mapping->i_shared_sem);
 		}
 
 		/*
@@ -642,6 +652,11 @@
 		goto out;
 	}
 
+	/*
+	 * Note: we may be using current for both targets (See exec.c)
+	 * This works because we cache current->files (old) as oldf. Don't
+	 * break this.
+	 */
 	tsk->files = NULL;
 	error = -ENOMEM;
 	newf = kmem_cache_alloc(files_cachep, SLAB_KERNEL);
@@ -731,6 +746,35 @@
 	goto out;
 }
 
+/*
+ *	Helper to unshare the files of the current task.
+ *	We don't want to expose copy_files internals to
+ *	the exec layer of the kernel.
+ */
+
+int unshare_files(void)
+{
+	struct files_struct *files  = current->files;
+	int rc;
+
+	if(!files)
+		BUG();
+
+	/* This can race but the race causes us to copy when we don't
+	   need to and drop the copy */
+	if(atomic_read(&files->count) == 1)
+	{
+		atomic_inc(&files->count);
+		return 0;
+	}
+	rc = copy_files(0, current);
+	if(rc)
+		current->files = files;
+	return rc;
+}
+
+EXPORT_SYMBOL(unshare_files);
+
 static inline int copy_sighand(unsigned long clone_flags, struct task_struct * tsk)
 {
 	struct sighand_struct *sig;
@@ -929,6 +973,7 @@
 	p->start_time = get_jiffies_64();
 	p->security = NULL;
 	p->io_context = NULL;
+	p->io_wait = NULL;
 
 	retval = -ENOMEM;
 	if ((retval = security_task_alloc(p)))
--- diff/kernel/futex.c	2003-10-27 09:20:39.000000000 +0000
+++ source/kernel/futex.c	2003-12-29 09:30:42.000000000 +0000
@@ -246,7 +246,7 @@
  * Drop a reference to the resource addressed by a key.
  * The hash bucket spinlock must not be held.
  */
-static inline void drop_key_refs(union futex_key *key)
+static void drop_key_refs(union futex_key *key)
 {
 	if (key->both.ptr != 0) {
 		if (key->both.offset & 1)
@@ -260,7 +260,7 @@
  * The hash bucket lock must be held when this is called.
  * Afterwards, the futex_q must not be accessed.
  */
-static inline void wake_futex(struct futex_q *q)
+static void wake_futex(struct futex_q *q)
 {
 	list_del_init(&q->list);
 	if (q->filp)
@@ -384,7 +384,7 @@
  */
 
 /* The key must be already stored in q->key. */
-static inline void queue_me(struct futex_q *q, int fd, struct file *filp)
+static void queue_me(struct futex_q *q, int fd, struct file *filp)
 {
 	struct futex_hash_bucket *bh;
 
@@ -577,6 +577,7 @@
 	filp->f_op = &futex_fops;
 	filp->f_vfsmnt = mntget(futex_mnt);
 	filp->f_dentry = dget(futex_mnt->mnt_root);
+	filp->f_mapping = filp->f_dentry->d_inode->i_mapping;
 
 	if (signal) {
 		int err;
--- diff/kernel/kmod.c	2003-10-27 09:20:44.000000000 +0000
+++ source/kernel/kmod.c	2003-12-29 09:30:42.000000000 +0000
@@ -182,16 +182,21 @@
 {
 	struct subprocess_info *sub_info = data;
 	pid_t pid;
+	struct k_sigaction sa;
+
+	/* Install a handler: if SIGCLD isn't handled sys_wait4 won't
+	 * populate the status, but will return -ECHILD. */
+	sa.sa.sa_handler = SIG_IGN;
+	sa.sa.sa_flags = 0;
+	siginitset(&sa.sa.sa_mask, sigmask(SIGCHLD));
+	do_sigaction(SIGCHLD, &sa, (struct k_sigaction *)0);
+	allow_signal(SIGCHLD);
 
-	sub_info->retval = 0;
 	pid = kernel_thread(____call_usermodehelper, sub_info, SIGCHLD);
 	if (pid < 0)
 		sub_info->retval = pid;
 	else
-		/* We don't have a SIGCHLD signal handler, so this
-		 * always returns -ECHILD, but the important thing is
-		 * that it blocks. */
-		sys_wait4(pid, NULL, 0, NULL);
+		sys_wait4(pid, &sub_info->retval, 0, NULL);
 
 	complete(sub_info->complete);
 	return 0;
@@ -210,7 +215,7 @@
 	 * until that is done.  */
 	if (sub_info->wait)
 		pid = kernel_thread(wait_for_helper, sub_info,
-				    CLONE_KERNEL | SIGCHLD);
+				    CLONE_FS | CLONE_FILES | SIGCHLD);
 	else
 		pid = kernel_thread(____call_usermodehelper, sub_info,
 				    CLONE_VFORK | SIGCHLD);
--- diff/kernel/pid.c	2003-10-27 09:20:39.000000000 +0000
+++ source/kernel/pid.c	2003-12-29 09:30:42.000000000 +0000
@@ -268,6 +268,9 @@
  * machine.  From a minimum of 16 slots up to 4096 slots at one gigabyte or
  * more.
  */
+#ifdef CONFIG_KGDB
+int kgdb_pid_init_done; /* so we don't call prior to... */
+#endif
 void __init pidhash_init(void)
 {
 	int i, j, pidhash_size;
@@ -289,6 +292,9 @@
 		for (j = 0; j < pidhash_size; j++)
 			INIT_LIST_HEAD(&pid_hash[i][j]);
 	}
+#ifdef CONFIG_KGDB
+	kgdb_pid_init_done++;
+#endif
 }
 
 void __init pidmap_init(void)
--- diff/kernel/printk.c	2003-10-09 09:47:34.000000000 +0100
+++ source/kernel/printk.c	2003-12-29 09:30:42.000000000 +0000
@@ -447,9 +447,13 @@
 	char *p;
 	static char printk_buf[1024];
 	static int log_level_unknown = 1;
+	static int printk_cpu = -1;
 
-	if (oops_in_progress) {
-		/* If a crash is occurring, make sure we can't deadlock */
+	if (oops_in_progress && printk_cpu == smp_processor_id()) {
+		/*
+		 * If a crash is occurring during printk() on this CPU, make
+		 * sure we can't deadlock
+		 */
 		spin_lock_init(&logbuf_lock);
 		/* And make sure that we print immediately */
 		init_MUTEX(&console_sem);
@@ -457,6 +461,7 @@
 
 	/* This stops the holder of console_sem just where we want him */
 	spin_lock_irqsave(&logbuf_lock, flags);
+	printk_cpu = smp_processor_id();
 
 	/* Emit the output into the temporary buffer */
 	va_start(args, fmt);
--- diff/kernel/sched.c	2003-12-19 09:51:11.000000000 +0000
+++ source/kernel/sched.c	2003-12-29 09:30:42.000000000 +0000
@@ -203,7 +203,7 @@
 	task_t *curr, *idle;
 	struct mm_struct *prev_mm;
 	prio_array_t *active, *expired, arrays[2];
-	int prev_cpu_load[NR_CPUS];
+	int best_expired_prio, prev_cpu_load[NR_CPUS];
 #ifdef CONFIG_NUMA
 	atomic_t *node_nr_running;
 	int prev_node_load[MAX_NUMNODES];
@@ -1061,10 +1061,11 @@
 	 * the lock held.
 	 *
 	 * We fend off statistical fluctuations in runqueue lengths by
-	 * saving the runqueue length during the previous load-balancing
-	 * operation and using the smaller one the current and saved lengths.
-	 * If a runqueue is long enough for a longer amount of time then
-	 * we recognize it and pull tasks from it.
+	 * saving the runqueue length (as seen by the balancing CPU) during
+	 * the previous load-balancing operation and using the smaller one
+	 * of the current and saved lengths. If a runqueue is long enough
+	 * for a longer amount of time then we recognize it and pull tasks
+	 * from it.
 	 *
 	 * The 'current runqueue length' is a statistical maximum variable,
 	 * for that one we take the longer one - to avoid fluctuations in
@@ -1340,12 +1341,14 @@
  * interactivity of a task if the first expired task had to wait more
  * than a 'reasonable' amount of time. This deadline timeout is
  * load-dependent, as the frequency of array switched decreases with
- * increasing number of running tasks:
+ * increasing number of running tasks. We also ignore the interactivity
+ * if a better static_prio task has expired:
  */
 #define EXPIRED_STARVING(rq) \
-		(STARVATION_LIMIT && ((rq)->expired_timestamp && \
+	((STARVATION_LIMIT && ((rq)->expired_timestamp && \
 		(jiffies - (rq)->expired_timestamp >= \
-			STARVATION_LIMIT * ((rq)->nr_running) + 1)))
+			STARVATION_LIMIT * ((rq)->nr_running) + 1))) || \
+				((rq)->curr->static_prio > (rq)->best_expired_prio))
 
 /*
  * This function gets called by the timer code, with HZ frequency.
@@ -1427,6 +1430,8 @@
 			rq->expired_timestamp = jiffies;
 		if (!TASK_INTERACTIVE(p) || EXPIRED_STARVING(rq)) {
 			enqueue_task(p, rq->expired);
+			if (p->static_prio < rq->best_expired_prio)
+				rq->best_expired_prio = p->static_prio;
 		} else
 			enqueue_task(p, rq->active);
 	} else {
@@ -1512,33 +1517,20 @@
 
 	spin_lock_irq(&rq->lock);
 
-	/*
-	 * if entering off of a kernel preemption go straight
-	 * to picking the next task.
-	 */
-	if (unlikely(preempt_count() & PREEMPT_ACTIVE))
-		goto pick_next_task;
-
-	switch (prev->state) {
-	case TASK_INTERRUPTIBLE:
-		if (unlikely(signal_pending(prev))) {
+	if (prev->state != TASK_RUNNING &&
+			likely(!(preempt_count() & PREEMPT_ACTIVE)) ) {
+		if (unlikely(signal_pending(prev)) &&
+				prev->state == TASK_INTERRUPTIBLE)
 			prev->state = TASK_RUNNING;
-			break;
-		}
-	default:
-		deactivate_task(prev, rq);
-		prev->nvcsw++;
-		break;
-	case TASK_RUNNING:
-		prev->nivcsw++;
+		else
+			deactivate_task(prev, rq);
 	}
-pick_next_task:
-	if (unlikely(!rq->nr_running)) {
+
 #ifdef CONFIG_SMP
+	if (unlikely(!rq->nr_running))
 		load_balance(rq, 1, cpu_to_node_mask(smp_processor_id()));
-		if (rq->nr_running)
-			goto pick_next_task;
 #endif
+	if (unlikely(!rq->nr_running)) {
 		next = rq->idle;
 		rq->expired_timestamp = 0;
 		goto switch_tasks;
@@ -1553,6 +1545,7 @@
 		rq->expired = array;
 		array = rq->active;
 		rq->expired_timestamp = 0;
+		rq->best_expired_prio = MAX_PRIO;
 	}
 
 	idx = sched_find_first_bit(array->bitmap);
@@ -1585,6 +1578,12 @@
 	prev->timestamp = now;
 
 	if (likely(prev != next)) {
+		if (prev->state == TASK_RUNNING ||
+				unlikely(preempt_count() & PREEMPT_ACTIVE))
+			prev->nivcsw++;
+		else
+			prev->nvcsw++;
+
 		next->timestamp = now;
 		rq->nr_switches++;
 		rq->curr = next;
@@ -1891,6 +1890,13 @@
 
 EXPORT_SYMBOL(set_user_nice);
 
+#if defined( CONFIG_KGDB)
+struct task_struct * kgdb_get_idle(int this_cpu)
+{
+        return cpu_rq(this_cpu)->idle;
+}
+#endif
+
 #ifndef __alpha__
 
 /*
@@ -2445,17 +2451,16 @@
 
 static void show_task(task_t * p)
 {
-	unsigned long free = 0;
 	task_t *relative;
-	int state;
-	static const char * stat_nam[] = { "R", "S", "D", "T", "Z", "W" };
+	unsigned state;
+	static const char *stat_nam[] = { "R", "S", "D", "T", "Z", "W" };
 
 	printk("%-13.13s ", p->comm);
 	state = p->state ? __ffs(p->state) + 1 : 0;
-	if (((unsigned) state) < sizeof(stat_nam)/sizeof(char *))
+	if (state < ARRAY_SIZE(stat_nam))
 		printk(stat_nam[state]);
 	else
-		printk(" ");
+		printk("?");
 #if (BITS_PER_LONG == 32)
 	if (p == current)
 		printk(" current  ");
@@ -2467,13 +2472,7 @@
 	else
 		printk(" %016lx ", thread_saved_pc(p));
 #endif
-	{
-		unsigned long * n = (unsigned long *) (p->thread_info+1);
-		while (!*n)
-			n++;
-		free = (unsigned long) n - (unsigned long)(p->thread_info+1);
-	}
-	printk("%5lu %5d %6d ", free, p->pid, p->parent->pid);
+	printk("%5d %6d ", p->pid, p->parent->pid);
 	if ((relative = eldest_child(p)))
 		printk("%5d ", relative->pid);
 	else
@@ -2500,12 +2499,12 @@
 
 #if (BITS_PER_LONG == 32)
 	printk("\n"
-	       "                         free                        sibling\n");
-	printk("  task             PC    stack   pid father child younger older\n");
+	       "                                               sibling\n");
+	printk("  task             PC      pid father child younger older\n");
 #else
 	printk("\n"
-	       "                                 free                        sibling\n");
-	printk("  task                 PC        stack   pid father child younger older\n");
+	       "                                                       sibling\n");
+	printk("  task                 PC          pid father child younger older\n");
 #endif
 	read_lock(&tasklist_lock);
 	do_each_thread(g, p) {
@@ -2814,6 +2813,8 @@
 		rq = cpu_rq(i);
 		rq->active = rq->arrays;
 		rq->expired = rq->arrays + 1;
+		rq->best_expired_prio = MAX_PRIO;
+
 		spin_lock_init(&rq->lock);
 		INIT_LIST_HEAD(&rq->migration_queue);
 		atomic_set(&rq->nr_iowait, 0);
--- diff/kernel/softirq.c	2003-10-09 09:47:34.000000000 +0100
+++ source/kernel/softirq.c	2003-12-29 09:30:42.000000000 +0000
@@ -117,11 +117,22 @@
 
 void local_bh_enable(void)
 {
+	if (in_irq()) {
+		printk("local_bh_enable() was called in hard irq context.   "
+			"This is probably a bug\n");
+		dump_stack();
+	}
+
 	__local_bh_enable();
-	WARN_ON(irqs_disabled());
-	if (unlikely(!in_interrupt() &&
-		     local_softirq_pending()))
+	if (unlikely(!in_interrupt() && local_softirq_pending())) {
+		if (irqs_disabled()) {
+			printk("local_bh_enable() was called with local "
+				"interrupts disabled.  This is probably a"
+				" bug\n");
+			dump_stack();
+		}
 		invoke_softirq();
+	}
 	preempt_check_resched();
 }
 EXPORT_SYMBOL(local_bh_enable);
--- diff/kernel/sys.c	2003-10-27 09:20:44.000000000 +0000
+++ source/kernel/sys.c	2003-12-29 09:30:42.000000000 +0000
@@ -1323,8 +1323,6 @@
  * either stopped or zombied.  In the zombied case the task won't get
  * reaped till shortly after the call to getrusage(), in both cases the
  * task being examined is in a frozen state so the counters won't change.
- *
- * FIXME! Get the fault counts properly!
  */
 int getrusage(struct task_struct *p, int who, struct rusage __user *ru)
 {
--- diff/kernel/sysctl.c	2003-10-09 09:47:34.000000000 +0100
+++ source/kernel/sysctl.c	2003-12-29 09:30:42.000000000 +0000
@@ -794,6 +794,22 @@
 		.mode		= 0644,
 		.proc_handler	= &proc_dointvec,
 	},
+	{
+		.ctl_name	= FS_AIO_NR,
+		.procname	= "aio-nr",
+		.data		= &aio_nr,
+		.maxlen		= sizeof(aio_nr),
+		.mode		= 0444,
+		.proc_handler	= &proc_dointvec,
+	},
+	{
+		.ctl_name	= FS_AIO_MAX_NR,
+		.procname	= "aio-max-nr",
+		.data		= &aio_max_nr,
+		.maxlen		= sizeof(aio_max_nr),
+		.mode		= 0644,
+		.proc_handler	= &proc_dointvec,
+	},
 	{ .ctl_name = 0 }
 };
 
--- diff/lib/Makefile	2003-11-25 15:24:59.000000000 +0000
+++ source/lib/Makefile	2003-12-29 09:30:42.000000000 +0000
@@ -5,7 +5,7 @@
 
 lib-y := errno.o ctype.o string.o vsprintf.o cmdline.o \
 	 bust_spinlocks.o rbtree.o radix-tree.o dump_stack.o \
-	 kobject.o idr.o div64.o parser.o
+	 kobject.o idr.o div64.o parser.o int_sqrt.o mask.o
 
 lib-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o
 lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o
--- diff/lib/inflate.c	2003-09-30 15:46:21.000000000 +0100
+++ source/lib/inflate.c	2003-12-29 09:30:42.000000000 +0000
@@ -221,7 +221,7 @@
     0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
 };
 
-#define NEXTBYTE()  (uch)get_byte()
+#define NEXTBYTE()  ({ int v = get_byte(); if (v < 0) goto underrun; (uch)v; })
 #define NEEDBITS(n) {while(k<(n)){b|=((ulg)NEXTBYTE())<<k;k+=8;}}
 #define DUMPBITS(n) {b>>=(n);k-=(n);}
 
@@ -620,6 +620,9 @@
 
   /* done */
   return 0;
+
+ underrun:
+  return 4;			/* Input underrun */
 }
 
 
@@ -676,6 +679,9 @@
 
   DEBG(">");
   return 0;
+
+ underrun:
+  return 4;			/* Input underrun */
 }
 
 
@@ -908,6 +914,9 @@
 
   DEBG(">");
   return 0;
+
+ underrun:
+  return 4;			/* Input underrun */
 }
 
 
@@ -956,6 +965,9 @@
 
   /* bad block type */
   return 2;
+
+ underrun:
+  return 4;			/* Input underrun */
 }
 
 
@@ -1079,9 +1091,9 @@
     ulg orig_len = 0;       /* original uncompressed length */
     int res;
 
-    magic[0] = (unsigned char)get_byte();
-    magic[1] = (unsigned char)get_byte();
-    method = (unsigned char)get_byte();
+    magic[0] = NEXTBYTE();
+    magic[1] = NEXTBYTE();
+    method   = NEXTBYTE();
 
     if (magic[0] != 037 ||
 	((magic[1] != 0213) && (magic[1] != 0236))) {
@@ -1108,29 +1120,29 @@
 	    error("Input has invalid flags");
 	    return -1;
     }
-    (ulg)get_byte();	/* Get timestamp */
-    ((ulg)get_byte()) << 8;
-    ((ulg)get_byte()) << 16;
-    ((ulg)get_byte()) << 24;
+    (ulg)NEXTBYTE();	/* Get timestamp */
+    ((ulg)NEXTBYTE()) << 8;
+    ((ulg)NEXTBYTE()) << 16;
+    ((ulg)NEXTBYTE()) << 24;
 
-    (void)get_byte();  /* Ignore extra flags for the moment */
-    (void)get_byte();  /* Ignore OS type for the moment */
+    (void)NEXTBYTE();  /* Ignore extra flags for the moment */
+    (void)NEXTBYTE();  /* Ignore OS type for the moment */
 
     if ((flags & EXTRA_FIELD) != 0) {
-	    unsigned len = (unsigned)get_byte();
-	    len |= ((unsigned)get_byte())<<8;
-	    while (len--) (void)get_byte();
+	    unsigned len = (unsigned)NEXTBYTE();
+	    len |= ((unsigned)NEXTBYTE())<<8;
+	    while (len--) (void)NEXTBYTE();
     }
 
     /* Get original file name if it was truncated */
     if ((flags & ORIG_NAME) != 0) {
 	    /* Discard the old name */
-	    while (get_byte() != 0) /* null */ ;
+	    while (NEXTBYTE() != 0) /* null */ ;
     } 
 
     /* Discard file comment if any */
     if ((flags & COMMENT) != 0) {
-	    while (get_byte() != 0) /* null */ ;
+	    while (NEXTBYTE() != 0) /* null */ ;
     }
 
     /* Decompress */
@@ -1147,6 +1159,9 @@
 	    case 3:
 		    error("out of memory");
 		    break;
+	    case 4:
+		    error("out of input data");
+		    break;
 	    default:
 		    error("invalid compressed format (other)");
 	    }
@@ -1157,15 +1172,15 @@
     /* crc32  (see algorithm.doc)
      * uncompressed input size modulo 2^32
      */
-    orig_crc = (ulg) get_byte();
-    orig_crc |= (ulg) get_byte() << 8;
-    orig_crc |= (ulg) get_byte() << 16;
-    orig_crc |= (ulg) get_byte() << 24;
+    orig_crc = (ulg) NEXTBYTE();
+    orig_crc |= (ulg) NEXTBYTE() << 8;
+    orig_crc |= (ulg) NEXTBYTE() << 16;
+    orig_crc |= (ulg) NEXTBYTE() << 24;
     
-    orig_len = (ulg) get_byte();
-    orig_len |= (ulg) get_byte() << 8;
-    orig_len |= (ulg) get_byte() << 16;
-    orig_len |= (ulg) get_byte() << 24;
+    orig_len = (ulg) NEXTBYTE();
+    orig_len |= (ulg) NEXTBYTE() << 8;
+    orig_len |= (ulg) NEXTBYTE() << 16;
+    orig_len |= (ulg) NEXTBYTE() << 24;
     
     /* Validate decompression */
     if (orig_crc != CRC_VALUE) {
@@ -1177,6 +1192,10 @@
 	    return -1;
     }
     return 0;
+
+ underrun:			/* NEXTBYTE() goto's here if needed */
+    error("out of input data");
+    return -1;
 }
 
 
--- diff/lib/parser.c	2003-10-09 09:47:34.000000000 +0100
+++ source/lib/parser.c	2003-12-29 09:30:42.000000000 +0000
@@ -11,6 +11,17 @@
 #include <linux/slab.h>
 #include <linux/string.h>
 
+/**
+ * match_one: - Determines if a string matches a simple pattern
+ * @s: the string to examine for presense of the pattern
+ * @p: the string containing the pattern
+ * @args: array of %MAX_OPT_ARGS &substring_t elements. Used to return match
+ * locations.
+ *
+ * Description: Determines if the pattern @p is present in string @s. Can only
+ * match extremely simple token=arg style patterns. If the pattern is found,
+ * the location(s) of the arguments will be returned in the @args array.
+ */
 static int match_one(char *s, char *p, substring_t args[])
 {
 	char *meta;
@@ -74,6 +85,20 @@
 	}
 }
 
+/**
+ * match_token: - Find a token (and optional args) in a string
+ * @s: the string to examine for token/argument pairs
+ * @table: match_table_t describing the set of allowed option tokens and the
+ * arguments that may be associated with them. Must be terminated with a
+ * &struct match_token whose pattern is set to the NULL pointer.
+ * @args: array of %MAX_OPT_ARGS &substring_t elements. Used to return match
+ * locations.
+ *
+ * Description: Detects which if any of a set of token strings has been passed
+ * to it. Tokens can include up to MAX_OPT_ARGS instances of basic c-style
+ * format identifiers which will be taken into account when matching the
+ * tokens, and whose locations will be returned in the @args array.
+ */
 int match_token(char *s, match_table_t table, substring_t args[])
 {
 	struct match_token *p;
@@ -84,6 +109,16 @@
 	return p->token;
 }
 
+/**
+ * match_number: scan a number in the given base from a substring_t
+ * @s: substring to be scanned
+ * @result: resulting integer on success
+ * @base: base to use when converting string
+ *
+ * Description: Given a &substring_t and a base, attempts to parse the substring
+ * as a number in that base. On success, sets @result to the integer represented
+ * by the string and returns 0. Returns either -ENOMEM or -EINVAL on failure.
+ */
 static int match_number(substring_t *s, int *result, int base)
 {
 	char *endp;
@@ -103,27 +138,71 @@
 	return ret;
 }
 
+/**
+ * match_int: - scan a decimal representation of an integer from a substring_t
+ * @s: substring_t to be scanned
+ * @result: resulting integer on success
+ *
+ * Description: Attempts to parse the &substring_t @s as a decimal integer. On
+ * success, sets @result to the integer represented by the string and returns 0.
+ * Returns either -ENOMEM or -EINVAL on failure.
+ */
 int match_int(substring_t *s, int *result)
 {
 	return match_number(s, result, 0);
 }
 
+/**
+ * match_octal: - scan an octal representation of an integer from a substring_t
+ * @s: substring_t to be scanned
+ * @result: resulting integer on success
+ *
+ * Description: Attempts to parse the &substring_t @s as an octal integer. On
+ * success, sets @result to the integer represented by the string and returns
+ * 0. Returns either -ENOMEM or -EINVAL on failure.
+ */
 int match_octal(substring_t *s, int *result)
 {
 	return match_number(s, result, 8);
 }
 
+/**
+ * match_hex: - scan a hex representation of an integer from a substring_t
+ * @s: substring_t to be scanned
+ * @result: resulting integer on success
+ *
+ * Description: Attempts to parse the &substring_t @s as a hexadecimal integer.
+ * On success, sets @result to the integer represented by the string and
+ * returns 0. Returns either -ENOMEM or -EINVAL on failure.
+ */
 int match_hex(substring_t *s, int *result)
 {
 	return match_number(s, result, 16);
 }
 
+/**
+ * match_strcpy: - copies the characters from a substring_t to a string
+ * @to: string to copy characters to.
+ * @s: &substring_t to copy
+ *
+ * Description: Copies the set of characters represented by the given
+ * &substring_t @s to the c-style string @to. Caller guarantees that @to is
+ * large enough to hold the characters of @s.
+ */
 void match_strcpy(char *to, substring_t *s)
 {
 	memcpy(to, s->from, s->to - s->from);
 	to[s->to - s->from] = '\0';
 }
 
+/**
+ * match_strdup: - allocate a new string with the contents of a substring_t
+ * @s: &substring_t to copy
+ *
+ * Description: Allocates and returns a string filled with the contents of
+ * the &substring_t @s. The caller is responsible for freeing the returned
+ * string with kfree().
+ */
 char *match_strdup(substring_t *s)
 {
 	char *p = kmalloc(s->to - s->from + 1, GFP_KERNEL);
--- diff/mm/Makefile	2003-10-09 09:47:17.000000000 +0100
+++ source/mm/Makefile	2003-12-29 09:30:42.000000000 +0000
@@ -12,3 +12,6 @@
 			   slab.o swap.o truncate.o vmscan.o $(mmu-y)
 
 obj-$(CONFIG_SWAP)	+= page_io.o swap_state.o swapfile.o
+
+obj-$(CONFIG_X86_4G) += usercopy.o
+
--- diff/mm/fadvise.c	2003-09-30 15:46:21.000000000 +0100
+++ source/mm/fadvise.c	2003-12-29 09:30:42.000000000 +0000
@@ -23,7 +23,6 @@
 asmlinkage long sys_fadvise64_64(int fd, loff_t offset, loff_t len, int advice)
 {
 	struct file *file = fget(fd);
-	struct inode *inode;
 	struct address_space *mapping;
 	struct backing_dev_info *bdi;
 	pgoff_t start_index;
@@ -33,8 +32,7 @@
 	if (!file)
 		return -EBADF;
 
-	inode = file->f_dentry->d_inode;
-	mapping = inode->i_mapping;
+	mapping = file->f_mapping;
 	if (!mapping) {
 		ret = -EINVAL;
 		goto out;
--- diff/mm/filemap.c	2003-11-25 15:24:59.000000000 +0000
+++ source/mm/filemap.c	2003-12-29 09:30:42.000000000 +0000
@@ -73,6 +73,9 @@
  *  ->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)
@@ -226,6 +229,18 @@
 
 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.
@@ -292,22 +307,42 @@
 	return &zone->wait_table[hash_ptr(page, zone->wait_table_bits)];
 }
 
-void wait_on_page_bit(struct page *page, int bit_nr)
+/*
+ * wait for the specified page bit to be cleared
+ * this could be a synchronous wait or could just queue an async
+ * notification callback depending on the wait queue entry parameter
+ *
+ * A NULL wait queue parameter defaults to sync behaviour
+ */
+int wait_on_page_bit_wq(struct page *page, int bit_nr, wait_queue_t *wait)
 {
 	wait_queue_head_t *waitqueue = page_waitqueue(page);
-	DEFINE_WAIT(wait);
+	DEFINE_WAIT(local_wait);
+
+	if (!wait)
+		wait = &local_wait; /* default to a sync wait entry */
 
 	do {
-		prepare_to_wait(waitqueue, &wait, TASK_UNINTERRUPTIBLE);
+		prepare_to_wait(waitqueue, wait, TASK_UNINTERRUPTIBLE);
 		if (test_bit(bit_nr, &page->flags)) {
 			sync_page(page);
+			if (!is_sync_wait(wait)) {
+				/*
+				 * if we've queued an async wait queue
+				 * callback do not block; just tell the
+				 * caller to return and retry later when
+				 * the callback is notified
+				 */
+				return -EIOCBRETRY;
+			}
 			io_schedule();
 		}
 	} while (test_bit(bit_nr, &page->flags));
-	finish_wait(waitqueue, &wait);
-}
+	finish_wait(waitqueue, wait);
 
-EXPORT_SYMBOL(wait_on_page_bit);
+	return 0;
+}
+EXPORT_SYMBOL(wait_on_page_bit_wq);
 
 /**
  * unlock_page() - unlock a locked page
@@ -317,7 +352,9 @@
  * Unlocks the page and wakes up sleepers in ___wait_on_page_locked().
  * Also wakes sleepers in wait_on_page_writeback() because the wakeup
  * mechananism between PageLocked pages and PageWriteback pages is shared.
- * But that's OK - sleepers in wait_on_page_writeback() just go back to sleep.
+ * But that's OK - sleepers in wait_on_page_writeback() just go back to sleep,
+ * or in case the wakeup notifies async wait queue entries, as in the case
+ * of aio, retries would be triggered and may re-queue their callbacks.
  *
  * The first mb is necessary to safely close the critical section opened by the
  * TestSetPageLocked(), the second mb is necessary to enforce ordering between
@@ -358,26 +395,51 @@
 EXPORT_SYMBOL(end_page_writeback);
 
 /*
- * Get a lock on the page, assuming we need to sleep to get it.
+ * Get a lock on the page, assuming we need to either sleep to get it
+ * or to queue an async notification callback to try again when its
+ * available.
+ *
+ * A NULL wait queue parameter defaults to sync behaviour. Otherwise
+ * it specifies the wait queue entry to be used for async notification
+ * or waiting.
  *
  * Ugly: running sync_page() in state TASK_UNINTERRUPTIBLE is scary.  If some
  * random driver's requestfn sets TASK_RUNNING, we could busywait.  However
  * chances are that on the second loop, the block layer's plug list is empty,
  * so sync_page() will then return in state TASK_UNINTERRUPTIBLE.
  */
-void __lock_page(struct page *page)
+int __lock_page_wq(struct page *page, wait_queue_t *wait)
 {
 	wait_queue_head_t *wqh = page_waitqueue(page);
-	DEFINE_WAIT(wait);
+	DEFINE_WAIT(local_wait);
+
+	if (!wait)
+		wait = &local_wait;
 
 	while (TestSetPageLocked(page)) {
-		prepare_to_wait(wqh, &wait, TASK_UNINTERRUPTIBLE);
+		prepare_to_wait(wqh, wait, TASK_UNINTERRUPTIBLE);
 		if (PageLocked(page)) {
 			sync_page(page);
+			if (!is_sync_wait(wait)) {
+				/*
+				 * if we've queued an async wait queue
+				 * callback do not block; just tell the
+				 * caller to return and retry later when
+				 * the callback is notified
+				 */
+				return -EIOCBRETRY;
+			}
 			io_schedule();
 		}
 	}
-	finish_wait(wqh, &wait);
+	finish_wait(wqh, wait);
+	return 0;
+}
+EXPORT_SYMBOL(__lock_page_wq);
+
+void __lock_page(struct page *page)
+{
+	__lock_page_wq(page, NULL);
 }
 
 EXPORT_SYMBOL(__lock_page);
@@ -432,8 +494,8 @@
  *
  * Returns zero if the page was not present. find_lock_page() may sleep.
  */
-struct page *find_lock_page(struct address_space *mapping,
-				unsigned long offset)
+struct page *find_lock_page_wq(struct address_space *mapping,
+				unsigned long offset, wait_queue_t *wait)
 {
 	struct page *page;
 
@@ -444,7 +506,10 @@
 		page_cache_get(page);
 		if (TestSetPageLocked(page)) {
 			spin_unlock(&mapping->page_lock);
-			lock_page(page);
+			if (-EIOCBRETRY == lock_page_wq(page, wait)) {
+				page_cache_release(page);
+				return ERR_PTR(-EIOCBRETRY);
+			}
 			spin_lock(&mapping->page_lock);
 
 			/* Has the page been truncated while we slept? */
@@ -461,6 +526,12 @@
 
 EXPORT_SYMBOL(find_lock_page);
 
+struct page *find_lock_page(struct address_space *mapping,
+				unsigned long offset)
+{
+	return find_lock_page_wq(mapping, offset, NULL);
+}
+
 /**
  * find_or_create_page - locate or add a pagecache page
  *
@@ -521,9 +592,12 @@
  * The search returns a group of mapping-contiguous pages with ascending
  * indexes.  There may be holes in the indices due to not-present pages.
  *
- * find_get_pages() returns the number of pages which were found.
+ * find_get_pages() returns the number of pages which were found
+ * and also atomically sets the next offset to continue looking up
+ * mapping contiguous pages from (useful when doing a range of
+ * pagevec lookups in chunks of PAGEVEC_SIZE).
  */
-unsigned int find_get_pages(struct address_space *mapping, pgoff_t start,
+unsigned int find_get_pages(struct address_space *mapping, pgoff_t *next,
 			    unsigned int nr_pages, struct page **pages)
 {
 	unsigned int i;
@@ -531,9 +605,12 @@
 
 	spin_lock(&mapping->page_lock);
 	ret = radix_tree_gang_lookup(&mapping->page_tree,
-				(void **)pages, start, nr_pages);
+				(void **)pages, *next, nr_pages);
 	for (i = 0; i < ret; i++)
 		page_cache_get(pages[i]);
+	if (ret)
+		*next = pages[ret - 1]->index + 1;
+
 	spin_unlock(&mapping->page_lock);
 	return ret;
 }
@@ -587,21 +664,46 @@
 			     read_actor_t actor)
 {
 	struct inode *inode = mapping->host;
-	unsigned long index, offset;
+	unsigned long index, offset, first, last, end_index;
+	loff_t isize = i_size_read(inode);
 	struct page *cached_page;
 	int error;
 
 	cached_page = NULL;
-	index = *ppos >> PAGE_CACHE_SHIFT;
+	first = *ppos >> PAGE_CACHE_SHIFT;
 	offset = *ppos & ~PAGE_CACHE_MASK;
+	last = (*ppos + desc->count) >> PAGE_CACHE_SHIFT;
+	end_index = isize >> PAGE_CACHE_SHIFT;
+	if (last > end_index)
+		last = end_index;
 
+	/* Don't repeat the readahead if we are executing aio retries */
+	if (in_aio()) {
+		if (is_retried_kiocb(io_wait_to_kiocb(current->io_wait)))
+			goto done_readahead;
+	}
+
+	/*
+	 * Let the readahead logic know upfront about all
+	 * the pages we'll need to satisfy this request
+	 */
+	for (index = first; index < last; index++)
+		page_cache_readahead(mapping, ra, filp, index);
+
+	if (ra->next_size == -1UL) {
+		/* the readahead window was maximally shrunk */
+		/* explicitly readahead at least what is needed now */
+		for (index = first; index < last; index++)
+			handle_ra_miss(mapping, ra, index);
+		do_page_cache_readahead(mapping, filp, first, last - first);
+	}
+
+done_readahead:
+	index = first;
 	for (;;) {
 		struct page *page;
-		unsigned long end_index, nr, ret;
-		loff_t isize = i_size_read(inode);
+		unsigned long nr, ret;
 
-		end_index = isize >> PAGE_CACHE_SHIFT;
-			
 		if (index > end_index)
 			break;
 		nr = PAGE_CACHE_SIZE;
@@ -612,7 +714,6 @@
 		}
 
 		cond_resched();
-		page_cache_readahead(mapping, ra, filp, index);
 
 		nr = nr - offset;
 find_page:
@@ -662,7 +763,12 @@
 			goto page_ok;
 
 		/* Get exclusive access to the page ... */
-		lock_page(page);
+
+		if (lock_page_wq(page, current->io_wait)) {
+			pr_debug("queued lock page \n");
+			error = -EIOCBRETRY;
+			goto sync_error;
+		}
 
 		/* Did it get unhashed before we got the lock? */
 		if (!page->mapping) {
@@ -684,13 +790,23 @@
 		if (!error) {
 			if (PageUptodate(page))
 				goto page_ok;
-			wait_on_page_locked(page);
+			if (wait_on_page_locked_wq(page, current->io_wait)) {
+				pr_debug("queued wait_on_page \n");
+				error = -EIOCBRETRY;
+				goto sync_error;
+			}
+
 			if (PageUptodate(page))
 				goto page_ok;
 			error = -EIO;
 		}
 
-		/* UHHUH! A synchronous read error occurred. Report it */
+sync_error:
+		/* We don't have uptodate data in the page yet */
+		/* Could be due to an error or because we need to
+		 * retry when we get an async i/o notification.
+		 * Report the reason.
+		 */
 		desc->error = error;
 		page_cache_release(page);
 		break;
@@ -804,7 +920,7 @@
 		struct address_space *mapping;
 		struct inode *inode;
 
-		mapping = filp->f_dentry->d_inode->i_mapping;
+		mapping = filp->f_mapping;
 		inode = mapping->host;
 		retval = 0;
 		if (!count)
@@ -844,22 +960,19 @@
 out:
 	return retval;
 }
-
 EXPORT_SYMBOL(__generic_file_aio_read);
 
-ssize_t
-generic_file_aio_read(struct kiocb *iocb, char __user *buf, size_t count, loff_t pos)
+ssize_t generic_file_aio_read(struct kiocb *iocb, char __user *buf,
+				size_t count, loff_t pos)
 {
 	struct iovec local_iov = { .iov_base = buf, .iov_len = count };
 
-	BUG_ON(iocb->ki_pos != pos);
 	return __generic_file_aio_read(iocb, &local_iov, 1, &iocb->ki_pos);
 }
-
 EXPORT_SYMBOL(generic_file_aio_read);
 
-ssize_t
-generic_file_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
+ssize_t generic_file_read(struct file *filp, char __user *buf,
+				size_t count, loff_t *ppos)
 {
 	struct iovec local_iov = { .iov_base = buf, .iov_len = count };
 	struct kiocb kiocb;
@@ -871,10 +984,10 @@
 		ret = wait_on_sync_kiocb(&kiocb);
 	return ret;
 }
-
 EXPORT_SYMBOL(generic_file_read);
 
-int file_send_actor(read_descriptor_t * desc, struct page *page, unsigned long offset, unsigned long size)
+int file_send_actor(read_descriptor_t * desc, struct page *page,
+				unsigned long offset, unsigned long size)
 {
 	ssize_t written;
 	unsigned long count = desc->count;
@@ -936,7 +1049,7 @@
 	file = fget(fd);
 	if (file) {
 		if (file->f_mode & FMODE_READ) {
-			struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
+			struct address_space *mapping = file->f_mapping;
 			unsigned long start = offset >> PAGE_CACHE_SHIFT;
 			unsigned long end = (offset + count - 1) >> PAGE_CACHE_SHIFT;
 			unsigned long len = end - start + 1;
@@ -955,7 +1068,7 @@
 static int FASTCALL(page_cache_read(struct file * file, unsigned long offset));
 static int page_cache_read(struct file * file, unsigned long offset)
 {
-	struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
+	struct address_space *mapping = file->f_mapping;
 	struct page *page; 
 	int error;
 
@@ -990,16 +1103,16 @@
  * it in the page cache, and handles the special cases reasonably without
  * having a lot of duplicated code.
  */
-struct page * filemap_nopage(struct vm_area_struct * area, unsigned long address, int unused)
+struct page * filemap_nopage(struct vm_area_struct * area, unsigned long address, int *type)
 {
 	int error;
 	struct file *file = area->vm_file;
-	struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
+	struct address_space *mapping = file->f_mapping;
 	struct file_ra_state *ra = &file->f_ra;
 	struct inode *inode = mapping->host;
 	struct page *page;
 	unsigned long size, pgoff, endoff;
-	int did_readaround = 0;
+	int did_readaround = 0, majmin = VM_FAULT_MINOR;
 
 	pgoff = ((address - area->vm_start) >> PAGE_CACHE_SHIFT) + area->vm_pgoff;
 	endoff = ((area->vm_end - area->vm_start) >> PAGE_CACHE_SHIFT) + area->vm_pgoff;
@@ -1048,6 +1161,14 @@
 		if (ra->mmap_miss > ra->mmap_hit + MMAP_LOTSAMISS)
 			goto no_cached_page;
 
+		/*
+		 * To keep the pgmajfault counter straight, we need to
+		 * check did_readaround, as this is an inner loop.
+		 */
+		if (!did_readaround) {
+			majmin = VM_FAULT_MAJOR;
+			inc_page_state(pgmajfault);
+		}
 		did_readaround = 1;
 		do_page_cache_readahead(mapping, file,
 				pgoff & ~(MMAP_READAROUND-1), MMAP_READAROUND);
@@ -1069,6 +1190,8 @@
 	 * Found the page and have a reference on it.
 	 */
 	mark_page_accessed(page);
+	if (type)
+		*type = majmin;
 	return page;
 
 outside_data_content:
@@ -1104,7 +1227,10 @@
 	return NULL;
 
 page_not_uptodate:
-	inc_page_state(pgmajfault);
+	if (!did_readaround) {
+		majmin = VM_FAULT_MAJOR;
+		inc_page_state(pgmajfault);
+	}
 	lock_page(page);
 
 	/* Did it get unhashed while we waited for it? */
@@ -1166,7 +1292,7 @@
 static struct page * filemap_getpage(struct file *file, unsigned long pgoff,
 					int nonblock)
 {
-	struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
+	struct address_space *mapping = file->f_mapping;
 	struct page *page;
 	int error;
 
@@ -1278,7 +1404,7 @@
 			int nonblock)
 {
 	struct file *file = vma->vm_file;
-	struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
+	struct address_space *mapping = file->f_mapping;
 	struct inode *inode = mapping->host;
 	unsigned long size;
 	struct mm_struct *mm = vma->vm_mm;
@@ -1337,7 +1463,7 @@
 
 int generic_file_mmap(struct file * file, struct vm_area_struct * vma)
 {
-	struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
+	struct address_space *mapping = file->f_mapping;
 	struct inode *inode = mapping->host;
 
 	if (!mapping->a_ops->readpage)
@@ -1460,7 +1586,9 @@
 	int err;
 	struct page *page;
 repeat:
-	page = find_lock_page(mapping, index);
+	page = find_lock_page_wq(mapping, index, current->io_wait);
+	if (IS_ERR(page))
+		return page;
 	if (!page) {
 		if (!*cached_page) {
 			*cached_page = page_cache_alloc(mapping);
@@ -1605,9 +1733,9 @@
  * Returns appropriate error code that caller should return or
  * zero in case that write should be allowed.
  */
-inline int generic_write_checks(struct inode *inode,
-		struct file *file, loff_t *pos, size_t *count, int isblk)
+inline int generic_write_checks(struct file *file, loff_t *pos, size_t *count, int isblk)
 {
+	struct inode *inode = file->f_mapping->host;
 	unsigned long limit = current->rlim[RLIMIT_FSIZE].rlim_cur;
 
         if (unlikely(*pos < 0))
@@ -1669,7 +1797,7 @@
 			*count = inode->i_sb->s_maxbytes - *pos;
 	} else {
 		loff_t isize;
-		if (bdev_read_only(inode->i_bdev))
+		if (bdev_read_only(I_BDEV(inode)))
 			return -EPERM;
 		isize = i_size_read(inode);
 		if (*pos >= isize) {
@@ -1687,6 +1815,7 @@
 
 /*
  * 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
@@ -1695,11 +1824,11 @@
  *							okir@monad.swb.de
  */
 ssize_t
-generic_file_aio_write_nolock(struct kiocb *iocb, const struct iovec *iov,
+__generic_file_aio_write_nolock(struct kiocb *iocb, const struct iovec *iov,
 				unsigned long nr_segs, loff_t *ppos)
 {
 	struct file *file = iocb->ki_filp;
-	struct address_space * mapping = file->f_dentry->d_inode->i_mapping;
+	struct address_space * mapping = file->f_mapping;
 	struct address_space_operations *a_ops = mapping->a_ops;
 	size_t ocount;		/* original count */
 	size_t count;		/* after file limit checks */
@@ -1746,11 +1875,10 @@
 	current->backing_dev_info = mapping->backing_dev_info;
 	written = 0;
 
-	err = generic_write_checks(inode, file, &pos, &count, isblk);
+	err = generic_write_checks(file, &pos, &count, isblk);
 	if (err)
 		goto out;
 
-
 	if (count == 0)
 		goto out;
 
@@ -1775,12 +1903,19 @@
 		/*
 		 * 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, OSYNC_METADATA);
+			status = generic_osync_inode(inode, mapping, OSYNC_METADATA);
 		if (written >= 0 && !is_sync_kiocb(iocb))
 			written = -EIOCBQUEUED;
-		goto out_status;
+		if (written != -ENOTBLK)
+			goto out_status;
+		/*
+		 * direct-io write to a hole: fall through to buffered I/O
+		 */
+		written = 0;
 	}
 
 	buf = iov->iov_base;
@@ -1804,6 +1939,10 @@
 		fault_in_pages_readable(buf, bytes);
 
 		page = __grab_cache_page(mapping,index,&cached_page,&lru_pvec);
+		if (IS_ERR(page)) {
+			status = PTR_ERR(page);
+			break;
+		}
 		if (!page) {
 			status = -ENOMEM;
 			break;
@@ -1852,7 +1991,11 @@
 		page_cache_release(page);
 		if (status < 0)
 			break;
-		balance_dirty_pages_ratelimited(mapping);
+		status = balance_dirty_pages_ratelimited(mapping);
+		if (status < 0) {
+			pr_debug("async balance_dirty_pages\n");
+			break;
+		}
 		cond_resched();
 	} while (count);
 	*ppos = pos;
@@ -1863,12 +2006,22 @@
 	/*
 	 * For now, when the user asks for O_SYNC, we'll actually give O_DSYNC
 	 */
-	if (status >= 0) {
-		if ((file->f_flags & O_SYNC) || IS_SYNC(inode))
-			status = generic_osync_inode(inode,
-					OSYNC_METADATA|OSYNC_DATA);
-	}
+	if (likely(status >= 0)) {
+		if (unlikely((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
+			if (!a_ops->writepage)
+				status = generic_osync_inode(inode, mapping,
+						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:
@@ -1880,6 +2033,55 @@
 EXPORT_SYMBOL(generic_file_aio_write_nolock);
 
 ssize_t
+generic_file_aio_write_nolock(struct kiocb *iocb, const struct iovec *iov,
+				unsigned long nr_segs, loff_t *ppos)
+{
+	struct file *file = iocb->ki_filp;
+	struct address_space *mapping = file->f_mapping;
+	struct inode *inode = mapping->host;
+	ssize_t ret;
+	loff_t pos = *ppos;
+
+	if (!iov->iov_base && !is_sync_kiocb(iocb)) {
+		/* nothing to transfer, may just need to sync data */
+		ret = iov->iov_len; /* vector AIO not supported yet */
+		goto osync;
+	}
+
+	ret = __generic_file_aio_write_nolock(iocb, iov, nr_segs, ppos);
+
+	/*
+	 * Avoid doing a sync in parts for aio - its more efficient to
+	 * call in again after all the data has been copied
+	 */
+	if (!is_sync_kiocb(iocb))
+		return ret;
+
+osync:
+	if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
+		ret = sync_page_range_nolock(inode, mapping, pos, ret);
+		if (ret >= 0)
+			*ppos = pos + ret;
+	}
+	return ret;
+}
+
+
+ssize_t
+__generic_file_write_nolock(struct file *file, const struct iovec *iov,
+				unsigned long nr_segs, loff_t *ppos)
+{
+	struct kiocb kiocb;
+	ssize_t ret;
+
+	init_sync_kiocb(&kiocb, file);
+	ret = __generic_file_aio_write_nolock(&kiocb, iov, nr_segs, ppos);
+	if (-EIOCBQUEUED == ret)
+		ret = wait_on_sync_kiocb(&kiocb);
+	return ret;
+}
+
+ssize_t
 generic_file_write_nolock(struct file *file, const struct iovec *iov,
 				unsigned long nr_segs, loff_t *ppos)
 {
@@ -1899,36 +2101,62 @@
 			       size_t count, loff_t pos)
 {
 	struct file *file = iocb->ki_filp;
-	struct inode *inode = file->f_dentry->d_inode->i_mapping->host;
-	ssize_t err;
-	struct iovec local_iov = { .iov_base = (void __user *)buf, .iov_len = count };
+	struct address_space *mapping = file->f_mapping;
+	struct inode *inode = mapping->host;
+	ssize_t ret;
+	struct iovec local_iov = { .iov_base = (void __user *)buf,
+					.iov_len = count };
 
-	BUG_ON(iocb->ki_pos != pos);
+	if (!buf && !is_sync_kiocb(iocb)) {
+		/* nothing to transfer, may just need to sync data */
+		ret = count;
+		goto osync;
+	}
 
 	down(&inode->i_sem);
-	err = generic_file_aio_write_nolock(iocb, &local_iov, 1, 
+	ret = __generic_file_aio_write_nolock(iocb, &local_iov, 1,
 						&iocb->ki_pos);
 	up(&inode->i_sem);
 
-	return err;
-}
+	/*
+	 * Avoid doing a sync in parts for aio - its more efficient to
+	 * call in again after all the data has been copied
+	 */
+	if (!is_sync_kiocb(iocb))
+		return ret;
 
+osync:
+	if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
+		ret = sync_page_range(inode, mapping, pos, ret);
+		if (ret >= 0)
+			iocb->ki_pos = pos + ret;
+	}
+	return ret;
+}
 EXPORT_SYMBOL(generic_file_aio_write);
 
 ssize_t generic_file_write(struct file *file, const char __user *buf,
 			   size_t count, loff_t *ppos)
 {
-	struct inode	*inode = file->f_dentry->d_inode->i_mapping->host;
-	ssize_t		err;
-	struct iovec local_iov = { .iov_base = (void __user *)buf, .iov_len = count };
+	struct address_space *mapping = file->f_mapping;
+	struct inode *inode = mapping->host;
+	ssize_t	ret;
+	struct iovec local_iov = { .iov_base = (void __user *)buf,
+					.iov_len = count };
 
 	down(&inode->i_sem);
-	err = generic_file_write_nolock(file, &local_iov, 1, ppos);
+	ret = __generic_file_write_nolock(file, &local_iov, 1, ppos);
 	up(&inode->i_sem);
 
-	return err;
-}
+	if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
+		ssize_t err;
 
+		err = sync_page_range(inode, mapping, *ppos - ret, ret);
+		if (err < 0)
+			ret = err;
+	}
+	return ret;
+}
 EXPORT_SYMBOL(generic_file_write);
 
 ssize_t generic_file_readv(struct file *filp, const struct iovec *iov,
@@ -1947,39 +2175,46 @@
 EXPORT_SYMBOL(generic_file_readv);
 
 ssize_t generic_file_writev(struct file *file, const struct iovec *iov,
-			unsigned long nr_segs, loff_t * ppos) 
+			unsigned long nr_segs, loff_t *ppos)
 {
-	struct inode *inode = file->f_dentry->d_inode;
+	struct address_space *mapping = file->f_mapping;
+	struct inode *inode = mapping->host;
 	ssize_t ret;
 
 	down(&inode->i_sem);
-	ret = generic_file_write_nolock(file, iov, nr_segs, ppos);
+	ret = __generic_file_write_nolock(file, iov, nr_segs, ppos);
 	up(&inode->i_sem);
+
+	if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
+		ssize_t err;
+
+		err = sync_page_range(inode, mapping, *ppos - ret, ret);
+		if (err < 0)
+			ret = err;
+	}
 	return ret;
 }
 
 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)
 {
 	struct file *file = iocb->ki_filp;
-	struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
+	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/highmem.c	2003-10-09 09:47:34.000000000 +0100
+++ source/mm/highmem.c	2003-12-29 09:30:42.000000000 +0000
@@ -285,7 +285,7 @@
 	struct bio_vec *tovec, *fromvec;
 	int i;
 
-	__bio_for_each_segment(tovec, to, i, 0) {
+	bio_for_each_segment(tovec, to, i) {
 		fromvec = from->bi_io_vec + i;
 
 		/*
@@ -314,7 +314,7 @@
 	/*
 	 * free up bounce indirect pages used
 	 */
-	__bio_for_each_segment(bvec, bio, i, 0) {
+	bio_for_each_segment(bvec, bio, i) {
 		org_vec = bio_orig->bi_io_vec + i;
 		if (bvec->bv_page == org_vec->bv_page)
 			continue;
@@ -437,7 +437,7 @@
 	bio->bi_rw = (*bio_orig)->bi_rw;
 
 	bio->bi_vcnt = (*bio_orig)->bi_vcnt;
-	bio->bi_idx = 0;
+	bio->bi_idx = (*bio_orig)->bi_idx;
 	bio->bi_size = (*bio_orig)->bi_size;
 
 	if (pool == page_pool) {
--- diff/mm/madvise.c	2003-08-20 14:16:34.000000000 +0100
+++ source/mm/madvise.c	2003-12-29 09:30:42.000000000 +0000
@@ -65,7 +65,7 @@
 		end = vma->vm_end;
 	end = ((end - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff;
 
-	force_page_cache_readahead(file->f_dentry->d_inode->i_mapping,
+	force_page_cache_readahead(file->f_mapping,
 			file, start, max_sane_readahead(end - start));
 	return 0;
 }
--- diff/mm/memory.c	2003-11-25 15:24:59.000000000 +0000
+++ source/mm/memory.c	2003-12-29 09:30:42.000000000 +0000
@@ -107,7 +107,8 @@
 	pte_free_tlb(tlb, page);
 }
 
-static inline void free_one_pgd(struct mmu_gather *tlb, pgd_t * dir)
+static inline void free_one_pgd(struct mmu_gather *tlb, pgd_t * dir,
+							int pgd_idx)
 {
 	int j;
 	pmd_t * pmd;
@@ -121,8 +122,11 @@
 	}
 	pmd = pmd_offset(dir, 0);
 	pgd_clear(dir);
-	for (j = 0; j < PTRS_PER_PMD ; j++)
+	for (j = 0; j < PTRS_PER_PMD ; j++) {
+		if (pgd_idx * PGDIR_SIZE + j * PMD_SIZE >= TASK_SIZE)
+			break;
 		free_one_pmd(tlb, pmd+j);
+	}
 	pmd_free_tlb(tlb, pmd);
 }
 
@@ -135,11 +139,13 @@
 void clear_page_tables(struct mmu_gather *tlb, unsigned long first, int nr)
 {
 	pgd_t * page_dir = tlb->mm->pgd;
+	int pgd_idx = first;
 
 	page_dir += first;
 	do {
-		free_one_pgd(tlb, page_dir);
+		free_one_pgd(tlb, page_dir, pgd_idx);
 		page_dir++;
+		pgd_idx++;
 	} while (--nr);
 }
 
@@ -437,7 +443,7 @@
 		unsigned long address, unsigned long size)
 {
 	pmd_t * pmd;
-	unsigned long end;
+	unsigned long end, pgd_boundary;
 
 	if (pgd_none(*dir))
 		return;
@@ -448,8 +454,9 @@
 	}
 	pmd = pmd_offset(dir, address);
 	end = address + size;
-	if (end > ((address + PGDIR_SIZE) & PGDIR_MASK))
-		end = ((address + PGDIR_SIZE) & PGDIR_MASK);
+	pgd_boundary = ((address + PGDIR_SIZE) & PGDIR_MASK);
+	if (pgd_boundary && (end > pgd_boundary))
+		end = pgd_boundary;
 	do {
 		zap_pte_range(tlb, pmd, address, end - address);
 		address = (address + PMD_SIZE) & PMD_MASK; 
@@ -603,6 +610,11 @@
 	might_sleep();
 
 	if (is_vm_hugetlb_page(vma)) {
+		static int x;
+		if (x < 10) {
+			x++;
+			dump_stack();
+		}
 		zap_hugepage_range(vma, address, size);
 		return;
 	}
@@ -685,6 +697,7 @@
 		struct page **pages, struct vm_area_struct **vmas)
 {
 	int i;
+	int vm_io;
 	unsigned int flags;
 
 	/* 
@@ -741,8 +754,10 @@
 		}
 #endif
 
-		if (!vma || (pages && (vma->vm_flags & VM_IO))
-				|| !(flags & vma->vm_flags))
+		if (!vma)
+			return i ? : -EFAULT;
+		vm_io = vma->vm_flags & VM_IO;
+		if ((pages && vm_io) || !(flags & vma->vm_flags))
 			return i ? : -EFAULT;
 
 		if (is_vm_hugetlb_page(vma)) {
@@ -750,9 +765,17 @@
 						&start, &len, i);
 			continue;
 		}
+
 		spin_lock(&mm->page_table_lock);
 		do {
-			struct page *map;
+			struct page *map = NULL;
+
+			/*
+			 * We don't follow pagetables for VM_IO regions - they
+			 * may have no pageframes.
+			 */
+			if (vm_io)
+				goto no_follow;
 			while (!(map = follow_page(mm, start, write))) {
 				spin_unlock(&mm->page_table_lock);
 				switch (handle_mm_fault(mm,vma,start,write)) {
@@ -784,6 +807,7 @@
 				if (!PageReserved(pages[i]))
 					page_cache_get(pages[i]);
 			}
+no_follow:
 			if (vmas)
 				vmas[i] = vma;
 			i++;
@@ -1147,7 +1171,7 @@
 		invalidate_mmap_range_list(&mapping->i_mmap_shared, hba, hlen);
 	up(&mapping->i_shared_sem);
 }
-EXPORT_SYMBOL_GPL(invalidate_mmap_range);
+EXPORT_SYMBOL(invalidate_mmap_range);
 
 /*
  * Handle all mappings that got truncated by a "truncate()"
@@ -1400,7 +1424,7 @@
 	pte_t entry;
 	struct pte_chain *pte_chain;
 	int sequence = 0;
-	int ret;
+	int ret = VM_FAULT_MINOR;
 
 	if (!vma->vm_ops || !vma->vm_ops->nopage)
 		return do_anonymous_page(mm, vma, page_table,
@@ -1409,12 +1433,12 @@
 	spin_unlock(&mm->page_table_lock);
 
 	if (vma->vm_file) {
-		mapping = vma->vm_file->f_dentry->d_inode->i_mapping;
+		mapping = vma->vm_file->f_mapping;
 		sequence = atomic_read(&mapping->truncate_count);
 	}
 	smp_rmb();  /* Prevent CPU from reordering lock-free ->nopage() */
 retry:
-	new_page = vma->vm_ops->nopage(vma, address & PAGE_MASK, 0);
+	new_page = vma->vm_ops->nopage(vma, address & PAGE_MASK, &ret);
 
 	/* no page was available -- either SIGBUS or OOM */
 	if (new_page == NOPAGE_SIGBUS)
@@ -1483,14 +1507,12 @@
 		pte_unmap(page_table);
 		page_cache_release(new_page);
 		spin_unlock(&mm->page_table_lock);
-		ret = VM_FAULT_MINOR;
 		goto out;
 	}
 
 	/* no need to invalidate: a not-present page shouldn't be cached */
 	update_mmu_cache(vma, address, entry);
 	spin_unlock(&mm->page_table_lock);
-	ret = VM_FAULT_MAJOR;
 	goto out;
 oom:
 	ret = VM_FAULT_OOM;
--- diff/mm/mincore.c	2003-06-09 14:18:20.000000000 +0100
+++ source/mm/mincore.c	2003-12-29 09:30:42.000000000 +0000
@@ -26,7 +26,7 @@
 	unsigned long pgoff)
 {
 	unsigned char present = 0;
-	struct address_space * as = vma->vm_file->f_dentry->d_inode->i_mapping;
+	struct address_space * as = vma->vm_file->f_mapping;
 	struct page * page;
 
 	page = find_get_page(as, pgoff);
--- diff/mm/mmap.c	2003-12-19 09:51:11.000000000 +0000
+++ source/mm/mmap.c	2003-12-29 09:30:42.000000000 +0000
@@ -80,11 +80,10 @@
 	struct file *file = vma->vm_file;
 
 	if (file) {
-		struct inode *inode = file->f_dentry->d_inode;
-
-		down(&inode->i_mapping->i_shared_sem);
-		__remove_shared_vm_struct(vma, inode);
-		up(&inode->i_mapping->i_shared_sem);
+		struct address_space *mapping = file->f_mapping;
+		down(&mapping->i_shared_sem);
+		__remove_shared_vm_struct(vma, file->f_dentry->d_inode);
+		up(&mapping->i_shared_sem);
 	}
 }
 
@@ -235,11 +234,10 @@
 
 	file = vma->vm_file;
 	if (file) {
-		struct inode * inode = file->f_dentry->d_inode;
-		struct address_space *mapping = inode->i_mapping;
+		struct address_space *mapping = file->f_mapping;
 
 		if (vma->vm_flags & VM_DENYWRITE)
-			atomic_dec(&inode->i_writecount);
+			atomic_dec(&file->f_dentry->d_inode->i_writecount);
 
 		if (vma->vm_flags & VM_SHARED)
 			list_add_tail(&vma->shared, &mapping->i_mmap_shared);
@@ -265,7 +263,7 @@
 	struct address_space *mapping = NULL;
 
 	if (vma->vm_file)
-		mapping = vma->vm_file->f_dentry->d_inode->i_mapping;
+		mapping = vma->vm_file->f_mapping;
 
 	if (mapping)
 		down(&mapping->i_shared_sem);
@@ -383,7 +381,7 @@
 	if (vm_flags & VM_SPECIAL)
 		return 0;
 
-	i_shared_sem = file ? &inode->i_mapping->i_shared_sem : NULL;
+	i_shared_sem = file ? &file->f_mapping->i_shared_sem : NULL;
 
 	if (!prev) {
 		prev = rb_entry(rb_parent, struct vm_area_struct, vm_rb);
@@ -1138,7 +1136,11 @@
 	tlb = tlb_gather_mmu(mm, 0);
 	unmap_vmas(&tlb, mm, vma, start, end, &nr_accounted);
 	vm_unacct_memory(nr_accounted);
-	free_pgtables(tlb, prev, start, end);
+
+	if (is_hugepage_only_range(start, end - start))
+		hugetlb_free_pgtables(tlb, prev, start, end);
+	else
+		free_pgtables(tlb, prev, start, end);
 	tlb_finish_mmu(tlb, start, end);
 }
 
@@ -1203,7 +1205,7 @@
 		new->vm_ops->open(new);
 
 	if (vma->vm_file)
-		 mapping = vma->vm_file->f_dentry->d_inode->i_mapping;
+		 mapping = vma->vm_file->f_mapping;
 
 	if (mapping)
 		down(&mapping->i_shared_sem);
--- diff/mm/msync.c	2003-05-21 11:50:10.000000000 +0100
+++ source/mm/msync.c	2003-12-29 09:30:42.000000000 +0000
@@ -146,20 +146,20 @@
 		ret = filemap_sync(vma, start, end-start, flags);
 
 		if (!ret && (flags & MS_SYNC)) {
-			struct inode *inode = file->f_dentry->d_inode;
+			struct address_space *mapping = file->f_mapping;
 			int err;
 
-			down(&inode->i_sem);
-			ret = filemap_fdatawrite(inode->i_mapping);
+			down(&mapping->host->i_sem);
+			ret = filemap_fdatawrite(mapping);
 			if (file->f_op && file->f_op->fsync) {
 				err = file->f_op->fsync(file,file->f_dentry,1);
 				if (err && !ret)
 					ret = err;
 			}
-			err = filemap_fdatawait(inode->i_mapping);
+			err = filemap_fdatawait(mapping);
 			if (!ret)
 				ret = err;
-			up(&inode->i_sem);
+			up(&mapping->host->i_sem);
 		}
 	}
 	return ret;
--- diff/mm/oom_kill.c	2003-10-09 09:47:17.000000000 +0100
+++ source/mm/oom_kill.c	2003-12-29 09:30:42.000000000 +0000
@@ -24,20 +24,6 @@
 /* #define DEBUG */
 
 /**
- * int_sqrt - oom_kill.c internal function, rough approximation to sqrt
- * @x: integer of which to calculate the sqrt
- * 
- * A very rough approximation to the sqrt() function.
- */
-static unsigned int int_sqrt(unsigned int x)
-{
-	unsigned int out = x;
-	while (x & ~(unsigned int)1) x >>=2, out >>=1;
-	if (x) out -= out >> 2;
-	return (out ? out : 1);
-}	
-
-/**
  * oom_badness - calculate a numeric value for how bad this task has been
  * @p: task struct of which task we should calculate
  *
@@ -57,7 +43,7 @@
 
 static int badness(struct task_struct *p)
 {
-	int points, cpu_time, run_time;
+	int points, cpu_time, run_time, s;
 
 	if (!p->mm)
 		return 0;
@@ -77,8 +63,12 @@
 	cpu_time = (p->utime + p->stime) >> (SHIFT_HZ + 3);
 	run_time = (get_jiffies_64() - p->start_time) >> (SHIFT_HZ + 10);
 
-	points /= int_sqrt(cpu_time);
-	points /= int_sqrt(int_sqrt(run_time));
+	s = int_sqrt(cpu_time);
+	if (s)
+		points /= s;
+	s = int_sqrt(int_sqrt(run_time));
+	if (s)
+		points /= s;
 
 	/*
 	 * Niced processes are most likely less important, so double
--- diff/mm/page-writeback.c	2003-10-27 09:20:39.000000000 +0000
+++ source/mm/page-writeback.c	2003-12-29 09:30:42.000000000 +0000
@@ -28,6 +28,7 @@
 #include <linux/smp.h>
 #include <linux/sysctl.h>
 #include <linux/cpu.h>
+#include <linux/pagevec.h>
 
 /*
  * The maximum number of pages to writeout in a single bdflush/kupdate
@@ -146,7 +147,7 @@
  * If we're over `background_thresh' then pdflush is woken to perform some
  * writeout.
  */
-static void balance_dirty_pages(struct address_space *mapping)
+static int balance_dirty_pages(struct address_space *mapping)
 {
 	struct page_state ps;
 	long nr_reclaimable;
@@ -163,6 +164,7 @@
 			.sync_mode	= WB_SYNC_NONE,
 			.older_than_this = NULL,
 			.nr_to_write	= write_chunk,
+			.nonblocking	= !is_sync_wait(current->io_wait)
 		};
 
 		get_dirty_limits(&ps, &background_thresh, &dirty_thresh);
@@ -189,7 +191,11 @@
 			if (pages_written >= write_chunk)
 				break;		/* We've done our duty */
 		}
-		blk_congestion_wait(WRITE, HZ/10);
+		if (-EIOCBRETRY == blk_congestion_wait_wq(WRITE, HZ/10,
+			current->io_wait)) {
+			pr_debug("async blk congestion wait\n");
+			return -EIOCBRETRY;
+		}
 	}
 
 	if (nr_reclaimable + ps.nr_writeback <= dirty_thresh)
@@ -197,6 +203,8 @@
 
 	if (!writeback_in_progress(bdi) && nr_reclaimable > background_thresh)
 		pdflush_operation(background_writeout, 0);
+
+	return 0;
 }
 
 /**
@@ -212,7 +220,7 @@
  * decrease the ratelimiting by a lot, to prevent individual processes from
  * overshooting the limit by (ratelimit_pages) each.
  */
-void balance_dirty_pages_ratelimited(struct address_space *mapping)
+int balance_dirty_pages_ratelimited(struct address_space *mapping)
 {
 	static DEFINE_PER_CPU(int, ratelimits) = 0;
 	long ratelimit;
@@ -228,10 +236,10 @@
 	if (get_cpu_var(ratelimits)++ >= ratelimit) {
 		__get_cpu_var(ratelimits) = 0;
 		put_cpu_var(ratelimits);
-		balance_dirty_pages(mapping);
-		return;
+		return balance_dirty_pages(mapping);
 	}
 	put_cpu_var(ratelimits);
+	return 0;
 }
 
 /*
@@ -567,3 +575,152 @@
 	return 0;
 }
 EXPORT_SYMBOL(test_clear_page_dirty);
+
+
+static ssize_t operate_on_page_range(struct address_space *mapping,
+		loff_t pos, size_t count, int (*operator)(struct page *))
+{
+	pgoff_t first = pos >> PAGE_CACHE_SHIFT;
+	pgoff_t last = (pos + count - 1) >> PAGE_CACHE_SHIFT;	/* inclusive */
+	pgoff_t next = first, curr = first;
+	struct pagevec pvec;
+	ssize_t ret = 0, bytes = 0;
+	int i, nr;
+
+	if (count == 0)
+		return 0;
+
+	pagevec_init(&pvec, 0);
+	while ((nr = pagevec_lookup(&pvec, mapping, &next,
+				min((pgoff_t)PAGEVEC_SIZE, last - next + 1)))) {
+		for (i = 0; i < pagevec_count(&pvec); i++) {
+			struct page *page = pvec.pages[i];
+
+			curr = page->index;
+			if (page->mapping != mapping) /* truncated ?*/ {
+				curr = next;
+				break;
+			} else {
+				ret = (*operator)(page);
+				if (ret == -EIOCBRETRY)
+					break;
+				if (PageError(page)) {
+					if (!ret)
+						ret = -EIO;
+				} else
+					curr++;
+			}
+		}
+		pagevec_release(&pvec);
+		if ((ret == -EIOCBRETRY) || (next > last))
+			break;
+	}
+	if (!nr)
+		curr = last + 1;
+
+	bytes = (curr << PAGE_CACHE_SHIFT) - pos;
+	if (bytes > count)
+		bytes = count;
+	return (bytes && (!ret || (ret == -EIOCBRETRY))) ? bytes : ret;
+}
+
+static int page_waiter(struct page *page)
+{
+	return wait_on_page_writeback_wq(page, current->io_wait);
+}
+
+static size_t
+wait_on_page_range(struct address_space *mapping, loff_t pos, size_t count)
+{
+	return operate_on_page_range(mapping, pos, count, page_waiter);
+}
+
+static int page_writer(struct page *page)
+{
+	struct writeback_control wbc = {
+		.sync_mode	= WB_SYNC_ALL,
+		.nr_to_write	= 1,
+	};
+
+	lock_page(page);
+	if (!page->mapping) {	/* truncated */
+		unlock_page(page);
+		return 0;
+	}
+	if (!test_clear_page_dirty(page)) {
+		unlock_page(page);
+		return 0;
+	}
+	wait_on_page_writeback(page);
+	return page->mapping->a_ops->writepage(page, &wbc);
+}
+
+static ssize_t
+write_out_page_range(struct address_space *mapping, loff_t pos, size_t count)
+{
+	return operate_on_page_range(mapping, pos, count, page_writer);
+}
+
+/*
+ * Write and wait upon all the pages in the passed range.  This is a "data
+ * integrity" operation.  It waits upon in-flight writeout before starting and
+ * waiting upon new writeout.  If there was an IO error, return it.
+ *
+ * We need to re-take i_sem during the generic_osync_inode list walk because
+ * it is otherwise livelockable.
+ */
+ssize_t sync_page_range(struct inode *inode, struct address_space *mapping,
+			loff_t pos, size_t count)
+{
+	int ret = 0;
+
+	if (in_aio()) {
+		/* Already issued writeouts for this iocb ? */
+		if (kiocbTrySync(io_wait_to_kiocb(current->io_wait)))
+			goto do_wait; /* just need to check if done */
+	}
+	if (!mapping->a_ops->writepage)
+		return 0;
+	if (mapping->backing_dev_info->memory_backed)
+		return 0;
+	ret = write_out_page_range(mapping, pos, count);
+	if (ret >= 0) {
+		down(&inode->i_sem);
+		ret = generic_osync_inode(inode, mapping, OSYNC_METADATA);
+		up(&inode->i_sem);
+	}
+do_wait:
+	if (ret >= 0)
+		ret = wait_on_page_range(mapping, pos, count);
+	return ret;
+}
+
+/*
+ * It is really better to use sync_page_range, rather than call
+ * sync_page_range_nolock while holding i_sem, if you don't
+ * want to block parallel O_SYNC writes until the pages in this
+ * range are written out.
+ */
+ssize_t sync_page_range_nolock(struct inode *inode, struct address_space
+	*mapping, loff_t pos, size_t count)
+{
+	ssize_t ret = 0;
+
+	if (in_aio()) {
+		/* Already issued writeouts for this iocb ? */
+		if (kiocbTrySync(io_wait_to_kiocb(current->io_wait)))
+			goto do_wait; /* just need to check if done */
+	}
+	if (!mapping->a_ops->writepage)
+		return 0;
+	if (mapping->backing_dev_info->memory_backed)
+		return 0;
+	ret = write_out_page_range(mapping, pos, count);
+	if (ret >= 0) {
+		ret = generic_osync_inode(inode, mapping, OSYNC_METADATA);
+	}
+do_wait:
+	if (ret >= 0)
+		ret = wait_on_page_range(mapping, pos, count);
+	return ret;
+}
--- diff/mm/page_alloc.c	2003-10-09 09:47:34.000000000 +0100
+++ source/mm/page_alloc.c	2003-12-29 09:30:42.000000000 +0000
@@ -267,9 +267,11 @@
 void __free_pages_ok(struct page *page, unsigned int order)
 {
 	LIST_HEAD(list);
+	int i;
 
 	mod_page_state(pgfree, 1 << order);
-	free_pages_check(__FUNCTION__, page);
+	for (i = 0 ; i < (1 << order) ; ++i)
+		free_pages_check(__FUNCTION__, page + i);
 	list_add(&page->list, &list);
 	kernel_map_pages(page, 1<<order, 0);
 	free_pages_bulk(page_zone(page), 1, &list, order);
@@ -537,7 +539,7 @@
 {
 	const int wait = gfp_mask & __GFP_WAIT;
 	unsigned long min;
-	struct zone **zones, *classzone;
+	struct zone **zones;
 	struct page *page;
 	struct reclaim_state reclaim_state;
 	struct task_struct *p = current;
@@ -552,8 +554,7 @@
 		cold = 1;
 
 	zones = zonelist->zones;  /* the list of zones suitable for gfp_mask */
-	classzone = zones[0]; 
-	if (classzone == NULL)    /* no zones in the zonelist */
+	if (zones[0] == NULL)     /* no zones in the zonelist */
 		return NULL;
 
 	/* Go through the zonelist once, looking for a zone with enough free */
@@ -628,7 +629,7 @@
 	reclaim_state.reclaimed_slab = 0;
 	p->reclaim_state = &reclaim_state;
 
-	try_to_free_pages(classzone, gfp_mask, order);
+	try_to_free_pages(zones, gfp_mask, order);
 
 	p->reclaim_state = NULL;
 	p->flags &= ~PF_MEMALLOC;
@@ -672,6 +673,7 @@
 		printk("%s: page allocation failure."
 			" order:%d, mode:0x%x\n",
 			p->comm, order, gfp_mask);
+		dump_stack();
 	}
 	return NULL;
 got_pg:
@@ -1589,7 +1591,7 @@
  *	that the pages_{min,low,high} values for each zone are set correctly 
  *	with respect to min_free_kbytes.
  */
-void setup_per_zone_pages_min(void)
+static void setup_per_zone_pages_min(void)
 {
 	unsigned long pages_min = min_free_kbytes >> (PAGE_SHIFT - 10);
 	unsigned long lowmem_pages = 0;
@@ -1633,6 +1635,45 @@
 }
 
 /*
+ * Initialise min_free_kbytes.
+ *
+ * For small machines we want it small (128k min).  For large machines
+ * we want it large (16MB max).  But it is not linear, because network
+ * bandwidth does not increase linearly with machine size.  We use
+ *
+ *	min_free_kbytes = sqrt(lowmem_kbytes)
+ *
+ * which yields
+ *
+ * 16MB:	128k
+ * 32MB:	181k
+ * 64MB:	256k
+ * 128MB:	362k
+ * 256MB:	512k
+ * 512MB:	724k
+ * 1024MB:	1024k
+ * 2048MB:	1448k
+ * 4096MB:	2048k
+ * 8192MB:	2896k
+ * 16384MB:	4096k
+ */
+static int __init init_per_zone_pages_min(void)
+{
+	unsigned long lowmem_kbytes;
+
+	lowmem_kbytes = nr_free_buffer_pages() * (PAGE_SIZE >> 10);
+
+	min_free_kbytes = int_sqrt(lowmem_kbytes);
+	if (min_free_kbytes < 128)
+		min_free_kbytes = 128;
+	if (min_free_kbytes > 16384)
+		min_free_kbytes = 16384;
+	setup_per_zone_pages_min();
+	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 
  *	changes.
--- diff/mm/pdflush.c	2003-10-09 09:47:17.000000000 +0100
+++ source/mm/pdflush.c	2003-12-29 09:30:42.000000000 +0000
@@ -84,6 +84,8 @@
 	unsigned long when_i_went_to_sleep;
 };
 
+static int wakeup_count = 100;
+
 static int __pdflush(struct pdflush_work *my_work)
 {
 	daemonize("pdflush");
@@ -112,7 +114,10 @@
 
 		spin_lock_irq(&pdflush_lock);
 		if (!list_empty(&my_work->list)) {
-			printk("pdflush: bogus wakeup!\n");
+			if (wakeup_count > 0) {
+				wakeup_count--;
+				printk("pdflush: bogus wakeup!\n");
+			}
 			my_work->fn = NULL;
 			continue;
 		}
@@ -182,6 +187,7 @@
 {
 	unsigned long flags;
 	int ret = 0;
+	static int poke_count = 0;
 
 	if (fn == NULL)
 		BUG();		/* Hard to diagnose if it's deferred */
@@ -190,9 +196,19 @@
 	if (list_empty(&pdflush_list)) {
 		spin_unlock_irqrestore(&pdflush_lock, flags);
 		ret = -1;
+		if (wakeup_count < 100 && poke_count < 10) {
+			printk("%s: no threads\n", __FUNCTION__);
+			dump_stack();
+			poke_count++;
+		}
 	} else {
 		struct pdflush_work *pdf;
 
+		if (wakeup_count < 100 && poke_count < 10) {
+			printk("%s: found a thread\n", __FUNCTION__);
+			dump_stack();
+			poke_count++;
+		}
 		pdf = list_entry(pdflush_list.next, struct pdflush_work, list);
 		list_del_init(&pdf->list);
 		if (list_empty(&pdflush_list))
--- diff/mm/readahead.c	2003-10-09 09:47:34.000000000 +0100
+++ source/mm/readahead.c	2003-12-29 09:30:42.000000000 +0000
@@ -347,6 +347,8 @@
 	unsigned min;
 	unsigned orig_next_size;
 	unsigned actual;
+	int first_access=0;
+	unsigned long preoffset=0;
 
 	/*
 	 * Here we detect the case where the application is performing
@@ -370,16 +372,18 @@
 	min = get_min_readahead(ra);
 	orig_next_size = ra->next_size;
 
-	if (ra->next_size == 0 && offset == 0) {
+	if (ra->next_size == 0) {
 		/*
-		 * Special case - first read from first page.
+		 * Special case - first read.
 		 * We'll assume it's a whole-file read, and
 		 * grow the window fast.
 		 */
+		first_access=1;
 		ra->next_size = max / 2;
 		goto do_io;
 	}
 
+	preoffset = ra->prev_page;
 	ra->prev_page = offset;
 
 	if (offset >= ra->start && offset <= (ra->start + ra->size)) {
@@ -439,20 +443,44 @@
 		 * ahead window and get some I/O underway for the new
 		 * current window.
 		 */
+		if (!first_access && preoffset >= ra->start &&
+				preoffset < (ra->start + ra->size)) {
+			 /* Heuristic:  If 'n' pages were
+			  * accessed in the current window, there
+			  * is a high probability that around 'n' pages
+			  * shall be used in the next current window.
+			  *
+			  * To minimize lazy-readahead triggered
+			  * in the next current window, read in
+			  * an extra page.
+			  */
+			ra->next_size = preoffset - ra->start + 2;
+		}
 		ra->start = offset;
 		ra->size = ra->next_size;
 		ra->ahead_start = 0;		/* Invalidate these */
 		ra->ahead_size = 0;
 		actual = do_page_cache_readahead(mapping, filp, offset,
 						 ra->size);
-		check_ra_success(ra, ra->size, actual, orig_next_size);
+		if(!first_access) {
+			/*
+			 * do not adjust the readahead window size the first
+			 * time, the ahead window might get closed if all
+			 * the pages are already in the cache.
+			 */
+			check_ra_success(ra, ra->size, actual, orig_next_size);
+		}
 	} else {
 		/*
 		 * This read request is within the current window.  It is time
 		 * to submit I/O for the ahead window while the application is
-		 * crunching through the current window.
+		 * about to step into the ahead window.
+		 * Heuristic: Defer reading the ahead window till we hit
+		 * the last page in the current window. (lazy readahead)
+		 * If we read in earlier we run the risk of wasting
+		 * the ahead window.
 		 */
-		if (ra->ahead_start == 0) {
+		if (ra->ahead_start == 0 && offset == (ra->start + ra->size -1)) {
 			ra->ahead_start = ra->start + ra->size;
 			ra->ahead_size = ra->next_size;
 			actual = do_page_cache_readahead(mapping, filp,
@@ -488,7 +516,7 @@
 		const unsigned long max = get_max_readahead(ra);
 
 		if (offset != ra->prev_page + 1) {
-			ra->size = 0;			/* Not sequential */
+			ra->size = ra->size?ra->size-1:0; /* Not sequential */
 		} else {
 			ra->size++;			/* A sequential read */
 			if (ra->size >= max) {		/* Resume readahead */
--- diff/mm/shmem.c	2003-10-27 09:20:44.000000000 +0000
+++ source/mm/shmem.c	2003-12-29 09:30:42.000000000 +0000
@@ -71,7 +71,7 @@
 };
 
 static int shmem_getpage(struct inode *inode, unsigned long idx,
-			 struct page **pagep, enum sgp_type sgp);
+			 struct page **pagep, enum sgp_type sgp, int *type);
 
 static inline struct page *shmem_dir_alloc(unsigned int gfp_mask)
 {
@@ -540,7 +540,7 @@
 			if (attr->ia_size & (PAGE_CACHE_SIZE-1)) {
 				(void) shmem_getpage(inode,
 					attr->ia_size>>PAGE_CACHE_SHIFT,
-						&page, SGP_READ);
+						&page, SGP_READ, NULL);
 			}
 			/*
 			 * Reset SHMEM_PAGEIN flag so that shmem_truncate can
@@ -765,7 +765,7 @@
  * vm. If we swap it in we mark it dirty since we also free the swap
  * entry since a page cannot live in both the swap and page cache
  */
-static int shmem_getpage(struct inode *inode, unsigned long idx, struct page **pagep, enum sgp_type sgp)
+static int shmem_getpage(struct inode *inode, unsigned long idx, struct page **pagep, enum sgp_type sgp, int *type)
 {
 	struct address_space *mapping = inode->i_mapping;
 	struct shmem_inode_info *info = SHMEM_I(inode);
@@ -774,7 +774,7 @@
 	struct page *swappage;
 	swp_entry_t *entry;
 	swp_entry_t swap;
-	int error;
+	int error, majmin = VM_FAULT_MINOR;
 
 	if (idx >= SHMEM_MAX_INDEX)
 		return -EFBIG;
@@ -811,6 +811,10 @@
 		if (!swappage) {
 			shmem_swp_unmap(entry);
 			spin_unlock(&info->lock);
+			/* here we actually do the io */
+			if (majmin == VM_FAULT_MINOR && type)
+				inc_page_state(pgmajfault);
+			majmin = VM_FAULT_MAJOR;
 			swapin_readahead(swap);
 			swappage = read_swap_cache_async(swap);
 			if (!swappage) {
@@ -959,6 +963,8 @@
 		} else
 			*pagep = ZERO_PAGE(0);
 	}
+	if (type)
+		*type = majmin;
 	return 0;
 
 failed:
@@ -969,7 +975,7 @@
 	return error;
 }
 
-struct page *shmem_nopage(struct vm_area_struct *vma, unsigned long address, int unused)
+struct page *shmem_nopage(struct vm_area_struct *vma, unsigned long address, int *type)
 {
 	struct inode *inode = vma->vm_file->f_dentry->d_inode;
 	struct page *page = NULL;
@@ -980,7 +986,7 @@
 	idx += vma->vm_pgoff;
 	idx >>= PAGE_CACHE_SHIFT - PAGE_SHIFT;
 
-	error = shmem_getpage(inode, idx, &page, SGP_CACHE);
+	error = shmem_getpage(inode, idx, &page, SGP_CACHE, type);
 	if (error)
 		return (error == -ENOMEM)? NOPAGE_OOM: NOPAGE_SIGBUS;
 
@@ -1007,7 +1013,7 @@
 		/*
 		 * Will need changing if PAGE_CACHE_SIZE != PAGE_SIZE
 		 */
-		err = shmem_getpage(inode, pgoff, &page, sgp);
+		err = shmem_getpage(inode, pgoff, &page, sgp, NULL);
 		if (err)
 			return err;
 		if (page) {
@@ -1157,7 +1163,7 @@
 shmem_prepare_write(struct file *file, struct page *page, unsigned offset, unsigned to)
 {
 	struct inode *inode = page->mapping->host;
-	return shmem_getpage(inode, page->index, &page, SGP_WRITE);
+	return shmem_getpage(inode, page->index, &page, SGP_WRITE, NULL);
 }
 
 static ssize_t
@@ -1180,7 +1186,7 @@
 	pos = *ppos;
 	written = 0;
 
-	err = generic_write_checks(inode, file, &pos, &count, 0);
+	err = generic_write_checks(file, &pos, &count, 0);
 	if (err || !count)
 		goto out;
 
@@ -1214,7 +1220,7 @@
 		 * But it still may be a good idea to prefault below.
 		 */
 
-		err = shmem_getpage(inode, index, &page, SGP_WRITE);
+		err = shmem_getpage(inode, index, &page, SGP_WRITE, NULL);
 		if (err)
 			break;
 
@@ -1296,7 +1302,7 @@
 				break;
 		}
 
-		desc->error = shmem_getpage(inode, index, &page, SGP_READ);
+		desc->error = shmem_getpage(inode, index, &page, SGP_READ, NULL);
 		if (desc->error) {
 			if (desc->error == -EINVAL)
 				desc->error = 0;
@@ -1552,7 +1558,7 @@
 			iput(inode);
 			return -ENOMEM;
 		}
-		error = shmem_getpage(inode, 0, &page, SGP_WRITE);
+		error = shmem_getpage(inode, 0, &page, SGP_WRITE, NULL);
 		if (error) {
 			vm_unacct_memory(VM_ACCT(1));
 			iput(inode);
@@ -1590,7 +1596,7 @@
 static int shmem_readlink(struct dentry *dentry, char __user *buffer, int buflen)
 {
 	struct page *page = NULL;
-	int res = shmem_getpage(dentry->d_inode, 0, &page, SGP_READ);
+	int res = shmem_getpage(dentry->d_inode, 0, &page, SGP_READ, NULL);
 	if (res)
 		return res;
 	res = vfs_readlink(dentry, buffer, buflen, kmap(page));
@@ -1603,7 +1609,7 @@
 static int shmem_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
 	struct page *page = NULL;
-	int res = shmem_getpage(dentry->d_inode, 0, &page, SGP_READ);
+	int res = shmem_getpage(dentry->d_inode, 0, &page, SGP_READ, NULL);
 	if (res)
 		return res;
 	res = vfs_follow_link(nd, kmap(page));
@@ -1972,6 +1978,7 @@
 	inode->i_nlink = 0;	/* It is unlinked */
 	file->f_vfsmnt = mntget(shm_mnt);
 	file->f_dentry = dentry;
+	file->f_mapping = inode->i_mapping;
 	file->f_op = &shmem_file_operations;
 	file->f_mode = FMODE_WRITE | FMODE_READ;
 	return(file);
--- diff/mm/slab.c	2003-10-27 09:20:44.000000000 +0000
+++ source/mm/slab.c	2003-12-29 09:30:42.000000000 +0000
@@ -805,13 +805,14 @@
 	void *addr;
 
 	flags |= cachep->gfpflags;
-	if (cachep->flags & SLAB_RECLAIM_ACCOUNT)
-		atomic_add(1<<cachep->gfporder, &slab_reclaim_pages);
 	addr = (void*)__get_free_pages(flags, cachep->gfporder);
 	if (addr) {
 		int i = (1 << cachep->gfporder);
 		struct page *page = virt_to_page(addr);
 
+		if (cachep->flags & SLAB_RECLAIM_ACCOUNT)
+			atomic_add(i, &slab_reclaim_pages);
+		add_page_state(nr_slab, i);
 		while (i--) {
 			SetPageSlab(page);
 			page++;
@@ -1180,7 +1181,8 @@
 		cachep = NULL;
 		goto opps;
 	}
-	slab_size = L1_CACHE_ALIGN(cachep->num*sizeof(kmem_bufctl_t)+sizeof(struct slab));
+	slab_size = L1_CACHE_ALIGN(cachep->num*sizeof(kmem_bufctl_t) +
+			sizeof(struct slab));
 
 	/*
 	 * If the slab has been placed off-slab, and we have enough space then
@@ -1224,10 +1226,13 @@
 			 * the cache that's used by kmalloc(24), otherwise
 			 * the creation of further caches will BUG().
 			 */
-			cachep->array[smp_processor_id()] = &initarray_generic.cache;
+			cachep->array[smp_processor_id()] =
+					&initarray_generic.cache;
 			g_cpucache_up = PARTIAL;
 		} else {
-			cachep->array[smp_processor_id()] = kmalloc(sizeof(struct arraycache_init),GFP_KERNEL);
+			cachep->array[smp_processor_id()] =
+				kmalloc(sizeof(struct arraycache_init),
+					GFP_KERNEL);
 		}
 		BUG_ON(!ac_data(cachep));
 		ac_data(cachep)->avail = 0;
@@ -1241,7 +1246,7 @@
 	} 
 
 	cachep->lists.next_reap = jiffies + REAPTIMEOUT_LIST3 +
-					((unsigned long)cachep)%REAPTIMEOUT_LIST3;
+				((unsigned long)cachep)%REAPTIMEOUT_LIST3;
 
 	/* Need the semaphore to access the chain. */
 	down(&cache_chain_sem);
@@ -1254,16 +1259,24 @@
 		list_for_each(p, &cache_chain) {
 			kmem_cache_t *pc = list_entry(p, kmem_cache_t, next);
 			char tmp;
-			/* This happens when the module gets unloaded and doesn't
-			   destroy its slab cache and noone else reuses the vmalloc
-			   area of the module. Print a warning. */
-			if (__get_user(tmp,pc->name)) { 
-				printk("SLAB: cache with size %d has lost its name\n", 
-					pc->objsize); 
+
+			/*
+			 * This happens when the module gets unloaded and
+			 * doesn't destroy its slab cache and noone else reuses
+			 * the vmalloc area of the module. Print a warning.
+			 */
+#ifdef CONFIG_X86_UACCESS_INDIRECT
+			if (__direct_get_user(tmp,pc->name)) {
+#else
+			if (__get_user(tmp,pc->name)) {
+#endif
+				printk("SLAB: cache with size %d has lost its "
+						"name\n", pc->objsize);
 				continue; 
 			} 	
 			if (!strcmp(pc->name,name)) { 
-				printk("kmem_cache_create: duplicate cache %s\n",name); 
+				printk("kmem_cache_create: duplicate "
+						"cache %s\n",name);
 				up(&cache_chain_sem); 
 				BUG(); 
 			}	
@@ -1608,7 +1621,6 @@
 	do {
 		SET_PAGE_CACHE(page, cachep);
 		SET_PAGE_SLAB(page, slabp);
-		inc_page_state(nr_slab);
 		page++;
 	} while (--i);
 
@@ -1890,6 +1902,15 @@
 		*dbg_redzone1(cachep, objp) = RED_ACTIVE;
 		*dbg_redzone2(cachep, objp) = RED_ACTIVE;
 	}
+	{
+		int objnr;
+		struct slab *slabp;
+
+		slabp = GET_PAGE_SLAB(virt_to_page(objp));
+
+		objnr = (objp - slabp->s_mem) / cachep->objsize;
+		slab_bufctl(slabp)[objnr] = (int)caller;
+	}
 	objp += obj_dbghead(cachep);
 	if (cachep->ctor && cachep->flags & SLAB_POISON) {
 		unsigned long	ctor_flags = SLAB_CTOR_CONSTRUCTOR;
@@ -1951,12 +1972,14 @@
 		objnr = (objp - slabp->s_mem) / cachep->objsize;
 		check_slabp(cachep, slabp);
 #if DEBUG
+#if 0
 		if (slab_bufctl(slabp)[objnr] != BUFCTL_FREE) {
 			printk(KERN_ERR "slab: double free detected in cache '%s', objp %p.\n",
 						cachep->name, objp);
 			BUG();
 		}
 #endif
+#endif
 		slab_bufctl(slabp)[objnr] = slabp->free;
 		slabp->free = objnr;
 		STATS_DEC_ACTIVE(cachep);
@@ -2693,6 +2716,29 @@
 	.show	= s_show,
 };
 
+static void do_dump_slabp(kmem_cache_t *cachep)
+{
+#if DEBUG
+	struct list_head *q;
+
+	check_irq_on();
+	spin_lock_irq(&cachep->spinlock);
+	list_for_each(q,&cachep->lists.slabs_full) {
+		struct slab *slabp;
+		int i;
+		slabp = list_entry(q, struct slab, list);
+		for (i = 0; i < cachep->num; i++) {
+			unsigned long sym = slab_bufctl(slabp)[i];
+
+			printk("obj %p/%d: %p", slabp, i, (void *)sym);
+			print_symbol(" <%s>", sym);
+			printk("\n");
+		}
+	}
+	spin_unlock_irq(&cachep->spinlock);
+#endif
+}
+
 #define MAX_SLABINFO_WRITE 128
 /**
  * slabinfo_write - Tuning for the slab allocator
@@ -2733,9 +2779,11 @@
 			    batchcount < 1 ||
 			    batchcount > limit ||
 			    shared < 0) {
-				res = -EINVAL;
+				do_dump_slabp(cachep);
+				res = 0;
 			} else {
-				res = do_tune_cpucache(cachep, limit, batchcount, shared);
+				res = do_tune_cpucache(cachep, limit,
+							batchcount, shared);
 			}
 			break;
 		}
--- diff/mm/swap.c	2003-11-25 15:24:59.000000000 +0000
+++ source/mm/swap.c	2003-12-29 09:30:42.000000000 +0000
@@ -348,12 +348,15 @@
  * The search returns a group of mapping-contiguous pages with ascending
  * indexes.  There may be holes in the indices due to not-present pages.
  *
- * pagevec_lookup() returns the number of pages which were found.
+ * pagevec_lookup() returns the number of pages which were found
+ * and also atomically sets the next offset to continue looking up
+ * mapping contiguous pages from (useful when doing a range of
+ * pagevec lookups in chunks of PAGEVEC_SIZE).
  */
 unsigned int pagevec_lookup(struct pagevec *pvec, struct address_space *mapping,
-		pgoff_t start, unsigned int nr_pages)
+		pgoff_t *next, unsigned int nr_pages)
 {
-	pvec->nr = find_get_pages(mapping, start, nr_pages, pvec->pages);
+	pvec->nr = find_get_pages(mapping, next, nr_pages, pvec->pages);
 	return pagevec_count(pvec);
 }
 
@@ -386,17 +389,19 @@
 #ifdef CONFIG_SMP
 void percpu_counter_mod(struct percpu_counter *fbc, long amount)
 {
+	long count;
+	long *pcount;
 	int cpu = get_cpu();
-	long count = fbc->counters[cpu].count;
 
-	count += amount;
+	pcount = per_cpu_ptr(fbc->counters, cpu);
+	count = *pcount + amount;
 	if (count >= FBC_BATCH || count <= -FBC_BATCH) {
 		spin_lock(&fbc->lock);
 		fbc->count += count;
 		spin_unlock(&fbc->lock);
 		count = 0;
 	}
-	fbc->counters[cpu].count = count;
+	*pcount = count;
 	put_cpu();
 }
 EXPORT_SYMBOL(percpu_counter_mod);
--- diff/mm/swapfile.c	2003-10-27 09:20:39.000000000 +0000
+++ source/mm/swapfile.c	2003-12-29 09:30:42.000000000 +0000
@@ -912,7 +912,7 @@
 	sector_t last_block;
 	int ret;
 
-	inode = sis->swap_file->f_dentry->d_inode;
+	inode = sis->swap_file->f_mapping->host;
 	if (S_ISBLK(inode->i_mode)) {
 		ret = add_swap_extent(sis, 0, sis->max, 0);
 		goto done;
@@ -1031,13 +1031,13 @@
 	if (IS_ERR(victim))
 		goto out;
 
-	mapping = victim->f_dentry->d_inode->i_mapping;
+	mapping = victim->f_mapping;
 	prev = -1;
 	swap_list_lock();
 	for (type = swap_list.head; type >= 0; type = swap_info[type].next) {
 		p = swap_info + type;
 		if ((p->flags & SWP_ACTIVE) == SWP_ACTIVE) {
-			if (p->swap_file->f_dentry->d_inode->i_mapping==mapping)
+			if (p->swap_file->f_mapping == mapping)
 				break;
 		}
 		prev = type;
@@ -1099,13 +1099,12 @@
 	swap_device_unlock(p);
 	swap_list_unlock();
 	vfree(swap_map);
-	if (S_ISBLK(swap_file->f_dentry->d_inode->i_mode)) {
-		struct block_device *bdev;
-		bdev = swap_file->f_dentry->d_inode->i_bdev;
+	if (S_ISBLK(mapping->host->i_mode)) {
+		struct block_device *bdev = I_BDEV(mapping->host);
 		set_blocksize(bdev, p->old_block_size);
 		bd_release(bdev);
 	} else {
-		up(&swap_file->f_dentry->d_inode->i_mapping->host->i_sem);
+		up(&mapping->host->i_sem);
 	}
 	filp_close(swap_file, NULL);
 	err = 0;
@@ -1231,8 +1230,8 @@
 	int swapfilesize;
 	unsigned short *swap_map;
 	struct page *page = NULL;
-	struct inode *inode;
-	struct inode *downed_inode = NULL;
+	struct inode *inode = NULL;
+	int did_down = 0;
 
 	if (!capable(CAP_SYS_ADMIN))
 		return -EPERM;
@@ -1279,8 +1278,8 @@
 	}
 
 	p->swap_file = swap_file;
-	inode = swap_file->f_dentry->d_inode;
-	mapping = swap_file->f_dentry->d_inode->i_mapping;
+	mapping = swap_file->f_mapping;
+	inode = mapping->host;
 
 	error = -EBUSY;
 	for (i = 0; i < nr_swapfiles; i++) {
@@ -1288,32 +1287,32 @@
 
 		if (i == type || !q->swap_file)
 			continue;
-		if (mapping == q->swap_file->f_dentry->d_inode->i_mapping)
+		if (mapping == q->swap_file->f_mapping)
 			goto bad_swap;
 	}
 
 	error = -EINVAL;
 	if (S_ISBLK(inode->i_mode)) {
-		bdev = inode->i_bdev;
+		bdev = I_BDEV(inode);
 		error = bd_claim(bdev, sys_swapon);
 		if (error < 0) {
 			bdev = NULL;
 			goto bad_swap;
 		}
 		p->old_block_size = block_size(bdev);
-		error = set_blocksize(inode->i_bdev, PAGE_SIZE);
+		error = set_blocksize(bdev, PAGE_SIZE);
 		if (error < 0)
 			goto bad_swap;
 		p->bdev = bdev;
 	} else if (S_ISREG(inode->i_mode)) {
 		p->bdev = inode->i_sb->s_bdev;
-		downed_inode = mapping->host;
-		down(&downed_inode->i_sem);
+		down(&inode->i_sem);
+		did_down = 1;
 	} else {
 		goto bad_swap;
 	}
 
-	swapfilesize = i_size_read(mapping->host) >> PAGE_SHIFT;
+	swapfilesize = i_size_read(inode) >> PAGE_SHIFT;
 
 	/*
 	 * Read the swap header.
@@ -1465,8 +1464,8 @@
 	}
 	if (name)
 		putname(name);
-	if (error && downed_inode)
-		up(&downed_inode->i_sem);
+	if (error && did_down)
+		up(&inode->i_sem);
 	return error;
 }
 
--- diff/mm/truncate.c	2003-10-09 09:47:34.000000000 +0100
+++ source/mm/truncate.c	2003-12-29 09:30:42.000000000 +0000
@@ -122,14 +122,10 @@
 
 	pagevec_init(&pvec, 0);
 	next = start;
-	while (pagevec_lookup(&pvec, mapping, next, PAGEVEC_SIZE)) {
+	while (pagevec_lookup(&pvec, mapping, &next, PAGEVEC_SIZE)) {
 		for (i = 0; i < pagevec_count(&pvec); i++) {
 			struct page *page = pvec.pages[i];
-			pgoff_t page_index = page->index;
 
-			if (page_index > next)
-				next = page_index;
-			next++;
 			if (TestSetPageLocked(page))
 				continue;
 			if (PageWriteback(page)) {
@@ -155,7 +151,7 @@
 
 	next = start;
 	for ( ; ; ) {
-		if (!pagevec_lookup(&pvec, mapping, next, PAGEVEC_SIZE)) {
+		if (!pagevec_lookup(&pvec, mapping, &next, PAGEVEC_SIZE)) {
 			if (next == start)
 				break;
 			next = start;
@@ -166,14 +162,19 @@
 
 			lock_page(page);
 			wait_on_page_writeback(page);
-			if (page->index > next)
-				next = page->index;
-			next++;
 			truncate_complete_page(mapping, page);
 			unlock_page(page);
 		}
 		pagevec_release(&pvec);
 	}
+
+	if (lstart == 0) {
+		WARN_ON(mapping->nrpages);
+		WARN_ON(!list_empty(&mapping->clean_pages));
+		WARN_ON(!list_empty(&mapping->dirty_pages));
+		WARN_ON(!list_empty(&mapping->locked_pages));
+		WARN_ON(!list_empty(&mapping->io_pages));
+	}
 }
 
 EXPORT_SYMBOL(truncate_inode_pages);
@@ -201,17 +202,13 @@
 
 	pagevec_init(&pvec, 0);
 	while (next <= end &&
-			pagevec_lookup(&pvec, mapping, next, PAGEVEC_SIZE)) {
+			pagevec_lookup(&pvec, mapping, &next, PAGEVEC_SIZE)) {
 		for (i = 0; i < pagevec_count(&pvec); i++) {
 			struct page *page = pvec.pages[i];
 
 			if (TestSetPageLocked(page)) {
-				next++;
 				continue;
 			}
-			if (page->index > next)
-				next = page->index;
-			next++;
 			if (PageDirty(page) || PageWriteback(page))
 				goto unlock;
 			if (page_mapped(page))
@@ -250,14 +247,13 @@
 	int i;
 
 	pagevec_init(&pvec, 0);
-	while (pagevec_lookup(&pvec, mapping, next, PAGEVEC_SIZE)) {
+	while (pagevec_lookup(&pvec, mapping, &next, PAGEVEC_SIZE)) {
 		for (i = 0; i < pagevec_count(&pvec); i++) {
 			struct page *page = pvec.pages[i];
 
 			lock_page(page);
 			if (page->mapping == mapping) {	/* truncate race? */
 				wait_on_page_writeback(page);
-				next = page->index + 1;
 				if (page_mapped(page))
 					clear_page_dirty(page);
 				else
--- diff/mm/vmscan.c	2003-10-09 09:47:34.000000000 +0100
+++ source/mm/vmscan.c	2003-12-29 09:30:42.000000000 +0000
@@ -779,7 +779,7 @@
 		count = atomic_read(&zone->refill_counter);
 		if (count > SWAP_CLUSTER_MAX * 4)
 			count = SWAP_CLUSTER_MAX * 4;
-		atomic_sub(count, &zone->refill_counter);
+		atomic_set(&zone->refill_counter, 0);
 		refill_inactive_zone(zone, count, ps, priority);
 	}
 	return shrink_cache(nr_pages, zone, gfp_mask,
@@ -803,16 +803,15 @@
  * scan then give up on it.
  */
 static int
-shrink_caches(struct zone *classzone, int priority, int *total_scanned,
+shrink_caches(struct zone **zones, int priority, int *total_scanned,
 		int gfp_mask, int nr_pages, struct page_state *ps)
 {
-	struct zone *first_classzone;
-	struct zone *zone;
 	int ret = 0;
+	int i;
 
-	first_classzone = classzone->zone_pgdat->node_zones;
-	for (zone = classzone; zone >= first_classzone; zone--) {
+	for (i = 0; zones[i] != NULL; i++) {
 		int to_reclaim = max(nr_pages, SWAP_CLUSTER_MAX);
+		struct zone *zone = zones[i];
 		int nr_mapped = 0;
 		int max_scan;
 
@@ -855,27 +854,27 @@
  * excessive rotation of the inactive list, which is _supposed_ to be an LRU,
  * yes?
  */
-int try_to_free_pages(struct zone *cz,
+int try_to_free_pages(struct zone **zones,
 		unsigned int gfp_mask, unsigned int order)
 {
 	int priority;
 	int ret = 0;
 	const int nr_pages = SWAP_CLUSTER_MAX;
 	int nr_reclaimed = 0;
-	struct zone *zone;
 	struct reclaim_state *reclaim_state = current->reclaim_state;
+	int i;
 
 	inc_page_state(allocstall);
 
-	for (zone = cz; zone >= cz->zone_pgdat->node_zones; --zone)
-		zone->temp_priority = DEF_PRIORITY;
+	for (i = 0; zones[i] != 0; i++)
+		zones[i]->temp_priority = DEF_PRIORITY;
 
 	for (priority = DEF_PRIORITY; priority >= 0; priority--) {
 		int total_scanned = 0;
 		struct page_state ps;
 
 		get_page_state(&ps);
-		nr_reclaimed += shrink_caches(cz, priority, &total_scanned,
+		nr_reclaimed += shrink_caches(zones, priority, &total_scanned,
 						gfp_mask, nr_pages, &ps);
 		if (nr_reclaimed >= nr_pages) {
 			ret = 1;
@@ -892,7 +891,7 @@
 
 		/* Take a nap, wait for some writeback to complete */
 		blk_congestion_wait(WRITE, HZ/10);
-		if (cz - cz->zone_pgdat->node_zones < ZONE_HIGHMEM) {
+		if (zones[0] - zones[0]->zone_pgdat->node_zones < ZONE_HIGHMEM) {
 			shrink_slab(total_scanned, gfp_mask);
 			if (reclaim_state) {
 				nr_reclaimed += reclaim_state->reclaimed_slab;
@@ -903,8 +902,8 @@
 	if ((gfp_mask & __GFP_FS) && !(gfp_mask & __GFP_NORETRY))
 		out_of_memory();
 out:
-	for (zone = cz; zone >= cz->zone_pgdat->node_zones; --zone)
-		zone->prev_priority = zone->temp_priority;
+	for (i = 0; zones[i] != 0; i++)
+		zones[i]->prev_priority = zones[i]->temp_priority;
 	return ret;
 }
 
--- diff/net/core/dev.c	2003-11-25 15:24:59.000000000 +0000
+++ source/net/core/dev.c	2003-12-29 09:30:42.000000000 +0000
@@ -111,6 +111,10 @@
 #endif	/* CONFIG_NET_RADIO */
 #include <asm/current.h>
 
+#ifdef CONFIG_KGDB
+#include <asm/kgdb.h>
+#endif
+
 /* This define, if set, will randomly drop a packet when congestion
  * is more than moderate.  It helps fairness in the multi-interface
  * case when one of them is a hog, but it kills performance for the
@@ -1380,7 +1384,6 @@
 }
 #endif
 
-
 /**
  *	netif_rx	-	post buffer to the network code
  *	@skb: buffer to post
@@ -1405,6 +1408,21 @@
 	struct softnet_data *queue;
 	unsigned long flags;
 
+#ifdef CONFIG_KGDB
+	/* See if kgdb_eth wants this packet */
+	if (!kgdb_net_interrupt(skb)) {
+		/* No.. if we're 'trapped' then junk it */
+		if (kgdb_eth_is_trapped()) {
+			kfree_skb(skb);
+			return NET_RX_DROP;
+		}
+	} else {
+		/* kgdb_eth ate the packet... drop it silently */
+		kfree_skb(skb);
+		return NET_RX_DROP;
+	}
+#endif
+
 	if (!skb->stamp.tv_sec)
 		do_gettimeofday(&skb->stamp);
 
--- diff/net/socket.c	2003-11-25 15:24:59.000000000 +0000
+++ source/net/socket.c	2003-12-29 09:30:42.000000000 +0000
@@ -394,6 +394,7 @@
 		file->f_dentry->d_op = &sockfs_dentry_operations;
 		d_add(file->f_dentry, SOCK_INODE(sock));
 		file->f_vfsmnt = mntget(sock_mnt);
+		file->f_mapping = file->f_dentry->d_inode->i_mapping;
 
 		sock->file = file;
 		file->f_op = SOCK_INODE(sock)->i_fop = &socket_file_ops;
--- diff/scripts/kconfig/gconf.c	2003-08-20 14:16:34.000000000 +0100
+++ source/scripts/kconfig/gconf.c	2003-12-29 09:30:42.000000000 +0000
@@ -1172,7 +1172,7 @@
 
 	gtk_widget_realize(tree2_w);
 	gtk_tree_view_set_cursor(view, path, NULL, FALSE);
-	gtk_widget_grab_focus(GTK_TREE_VIEW(tree2_w));
+	gtk_widget_grab_focus(GTK_WIDGET(tree2_w));
 
 	return FALSE;
 }
--- diff/scripts/modpost.c	2003-09-30 15:46:21.000000000 +0100
+++ source/scripts/modpost.c	2003-12-29 09:30:42.000000000 +0000
@@ -324,6 +324,19 @@
 	}
 }
 
+int
+is_vmlinux(const char *modname)
+{
+	const char *myname;
+
+	if ((myname = strrchr(modname, '/')))
+		myname++;
+	else
+		myname = modname;
+
+	return strcmp(myname, "vmlinux") == 0;
+}
+
 void
 read_symbols(char *modname)
 {
@@ -335,8 +348,7 @@
 
 	/* When there's no vmlinux, don't print warnings about
 	 * unresolved symbols (since there'll be too many ;) */
-	if (strcmp(modname, "vmlinux") == 0)
-		have_vmlinux = 1;
+	have_vmlinux = is_vmlinux(modname);
 
 	parse_elf(&info, modname);
 
@@ -460,10 +472,7 @@
 	int first = 1;
 
 	for (m = modules; m; m = m->next) {
-		if (strcmp(m->name, "vmlinux") == 0)
-			m->seen = 1;
-		else 
-			m->seen = 0;
+		m->seen = is_vmlinux(m->name);
 	}
 
 	buf_printf(b, "\n");
@@ -543,7 +552,7 @@
 	}
 
 	for (mod = modules; mod; mod = mod->next) {
-		if (strcmp(mod->name, "vmlinux") == 0)
+		if (is_vmlinux(mod->name))
 			continue;
 
 		buf.pos = 0;
--- diff/security/selinux/hooks.c	2003-10-09 09:47:34.000000000 +0100
+++ source/security/selinux/hooks.c	2003-12-29 09:30:42.000000000 +0000
@@ -1738,10 +1738,6 @@
 		return 0;
 	}
 
-	if (nd && nd->dentry)
-		return dentry_has_perm(current, nd->mnt, nd->dentry,
-				       file_mask_to_av(inode->i_mode, mask));
-
 	return inode_has_perm(current, inode,
 			       file_mask_to_av(inode->i_mode, mask), NULL, NULL);
 }
@@ -1992,8 +1988,7 @@
 
 	        case KDSKBENT:
 	        case KDSKBSENT:
-		  	if (!capable(CAP_SYS_TTY_CONFIG))
-				error = -EPERM;
+			error = task_has_capability(current,CAP_SYS_TTY_CONFIG);
 			break;
 
 		/* default case assumes that the command will go
--- diff/security/selinux/ss/Makefile	2003-08-20 14:16:36.000000000 +0100
+++ source/security/selinux/ss/Makefile	2003-12-29 09:30:42.000000000 +0000
@@ -2,8 +2,7 @@
 # Makefile for building the SELinux security server as part of the kernel tree.
 #
 
-EXTRA_CFLAGS += -Isecurity/selinux/include -include security/selinux/ss/global.h
-
+EXTRA_CFLAGS += -Isecurity/selinux/include
 obj-y := ss.o
 
 ss-objs := ebitmap.o hashtab.o symtab.o sidtab.o avtab.o policydb.o services.o
--- diff/security/selinux/ss/avtab.c	2003-09-17 12:28:13.000000000 +0100
+++ source/security/selinux/ss/avtab.c	2003-12-29 09:30:42.000000000 +0000
@@ -3,6 +3,10 @@
  *
  * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
  */
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/vmalloc.h>
+#include <linux/errno.h>
 #include "avtab.h"
 #include "policydb.h"
 
--- diff/security/selinux/ss/ebitmap.c	2003-09-17 12:28:13.000000000 +0100
+++ source/security/selinux/ss/ebitmap.c	2003-12-29 09:30:42.000000000 +0000
@@ -3,6 +3,9 @@
  *
  * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
  */
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/errno.h>
 #include "ebitmap.h"
 #include "policydb.h"
 
--- diff/security/selinux/ss/global.h	2003-09-17 12:28:13.000000000 +0100
+++ source/security/selinux/ss/global.h	2003-12-29 09:30:42.000000000 +0000
@@ -1,18 +0,0 @@
-#ifndef _SS_GLOBAL_H_
-#define _SS_GLOBAL_H_
-
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/string.h>
-#include <linux/ctype.h>
-#include <linux/in.h>
-#include <linux/spinlock.h>
-#include <linux/sched.h>
-#include <linux/vmalloc.h>
-
-#include "flask.h"
-#include "avc.h"
-#include "avc_ss.h"
-#include "security.h"
-
-#endif /* _SS_GLOBAL_H_ */
--- diff/security/selinux/ss/hashtab.c	2003-08-20 14:16:36.000000000 +0100
+++ source/security/selinux/ss/hashtab.c	2003-12-29 09:30:42.000000000 +0000
@@ -3,6 +3,9 @@
  *
  * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
  */
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/errno.h>
 #include "hashtab.h"
 
 struct hashtab *hashtab_create(u32 (*hash_value)(struct hashtab *h, void *key),
--- diff/security/selinux/ss/mls.c	2003-09-30 15:46:21.000000000 +0100
+++ source/security/selinux/ss/mls.c	2003-12-29 09:30:42.000000000 +0000
@@ -3,6 +3,10 @@
  *
  * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
  */
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/errno.h>
 #include "mls.h"
 #include "policydb.h"
 #include "services.h"
--- diff/security/selinux/ss/policydb.c	2003-09-30 15:46:21.000000000 +0100
+++ source/security/selinux/ss/policydb.c	2003-12-29 09:30:42.000000000 +0000
@@ -3,6 +3,11 @@
  *
  * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
  */
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/errno.h>
+#include "security.h"
 #include "policydb.h"
 #include "mls.h"
 
--- diff/security/selinux/ss/services.c	2003-10-09 09:47:34.000000000 +0100
+++ source/security/selinux/ss/services.c	2003-12-29 09:30:42.000000000 +0000
@@ -10,6 +10,17 @@
  *	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/slab.h>
+#include <linux/string.h>
+#include <linux/spinlock.h>
+#include <linux/errno.h>
+#include <linux/in.h>
+#include <asm/semaphore.h>
+#include "flask.h"
+#include "avc.h"
+#include "avc_ss.h"
+#include "security.h"
 #include "context.h"
 #include "policydb.h"
 #include "sidtab.h"
--- diff/security/selinux/ss/sidtab.c	2003-08-20 14:16:36.000000000 +0100
+++ source/security/selinux/ss/sidtab.c	2003-12-29 09:30:42.000000000 +0000
@@ -3,6 +3,12 @@
  *
  * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
  */
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/errno.h>
+#include "flask.h"
+#include "security.h"
 #include "sidtab.h"
 
 #define SIDTAB_HASH(sid) \
--- diff/security/selinux/ss/symtab.c	2003-08-20 14:16:36.000000000 +0100
+++ source/security/selinux/ss/symtab.c	2003-12-29 09:30:42.000000000 +0000
@@ -3,6 +3,10 @@
  *
  * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
  */
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/errno.h>
 #include "symtab.h"
 
 static unsigned int symhash(struct hashtab *h, void *key)
--- diff/sound/core/pcm_native.c	2003-10-27 09:20:44.000000000 +0000
+++ source/sound/core/pcm_native.c	2003-12-29 09:30:42.000000000 +0000
@@ -2779,7 +2779,7 @@
 	return mask;
 }
 
-static struct page * snd_pcm_mmap_status_nopage(struct vm_area_struct *area, unsigned long address, int no_share)
+static struct page * snd_pcm_mmap_status_nopage(struct vm_area_struct *area, unsigned long address, int *type)
 {
 	snd_pcm_substream_t *substream = (snd_pcm_substream_t *)area->vm_private_data;
 	snd_pcm_runtime_t *runtime;
@@ -2791,6 +2791,8 @@
 	page = virt_to_page(runtime->status);
 	if (!PageReserved(page))
 		get_page(page);
+	if (type)
+		*type = VM_FAULT_MINOR;
 	return page;
 }
 
@@ -2817,7 +2819,7 @@
 	return 0;
 }
 
-static struct page * snd_pcm_mmap_control_nopage(struct vm_area_struct *area, unsigned long address, int no_share)
+static struct page * snd_pcm_mmap_control_nopage(struct vm_area_struct *area, unsigned long address, int *type)
 {
 	snd_pcm_substream_t *substream = (snd_pcm_substream_t *)area->vm_private_data;
 	snd_pcm_runtime_t *runtime;
@@ -2829,6 +2831,8 @@
 	page = virt_to_page(runtime->control);
 	if (!PageReserved(page))
 		get_page(page);
+	if (type)
+		*type = VM_FAULT_MINOR;
 	return page;
 }
 
@@ -2867,7 +2871,7 @@
 	atomic_dec(&substream->runtime->mmap_count);
 }
 
-static struct page * snd_pcm_mmap_data_nopage(struct vm_area_struct *area, unsigned long address, int no_share)
+static struct page * snd_pcm_mmap_data_nopage(struct vm_area_struct *area, unsigned long address, int *type)
 {
 	snd_pcm_substream_t *substream = (snd_pcm_substream_t *)area->vm_private_data;
 	snd_pcm_runtime_t *runtime;
@@ -2895,6 +2899,8 @@
 	}
 	if (!PageReserved(page))
 		get_page(page);
+	if (type)
+		*type = VM_FAULT_MINOR;
 	return page;
 }
 
--- diff/sound/core/sound.c	2003-09-30 15:46:21.000000000 +0100
+++ source/sound/core/sound.c	2003-12-29 09:30:42.000000000 +0000
@@ -31,6 +31,7 @@
 #include <sound/initval.h>
 #include <linux/kmod.h>
 #include <linux/devfs_fs_kernel.h>
+#include <linux/device.h>
 
 #define SNDRV_OS_MINORS 256
 
@@ -52,6 +53,7 @@
 MODULE_PARM(cards_limit, "i");
 MODULE_PARM_DESC(cards_limit, "Count of soundcards installed in the system.");
 MODULE_PARM_SYNTAX(cards_limit, "default:8,skill:advanced");
+MODULE_ALIAS_CHARDEV_MAJOR(CONFIG_SND_MAJOR);
 #ifdef CONFIG_DEVFS_FS
 MODULE_PARM(device_mode, "i");
 MODULE_PARM_DESC(device_mode, "Device file permission mask for devfs.");
--- diff/sound/i2c/i2c.c	2003-06-09 14:18:21.000000000 +0100
+++ source/sound/i2c/i2c.c	2003-12-29 09:30:42.000000000 +0000
@@ -84,7 +84,7 @@
 	bus = (snd_i2c_bus_t *)snd_magic_kcalloc(snd_i2c_bus_t, 0, GFP_KERNEL);
 	if (bus == NULL)
 		return -ENOMEM;
-	spin_lock_init(&bus->lock);
+	init_MUTEX(&bus->lock_mutex);
 	INIT_LIST_HEAD(&bus->devices);
 	INIT_LIST_HEAD(&bus->buses);
 	bus->card = card;
--- diff/sound/isa/gus/gus_pcm.c	2003-05-21 11:49:56.000000000 +0100
+++ source/sound/isa/gus/gus_pcm.c	2003-12-29 09:30:42.000000000 +0000
@@ -334,9 +334,11 @@
 					snd_gf1_poke(gus, pos++, *buf++ ^ invert);
 			}
 		}
-		schedule_timeout(1);
-		if (signal_pending(current))
-			return -EAGAIN;
+		if (count > 0 && !in_interrupt()) {
+			schedule_timeout(1);
+			if (signal_pending(current))
+				return -EAGAIN;
+		}
 	}
 	return 0;
 }
--- diff/sound/oss/Kconfig	2003-10-27 09:20:39.000000000 +0000
+++ source/sound/oss/Kconfig	2003-12-29 09:30:42.000000000 +0000
@@ -25,7 +25,7 @@
 	depends on SOUND_PRIME!=n && SOUND && PCI
 	help
 	  Say Y or M if you have a PCI sound card using the CMI8338
-	  or the CMI8378 chipset.  Data on these chips are available at
+	  or the CMI8738 chipset.  Data on these chips are available at
 	  <http://www.cmedia.com.tw/>.
 
 	  A userspace utility to control some internal registers of these
--- diff/sound/oss/cmpci.c	2003-09-17 12:28:13.000000000 +0100
+++ source/sound/oss/cmpci.c	2003-12-29 09:30:42.000000000 +0000
@@ -2876,7 +2876,6 @@
 void initialize_chip(struct pci_dev *pcidev)
 {
 	struct cm_state *s;
-	mm_segment_t fs;
 	int i, val;
 #if defined(CONFIG_SOUND_CMPCI_MIDI) || defined(CONFIG_SOUND_CMPCI_FM)
 	unsigned char reg_mask = 0;
@@ -3038,8 +3037,6 @@
 #endif
 		pci_set_master(pcidev);	/* enable bus mastering */
 		/* initialize the chips */
-		fs = get_fs();
-		set_fs(KERNEL_DS);
 		/* set mixer output */
 		frobindir(s, DSP_MIX_OUTMIXIDX, 0x1f, 0x1f);
 		/* set mixer input */
--- diff/sound/oss/emu10k1/audio.c	2003-09-17 12:28:13.000000000 +0100
+++ source/sound/oss/emu10k1/audio.c	2003-12-29 09:30:42.000000000 +0000
@@ -989,7 +989,7 @@
 	return 0;
 }
 
-static struct page *emu10k1_mm_nopage (struct vm_area_struct * vma, unsigned long address, int write_access)
+static struct page *emu10k1_mm_nopage (struct vm_area_struct * vma, unsigned long address, int *type)
 {
 	struct emu10k1_wavedevice *wave_dev = vma->vm_private_data;
 	struct woinst *woinst = wave_dev->woinst;
@@ -1032,6 +1032,8 @@
 	get_page (dmapage);
 
 	DPD(3, "page: %#lx\n", (unsigned long) dmapage);
+	if (type)
+		*type = VM_FAULT_MINOR;
 	return dmapage;
 }
 
--- diff/sound/oss/via82cxxx_audio.c	2003-10-27 09:20:39.000000000 +0000
+++ source/sound/oss/via82cxxx_audio.c	2003-12-29 09:30:42.000000000 +0000
@@ -15,7 +15,7 @@
  */
 
 
-#define VIA_VERSION	"1.9.1-ac3-2.5"
+#define VIA_VERSION	"1.9.1-ac4-2.5"
 
 
 #include <linux/config.h>
@@ -1237,7 +1237,6 @@
 		}
 	/* unknown */
 	default:
-		printk (KERN_WARNING PFX "unknown number of channels\n");
 		val = -EINVAL;
 		break;
 	}
@@ -2116,7 +2115,7 @@
 
 
 static struct page * via_mm_nopage (struct vm_area_struct * vma,
-				    unsigned long address, int write_access)
+				    unsigned long address, int *type)
 {
 	struct via_info *card = vma->vm_private_data;
 	struct via_channel *chan = &card->ch_out;
@@ -2124,12 +2123,11 @@
 	unsigned long pgoff;
 	int rd, wr;
 
-	DPRINTK ("ENTER, start %lXh, ofs %lXh, pgoff %ld, addr %lXh, wr %d\n",
+	DPRINTK ("ENTER, start %lXh, ofs %lXh, pgoff %ld, addr %lXh\n",
 		 vma->vm_start,
 		 address - vma->vm_start,
 		 (address - vma->vm_start) >> PAGE_SHIFT,
-		 address,
-		 write_access);
+		 address);
 
         if (address > vma->vm_end) {
 		DPRINTK ("EXIT, returning NOPAGE_SIGBUS\n");
@@ -2167,6 +2165,8 @@
 	DPRINTK ("EXIT, returning page %p for cpuaddr %lXh\n",
 		 dmapage, (unsigned long) chan->pgtbl[pgoff].cpuaddr);
 	get_page (dmapage);
+	if (type)
+		*type = VM_FAULT_MINOR;
 	return dmapage;
 }
 
@@ -3367,7 +3367,7 @@
 
 	if (file->f_mode & FMODE_WRITE) {
 		rc = via_dsp_drain_playback (card, &card->ch_out, nonblock);
-		if (rc && rc != ERESTARTSYS)	/* Nobody needs to know about ^C */
+		if (rc && rc != -ERESTARTSYS)	/* Nobody needs to know about ^C */
 			printk (KERN_DEBUG "via_audio: ignoring drain playback error %d\n", rc);
 
 		via_chan_free (card, &card->ch_out);
--- diff/sound/pci/intel8x0.c	2003-10-09 09:47:17.000000000 +0100
+++ source/sound/pci/intel8x0.c	2003-12-29 09:30:42.000000000 +0000
@@ -2271,10 +2271,8 @@
 
 	t = stop_time.tv_sec - start_time.tv_sec;
 	t *= 1000000;
-	if (stop_time.tv_usec < start_time.tv_usec)
-		t -= start_time.tv_usec - stop_time.tv_usec;
-	else
-		t += stop_time.tv_usec - start_time.tv_usec;
+	t += stop_time.tv_usec - start_time.tv_usec;
+	printk(KERN_INFO "%s: measured %lu usecs\n", __FUNCTION__, t);
 	if (t == 0) {
 		snd_printk(KERN_ERR "?? calculation error..\n");
 		return;
--- diff/sound/sound_core.c	2003-09-17 12:28:13.000000000 +0100
+++ source/sound/sound_core.c	2003-12-29 09:30:42.000000000 +0000
@@ -45,6 +45,7 @@
 #include <linux/major.h>
 #include <linux/kmod.h>
 #include <linux/devfs_fs_kernel.h>
+#include <linux/device.h>
 
 #define SOUND_STEP 16
 
@@ -547,6 +548,7 @@
 MODULE_DESCRIPTION("Core sound module");
 MODULE_AUTHOR("Alan Cox");
 MODULE_LICENSE("GPL");
+MODULE_ALIAS_CHARDEV_MAJOR(SOUND_MAJOR);
 
 static void __exit cleanup_soundcore(void)
 {
--- diff/usr/gen_init_cpio.c	2003-09-30 15:46:21.000000000 +0100
+++ source/usr/gen_init_cpio.c	2003-12-29 09:30:42.000000000 +0000
@@ -197,6 +197,7 @@
 
 	for (i = 0; i < buf.st_size; ++i)
 		fputc(filebuf[i], stdout);
+	offset += buf.st_size;
 	close(file);
 	free(filebuf);
 	push_pad();
--- diff/Documentation/MSI-HOWTO.txt	1970-01-01 01:00:00.000000000 +0100
+++ source/Documentation/MSI-HOWTO.txt	2003-12-29 09:30:39.000000000 +0000
@@ -0,0 +1,321 @@
+		The MSI Driver Guide HOWTO
+	Tom L Nguyen tom.l.nguyen@intel.com
+			10/03/2003
+
+1. About this guide
+
+This guide describes the basics of Message Signaled Interrupts(MSI), the
+advantages of using MSI over traditional interrupt mechanisms, and how
+to enable your driver to use MSI or MSI-X. Also included is a Frequently
+Asked Questions.
+
+2. Copyright 2003 Intel Corporation
+
+3. What is MSI/MSI-X?
+
+Message Signaled Interrupt (MSI), as described in the PCI Local Bus
+Specification Revision 2.3 or latest, is an optional feature, and a
+required feature for PCI Express devices. MSI enables a device function
+to request service by sending an Inbound Memory Write on its PCI bus to
+the FSB as a Message Signal Interrupt transaction. Because MSI is
+generated in the form of a Memory Write, all transaction conditions,
+such as a Retry, Master-Abort, Target-Abort or normal completion, are
+supported.
+
+A PCI device that supports MSI must also support pin IRQ assertion
+interrupt mechanism to provide backward compatibility for systems that
+do not support MSI. In Systems, which support MSI, the bus driver is
+responsible for initializing the message address and message data of
+the device function's MSI/MSI-X capability structure during device
+initial configuration.
+
+An MSI capable device function indicates MSI support by implementing
+the MSI/MSI-X capability structure in its PCI capability list. The
+device function may implement both the MSI capability structure and
+the MSI-X capability structure; however, the bus driver should not
+enable both, but instead enable only the MSI-X capability structure.
+
+The MSI capability structure contains Message Control register,
+Message Address register and Message Data register. These registers
+provide the bus driver control over MSI. The Message Control register
+indicates the MSI capability supported by the device. The Message
+Address register specifies the target address and the Message Data
+register specifies the characteristics of the message. To request
+service, the device function writes the content of the Message Data
+register to the target address. The device and its software driver
+are prohibited from writing to these registers.
+
+The MSI-X capability structure is an optional extension to MSI. It
+uses an independent and separate capability structure. There are
+some key advantages to implementing the MSI-X capability structure
+over the MSI capability structure as described below.
+
+	- Support a larger maximum number of vectors per function.
+
+	- Provide the ability for system software to configure
+	each vector with an independent message address and message
+	data, specified by a table that resides in Memory Space.
+
+        - MSI and MSI-X both support per-vector masking. Per-vector
+	masking is an optional extension of MSI but a required
+	feature for MSI-X. Per-vector masking provides the kernel
+	the ability to mask/unmask MSI when servicing its software
+	interrupt service routing handler. If per-vector masking is
+	not supported, then the device driver should provide the
+	hardware/software synchronization to ensure that the device
+	generates MSI when the driver wants it to do so.
+
+4. Why use MSI?
+
+As a benefit the simplification of board design, MSI allows board
+designers to remove out of band interrupt routing. MSI is another
+step towards a legacy-free environment.
+
+Due to increasing pressure on chipset and processor packages to
+reduce pin count, the need for interrupt pins is expected to
+diminish over time. Devices, due to pin constraints, may implement
+messages to increase performance.
+
+PCI Express endpoints uses INTx emulation (in-band messages) instead
+of IRQ pin assertion. Using INTx emulation requires interrupt
+sharing among devices connected to the same node (PCI bridge) while
+MSI is unique (non-shared) and does not require BIOS configuration
+support. As a result, the PCI Express technology requires MSI
+support for better interrupt performance.
+
+Using MSI enables the device functions to support two or more
+vectors, which can be configure to target different CPU's to
+increase scalability.
+
+5. Configuring a driver to use MSI/MSI-X
+
+By default, the kernel will not enable MSI/MSI-X on all devices that
+support this capability once the patch is installed. A kernel
+configuration option must be selected to enable MSI/MSI-X support.
+
+5.1 Including MSI support into the kernel
+
+To include MSI support into the kernel requires users to patch the
+VECTOR-base patch first and then the MSI patch because the MSI
+support needs VECTOR based scheme. Once these patches are installed,
+setting CONFIG_PCI_USE_VECTOR enables the VECTOR based scheme and
+the option for MSI-capable device drivers to selectively enable MSI
+(using pci_enable_msi as desribed below).
+
+Since the target of the inbound message is the local APIC, providing
+CONFIG_PCI_USE_VECTOR is dependent on whether CONFIG_X86_LOCAL_APIC
+is enabled or not.
+
+int pci_enable_msi(struct pci_dev *)
+
+With this new API, any existing device driver, which like to have
+MSI enabled on its device function, must call this explicitly. A
+successful call will initialize the MSI/MSI-X capability structure
+with ONE vector, regardless of whether the device function is
+capable of supporting multiple messages. This vector replaces the
+pre-assigned dev->irq with a new MSI vector. To avoid the conflict
+of new assigned vector with existing pre-assigned vector requires
+the device driver to call this API before calling request_irq(...).
+
+The below diagram shows the events, which switches the interrupt
+mode on the MSI-capable device function between MSI mode and
+PIN-IRQ assertion mode.
+
+	 ------------   pci_enable_msi 	 ------------------------
+	|	     | <===============	| 			 |
+	| MSI MODE   |	  	     	| PIN-IRQ ASSERTION MODE |
+	| 	     | ===============>	|			 |
+ 	 ------------	free_irq      	 ------------------------
+
+5.2 Configuring for MSI support
+
+Due to the non-contiguous fashion in vector assignment of the
+existing Linux kernel, this patch does not support multiple
+messages regardless of the device function is capable of supporting
+more than one vector. The bus driver initializes only entry 0 of
+this capability if pci_enable_msi(...) is called successfully by
+the device driver.
+
+5.3 Configuring for MSI-X support
+
+Both the MSI capability structure and the MSI-X capability structure
+share the same above semantics; however, due to the ability of the
+system software to configure each vector of the MSI-X capability
+structure with an independent message address and message data, the
+non-contiguous fashion in vector assignment of the existing Linux
+kernel has no impact on supporting multiple messages on an MSI-X
+capable device functions. By default, as mentioned above, ONE vector
+should be always allocated to the MSI-X capability structure at
+entry 0. The bus driver does not initialize other entries of the
+MSI-X table.
+
+Note that the PCI subsystem should have full control of a MSI-X
+table that resides in Memory Space. The software device driver
+should not access this table.
+
+To request for additional vectors, the device software driver should
+call function msi_alloc_vectors(). It is recommended that the
+software driver should call this function once during the
+initialization phase of the device driver.
+
+The function msi_alloc_vectors(), once invoked, enables either
+all or nothing, depending on the current availability of vector
+resources. If no vector resources are available, the device function
+still works with ONE vector. If the vector resources are available
+for the number of vectors requested by the driver, this function
+will reconfigure the MSI-X capability structure of the device with
+additional messages, starting from entry 1. To emphasize this
+reason, for example, the device may be capable for supporting the
+maximum of 32 vectors while its software driver usually may request
+4 vectors.
+
+For each vector, after this successful call, the device driver is
+responsible to call other functions like request_irq(), enable_irq(),
+etc. to enable this vector with its corresponding interrupt service
+handler. It is the device driver's choice to have all vectors shared
+the same interrupt service handler or each vector with a unique
+interrupt service handler.
+
+In addition to the function msi_alloc_vectors(), another function
+msi_free_vectors() is provided to allow the software driver to
+release a number of vectors back to the vector resources. Once
+invoked, the PCI subsystem disables (masks) each vector released.
+These vectors are no longer valid for the hardware device and its
+software driver to use. Like free_irq, it recommends that the
+device driver should also call msi_free_vectors to release all
+additional vectors previously requested.
+
+int msi_alloc_vectors(struct pci_dev *dev, int *vector, int nvec)
+
+This API enables the software driver to request the PCI subsystem
+for additional messages. Depending on the number of vectors
+available, the PCI subsystem enables either all or nothing.
+
+Argument dev points to the device (pci_dev) structure.
+Argument vector is a pointer of integer type. The number of
+elements is indicated in argument nvec.
+Argument nvec is an integer indicating the number of messages
+requested.
+A return of zero indicates that the number of allocated vector is
+successfully allocated. Otherwise, indicate resources not
+available.
+
+int msi_free_vectors(struct pci_dev* dev, int *vector, int nvec)
+
+This API enables the software driver to inform the PCI subsystem
+that it is willing to release a number of vectors back to the
+MSI resource pool. Once invoked, the PCI subsystem disables each
+MSI-X entry associated with each vector stored in the argument 2.
+These vectors are no longer valid for the hardware device and
+its software driver to use.
+
+Argument dev points to the device (pci_dev) structure.
+Argument vector is a pointer of integer type. The number of
+elements is indicated in argument nvec.
+Argument nvec is an integer indicating the number of messages
+released.
+A return of zero indicates that the number of allocated vectors
+is successfully released. Otherwise, indicates a failure.
+
+5.4 Hardware requirements for MSI support
+MSI support requires support from both system hardware and
+individual hardware device functions.
+
+5.4.1 System hardware support
+Since the target of MSI address is the local APIC CPU, enabling
+MSI support in Linux kernel is dependent on whether existing
+system hardware supports local APIC. Users should verify their
+system whether it runs when CONFIG_X86_LOCAL_APIC=y.
+
+In SMP environment, CONFIG_X86_LOCAL_APIC is automatically set;
+however, in UP environment, users must manually set
+CONFIG_X86_LOCAL_APIC. Once CONFIG_X86_LOCAL_APIC=y, setting
+CONFIG_PCI_USE_VECTOR enables the VECTOR based scheme and
+the option for MSI-capable device drivers to selectively enable
+MSI (using pci_enable_msi as desribed below).
+
+Note that CONFIG_X86_IO_APIC setting is irrelevant because MSI
+vector is allocated new during runtime and MSI support does not
+depend on BIOS support. This key independency enables MSI support
+on future IOxAPIC free platform.
+
+5.4.2 Device hardware support
+The hardware device function supports MSI by indicating the
+MSI/MSI-X capability structure on its PCI capability list. By
+default, this capability structure will not be initialized by
+the kernel to enable MSI during the system boot. In other words,
+the device function is running on its default pin assertion mode.
+Note that in many cases the hardware supporting MSI have bugs,
+which may result in system hang. The software driver of specific
+MSI-capable hardware is responsible for whether calling
+pci_enable_msi or not. A return of zero indicates the kernel
+successfully initializes the MSI/MSI-X capability structure of the
+device funtion. The device function is now running on MSI mode.
+
+5.5 How to tell whether MSI is enabled on device function
+
+At the driver level, a return of zero from pci_enable_msi(...)
+indicates to the device driver that its device function is
+initialized successfully and ready to run in MSI mode.
+
+At the user level, users can use command 'cat /proc/interrupts'
+to display the vector allocated for the device and its interrupt
+mode, as shown below.
+
+           CPU0       CPU1
+  0:     324639          0    IO-APIC-edge  timer
+  1:       1186          0    IO-APIC-edge  i8042
+  2:          0          0          XT-PIC  cascade
+ 12:       2797          0    IO-APIC-edge  i8042
+ 14:       6543          0    IO-APIC-edge  ide0
+ 15:          1          0    IO-APIC-edge  ide1
+169:          0          0   IO-APIC-level  uhci-hcd
+185:          0          0   IO-APIC-level  uhci-hcd
+193:        138         10         PCI MSI  aic79xx
+201:         30          0         PCI MSI  aic79xx
+225:         30          0   IO-APIC-level  aic7xxx
+233:         30          0   IO-APIC-level  aic7xxx
+NMI:          0          0
+LOC:     324553     325068
+ERR:          0
+MIS:          0
+
+6. FAQ
+
+Q1. Are there any limitations on using the MSI?
+
+A1. If the PCI device supports MSI and conforms to the
+specification and the platform supports the APIC local bus,
+then using MSI should work.
+
+Q2. Will it work on all the Pentium processors (P3, P4, Xeon,
+AMD processors)? In P3 IPI's are transmitted on the APIC local
+bus and in P4 and Xeon they are transmitted on the system
+bus. Are there any implications with this?
+
+A2. MSI support enables a PCI device sending an inbound
+memory write (0xfeexxxxx as target address) on its PCI bus
+directly to the FSB. Since the message address has a
+redirection hint bit cleared, it should work.
+
+Q3. The target address 0xfeexxxxx will be translated by the
+Host Bridge into an interrupt message. Are there any
+limitations on the chipsets such as Intel 8xx, Intel e7xxx,
+or VIA?
+
+A3. If these chipsets support an inbound memory write with
+target address set as 0xfeexxxxx, as conformed to PCI
+specification 2.3 or latest, then it should work.
+
+Q4. From the driver point of view, if the MSI is lost because
+of the errors occur during inbound memory write, then it may
+wait for ever. Is there a mechanism for it to recover?
+
+A4. Since the target of the transaction is an inbound memory
+write, all transaction termination conditions (Retry,
+Master-Abort, Target-Abort, or normal completion) are
+supported. A device sending an MSI must abide by all the PCI
+rules and conditions regarding that inbound memory write. So,
+if a retry is signaled it must retry, etc... We believe that
+the recommendation for Abort is also a retry (refer to PCI
+specification 2.3 or latest).
--- diff/Documentation/dvb/cards.txt	1970-01-01 01:00:00.000000000 +0100
+++ source/Documentation/dvb/cards.txt	2003-12-29 09:30:39.000000000 +0000
@@ -0,0 +1,63 @@
+Hardware supported by the linuxtv.org DVB drivers
+=================================================
+
+  Generally, the DVB hardware manufacturers frequently change the
+  frontends (i.e. tuner / demodulator units) used, usually without
+  changing the product name, revision number or specs. Some cards
+  are also available in versions with different frontends for
+  DVB-S/DVB-C/DVB-T. Thus the frontend drivers are listed seperately.
+
+  Note 1: There is no guarantee that every frontend driver works
+  out-of-the box with every card, because of different wiring.
+
+  Note 2: The demodulator chips can be used with a variety of
+  tuner/PLL chips, and not all combinations are supported. Often
+  the demodulator and tuner/PLL chip are inside a metal box for
+  shielding, and the whole metal box has its own part number.
+
+
+o Frontends drivers: 
+  - dvb_dummy_fe: for testing...
+  DVB-S:
+   - alps_bsrv2		: Alps BSRV2 (ves1893 demodulator)
+   - cx24110		: Conexant HM1221/HM1811 (cx24110 or cx24106 demod, cx24108 PLL)
+   - grundig_29504-491	: Grundig 29504-491 (Philips TDA8083 demodulator), tsa5522 PLL
+   - mt312		: Zarlink mt312 or Mitel vp310 demodulator, sl1935 or tsa5059 PLL
+   - stv0299		: Alps BSRU6 (tsa5059 PLL), LG TDQB-S00x (tsa5059 PLL),
+   			  LG TDQF-S001F (sl1935 PLL), Philips SU1278 (tua6100 PLL), 
+			  Philips SU1278SH (tsa5059 PLL)
+  DVB-C:
+   - ves1820		: various (ves1820 demodulator, sp5659c or spXXXX PLL)
+   - at76c651		: Atmel AT76c651(B) with DAT7021 PLL
+  DVB-T:
+   - alps_tdlb7		: Alps TDLB7 (sp8870 demodulator, sp5659 PLL)
+   - alps_tdmb7		: Alps TDMB7 (cx22700 demodulator)
+   - grundig_29504-401	: Grundig 29504-401 (LSI L64781 demodulator), tsa5060 PLL
+   - tda1004x		: Philips tda10045h (td1344 or tdm1316l PLL)
+   - nxt6000 		: Alps TDME7 (MITEL SP5659 PLL), Alps TDED4 (TI ALP510 PLL),
+               		  Comtech DVBT-6k07 (SP5730 PLL)
+               		  (NxtWave Communications NXT6000 demodulator)
+
+
+o Cards based on the Phillips saa7146 multimedia PCI bridge chip:
+  - TI AV7110 based cards (i.e. with hardware MPEG decoder):
+    - Siemens/Technotrend/Hauppauge PCI DVB card revision 1.1, 1.3, 1.5, 1.6, 2.1
+      (aka Hauppauge Nexus)
+  - "budget" cards (i.e. without hardware MPEG decoder):
+    - Technotrend Budget / Hauppauge WinTV-Nova PCI Cards
+    - SATELCO Multimedia PCI
+    - KNC1 DVB-S
+
+o Cards based on the B2C2 Inc. FlexCopII:
+  - Technisat SkyStar2 PCI DVB
+
+o Cards based on the Conexant Bt8xx PCI bridge:
+  - Pinnacle PCTV Sat DVB
+  - Nebula Electronics DigiTV
+
+o Technotrend / Hauppauge DVB USB devices:
+  - Nova USB
+  - DEC 2000-T
+
+o Preliminary support for the analog module of the Siemens DVB-C PCI card
+
--- diff/Documentation/dvb/contributors.txt	1970-01-01 01:00:00.000000000 +0100
+++ source/Documentation/dvb/contributors.txt	2003-12-29 09:30:39.000000000 +0000
@@ -0,0 +1,54 @@
+Thanks go to the following people for patches and contributions:
+
+Michael Hunold <m.hunold@gmx.de>
+  for the initial saa7146 driver and it's recent overhaul
+
+Christian Theiss
+  for his work on the initial Linux DVB driver
+
+Marcus Metzler <mocm@metzlerbros.de>
+Ralph Metzler <rjkm@metzlerbros.de>
+  for their contining work on the DVB driver
+
+Michael Holzt <kju@debian.org>
+  for his contributions to the dvb-net driver
+
+Diego Picciani <d.picciani@novacomp.it>
+  for CyberLogin for Linux which allows logging onto EON
+  (in case you are wondering where CyberLogin is, EON changed its login 
+  procedure and CyberLogin is no longer used.)
+
+Martin Schaller <martin@smurf.franken.de>
+  for patching the cable card decoder driver
+
+Klaus Schmidinger <Klaus.Schmidinger@cadsoft.de>
+  for various fixes regarding tuning, OSD and CI stuff and his work on VDR
+
+Steve Brown <sbrown@cortland.com>
+  for his AFC kernel thread
+
+Christoph Martin <martin@uni-mainz.de>
+  for his LIRC infrared handler
+
+Andreas Oberritter <andreas@oberritter.de>
+Florian Schirmer <jolt@tuxbox.org>
+...and all the other dBox2 people
+  for many bugfixes in the generic DVB Core and their work on the 
+  dBox2 port of the DVB driver
+
+Oliver Endriss <o.endriss@gmx.de>
+  for many bugfixes
+
+Andrew de Quincey <adq_dvb@lidskialf.net>
+  for the tda1004x frontend driver, and various bugfixes
+
+Peter Schildmann <peter.schildmann@web.de>
+  for the driver for the Technisat SkyStar2 PCI DVB card
+
+Vadim Catana <skystar@moldova.cc>
+Roberto Ragusa <r.ragusa@libero.it>
+Augusto Cardoso <augusto@carhil.net>
+  for all the work for the FlexCopII chipset by B2C2,Inc.
+
+(If you think you should be in this list, but you are not, drop a
+ line to the DVB mailing list)
--- diff/Documentation/dvb/faq.txt	1970-01-01 01:00:00.000000000 +0100
+++ source/Documentation/dvb/faq.txt	2003-12-29 09:30:39.000000000 +0000
@@ -0,0 +1,109 @@
+Some very frequently asked questions about linuxtv-dvb
+
+1. The signal seems to die a few seconds after tuning.
+
+	It's not a bug, it's a feature. Because the frontends have
+	significant power requirements (and hence get very hot), they
+	are powered down if they are unused (i.e. if the frontend device
+	is closed). The dvb-core.o module paramter "dvb_shutdown_timeout"
+	allow you to change the timeout (default 5 seconds). Setting the
+	timeout to 0 disables the timeout feature.
+
+2. How can I watch TV?
+
+	The driver distribution includes some simple utilities which
+	are mainly intended for testing and to demonstrate how the
+	DVB API works.
+
+	Depending on whether you have a DVB-S, DVB-C or DVB-T card, use
+	apps/szap/szap, czap or tzap. You must supply a channel list
+	in ~/.[sct]zap/channels.conf. If you are lucky you can just copy
+	one of the supplied channel lists, or you can create a new one
+	by running apps/scan/scan. If you run scan on an unknown network
+	you might have to supply some start data in apps/scan/initial.h.
+
+	If you have a card with a built-in hardware MPEG-decoder the
+	drivers create a video4linux device (/dev/v4l/video0) which
+	you can use to watch TV with any v4l application. xawtv is known
+	to work. Note that you cannot change channels with xawtv, you
+	have to zap using [sct]zap. If you want a nice application for
+	TV watching and record/playback, have a look at VDR.
+
+	If your card does not have a hardware MPEG decoder you need
+	a software MPEG decoder. Mplayer or xine are known to work.
+	Newsflash: MythTV also has DVB support now.
+	Note: Only very recent versions of Mplayer and xine can decode.
+	MPEG2 transport streams (TS) directly. Then, run
+	'[sct]zap channelname -r' in one xterm, and keep it running,
+	and start 'mplayer - < /dev/dvb/adapter0/dvr0' or 
+	'xine stdin://mpeg2 < /dev/dvb/adapter0/dvr0' in a second xterm.
+	That's all far from perfect, but it seems no one has written
+	a nice DVB application which includes a builtin software MPEG
+	decoder yet.
+
+	Newsflash: Newest xine directly supports DVB. Just copy your
+	channels.conf to ~/.xine and start 'xine dvb://', or select
+	the DVB button in the xine GUI. Channel switching works using the
+	numpad pgup/pgdown (NP9 / NP3) keys to scroll through the channel osd
+	menu and pressing numpad-enter to switch to the selected channel.
+
+	Note: Older versions of xine and mplayer understand MPEG program
+	streams (PS) only, and can be used in conjunction with the
+	ts2ps tool from the Metzler Brother's dvb-mpegtools package.
+
+3. Which other DVB applications exist?
+
+	http://www.cadsoft.de/people/kls/vdr/
+		Klaus Schmidinger's Video Disk Recorder
+
+	http://www.metzlerbros.org/dvb/
+		Metzler Bros. DVB development; alternate drivers and
+		DVB utilities, include dvb-mpegtools and tuxzap.
+
+	http://www.linuxstb.org/
+	http://sourceforge.net/projects/dvbtools/
+		Dave Chapman's dvbtools package, including
+		dvbstream and dvbtune
+
+	http://www.linuxdvb.tv/
+		Henning Holtschneider's site with many interesting
+		links and docs
+
+	http://www.dbox2.info/
+		LinuxDVB on the dBox2
+
+	http://www.tuxbox.org/
+	http://cvs.tuxbox.org/
+		the TuxBox CVS many interesting DVB applications and the dBox2
+		DVB source
+
+	http://sourceforge.net/projects/dvbsak/
+		DVB Swiss Army Knife library and utilities
+
+	http://www.nenie.org/misc/mpsys/
+		MPSYS: a MPEG2 system library and tools
+
+	http://mplayerhq.hu/
+		mplayer
+
+	http://xine.sourceforge.net/
+	http://xinehq.de/
+		xine
+
+	http://www.mythtv.org/
+		MythTV - analog TV PVR, but now with DVB support, too
+		(with software MPEG decode)
+
+4. Can't get a signal tuned correctly
+
+	If you are using a Technotrend/Hauppauge DVB-C card *without* analog
+	module, you might have to use module parameter adac=-1 (dvb-ttpci.o).
+
+5. The dvb_net device doesn't give me any multicast packets
+
+	Check your routes if they include the multicast address range.
+	Additionally make sure that "source validation by reversed path
+	lookup" is disabled:
+	  $ "echo 0 > /proc/sys/net/ipv4/conf/dvb0/rp_filter"
+
+eof
--- diff/Documentation/dvb/firmware.txt	1970-01-01 01:00:00.000000000 +0100
+++ source/Documentation/dvb/firmware.txt	2003-12-29 09:30:39.000000000 +0000
@@ -0,0 +1,116 @@
+Some DVB cards and many newer frontends require proprietary,
+binary-only firmware.
+
+The DVB drivers will be converted to use the request_firmware()
+hotplug interface (see linux/Documentation/firmware_class/).
+(CONFIG_FW_LOADER)
+
+The firmware can be loaded automatically via the hotplug manager
+or manually with the steps described below.
+
+Currently the drivers still use various different methods
+to load their firmwares, so here's just a short list of the
+current state:
+
+- dvb-ttpci: driver uses firmware hotplug interface
+- ttusb-budget: firmware is compiled in (dvb-ttusb-dspbootcode.h)
+- sp887x: firmware is compiled in (sp887x_firm.h)
+- alps_tdlb7: firmware is loaded from path specified by
+		"mcfile" module parameter; the binary must be
+		extracted from the Windows driver (Sc_main.mc).
+- tda1004x: firmware is loaded from path specified in
+		DVB_TDA1004X_FIRMWARE_FILE kernel config
+		variable (default /etc/dvb/tda1004x.bin); the
+		firmware binary must be extracted from the windows
+		driver
+- ttusb-dec: see "ttusb-dec.txt" for details
+
+1) Automatic firmware loading
+
+You need to install recent hotplug scripts if your distribution did not do it
+for you already, especially the  /etc/hotplug/firmware.agent.
+http://linux-hotplug.sourceforge.net/ (Call /sbin/hotplug without arguments
+to find out if the firmware agent is installed.)
+
+The firmware.agent script expects firmware binaries in
+/usr/lib/hotplug/firmware/. To avoid naming and versioning
+conflicts we propose the following naming scheme:
+
+  /usr/lib/hotplug/firmware/dvb-{driver}-{ver}.fw	for MPEG decoders etc.
+  /usr/lib/hotplug/firmware/dvb-fe-{driver}-{ver}.fw	for frontends
+
+  {driver} name is the basename of the driver kernel module (e.g. dvb-ttpci)
+  {ver} is a version number/name that should change only when the
+  driver/firmware internal API changes (so users are free to install the
+  latest firmware compatible with the driver).
+
+2) Manually loading the firmware into a driver
+   (currently only the dvb-ttpci / av7110 driver supports this)
+   
+Step a) Mount sysfs-filesystem.
+
+Sysfs provides a means to export kernel data structures, their attributes,
+and the linkages between them to userspace. 
+
+For detailed informations have a look at Documentation/filesystems/sysfs.txt 
+All you need to know at the moment is that firmware loading only works through
+sysfs.
+
+> mkdir /sys
+> mount -t sysfs sysfs /sys
+
+Step b) Exploring the firmware loading facilities
+
+Firmware_class support is located in
+/sys/class/firmware
+
+> dir /sys/class/firmware
+
+The "timeout" values specifies the amount of time that is waited before the
+firmware upload  process is cancelled. The default values is 10 seconds. If
+you use a hotplug script for the firmware upload, this is sufficient. If
+you want to upload the firmware by hand, however, this might be too fast.
+
+> echo "180" > /sys/class/firmware/timeout
+
+Step c) Getting a usable firmware file for the dvb-ttpci driver/av7110 card.
+
+You can download the firmware files from
+http://www.linuxtv.org/download/dvb/
+
+Please note that in case of the dvb-ttpci driver this is *not* the "Root"
+file you probably know from the 2.4 DVB releases driver.
+
+> wget http://www.linuxtv.org/download/dvb/dvb-ttpci-01.fw
+gets you the version 01 of the firmware fot the ttpci driver.
+
+Step d) Loading the dvb-ttpci driver and loading the firmware
+
+"modprobe" will take care that every needed module will be loaded
+automatically (except the frontend driver)
+
+> modprobe dvb-ttpci
+
+The "modprobe" process will hang until
+a) you upload the firmware or
+b) the timeout occurs.
+
+Change to another terminal and have a look at 
+
+> dir /sys/class/firmware/
+
+total 0
+drwxr-xr-x    2 root     root            0 Jul 29 11:00 0000:03:05.0
+-rw-r--r--    1 root     root            0 Jul 29 10:41 timeout
+
+"0000:03:05.0" is the id for my dvb-c card. It depends on the pci slot,
+so it changes if you plug the card to different slots.
+
+You can upload the firmware like that:
+
+> export DEVDIR=/sys/class/firmware/0000\:03\:05.0
+> echo 1 > $DEVDIR/loading
+> cat dvb-ttpci-01.fw > $DEVDIR/data
+> echo 0 > $DEVDIR/loading
+
+That's it. The driver should be up and running now.
--- diff/Documentation/dvb/readme.txt	1970-01-01 01:00:00.000000000 +0100
+++ source/Documentation/dvb/readme.txt	2003-12-29 09:30:39.000000000 +0000
@@ -0,0 +1,39 @@
+Linux Digital Video Broadcast (DVB) subsystem
+=============================================
+
+The main development site and CVS repository for these
+drivers is http://linuxtv.org/.
+
+The developer mailing list linux-dvb is also hosted there,
+see http://linuxtv.org/mailinglists.xml. Please check
+the archive http://linuxtv.org/mailinglists/linux-dvb/
+before asking newbie questions on the list.
+
+API documentation, utilities and test/example programs
+are available as part of the old driver package for Linux 2.4
+(linuxtv-dvb-1.0.x.tar.gz), or from CVS (module DVB).
+We plan to split this into separate packages, but it's not
+been done yet.
+
+http://linuxtv.org/download/dvb/
+
+What's inside this directory:
+
+"cards.txt" 
+contains a list of supported hardware.
+
+"contributors.txt"
+is the who-is-who of DVB development
+
+"faq.txt"
+contains frequently asked questions and their answers.
+
+"firmware.txt" 
+contains informations for required external firmware
+files and where to get them.
+
+"ttusb-dec.txt"
+contains detailed informations about the
+TT DEC2000/DEC3000 USB DVB hardware.
+
+Good luck and have fun!
--- diff/Documentation/dvb/ttusb-dec.txt	1970-01-01 01:00:00.000000000 +0100
+++ source/Documentation/dvb/ttusb-dec.txt	2003-12-29 09:30:39.000000000 +0000
@@ -0,0 +1,52 @@
+TechnoTrend/Hauppauge DEC USB Driver
+====================================
+
+Driver Status
+-------------
+
+Supported:
+	DEC2000-t
+	Linux Kernels 2.4 and 2.6
+	Video Streaming
+	Audio Streaming
+	Channel Zapping
+	Hotplug firmware loader under 2.6 kernels
+
+In Progress:
+	DEC3000-s
+
+To Do:
+	Section data
+	Teletext streams
+	Tuner status information
+	DVB network interface
+	Streaming video PC->DEC
+
+Note:	Since section data can not be retreived yet, scan apps will not work.
+
+Getting the Firmware
+--------------------
+Currently, the driver only works with v2.15a of the firmware.  The firmwares
+can be obtained in this way:
+
+wget http://hauppauge.lightpath.net/de/dec215a.exe
+unzip -j dec215a.exe Software/Oem/STB/App/Boot/STB_PC_T.bin
+unzip -j dec215a.exe Software/Oem/STB/App/Boot/STB_PC_S.bin
+
+
+Compilation Notes for 2.4 kernels
+---------------------------------
+For 2.4 kernels the firmware for the DECs is compiled into the driver itself.
+The firmwares are expected to be in /etc/dvb at compilation time.
+
+mv STB_PC_T.bin /etc/dvb/dec2000t.bin
+mv STB_PC_S.bin /etc/dvb/dec3000s.bin
+
+
+Hotplug Firmware Loading for 2.6 kernels
+----------------------------------------
+For 2.6 kernels the firmware is loaded at the point that the driver module is
+loaded.  See linux/Documentation/dvb/FIRMWARE for more information.
+
+mv STB_PC_T.bin /usr/lib/hotplug/firmware/dec2000t.bin
+mv STB_PC_S.bin /usr/lib/hotplug/firmware/dec3000s.bin
--- diff/Documentation/i386/kgdb/andthen	1970-01-01 01:00:00.000000000 +0100
+++ source/Documentation/i386/kgdb/andthen	2003-12-29 09:30:39.000000000 +0000
@@ -0,0 +1,100 @@
+
+define	set_andthen
+	set var $thp=0
+	set var $thp=(struct kgdb_and_then_struct *)&kgdb_data[0]
+	set var $at_size = (sizeof kgdb_data)/(sizeof *$thp)
+	set var $at_oc=kgdb_and_then_count
+	set var $at_cc=$at_oc
+end
+
+define andthen_next
+	set var $at_cc=$arg0
+end
+
+define andthen
+	andthen_set_edge
+	if ($at_cc >= $at_oc)
+		printf "Outside window.  Window size is %d\n",($at_oc-$at_low)
+	else
+		printf "%d: ",$at_cc
+		output *($thp+($at_cc++ % $at_size ))
+		printf "\n"
+	end
+end
+define andthen_set_edge
+	set var $at_oc=kgdb_and_then_count
+	set var $at_low = $at_oc - $at_size
+	if ($at_low < 0 )
+		set var $at_low = 0
+	end
+	if (( $at_cc > $at_oc) || ($at_cc < $at_low))
+		printf "Count outside of window, setting count to "
+		if ($at_cc >= $at_oc)
+			set var $at_cc = $at_oc
+		else
+			set var $at_cc = $at_low
+		end
+		printf "%d\n",$at_cc
+	end
+end
+
+define beforethat
+	andthen_set_edge
+	if ($at_cc <= $at_low)
+		printf "Outside window.  Window size is %d\n",($at_oc-$at_low)
+	else
+		printf "%d: ",$at_cc-1
+		output *($thp+(--$at_cc % $at_size ))
+		printf "\n"
+	end
+end
+
+document andthen_next
+	andthen_next <count>
+	.	sets the number of the event to display next. If this event
+	.	is not in the event pool, either andthen or beforethat will
+	.	correct it to the nearest event pool edge.  The event pool
+	.	ends at the last event recorded and begins <number of events>
+	.	prior to that.  If beforethat is used next, it will display
+	.	event <count> -1.
+.
+	andthen commands are: set_andthen, andthen_next, andthen and beforethat
+end
+
+
+document andthen
+	andthen
+.	displays the next event in the list.  <set_andthen> sets up to display
+.	the oldest saved event first.
+.	<count> (optional) count of the event to display.
+.	note the number of events saved is specified at configure time.
+.	if events are saved between calls to andthen the index will change
+.	but the displayed event will be the next one (unless the event buffer
+.	is overrun).
+.
+.	andthen commands are: set_andthen, andthen_next, andthen and beforethat
+end
+
+document set_andthen
+	set_andthen
+.	sets up to use the <andthen> and <beforethat> commands.
+.		if you have defined your own struct, use the above and
+.		then enter the following:
+.		p $thp=(struct kgdb_and_then_structX *)&kgdb_data[0]
+.		where <kgdb_and_then_structX> is the name of your structure.
+.
+.	andthen commands are: set_andthen, andthen_next, andthen and beforethat
+end
+
+document beforethat
+	beforethat
+.	displays the next prior event in the list. <set_andthen> sets up to
+.	display the last occuring event first.
+.
+.	note the number of events saved is specified at configure time.
+.	if events are saved between calls to beforethat the index will change
+.	but the displayed event will be the next one (unless the event buffer
+.	is overrun).
+.
+.	andthen commands are: set_andthen, andthen_next, andthen and beforethat
+end
--- diff/Documentation/i386/kgdb/debug-nmi.txt	1970-01-01 01:00:00.000000000 +0100
+++ source/Documentation/i386/kgdb/debug-nmi.txt	2003-12-29 09:30:39.000000000 +0000
@@ -0,0 +1,37 @@
+Subject: Debugging with NMI
+Date: Mon, 12 Jul 1999 11:28:31 -0500
+From: David Grothe <dave@gcom.com>
+Organization: Gcom, Inc
+To: David Grothe <dave@gcom.com>
+
+Kernel hackers:
+
+Maybe this is old hat, but it is new to me --
+
+On an ISA bus machine, if you short out the A1 and B1 pins of an ISA
+slot you will generate an NMI to the CPU.  This interrupts even a
+machine that is hung in a loop with interrupts disabled.  Used in
+conjunction with kgdb <
+ftp://ftp.gcom.com/pub/linux/src/kgdb-2.3.35/kgdb-2.3.35.tgz > you can
+gain debugger control of a machine that is hung in the kernel!  Even
+without kgdb the kernel will print a stack trace so you can find out
+where it was hung.
+
+The A1/B1 pins are directly opposite one another and the farthest pins
+towards the bracket end of the ISA bus socket.  You can stick a paper
+clip or multi-meter probe between them to short them out.
+
+I had a spare ISA bus to PC104 bus adapter around.  The PC104 end of the
+board consists of two rows of wire wrap pins.  So I wired a push button
+between the A1/B1 pins and now have an ISA board that I can stick into
+any ISA bus slot for debugger entry.
+
+Microsoft has a circuit diagram of a PCI card at
+http://www.microsoft.com/hwdev/DEBUGGING/DMPSW.HTM.  If you want to
+build one you will have to mail them and ask for the PAL equations.
+Nobody makes one comercially.
+
+[THIS TIP COMES WITH NO WARRANTY WHATSOEVER.  It works for me, but if
+your machine catches fire, it is your problem, not mine.]
+
+-- Dave (the kgdb guy)
--- diff/Documentation/i386/kgdb/gdb-globals.txt	1970-01-01 01:00:00.000000000 +0100
+++ source/Documentation/i386/kgdb/gdb-globals.txt	2003-12-29 09:30:39.000000000 +0000
@@ -0,0 +1,71 @@
+Sender: akale@veritas.com
+Date: Fri, 23 Jun 2000 19:26:35 +0530
+From: "Amit S. Kale" <akale@veritas.com>
+Organization: Veritas Software (India)
+To: Dave Grothe <dave@gcom.com>, linux-kernel@vger.rutgers.edu
+CC: David Milburn <dmilburn@wirespeed.com>,
+        "Edouard G. Parmelan" <Edouard.Parmelan@quadratec.fr>,
+        ezannoni@cygnus.com, Keith Owens <kaos@ocs.com.au>
+Subject: Re: Module debugging using kgdb
+
+Dave Grothe wrote:
+>
+> Amit:
+>
+> There is a 2.4.0 version of kgdb on our ftp site:
+> ftp://ftp.gcom.com/pub/linux/src/kgdb.  I mirrored your version of gdb
+> and loadmodule.sh there.
+>
+> Have a look at the README file and see if I go it right.  If not, send
+> me some corrections and I will update it.
+>
+> Does your version of gdb solve the global variable problem?
+
+Yes.
+Thanks to Elena Zanoni, gdb (developement version) can now calculate
+correctly addresses  of dynamically loaded object files. I have not been
+following gdb developement for sometime and am not sure when symbol
+address calculation fix is going to appear in a gdb stable version.
+
+Elena, any idea when the fix will make it to a prebuilt gdb from a
+redhat release?
+
+For the time being I have built a gdb developement version. It can be
+used for module debugging with loadmodule.sh script.
+
+The problem with calculating of module addresses with previous versions
+of gdb was as follows:
+gdb did not use base address of a section while calculating address of
+a symbol in the section in an object file loaded via 'add-symbol-file'.
+It used address of .text segment instead. Due to this addresses of
+symbols in .data, .bss etc. (e.g. global variables) were calculated incorrectly.
+
+Above mentioned fix allow gdb to use base address of a segment while
+calculating address of a symbol in it. It adds a parameter '-s' to
+'add-symbol-file' command for specifying base address of a segment.
+
+loadmodule.sh script works as follows.
+
+1. Copy a module file to target machine.
+2. Load the module on the target machine using insmod with -m parameter.
+insmod produces a module load map which contains base addresses of all
+sections in the module and addresses of symbols in the module file.
+3. Find all sections and their base addresses in the module from
+the module map.
+4. Generate a script that loads the module file. The script uses
+'add-symbol-file' and specifies address of text segment followed by
+addresses of all segments in the module.
+
+Here is an example gdb script produced by loadmodule.sh script.
+
+add-symbol-file foo 0xd082c060 -s .text.lock 0xd08cbfb5
+-s .fixup 0xd08cfbdf -s .rodata 0xd08cfde0 -s __ex_table 0xd08e3b38
+-s .data 0xd08e3d00 -s .bss 0xd08ec8c0 -s __ksymtab 0xd08ee838
+
+With this command gdb can calculate addresses of symbols in ANY segment
+in a module file.
+
+Regards.
+--
+Amit Kale
+Veritas Software ( http://www.veritas.com )
--- diff/Documentation/i386/kgdb/gdbinit	1970-01-01 01:00:00.000000000 +0100
+++ source/Documentation/i386/kgdb/gdbinit	2003-12-29 09:30:39.000000000 +0000
@@ -0,0 +1,14 @@
+shell echo -e "\003" >/dev/ttyS0
+set remotebaud 38400
+target remote /dev/ttyS0
+define si
+stepi
+printf "EAX=%08x EBX=%08x ECX=%08x EDX=%08x\n", $eax, $ebx, $ecx, $edx
+printf "ESI=%08x EDI=%08x EBP=%08x ESP=%08x\n", $esi, $edi, $ebp, $esp
+x/i $eip
+end
+define ni
+nexti
+printf "EAX=%08x EBX=%08x ECX=%08x EDX=%08x\n", $eax, $ebx, $ecx, $edx
+printf "ESI=%08x EDI=%08x EBP=%08x ESP=%08x\n", $esi, $edi, $ebp, $esp
+x/i $eip
--- diff/Documentation/i386/kgdb/gdbinit-modules	1970-01-01 01:00:00.000000000 +0100
+++ source/Documentation/i386/kgdb/gdbinit-modules	2003-12-29 09:30:39.000000000 +0000
@@ -0,0 +1,146 @@
+#
+# Usefull GDB user-command to debug Linux Kernel Modules with gdbstub.
+#
+# This don't work for Linux-2.0 or older.
+#
+# Author Edouard G. Parmelan <Edouard.Parmelan@quadratec.fr>
+#
+#
+# Fri Apr 30 20:33:29 CEST 1999
+#   First public release.
+#
+#   Major cleanup after experiment Linux-2.0 kernel without success.
+#   Symbols of a module are not in the correct order, I can't explain
+#   why :(
+#
+# Fri Mar 19 15:41:40 CET 1999
+#   Initial version.
+#
+# Thu Jan  6 16:29:03 CST 2000
+#   A little fixing by Dave Grothe <dave@gcom.com>
+#
+# Mon Jun 19 09:33:13 CDT 2000
+#   Alignment changes from Edouard Parmelan
+#
+# The basic idea is to find where insmod load the module and inform
+# GDB to load the symbol table of the module with the GDB command
+# ``add-symbol-file <object> <address>''.
+#
+# The Linux kernel holds the list of all loaded modules in module_list,
+# this list end with &kernel_module (exactly with module->next == NULL,
+# but the last module is not a real module).
+#
+# Insmod allocates the struct module before the object file.  Since
+# Linux-2.1, this structure contain his size.  The real address of
+# the object file is then (char*)module + module->size_of_struct.
+#
+# You can use three user functions ``mod-list'', ``mod-print-symbols''
+# and ``add-module-symbols''.
+#
+# mod-list list all loaded modules with the format:
+#    <module-address> <module-name>
+#
+# As soon as you have found the address of your module, you can
+# print its exported symbols (mod-print-symbols) or inform GDB to add
+# symbols from your module file (mod-add-symbols).
+#
+# The argument that you give to mod-print-symbols or mod-add-symbols
+# is the <module-address> from the mod-list command.
+#
+# When using the mod-add-symbols command you must also give the full
+# pathname of the modules object code file.
+#
+# The command mod-add-lis is an example of how to make this easier.
+# You can edit this macro to contain the path name of your own
+# favorite module and then use it as a shorthand to load it.  You
+# still need the module-address, however.
+#
+# The internal function ``mod-validate'' set the GDB variable $mod
+# as a ``struct module*'' if the kernel known the module otherwise
+# $mod is set to NULL.  This ensure to not add symbols for a wrong
+# address.
+#
+# Have a nice hacking day !
+#
+#
+define mod-list
+    set $mod = (struct module*)module_list
+    # the last module is the kernel, ignore it
+    while $mod != &kernel_module
+    	printf "%p\t%s\n", (long)$mod, ($mod)->name
+	set $mod = $mod->next
+    end
+end
+document mod-list
+List all modules in the form: <module-address> <module-name>
+Use the <module-address> as the argument for the other
+mod-commands: mod-print-symbols, mod-add-symbols.
+end
+
+define mod-validate
+    set $mod = (struct module*)module_list
+    while ($mod != $arg0) && ($mod != &kernel_module)
+    	set $mod = $mod->next
+    end
+    if $mod == &kernel_module
+	set $mod = 0
+    	printf "%p is not a module\n", $arg0
+    end
+end
+document mod-validate
+mod-validate <module-address>
+Internal user-command used to validate the module parameter.
+If <module> is a real loaded module, set $mod to it otherwise set $mod to 0.
+end
+
+
+define mod-print-symbols
+    mod-validate $arg0
+    if $mod != 0
+	set $i = 0
+	while $i < $mod->nsyms
+	    set $sym = $mod->syms[$i]
+	    printf "%p\t%s\n", $sym->value, $sym->name
+	    set $i = $i + 1
+	end
+    end
+end
+document mod-print-symbols
+mod-print-symbols <module-address>
+Print all exported symbols of the module.  see mod-list
+end
+
+
+define mod-add-symbols-align
+    mod-validate $arg0
+    if $mod != 0
+	set $mod_base = ($mod->size_of_struct + (long)$mod)
+	if ($arg2 != 0) && (($mod_base & ($arg2 - 1)) != 0)
+	    set $mod_base = ($mod_base | ($arg2 - 1)) + 1
+	end
+	add-symbol-file $arg1 $mod_base
+    end
+end
+document mod-add-symbols-align
+mod-add-symbols-align <module-address> <object file path name> <align>
+Load the symbols table of the module from the object file where
+first section aligment is <align>.
+To retreive alignment, use `objdump -h <object file path name>'.
+end
+
+define mod-add-symbols
+    mod-add-symbols-align $arg0 $arg1 sizeof(long)
+end
+document mod-add-symbols
+mod-add-symbols <module-address> <object file path name>
+Load the symbols table of the module from the object file.
+Default alignment is 4.  See mod-add-symbols-align.
+end
+
+define mod-add-lis
+    mod-add-symbols-align $arg0 /usr/src/LiS/streams.o 16
+end
+document mod-add-lis
+mod-add-lis <module-address>
+Does mod-add-symbols <module-address> /usr/src/LiS/streams.o
+end
--- diff/Documentation/i386/kgdb/gdbinit.hw	1970-01-01 01:00:00.000000000 +0100
+++ source/Documentation/i386/kgdb/gdbinit.hw	2003-12-29 09:30:39.000000000 +0000
@@ -0,0 +1,117 @@
+
+#Using ia-32 hardware breakpoints.
+#
+#4 hardware breakpoints are available in ia-32 processors. These breakpoints
+#do not need code modification. They are set using debug registers.
+#
+#Each hardware breakpoint can be of one of the
+#three types: execution, write, access.
+#1. An Execution breakpoint is triggered when code at the breakpoint address is
+#executed.
+#2. A write breakpoint ( aka watchpoints ) is triggered when memory location
+#at the breakpoint address is written.
+#3. An access breakpoint is triggered when memory location at the breakpoint
+#address is either read or written.
+#
+#As hardware breakpoints are available in limited number, use software
+#breakpoints ( br command in gdb ) instead of execution hardware breakpoints.
+#
+#Length of an access or a write breakpoint defines length of the datatype to
+#be watched. Length is 1 for char, 2 short , 3 int.
+#
+#For placing execution, write and access breakpoints, use commands
+#hwebrk, hwwbrk, hwabrk
+#To remove a breakpoint use hwrmbrk command.
+#
+#These commands take following types of arguments. For arguments associated
+#with each command, use help command.
+#1. breakpointno: 0 to 3
+#2. length: 1 to 3
+#3. address: Memory location in hex ( without 0x ) e.g c015e9bc
+#
+#Use the command exinfo to find which hardware breakpoint occured.
+
+#hwebrk breakpointno address
+define hwebrk
+	maintenance packet Y$arg0,0,0,$arg1
+end
+document hwebrk
+	hwebrk <breakpointno> <address>
+	Places a hardware execution breakpoint
+	<breakpointno> = 0 - 3
+	<address> = Hex digits without leading "0x".
+end
+
+#hwwbrk breakpointno length address
+define hwwbrk
+	maintenance packet Y$arg0,1,$arg1,$arg2
+end
+document hwwbrk
+	hwwbrk <breakpointno> <length> <address>
+	Places a hardware write breakpoint
+	<breakpointno> = 0 - 3
+	<length> = 1 (1 byte), 2 (2 byte), 3 (4 byte)
+	<address> = Hex digits without leading "0x".
+end
+
+#hwabrk breakpointno length address
+define hwabrk
+	maintenance packet Y$arg0,1,$arg1,$arg2
+end
+document hwabrk
+	hwabrk <breakpointno> <length> <address>
+	Places a hardware access breakpoint
+	<breakpointno> = 0 - 3
+	<length> = 1 (1 byte), 2 (2 byte), 3 (4 byte)
+	<address> = Hex digits without leading "0x".
+end
+
+#hwrmbrk breakpointno
+define hwrmbrk
+	maintenance packet y$arg0
+end
+document hwrmbrk
+	hwrmbrk <breakpointno>
+	<breakpointno> = 0 - 3
+	Removes a hardware breakpoint
+end
+
+define reboot
+        maintenance packet r
+end
+#exinfo
+define exinfo
+	maintenance packet qE
+end
+document exinfo
+	exinfo
+	Gives information about a breakpoint.
+end
+define get_th
+	p $th=(struct thread_info *)((int)$esp & ~8191)
+end
+document get_th
+	get_tu
+	Gets and prints the current thread_info pointer, Defines th to be it.
+end
+define get_cu
+	p $cu=((struct thread_info *)((int)$esp & ~8191))->task
+end
+document get_cu
+	get_cu
+	Gets and print the "current" value.  Defines $cu to be it.
+end
+define int_off
+	set var $flags=$eflags
+	set $eflags=$eflags&~0x200
+	end
+define int_on
+	set var $eflags|=$flags&0x200
+	end
+document int_off
+	saves the current interrupt state and clears the processor interrupt
+	flag.  Use int_on to restore the saved flag.
+end
+document int_on
+	Restores the interrupt flag saved by int_off.
+end
--- diff/Documentation/i386/kgdb/kgdb.txt	1970-01-01 01:00:00.000000000 +0100
+++ source/Documentation/i386/kgdb/kgdb.txt	2003-12-29 09:30:39.000000000 +0000
@@ -0,0 +1,775 @@
+Last edit: <20030806.1637.12>
+This file has information specific to the i386 kgdb option.  Other
+platforms with the kgdb option may behave in a similar fashion.
+
+New features:
+============
+20030806.1557.37
+This version was made against the 2.6.0-test2 kernel. We have made the
+following changes:
+
+- The getthread() code in the stub calls find_task_by_pid().  It fails
+  if we are early in the bring up such that the pid arrays have yet to
+  be allocated.  We have added a line to kernel/pid.c to make
+  "kgdb_pid_init_done" true once the arrays are allocated.  This way the
+  getthread() code knows not to call.  This is only used by the thread
+  debugging stuff and threads will not yet exist at this point in the
+  boot.
+
+- For some reason, gdb was not asking for a new thread list when the
+  "info thread" command was given.  We changed to the newer version of
+  the thread info command and gdb now seems to ask when needed.  Result,
+  we now get all threads in the thread list.
+
+- We now respond to the ThreadExtraInfo request from gdb with the thread
+  name from task_struct .comm.  This then appears in the thread list.
+  Thoughts on additional options for this are welcome.  Things such as
+  "has BKL" and "Preempted" come to mind.  I think we could have a flag
+  word that could enable different bits of info here.
+
+- We now honor, sort of, the C and S commands.  These are continue and
+  single set after delivering a signal.  We ignore the signal and do the
+  requested action.  This only happens when we told gdb that a signal
+  was the reason for entry, which is only done on memory faults.  The
+  result is that you can now continue into the Oops.
+
+- We changed the -g to -gdwarf-2.  This seems to be the same as -ggdb,
+  but it is more exact on what language to use.
+
+- We added two dwarf2 include files and a bit of code at the end of
+  entry.S.  This does not yet work, so it is disabled.  Still we want to
+  keep track of the code and "maybe" someone out there can fix it.
+
+- Randy Dunlap sent some fix ups for this file which are now merged.
+
+- Hugh Dickins sent a fix to a bit of code in traps.c that prevents a
+  compiler warning if CONFIG_KGDB is off (now who would do that :).
+
+- Andrew Morton sent a fix for the serial driver which is now merged.
+
+- Andrew also sent a change to the stub around the cpu managment code
+  which is also merged.
+
+- Andrew also sent a patch to make "f" as well as "g" work as SysRq
+  commands to enter kgdb, merged.
+
+- If CONFIG_KGDB and CONFIG_DEBUG_SPINLOCKS are both set we added a
+  "who" field to the spinlock data struct.  This is filled with
+  "current" when ever the spinlock suceeds.  Useful if you want to know
+  who has the lock.
+
+_ And last, but not least, we fixed the "get_cu" macro to properly get
+  the current value of "current".
+
+New features:
+============
+20030505.1827.27
+We are starting to align with the sourceforge version, at least in
+commands.  To this end, the boot command string to start kgdb at
+boot time has been changed from "kgdb" to "gdb".
+
+Andrew Morton sent a couple of patches which are now included as follows:
+1.) We now return a flag to the interrupt handler.
+2.) We no longer use smp_num_cpus (a conflict with the lock meter).
+3.) And from William Lee Irwin III <wli@holomorphy.com> code to make
+    sure high-mem is set up before we attempt to register our interrupt
+    handler.
+We now include asm/kgdb.h from config.h so you will most likely never
+have to include it.  It also 'NULLS' the kgdb macros you might have in
+your code when CONFIG_KGDB is not defined.  This allows you to just
+turn off CONFIG_KGDB to turn off all the kgdb_ts() calls and such.
+This include is conditioned on the machine being an x86 so as to not
+mess with other archs.
+
+20020801.1129.03
+This is currently the version for the 2.4.18 (and beyond?) kernel.
+
+We have several new "features" beginning with this version:
+
+1.) Kgdb now syncs the "other" CPUs with a cross-CPU NMI.  No more
+    waiting and it will pull that guy out of an IRQ off spin lock :)
+
+2.) We doctored up the code that tells where a task is waiting and
+    included it so that the "info thread" command will show a bit more
+    than "schedule()".  Try it...
+
+3.) Added the ability to call a function from gdb.  All the standard gdb
+    issues apply, i.e. if you hit a breakpoint in the function, you are
+    not allowed to call another (gdb limitation, not kgdb).  To help
+    this capability we added a memory allocation function.  Gdb does not
+    return this memory (it is used for strings that you pass to that function
+    you are calling from gdb) so we fixed up a way to allow you to
+    manually return the memory (see below).
+
+4.) Kgdb time stamps (kgdb_ts()) are enhanced to expand what was the
+    interrupt flag to now also include the preemption count and the
+    "in_interrupt" info.  The flag is now called "with_pif" to indicate
+    the order, preempt_count, in_interrupt, flag.  The preempt_count is
+    shifted left by 4 bits so you can read the count in hex by dropping
+    the low order digit.  In_interrupt is in bit 1, and the flag is in
+    bit 0.
+
+5.) The command: "p kgdb_info" is now expanded and prints something
+    like:
+(gdb) p kgdb_info
+$2 = {used_malloc = 0, called_from = 0xc0107506, entry_tsc = 67468627259,
+  errcode = 0, vector = 3, print_debug_info = 0, hold_on_sstep = 1,
+  cpus_waiting = {{task = 0xc027a000, pid = 32768, hold = 0,
+      regs = 0xc027bf84}, {task = 0x0, pid = 0, hold = 0, regs = 0x0}}}
+
+    Things to note here: a.) used_malloc is the amount of memory that
+    has been malloc'ed to do calls from gdb.  You can reclaim this
+    memory like this: "p kgdb_info.used_malloc=0" Cool, huh?  b.)
+    cpus_waiting is now "sized" by the number of CPUs you enter at
+    configure time in the kgdb configure section.  This is NOT used
+    anywhere else in the system, but it is "nice" here.  c.)  The task's
+    "pid" is now in the structure.  This is the pid you will need to use
+    to decode to the thread id to get gdb to look at that thread.
+    Remember that the "info thread" command prints a list of threads
+    wherein it numbers each thread with its reference number followed
+    by the thread's pid.  Note that the per-CPU idle threads actually
+    have pids of 0 (yes, there is more than one pid 0 in an SMP system).
+    To avoid confusion, kgdb numbers these threads with numbers beyond
+    the MAX_PID.  That is why you see 32768 and above.
+
+6.) A subtle change, we now provide the complete register set for tasks
+    that are active on the other CPUs.  This allows better trace back on
+    those tasks.
+
+    And, let's mention what we could not fix.  Back-trace from all but the
+    thread that we trapped will, most likely, have a bogus entry in it.
+    The problem is that gdb does not recognize the entry code for
+    functions that use "current" near (at all?) the entry.  The compiler
+    is putting the "current" decode as the first two instructions of the
+    function where gdb expects to find %ebp changing code.  Back trace
+    also has trouble with interrupt frames.  I am talking with Daniel
+    Jacobowitz about some way to fix this, but don't hold your breath.
+
+20011220.0050.35
+Major enhancement with this version is the ability to hold one or more
+CPUs in an SMP system while allowing the others to continue.  Also, by
+default only the current CPU is enabled on single-step commands (please
+note that gdb issues single-step commands at times other than when you
+use the si command).
+
+Another change is to collect some useful information in
+a global structure called "kgdb_info".  You should be able to just:
+
+p kgdb_info
+
+although I have seen cases where the first time this is done gdb just
+prints the first member but prints the whole structure if you then enter
+CR (carriage return or enter).  This also works:
+
+p *&kgdb_info
+
+Here is a sample:
+(gdb) p kgdb_info
+$4 = {called_from = 0xc010732c, entry_tsc = 32804123790856, errcode = 0,
+  vector = 3, print_debug_info = 0}
+
+"Called_from" is the return address from the current entry into kgdb.
+Sometimes it is useful to know why you are in kgdb, for example, was
+it an NMI or a real breakpoint?  The simple way to interrogate this
+return address is:
+
+l *0xc010732c
+
+which will print the surrounding few lines of source code.
+
+"Entry_tsc" is the CPU TSC on entry to kgdb (useful to compare to the
+kgdb_ts entries).
+
+"errcode" and "vector" are other entry parameters which may be helpful on
+some traps.
+
+"print_debug_info" is the internal debugging kgdb print enable flag.  Yes,
+you can modify it.
+
+In SMP systems kgdb_info also includes the "cpus_waiting" structure and
+"hold_on_step":
+
+(gdb) p kgdb_info
+$7 = {called_from = 0xc0112739, entry_tsc = 1034936624074, errcode = 0,
+  vector = 2, print_debug_info = 0, hold_on_sstep = 1, cpus_waiting = {{
+      task = 0x0, hold = 0, regs = 0x0}, {task = 0xc71b8000, hold = 0,
+      regs = 0xc71b9f70}, {task = 0x0, hold = 0, regs = 0x0}, {task = 0x0,
+      hold = 0, regs = 0x0}, {task = 0x0, hold = 0, regs = 0x0}, {task = 0x0,
+      hold = 0, regs = 0x0}, {task = 0x0, hold = 0, regs = 0x0}, {task = 0x0,
+      hold = 0, regs = 0x0}}}
+
+"Cpus_waiting" has an entry for each CPU other than the current one that
+has been stopped.  Each entry contains the task_struct address for that
+CPU, the address of the regs for that task and a hold flag.  All these
+have the proper typing so that, for example:
+
+p *kgdb_info.cpus_waiting[1].regs
+
+will print the registers for CPU 1.
+
+"Hold_on_sstep" is a new feature with this version and comes up set or
+true.  What this means is that whenever kgdb is asked to single-step all
+other CPUs are held (i.e. not allowed to execute).  The flag applies to
+all but the current CPU and, again, can be changed:
+
+p kgdb_info.hold_on_sstep=0
+
+restores the old behavior of letting all CPUs run during single-stepping.
+
+Likewise, each CPU has a "hold" flag, which if set, locks that CPU out
+of execution.  Note that this has some risk in cases where the CPUs need
+to communicate with each other.  If kgdb finds no CPU available on exit,
+it will push a message thru gdb and stay in kgdb.  Note that it is legal
+to hold the current CPU as long as at least one CPU can execute.
+
+20010621.1117.09
+This version implements an event queue.  Events are signaled by calling
+a function in the kgdb stub and may be examined from gdb.  See EVENTS
+below for details.  This version also tightens up the interrupt and SMP
+handling to not allow interrupts on the way to kgdb from a breakpoint
+trap.  It is fine to allow these interrupts for user code, but not
+system debugging.
+
+Version
+=======
+
+This version of the kgdb package was developed and tested on
+kernel version 2.4.16.  It will not install on any earlier kernels.
+It is possible that it will continue to work on later versions
+of 2.4 and then versions of 2.5 (I hope).
+
+
+Debugging Setup
+===============
+
+Designate one machine as the "development" machine.  This is the
+machine on which you run your compiles and which has your source
+code for the kernel.  Designate a second machine as the "target"
+machine.  This is the machine that will run your experimental
+kernel.
+
+The two machines will be connected together via a serial line out
+one or the other of the COM ports of the PC.  You will need the
+appropriate modem eliminator (null modem) cable(s) for this.
+
+Decide on which tty port you want the machines to communicate, then
+connect them up back-to-back using the null modem cable.  COM1 is
+/dev/ttyS0 and COM2 is /dev/ttyS1. You should test this connection
+with the two machines prior to trying to debug a kernel.  Once you
+have it working, on the TARGET machine, enter:
+
+setserial /dev/ttyS0 (or what ever tty you are using)
+
+and record the port address and the IRQ number.
+
+On the DEVELOPMENT machine you need to apply the patch for the kgdb
+hooks.  You have probably already done that if you are reading this
+file.
+
+On your DEVELOPMENT machine, go to your kernel source directory and do
+"make Xconfig" where X is one of "x", "menu", or "".  If you are
+configuring in the standard serial driver, it must not be a module.
+Either yes or no is ok, but making the serial driver a module means it
+will initialize after kgdb has set up the UART interrupt code and may
+cause a failure of the control-C option discussed below.  The configure
+question for the serial driver is under the "Character devices" heading
+and is:
+
+"Standard/generic (8250/16550 and compatible UARTs) serial support"
+
+Go down to the kernel debugging menu item and open it up.  Enable the
+kernel kgdb stub code by selecting that item.  You can also choose to
+turn on the "-ggdb -O1" compile options.  The -ggdb causes the compiler
+to put more debug info (like local symbols) in the object file.  On the
+i386 -g and -ggdb are the same so this option just reduces to "O1".  The
+-O1 reduces the optimization level.  This may be helpful in some cases,
+be aware, however, that this may also mask the problem you are looking
+for.
+
+The baud rate.  Default is 115200.  What ever you choose be sure that
+the host machine is set to the same speed.  I recommend the default.
+
+The port.  This is the I/O address of the serial UART that you should
+have gotten using setserial as described above.  The standard COM1 port
+(3f8) using IRQ 4 is default.  COM2 is 2f8 which by convention uses IRQ
+3.
+
+The port IRQ (see above).
+
+Stack overflow test.  This option makes a minor change in the trap,
+system call and interrupt code to detect stack overflow and transfer
+control to kgdb if it happens.  (Some platforms have this in the
+baseline code, but the i386 does not.)
+
+You can also configure the system to recognize the boot option
+"console=kgdb" which if given will cause all console output during
+booting to be put thru gdb as well as other consoles.  This option
+requires that gdb and kgdb be connected prior to sending console output
+so, if they are not, a breakpoint is executed to force the connection.
+This will happen before any kernel output (it is going thru gdb, right),
+and will stall the boot until the connection is made.
+
+You can also configure in a patch to SysRq to enable the kGdb SysRq.
+This request generates a breakpoint.  Since the serial port IRQ line is
+set up after any serial drivers, it is possible that this command will
+work when the control-C will not.
+
+Save and exit the Xconfig program.  Then do "make clean" , "make dep"
+and "make bzImage" (or whatever target you want to make).  This gets the
+kernel compiled with the "-g" option set -- necessary for debugging.
+
+You have just built the kernel on your DEVELOPMENT machine that you
+intend to run on your TARGET machine.
+
+To install this new kernel, use the following installation procedure.
+Remember, you are on the DEVELOPMENT machine patching the kernel source
+for the kernel that you intend to run on the TARGET machine.
+
+Copy this kernel to your target machine using your usual procedures.  I
+usually arrange to copy development:
+/usr/src/linux/arch/i386/boot/bzImage to /vmlinuz on the TARGET machine
+via a LAN based NFS access.  That is, I run the cp command on the target
+and copy from the development machine via the LAN.  Run Lilo (see "man
+lilo" for details on how to set this up) on the new kernel on the target
+machine so that it will boot!  Then boot the kernel on the target
+machine.
+
+On the DEVELOPMENT machine, create a file called .gdbinit in the
+directory /usr/src/linux.  An example .gdbinit file looks like this:
+
+shell echo -e "\003" >/dev/ttyS0
+set remotebaud 38400 (or what ever speed you have chosen)
+target remote /dev/ttyS0
+
+
+Change the "echo" and "target" definition so that it specifies the tty
+port that you intend to use.  Change the "remotebaud" definition to
+match the data rate that you are going to use for the com line.
+
+You are now ready to try it out.
+
+Boot your target machine with "kgdb" in the boot command i.e. something
+like:
+
+lilo> test kgdb
+
+or if you also want console output thru gdb:
+
+lilo> test kgdb console=kgdb
+
+You should see the lilo message saying it has loaded the kernel and then
+all output stops.  The kgdb stub is trying to connect with gdb.  Start
+gdb something like this:
+
+
+On your DEVELOPMENT machine, cd /usr/src/linux and enter "gdb vmlinux".
+When gdb gets the symbols loaded it will read your .gdbinit file and, if
+everything is working correctly, you should see gdb print out a few
+lines indicating that a breakpoint has been taken.  It will actually
+show a line of code in the target kernel inside the kgdb activation
+code.
+
+The gdb interaction should look something like this:
+
+    linux-dev:/usr/src/linux# gdb vmlinux
+    GDB is free software and you are welcome to distribute copies of it
+     under certain conditions; type "show copying" to see the conditions.
+    There is absolutely no warranty for GDB; type "show warranty" for details.
+    GDB 4.15.1 (i486-slackware-linux),
+    Copyright 1995 Free Software Foundation, Inc...
+    breakpoint () at i386-stub.c:750
+    750     }
+    (gdb)
+
+You can now use whatever gdb commands you like to set breakpoints.
+Enter "continue" to start your target machine executing again.  At this
+point the target system will run at full speed until it encounters
+your breakpoint or gets a segment violation in the kernel, or whatever.
+
+If you have the kgdb console enabled when you continue, gdb will print
+out all the console messages.
+
+The above example caused a breakpoint relatively early in the boot
+process.  For the i386 kgdb it is possible to code a break instruction
+as the first C-language point in init/main.c, i.e. as the first instruction
+in start_kernel().  This could be done as follows:
+
+#include <asm/kgdb.h>
+	 breakpoint();
+
+This breakpoint() is really a function that sets up the breakpoint and
+single-step hardware trap cells and then executes a breakpoint.  Any
+early hard coded breakpoint will need to use this function.  Once the
+trap cells are set up they need not be set again, but doing it again
+does not hurt anything, so you don't need to be concerned about which
+breakpoint is hit first.  Once the trap cells are set up (and the kernel
+sets them up in due course even if breakpoint() is never called) the
+macro:
+
+BREAKPOINT;
+
+will generate an inline breakpoint.  This may be more useful as it stops
+the processor at the instruction instead of in a function a step removed
+from the location of interest.  In either case <asm/kgdb.h> must be
+included to define both breakpoint() and BREAKPOINT.
+
+Triggering kgdbstub at other times
+==================================
+
+Often you don't need to enter the debugger until much later in the boot
+or even after the machine has been running for some time.  Once the
+kernel is booted and interrupts are on, you can force the system to
+enter the debugger by sending a control-C to the debug port. This is
+what the first line of the recommended .gdbinit file does.  This allows
+you to start gdb any time after the system is up as well as when the
+system is already at a breakpoint.  (In the case where the system is
+already at a breakpoint the control-C is not needed, however, it will
+be ignored by the target so no harm is done.  Also note the the echo
+command assumes that the port speed is already set.  This will be true
+once gdb has connected, but it is best to set the port speed before you
+run gdb.)
+
+Another simple way to do this is to put the following file in you ~/bin
+directory:
+
+#!/bin/bash
+echo  -e "\003"  > /dev/ttyS0
+
+Here, the ttyS0 should be replaced with what ever port you are using.
+The "\003" is control-C.  Once you are connected with gdb, you can enter
+control-C at the command prompt.
+
+An alternative way to get control to the debugger is to enable the kGdb
+SysRq command.  Then you would enter Alt-SysRq-g (all three keys at the
+same time, but push them down in the order given).  To refresh your
+memory of the available SysRq commands try Alt-SysRq-=.  Actually any
+undefined command could replace the "=", but I like to KNOW that what I
+am pushing will never be defined.
+
+Debugging hints
+===============
+
+You can break into the target machine at any time from the development
+machine by typing ^C (see above paragraph).  If the target machine has
+interrupts enabled this will stop it in the kernel and enter the
+debugger.
+
+There is unfortunately no way of breaking into the kernel if it is
+in a loop with interrupts disabled, so if this happens to you then
+you need to place exploratory breakpoints or printk's into the kernel
+to find out where it is looping.  The exploratory breakpoints can be
+entered either thru gdb or hard coded into the source.  This is very
+handy if you do something like:
+
+if (<it hurts>) BREAKPOINT;
+
+
+There is a copy of an e-mail in the Documentation/i386/kgdb/ directory
+(debug-nmi.txt) which describes how to create an NMI on an ISA bus
+machine using a paper clip.  I have a sophisticated version of this made
+by wiring a push button switch into a PC104/ISA bus adapter card.  The
+adapter card nicely furnishes wire wrap pins for all the ISA bus
+signals.
+
+When you are done debugging the kernel on the target machine it is a
+good idea to leave it in a running state.  This makes reboots faster,
+bypassing the fsck.  So do a gdb "continue" as the last gdb command if
+this is possible.  To terminate gdb itself on the development machine
+and leave the target machine running, first clear all breakpoints and
+continue, then type ^Z to suspend gdb and then kill it with "kill %1" or
+something similar.
+
+If gdbstub Does Not Work
+========================
+
+If it doesn't work, you will have to troubleshoot it.  Do the easy
+things first like double checking your cabling and data rates.  You
+might try some non-kernel based programs to see if the back-to-back
+connection works properly.  Just something simple like cat /etc/hosts
+>/dev/ttyS0 on one machine and cat /dev/ttyS0 on the other will tell you
+if you can send data from one machine to the other.  Make sure it works
+in both directions.  There is no point in tearing out your hair in the
+kernel if the line doesn't work.
+
+All of the real action takes place in the file
+/usr/src/linux/arch/i386/kernel/kgdb_stub.c.  That is the code on the target
+machine that interacts with gdb on the development machine.  In gdb you can
+turn on a debug switch with the following command:
+
+	set remotedebug
+
+This will print out the protocol messages that gdb is exchanging with
+the target machine.
+
+Another place to look is /usr/src/arch/i386/lib/kgdb_serial.c. This is
+the code that talks to the serial port on the target side.  There might
+be a problem there.  In particular there is a section of this code that
+tests the UART which will tell you what UART you have if you define
+"PRNT" (just remove "_off" from the #define PRNT_off).  To view this
+report you will need to boot the system without any beakpoints.  This
+allows the kernel to run to the point where it calls kgdb to set up
+interrupts.  At this time kgdb will test the UART and print out the type
+it finds.  (You need to wait so that the printks are actually being
+printed.  Early in the boot they are cached, waiting for the console to
+be enabled.  Also, if kgdb is entered thru a breakpoint it is possible
+to cause a dead lock by calling printk when the console is locked.  The
+stub thus avoids doing printks from breakpoints, especially in the
+serial code.)  At this time, if the UART fails to do the expected thing,
+kgdb will print out (using printk) information on what failed.  (These
+messages will be buried in all the other boot up messages.  Look for
+lines that start with "gdb_hook_interrupt:".  You may want to use dmesg
+once the system is up to view the log.  If this fails or if you still
+don't connect, review your answers for the port address.  Use:
+
+setserial /dev/ttyS0
+
+to get the current port and IRQ information.  This command will also
+tell you what the system found for the UART type. The stub recognizes
+the following UART types:
+
+16450, 16550, and 16550A
+
+If you are really desperate you can use printk debugging in the
+kgdbstub code in the target kernel until you get it working.  In particular,
+there is a global variable in /usr/src/linux/arch/i386/kernel/kgdb_stub.c
+named "remote_debug".  Compile your kernel with this set to 1, rather
+than 0 and the debug stub will print out lots of stuff as it does
+what it does.  Likewise there are debug printks in the kgdb_serial.c
+code that can be turned on with simple changes in the macro defines.
+
+
+Debugging Loadable Modules
+==========================
+
+This technique comes courtesy of Edouard Parmelan
+<Edouard.Parmelan@quadratec.fr>
+
+When you run gdb, enter the command
+
+source gdbinit-modules
+
+This will read in a file of gdb macros that was installed in your
+kernel source directory when kgdb was installed.  This file implements
+the following commands:
+
+mod-list
+    Lists the loaded modules in the form <module-address> <module-name>
+
+mod-print-symbols <module-address>
+    Prints all the symbols in the indicated module.
+
+mod-add-symbols <module-address> <object-file-path-name>
+    Loads the symbols from the object file and associates them
+    with the indicated module.
+
+After you have loaded the module that you want to debug, use the command
+mod-list to find the <module-address> of your module.  Then use that
+address in the mod-add-symbols command to load your module's symbols.
+From that point onward you can debug your module as if it were a part
+of the kernel.
+
+The file gdbinit-modules also contains a command named mod-add-lis as
+an example of how to construct a command of your own to load your
+favorite module.  The idea is to "can" the pathname of the module
+in the command so you don't have to type so much.
+
+Threads
+=======
+
+Each process in a target machine is seen as a gdb thread. gdb thread
+related commands (info threads, thread n) can be used.
+
+ia-32 hardware breakpoints
+==========================
+
+kgdb stub contains support for hardware breakpoints using debugging features
+of ia-32(x86) processors. These breakpoints do not need code modification.
+They use debugging registers. 4 hardware breakpoints are available in ia-32
+processors.
+
+Each hardware breakpoint can be of one of the following three types.
+
+1. Execution breakpoint - An Execution breakpoint is triggered when code
+	at the breakpoint address is executed.
+
+	As limited number of hardware breakpoints are available, it is
+	advisable to use software breakpoints ( break command ) instead
+	of execution hardware breakpoints, unless modification of code
+	is to be avoided.
+
+2. Write breakpoint - A write breakpoint is triggered when memory
+	location at the breakpoint address is written.
+
+	A write or can be placed for data of variable length. Length of
+	a write breakpoint indicates length of the datatype to be
+	watched. Length is 1 for 1 byte data , 2 for 2 byte data, 3 for
+	4 byte data.
+
+3. Access breakpoint - An access breakpoint is triggered when memory
+	location at the breakpoint address is either read or written.
+
+	Access breakpoints also have lengths similar to write breakpoints.
+
+IO breakpoints in ia-32 are not supported.
+
+Since gdb stub at present does not use the protocol used by gdb for hardware
+breakpoints, hardware breakpoints are accessed through gdb macros. gdb macros
+for hardware breakpoints are described below.
+
+hwebrk	- Places an execution breakpoint
+	hwebrk breakpointno address
+hwwbrk	- Places a write breakpoint
+	hwwbrk breakpointno length address
+hwabrk	- Places an access breakpoint
+	hwabrk breakpointno length address
+hwrmbrk	- Removes a breakpoint
+	hwrmbrk breakpointno
+exinfo	- Tells whether a software or hardware breakpoint has occurred.
+	Prints number of the hardware breakpoint if a hardware breakpoint has
+	occurred.
+
+Arguments required by these commands are as follows
+breakpointno	- 0 to 3
+length		- 1 to 3
+address		- Memory location in hex digits ( without 0x ) e.g c015e9bc
+
+SMP support
+==========
+
+When a breakpoint occurs or user issues a break ( Ctrl + C ) to gdb
+client, all the processors are forced to enter the debugger. Current
+thread corresponds to the thread running on the processor where
+breakpoint occurred.  Threads running on other processor(s) appear
+similar to other non-running threads in the 'info threads' output.
+Within the kgdb stub there is a structure "waiting_cpus" in which kgdb
+records the values of "current" and "regs" for each CPU other than the
+one that hit the breakpoint.  "current" is a pointer to the task
+structure for the task that CPU is running, while "regs" points to the
+saved registers for the task.  This structure can be examined with the
+gdb "p" command.
+
+ia-32 hardware debugging registers on all processors are set to same
+values.  Hence any hardware breakpoints may occur on any processor.
+
+gdb troubleshooting
+===================
+
+1. gdb hangs
+Kill it. restart gdb. Connect to target machine.
+
+2. gdb cannot connect to target machine (after killing a gdb and
+restarting another) If the target machine was not inside debugger when
+you killed gdb, gdb cannot connect because the target machine won't
+respond.  In this case echo "Ctrl+C"(ASCII 3) to the serial line.
+e.g. echo -e "\003" > /dev/ttyS1
+This forces that target machine into the debugger, after which you
+can connect.
+
+3. gdb cannot connect even after echoing Ctrl+C into serial line
+Try changing serial line settings min to 1 and time to 0
+e.g. stty min 1 time 0 < /dev/ttyS1
+Try echoing again
+
+Check serial line speed and set it to correct value if required
+e.g. stty ispeed 115200 ospeed 115200 < /dev/ttyS1
+
+EVENTS
+======
+
+Ever want to know the order of things happening?  Which CPU did what and
+when?  How did the spinlock get the way it is?  Then events are for
+you.  Events are defined by calls to an event collection interface and
+saved for later examination.  In this case, kgdb events are saved by a
+very fast bit of code in kgdb which is fully SMP and interrupt protected
+and they are examined by using gdb to display them.  Kgdb keeps only
+the last N events, where N must be a power of two and is defined at
+configure time.
+
+
+Events are signaled to kgdb by calling:
+
+kgdb_ts(data0,data1)
+
+For each call kgdb records each call in an array along with other info.
+Here is the array definition:
+
+struct kgdb_and_then_struct {
+#ifdef CONFIG_SMP
+	int	on_cpu;
+#endif
+	long long at_time;
+	int  	from_ln;
+	char	* in_src;
+	void	*from;
+        int     with_if;
+	int	data0;
+	int	data1;
+};
+
+For SMP machines the CPU is recorded, for all machines the TSC is
+recorded (gets a time stamp) as well as the line number and source file
+the call was made from.  The address of the (from), the "if" (interrupt
+flag) and the two data items are also recorded.  The macro kgdb_ts casts
+the types to int, so you can put any 32-bit values here.  There is a
+configure option to select the number of events you want to keep.  A
+nice number might be 128, but you can keep up to 1024 if you want.  The
+number must be a power of two.  An "andthen" macro library is provided
+for gdb to help you look at these events.  It is also possible to define
+a different structure for the event storage and cast the data to this
+structure.  For example the following structure is defined in kgdb:
+
+struct kgdb_and_then_struct2 {
+#ifdef CONFIG_SMP
+	int	on_cpu;
+#endif
+	long long at_time;
+	int  	from_ln;
+	char	* in_src;
+	void	*from;
+        int     with_if;
+	struct task_struct *t1;
+	struct task_struct *t2;
+};
+
+If you use this for display, the data elements will be displayed as
+pointers to task_struct entries.  You may want to define your own
+structure to use in casting.  You should only change the last two items
+and you must keep the structure size the same.  Kgdb will handle these
+as 32-bit ints, but within that constraint you can define a structure to
+cast to any 32-bit quantity.  This need only be available to gdb and is
+only used for casting in the display code.
+
+Final Items
+===========
+
+I picked up this code from Amit S. Kale and enhanced it.
+
+If you make some really cool modification to this stuff, or if you
+fix a bug, please let me know.
+
+George Anzinger
+<george@mvista.com>
+
+Amit S. Kale
+<akale@veritas.com>
+
+(First kgdb by David Grothe <dave@gcom.com>)
+
+(modified by Tigran Aivazian <tigran@sco.com>)
+    Putting gdbstub into the kernel config menu.
+
+(modified by Scott Foehner <sfoehner@engr.sgi.com>)
+    Hooks for entering gdbstub at boot time.
+
+(modified by Amit S. Kale <akale@veritas.com>)
+    Threads, ia-32 hw debugging, mp support, console support,
+    nmi watchdog handling.
+
+(modified by George Anzinger <george@mvista.com>)
+    Extended threads to include the idle threads.
+    Enhancements to allow breakpoint() at first C code.
+    Use of module_init() and __setup() to automate the configure.
+    Enhanced the cpu "collection" code to work in early bring-up.
+    Added ability to call functions from gdb
+    Print info thread stuff without going back to schedule()
+    Now collect the "other" cpus with an IPI/ NMI.
--- diff/Documentation/i386/kgdb/kgdbeth.txt	1970-01-01 01:00:00.000000000 +0100
+++ source/Documentation/i386/kgdb/kgdbeth.txt	2003-12-29 09:30:39.000000000 +0000
@@ -0,0 +1,118 @@
+KGDB over ethernet
+==================
+
+Authors
+-------
+
+Robert Walsh <rjwalsh@durables.org>  (2.6 port)
+wangdi <wangdi@clusterfs.com>        (2.6 port)
+San Mehat                            (original 2.4 code)
+
+
+Introduction
+------------
+
+KGDB supports debugging over ethernet.  Only a limited set of ethernet
+devices are supported right now, but adding support for new devices
+should not be too complicated.  See "New Devices" below for details.
+
+
+Terminology
+-----------
+
+This document uses the following terms:
+
+  TARGET: the machine being debugged.
+  HOST:   the machine running gdb.
+
+
+Usage
+-----
+
+You need to use the following command-line options on the TARGET kernel:
+
+  gdbeth=DEVICENUM
+  gdbeth_remoteip=HOSTIPADDR
+  gdbeth_remotemac=REMOTEMAC
+  gdbeth_localmac=LOCALMAC
+
+kgdbeth=DEVICENUM sets the ethernet device number to listen on for
+debugging packets.  e.g. kgdbeth=0 listens on eth0.
+
+kgdbeth_remoteip=HOSTIPADDR sets the IP address of the HOST machine.
+Only packets originating from this IP address will be accepted by the
+debugger.  e.g. kgdbeth_remoteip=192.168.2.2
+
+kgdbeth_remotemac=REMOTEMAC sets the ethernet address of the HOST machine.
+e.g. kgdbeth_remotemac=00:07:70:12:4E:F5
+
+kgdbeth_localmac=LOCALMAC sets the ethernet address of the TARGET machine.
+e.g. kgdbeth_localmac=00:10:9F:18:21:3C
+
+You can also set the following command-line option on the TARGET kernel:
+
+  kgdbeth_listenport=PORT
+
+kgdbeth_listenport sets the UDP port to listen on for gdb debugging
+packets.  The default value is "6443".  e.g. kgdbeth_listenport=7654
+causes the kernel to listen on UDP port 7654 for debugging packets.
+
+On the HOST side, run gdb as normal and use a remote UDP host as the
+target:
+
+   % gdb ./vmlinux
+   GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)
+   Copyright 2003 Free Software Foundation, Inc.
+   GDB is free software, covered by the GNU General Public License, and you are
+   welcome to change it and/or distribute copies of it under certain conditions.
+   Type "show copying" to see the conditions.
+   There is absolutely no warranty for GDB.  Type "show warranty" for details.
+   This GDB was configured as "i386-redhat-linux-gnu"...
+   (gdb) target remote udp:HOSTNAME:6443
+
+You can now continue as if you were debugging over a serial line.
+
+Observations
+------------
+
+I've used this with NFS and various other network applications (ssh,
+etc.) and it's doesn't appear to interfere with their operation in
+any way.  It doesn't seem to effect the NIC it uses - i.e. you don't
+need a dedicated NIC for this.
+
+Limitations
+-----------
+
+In the inital release of this code you _must_ break into the system with the
+debugger by hand, early after boot, as described above.
+
+Otherwise, the first time the kernel tries to enter the debugger (say, via an
+oops or a BUG), the kgdb stub will doublefault and die because things aren't
+fully set up yet.
+
+Supported devices
+-----------------
+
+Right now, the following drivers are supported:
+
+  e100 driver (drivers/net/e100/*)
+  3c59x driver (drivers/net/3c59x.c)
+
+
+New devices
+-----------
+
+Supporting a new device is straightforward.  Just add a "poll" routine to
+the driver and hook it into the poll_controller field in the netdevice
+structure.  For an example, look in drivers/net/3c59x.c and search
+for CONFIG_KGDB (two places.)
+
+The poll routine is usually quite simple - it's usually enough to just
+disable interrupts, call the device's interrupt routine and re-enable
+interrupts again.
+
+
+Bug reports
+-----------
+
+Send bug reports to Robert Walsh <rjwalsh@durables.org>.
--- diff/Documentation/i386/kgdb/loadmodule.sh	1970-01-01 01:00:00.000000000 +0100
+++ source/Documentation/i386/kgdb/loadmodule.sh	2003-12-29 09:30:39.000000000 +0000
@@ -0,0 +1,78 @@
+#/bin/sh
+# This script loads a module on a target machine and generates a gdb script.
+# source generated gdb script to load the module file at appropriate addresses
+# in gdb.
+#
+# Usage:
+# Loading the module on target machine and generating gdb script)
+#	[foo]$ loadmodule.sh <modulename>
+#
+# Loading the module file into gdb
+#	(gdb) source <gdbscriptpath>
+#
+# Modify following variables according to your setup.
+#	TESTMACHINE - Name of the target machine
+#	GDBSCRIPTS - The directory where a gdb script will be generated
+#
+# Author: Amit S. Kale (akale@veritas.com).
+#
+# If you run into problems, please check files pointed to by following
+# variables.
+#	ERRFILE - /tmp/<modulename>.errs contains stderr output of insmod
+#	MAPFILE - /tmp/<modulename>.map contains stdout output of insmod
+#	GDBSCRIPT - $GDBSCRIPTS/load<modulename> gdb script.
+
+TESTMACHINE=foo
+GDBSCRIPTS=/home/bar
+
+if [ $# -lt 1 ] ; then {
+	echo Usage: $0 modulefile
+	exit
+} ; fi
+
+MODULEFILE=$1
+MODULEFILEBASENAME=`basename $1`
+
+if [ $MODULEFILE = $MODULEFILEBASENAME ] ; then {
+	MODULEFILE=`pwd`/$MODULEFILE
+} fi
+
+ERRFILE=/tmp/$MODULEFILEBASENAME.errs
+MAPFILE=/tmp/$MODULEFILEBASENAME.map
+GDBSCRIPT=$GDBSCRIPTS/load$MODULEFILEBASENAME
+
+function findaddr() {
+	local ADDR=0x$(echo "$SEGMENTS" | \
+		grep "$1" | sed 's/^[^ ]*[ ]*[^ ]*[ ]*//' | \
+		sed 's/[ ]*[^ ]*$//')
+	echo $ADDR
+}
+
+function checkerrs() {
+	if [ "`cat $ERRFILE`" != "" ] ; then {
+		cat $ERRFILE
+		exit
+	} fi
+}
+
+#load the module
+echo Copying $MODULEFILE to $TESTMACHINE
+rcp $MODULEFILE root@${TESTMACHINE}:
+
+echo Loading module $MODULEFILE
+rsh -l root $TESTMACHINE  /sbin/insmod -m ./`basename $MODULEFILE` \
+	> $MAPFILE 2> $ERRFILE
+checkerrs
+
+SEGMENTS=`head -n 11 $MAPFILE | tail -n 10`
+TEXTADDR=$(findaddr "\\.text[^.]")
+LOADSTRING="add-symbol-file $MODULEFILE $TEXTADDR"
+SEGADDRS=`echo "$SEGMENTS" | awk '//{
+	if ($1 != ".text" && $1 != ".this" &&
+	    $1 != ".kstrtab" && $1 != ".kmodtab") {
+		print " -s " $1 " 0x" $3 " "
+	}
+}'`
+LOADSTRING="$LOADSTRING $SEGADDRS"
+echo Generating script $GDBSCRIPT
+echo $LOADSTRING > $GDBSCRIPT
--- diff/Documentation/must-fix.txt	1970-01-01 01:00:00.000000000 +0100
+++ source/Documentation/must-fix.txt	2003-12-29 09:30:39.000000000 +0000
@@ -0,0 +1,288 @@
+
+Must-fix bugs
+=============
+
+drivers/char/
+~~~~~~~~~~~~~
+
+o TTY locking is broken.
+
+  o see FIXME in do_tty_hangup().  This causes ppp BUGs in local_bh_enable()
+
+  o Other problems: aviro, dipankar, Alan have details.
+
+  o somebody will have to document the tty driver and ldisc API
+
+drivers/tty
+~~~~~~~~~~~
+
+o viro: tty_driver refcounting, tty/misc/upper levels of sound still not
+  completely fixed.
+
+drivers/block/
+~~~~~~~~~~~~~~
+
+o loop.c: Concurrent write access on block devices might cause a deadlock
+  of the complete system. See:
+  http://marc.theaimsgroup.com/?l=linux-kernel&m=106275365925769&w==
+  http://bugzilla.kernel.org/show_bug.cgi?id=1198
+  Thread of possible fix:
+  http://www.kerneli.org/pipermail/cryptoapi-devel/2003-October/000676.html
+
+  (Fruhwirth Clemens)
+
+o ideraid hasn't been ported to 2.5 at all yet.
+
+  We need to understand whether the proposed BIO split code will suffice
+  for this.
+
+drivers/input/
+~~~~~~~~~~~~~~
+
+o rmk: unconverted keyboard/mouse drivers (there's a deadline of 2.6.0
+  currently on these remaining in my/Linus' tree.)
+
+o viro: large absence of locking.
+
+o viro: parport is nearly as bad as that and there the code is more hairy.
+  IMO parport is more of "figure out what API changes are needed for its
+  users, get them done ASAP, then fix generic layer at leisure"
+
+o (Albert Cahalan) Lots of people (check Google) get this message from the
+  kernel:
+
+  psmouse.c: Lost synchronization, throwing 2 bytes away.
+
+  (the number of bytes will be 1, 2, or 3)
+
+  At work, I get it when there is heavy NFS traffic.  The mouse goes crazy,
+  jumping around and doing random cut-and-paste all over everything.  This
+  is with a decently fast and modern PC.
+
+o There seem to be too many reports of keyboards and mice failing or acting
+  strangely.
+
+
+drivers/misc/
+~~~~~~~~~~~~~
+
+o rmk: UCB1[23]00 drivers, currently sitting in drivers/misc in the ARM
+  tree.  (touchscreen, audio, gpio, type device.)
+
+  These need to be moved out of drivers/misc/ and into real places
+
+o viro: actually, misc.c has a good chance to die.  With cdev-cidr that's
+  trivial.
+
+drivers/net/
+~~~~~~~~~~~~
+
+drivers/net/irda/
+~~~~~~~~~~~~~~~~~
+
+  (Jean Tourrilhes)
+
+o irport need to be converted to sir-kthread
+
+o dongle drivers need to be converted to sir-dev (in progress)
+
+o new drivers (irtty-sir/smsc-ircc2/donauboe) need more testing (in progress)
+
+
+drivers/pci/
+~~~~~~~~~~~~
+
+o alan: Some cardbus crashes the system
+
+  (bugzilla, please?)
+
+drivers/pcmcia/
+~~~~~~~~~~~~~~~
+
+o alan: This is a locking disaster.
+
+  (rmk, brodo: in progress)
+
+drivers/pld/
+~~~~~~~~~~~~
+
+o rmk: EPXA (ARM platform) PLD hotswap drivers (drivers/pld)
+
+  (rmk: will work out what to do here.  maybe drivers/arm/)
+
+drivers/video/
+~~~~~~~~~~~~~~
+
+o Lots of drivers don't compile, others do but don't work.
+
+drivers/scsi/
+~~~~~~~~~~~~~
+
+o Convert am53c974, dpt_i2o, initio and pci2220i to DMA-mapping
+
+o Make inia100, cpqfc, pci2000 and dc390t compile
+
+o Convert
+
+   wd33c99 based: a2091 a3000 gpv11 mvme174 sgiwd93
+
+   53c7xx based: amiga7xxx bvme6000 mvme16x initio am53c974 pci2000
+   pci2220i dc390t
+
+  To new error handling
+
+  It also might be possible to shift the 53c7xx based drivers over to
+  53c700 which does the new EH stuff, but I don't have the hardware to check
+  such a shift.
+
+  For the non-compiling stuff, I've probably missed a few that just aren't
+  compilable on my platforms, so any updates would be welcome.  Also, are
+  some of our non-compiling or unconverted drivers obsolete?
+
+fs/
+~~~
+
+o AIO/direct-IO writes can race with truncate and wreck filesystems.
+  (Badari has a patch)
+
+o viro: fs/char_dev.c needs removal of aeb stuff and merge of cdev-cidr.
+  In progress.
+
+o forward-port sct's O_DIRECT fixes (Badari has a patch)
+
+o viro: there is some generic stuff for namei/namespace/super, but that's a
+  slow-merge and can go in 2.6 just fine
+
+o trond: NFS has a mmap-versus-truncate problem (fixed? needs testing)
+
+o trond: NFSv4 client, bugs in lockd, RPSEC_GSS for NFSv[23], some atomic open
+  bits. more info: http://www.fys.uio.no/~trondmy/src/Linux-2.6.x/2.6.0-test11/
+
+kernel/sched.c
+~~~~~~~~~~~~~~
+
+o Starvation, general interactivity need close monitoring.
+
+o SMT aware scheduler (Ingo, Rusty, Nick have implementations)
+
+kernel/
+~~~~~~~
+
+o Alan: 32bit uid support is *still* broken for process accounting.
+
+  Create a 32bit uid, turn accounting on.  Shock horror it doesn't work
+  because the field is 16bit.  We need an acct structure flag day for 2.6
+  IMHO
+
+  (alan has patch)
+
+o viro: core sysctl code is racy.  And its interaction wiuth sysfs
+
+o (ingo) rwsems (on x86) are limited to 32766 waiting processes.  This
+  means that setting pid_max to above 32K is unsafe :-(
+
+  An option is to use CONFIG_RWSEM_GENERIC_SPINLOCK variant all the time,
+  for all archs, and not inline any part of the ops.
+
+lib/kobject.c
+~~~~~~~~~~~~~
+
+o kobject refcounting (comments from Al Viro):
+
+  _anything_ can grab a temporary reference to kobject.  IOW, if kobject is
+  embedded into something that could be freed - it _MUST_ have a destructor
+  and that destructor _MUST_ be the destructor for containing object.
+
+  Any violation of the above (and we already have a bunch of those) is a
+  user-triggerable memory corruption.
+
+  We can tolerate it for a while in 2.5 (e.g.  during work on susbsystem we
+  can decide to switch to that way of handling objects and have subsystem
+  vulnerable for a while), but all such windows must be closed before 2.6
+  and during 2.6 we can't open them at all.
+
+o All block drivers which control multiple gendisks with a single
+  request_queue are broken, due to one-to-one assumptions in the request
+  queue sysfs hookup.
+
+mm/
+~~~
+
+o GFP_DMA32 (or something like that).  Lots of ideas.  jejb, zaitcev,
+  willy, arjan, wli.
+
+  Specifically, 64-bit systems need to be able to enforce 32-bit addressing
+  limits for device metadata like network cards' ring buffers and SCSI
+  command descriptors.
+
+o access_process_vm() doesn't flush right.  We probably need new flushing
+  primitives to do this (davem?)
+
+
+modules
+~~~~~~~
+
+  (Rusty)
+
+net/
+~~~~
+
+  (davem)
+
+o UDP apps can in theory deadlock, because the ip_append_data path can end
+  up sleeping while the socket lock is held.
+
+  It is OK to sleep with the socket held held, normally.  But in this case
+  the sleep happens while waiting for socket memory/space to become
+  available, if another context needs to take the socket lock to free up the
+  space we could hang.
+
+  I sent a rough patch on how to fix this to Alexey, and he is analyzing
+  the situation.  I expect a final fix from him next week or so.
+
+o Semantics for IPSEC during operations such as TCP connect suck currently.
+
+  When we first try to connect to a destination, we may need to ask the
+  IPSEC key management daemon to resolve the IPSEC routes for us.  For the
+  purposes of what the kernel needs to do, you can think of it like ARP.  We
+  can't send the packet out properly until we resolve the path.
+
+  What happens now for IPSEC is basically this:
+
+  O_NONBLOCK: returns -EAGAIN over and over until route is resolved
+
+  !O_NONBLOCK: Sleeps until route is resolved
+
+  These semantics are total crap.  The solution, which Alexey is working
+  on, is to allow incomplete routes to exist.  These "incomplete" routes
+  merely put the packet onto a "resolution queue", and once the key manager
+  does it's thing we finish the output of the packet.  This is precisely how
+  ARP works.
+
+  I don't know when Alexey will be done with this.
+
+net/*/netfilter/
+~~~~~~~~~~~~~~~~
+
+  (Rusty)
+
+sound/
+~~~~~~
+
+global
+~~~~~~
+
+o viro: 64-bit dev_t (not a mustfix for 2.6.0). 32-bit dev_t is done, 64-bit
+  means extra work on nfsd/raid/etc.
+
+o alan: Forward port 2.4 fixes
+  - Chris Wright: Security fixes including execve holes, execve vs proc races
+
+o There are about 60 or 70 security related checks that need doing
+  (copy_user etc) from Stanford tools.  (badari is looking into this, and
+  hollisb)
+
+o A couple of hundred real looking bugzilla bugs
+
+o viro: cdev rework. Mostly done.
+
--- diff/Documentation/should-fix.txt	1970-01-01 01:00:00.000000000 +0100
+++ source/Documentation/should-fix.txt	2003-12-29 09:30:39.000000000 +0000
@@ -0,0 +1,545 @@
+Not-ready features and speedups
+===============================
+
+Legend:
+
+PRI1:	We're totally lame if this doesn't get in
+PRI2:	Would be nice
+PRI3:	Not very important
+
+drivers/block/
+~~~~~~~~~~~~~~
+
+o viro: paride drivers need a big cleanup. Partially done, but ATAPI drivers
+  need serious work and bug fixing.
+
+  PRI2
+
+drivers/char/rtc/
+~~~~~~~~~~~~~~~~~
+
+o rmk, trini: add support for alarms to the existing generic rtc driver.
+
+  PRI2
+
+console drivers
+~~~~~~~~~~~~~~~
+  (Pavel Machek <pavel@ucw.cz>)
+
+o There are few must-fix bugs in cursor handling.
+
+o Play with gpm selection for a while and your cursor gets corrupted with
+  random dots. Ouch.
+
+device mapper
+~~~~~~~~~~~~~
+
+o ioctl interface cleanup patch is ready (redo the structure layouts)
+
+  PRI1
+
+o A port of the 2.4 snapshot and mirror targets is in progress
+
+  PRI1
+
+o the fs interface to dm needs to be redone.  gregkh was going to work on
+  this.  viro is interested in seeing work thus-far.
+
+  PRI2
+
+drivers/net/wireless/
+~~~~~~~~~~~~~~~~~~~~~
+
+  (Jean Tourrilhes <jt@bougret.hpl.hp.com>)
+
+o get HostAP driver in the kernel.  No consolidation of the 802.11
+  management across driver can happen until this one is in (which is probably
+  2.7.X material).  I think Jouni is mostly ready but didn't find time for
+  it.
+
+  PRI2
+
+o get more wireless drivers into the kernel.  The most "integrable" drivers
+  at this point seem the NWN driver, Pavel's Spectrum driver.
+
+  PRI1
+
+drivers/usb/gadget/
+~~~~~~~~~~~~~~~~~~~
+
+o rmk: SA11xx USB client/gadget code (David B has been doing some work on
+  this, and keeps trying to prod me, but unfortunately I haven't had the time
+  to look at his work, sorry David.)
+
+  PRI3
+
+fs/
+~~~
+
+o ext3 and ext2 block allocators have serious failure modes - interleaved
+  allocations.
+
+  PRI3
+
+o Integrate Chris Mason's 2.4 reiserfs ordered data and data journaling
+  patches.  They make reiserfs a lot safer.
+
+  Ordered: PRI2
+  data journalled: PRI3
+
+o viro: convert more filesystems to use lib/parser.c for options.
+
+  PRI2
+
+o aio: fs IO isn't async at present.  suparna has restart patches, they're
+  in -mm.  Need to get Ben to review/comment.
+
+  PRI1.
+
+o drepper: various filesystems use ->pid wrongly
+
+  PRI1
+
+o hch: devfs: there's a fundamental lookup vs devfsd race that's only
+  fixable by introducing a lookup vs devfs deadlock.  I can't see how this is
+  fixable without getting rid of the current devfsd design.  Mandrake seems
+  to have a workaround for this so this is at least not triggered so easily,
+  but that's not what I'd consider a fix..
+
+  PRI2
+
+kernel/
+~~~~~~~
+
+o rusty: Zippel's Reference count simplification.  Tricky code, but cuts
+  about 120 lines from module.c.  Patch exists, needs stressing.
+
+  PRI3
+
+o rusty: Fix module-failed-init races by starting module "disabled".  Patch
+  exists, requires some subsystems (ie.  add_partition) to explicitly say
+  "make module live now".  Without patch we are no worse off than 2.4 etc.
+
+  PRI1
+
+o Integrate userspace irq balancing daemon.
+
+  PRI2
+
+o kexec.  Seems to work, was in -mm.
+
+  PRI3
+
+o rmk: lib/inflate.c must not use static variables (causes these to be
+  referenced via GOTOFF relocations in PIC decompressor.  We have a PIC
+  decompressor to avoid having to hard code a per platform zImage link
+  address into the makefiles.)
+
+  PRI2
+
+o klibc merge?
+
+  PRI2
+
+mm/
+~~~
+
+o dropbehind for large files
+
+  PRI2
+
+net/
+~~~~
+
+  (davem)
+
+o Real serious use of IPSEC is hampered by lack of MPLS support.  MPLS is a
+  switching technology that works by switching based upon fixed length labels
+  prepended to packets.  Many people use this and IPSEC to implement VPNs
+  over public networks, it is also used for things like traffic engineering.
+
+  A good reference site is:
+
+	http://www.mplsrc.com/
+
+  Anyways, an existing (crappy) implementation exists.  I've almost
+  completed a rewrite, I should have something in the tree next week.
+
+  PRI1
+
+o Sometimes we generate IP fragments when it truly isn't necessary.
+
+  The way IP fragmentation is specified, each fragment must be modulo 8
+  bytes in length.  So suppose the device has an MTU that is not 0 modulo 8,
+  ethernet even classifies in this way.  1500 == (8 * 187) + 4
+
+  Our IP fragmenting engine can fragment on packets that are sized within
+  the last modulo 8 bytes of the MTU.  This happens in obscure cases, but it
+  does happen.
+
+  I've proposed a fix to Alexey, whereby very late in the output path we
+  check the packet, if we fragmented but the data length would fit into the
+  MTU we unfragment the packet.
+
+  This is low priority, because technically it creates suboptimal behavior
+  rather than mis-operation.
+
+  PRI1
+
+net/*/netfilter/
+~~~~~~~~~~~~~~~~
+
+o Lots of misc. cleanups, which are happening slowly.
+
+  PRI2
+
+power management
+~~~~~~~~~~~~~~~~
+
+o Pat and Pavel disagree over swsusp. Need to sort that out.
+
+  PRI2
+
+o Frame buffer restore codepaths (that requires some deep PCI magic)
+
+  PRI2
+
+o XFree86 hooks
+
+  PRI2
+
+o AGP restoration
+
+  PRI2
+
+o DRI restoration
+
+  (davej/Alan: not super-critical, can crash laptop on restore.  davej
+  looking into it.)
+
+  PRI2
+
+o IDE suspend/resume without races (Ben is looking at this a little)
+
+  PRI2
+
+o Pat: There are already CPU device structures; MTRRs should be a
+  dynamically registered interface of CPUs, which implies there needs
+  to be some other glue to know that there are MTRRs that need to be
+  saved/restored.
+
+  PRI1
+
+global
+~~~~~~
+
+o We need a kernel side API for reporting error events to userspace (could
+  be async to 2.6 itself)
+
+  (Prototype core based on netlink exists)
+
+  PRI2
+
+o Kai: Introduce a sane, easy and standard way to build external modules
+  - make clean and make modules_install are both broken
+
+  PRI2
+
+drivers
+~~~~~~~
+
+o Alan: Cardbus/PCMCIA requires all Russell's stuff is merged to do
+  multiheader right and so on
+
+  PRI1
+
+drivers/acpi/
+~~~~~~~~~~~~~
+
+o Fix acpi for all newer IBM Thinkpads see
+  http://bugme.osdl.org/show_bug.cgi?id=1038 for more information
+
+o alan: VIA APIC stuff is one bit of this, there are also some other
+  reports that were caused by ACPI not setting level v edge trigger some
+  times
+
+  PRI1
+
+o mochel: it seems the acpi irq routing code could use a serious rewrite.
+
+  grover: The problem is the ACPI irq routing code is trying to piggyback
+  on the existing MPS-specific data structures, and it's generally a hack.
+  So yes mochel is right, but it is also purging MPS-ities from common code
+  as well.  I've done some preliminary work in this area and it doesn't seem
+  to break anything (yet) but a rewrite in this area imho should not be
+  rushed out the door.  And, I think the above bugs can be fixed w/o the
+  rewrite.
+
+  PRI2
+
+o mochel: ACPI suspend doesn't work.  Important, not cricital.  Pat is
+  working it.
+
+  PRI2
+
+drivers/block/
+~~~~~~~~~~~~~~
+
+o More testing of floppy
+
+  PRI3
+
+drivers/char/
+~~~~~~~~~~~~~
+
+
+drivers/ide/
+~~~~~~~~~~~~
+
+  (Alan)
+
+o IDE PIO has occasional unexplained PIO disk eating reports
+
+  PRI1
+
+o IDE has multiple zillions of races/hangs in 2.5 still
+
+  PRI1
+
+o IDE scsi needs rewriting
+
+  PRI2
+
+o IDE needs significant reworking to handle Simplex right
+
+  PRI2
+
+o IDE hotplug handling for 2.5 is completely broken still
+
+  PRI2
+
+o There are lots of other IDE bugs that wont go away until the taskfile
+  stuff is included, the locking bugs that allow any user to hang the IDE
+  layer in 2.5, and some other updates are forward ported.  (esp.  HPT372N).
+
+  PRI1
+
+drivers/isdn/
+~~~~~~~~~~~~~
+
+  (Kai, rmk)
+
+o isdn_tty locking is completely broken (cli() and friends)
+
+  PRI2
+
+o fix other drivers
+
+  PRI2
+
+o lots more cleanups, adaption to recent APIs etc
+
+  PRI3
+
+o fixup tty-based ISDN drivers which provide TIOCM* ioctls (see my recent
+  3-set patch for serial stuff)
+
+  Alternatively, we could re-introduce the fallback to driver ioctl parsing
+  for these if not enough drivers get updated.
+
+  PRI3
+
+drivers/net/
+~~~~~~~~~~~~
+
+o davej: Either Wireless network drivers or PCMCIA broke somewhen.  A
+  configuration that worked fine under 2.4 doesn't receive any packets.  Need
+  to look into this more to make sure I don't have any misconfiguration that
+  just 'happened to work' under 2.4
+
+  PRI1
+
+drivers/scsi/
+~~~~~~~~~~~~~
+
+o jejb: qlogic -
+
+  o Merge the feral driver.  It covers all qlogic chips: 1020 all the way
+    up to 23xxx. http://linux-scsi.bkbits.net/scsi-isp-2.5
+
+  o qla2xxx: only for FC chips.  Has significant build issues.  hch
+    promises to send me a "must fix" list for this.
+    http://linux-scsi.bkbits.net/scsi-qla2xxx-2.5
+
+  PRI2
+
+o hch, Mike Anderson, Badari Pulavarty: scsi locking issues
+
+  o there are lots of members of struct Scsi_Host/scsi_device/scsi_cmnd
+    with very unclear locking, many of them probably want to become
+    atomic_t's or bitmaps (for the 1bit bitfields).
+
+  o there's lots of volatile abuse in the scsi code that needs to be
+    thought about.
+
+  o there's some global variables incremented without any locks
+
+  PRI2
+
+sound/
+~~~~~~
+
+o rmk: several OSS drivers for SA11xx-based hardware in need of
+  ALSA-ification and L3 bus support code for these.
+
+o rmk: need to complete ALSA-ification of the WaveArtist driver for both
+  NetWinder and other stuff (there's some fairly fundamental differences in
+  the way the mixer needs to be handled for the NetWinder.)
+
+  (Issues with forward-porting 2.4 bugfixes.)
+  (Killing off OSS is 2.7 material)
+
+PRI2
+
+arch/i386/
+~~~~~~~~~~
+
+o Also PC9800 merge needs finishing to the point we want for 2.6 (not all).
+
+  PRI3
+
+o davej: PAT support (for mtrr exhaustion w/ AGP)
+
+  PRI2
+
+o 2.5.x won't boot on some 440GX
+
+  alan: Problem understood now, feasible fix in 2.4/2.4-ac.  (440GX has two
+  IRQ routers, we use the $PIR table with the PIIX, but the 440GX doesnt use
+  the PIIX for its IRQ routing).  Fall back to BIOS for 440GX works and Intel
+  concurs.
+
+  PRI1
+
+o 2.5.x doesn't handle VIA APIC right yet.
+
+  1. We must write the PCI_INTERRUPT_LINE
+
+  2. We have quirk handlers that seem to trash it.
+
+  PRI1
+
+o ECC driver questions are not yet sorted (DaveJ is working on this) (Dan
+  Hollis)
+
+  alan: ECC - I have some test bits from Dan's stuff - they need no kernel
+  core changes for most platforms.  That means we can treat it as a random
+  driver merge.
+
+  PRI3
+
+o alan: 2.4 has some fixes for tsc handling bugs.  One where some bioses in
+  SMM mode mess up our toggle on the time high/low or mangle the counter and
+  one where a few chips need religious use of _p for timer access and we
+  don't do that.  This is forward porting little bits of fixup.
+
+  ACPI HZ stuff we can't trap - a lot of ACPI is implemented as outb's
+  triggering SMM traps
+
+  PRI1
+
+arch/x86_64/
+~~~~~~~~~~~~
+
+  (Andi)
+
+o time handling is broken. Need to move up 2.4 time.c code.
+
+  PRI1
+
+o NMI watchdog seems to tick too fast
+
+  PRI2
+
+o need to coredump 64bit vsyscall code with dwarf2
+
+  PRI2
+
+o move 64bit signal trampolines into vsyscall code and add dwarf2 for it.
+  (in progress)
+
+  PRI1
+
+o describe kernel assembly with dwarf2 annotations for kgdb
+
+  PRI3
+
+arch/alpha/
+~~~~~~~~~~~
+
+o rth: Ptrace writes are broken.  This means we can't (reliably) set
+  breakpoints or modify variables from gdb.
+
+  PRI1
+
+arch/arm/
+~~~~~~~~~
+
+o rmk: missing raw keyboard translation tables for all ARM machines.
+  Haven't even looked into this at all.  This could be messy since there
+  isn't an ARM architecture standard.  I'm presently hoping that it won't be
+  an issue.  If it does, I guess we'll see drivers/char/keyboard.c explode.
+
+  PRI2
+
+arch/others/
+~~~~~~~~~~~~
+
+o SH needs resyncing, as do some other ports. SH64 needs merging.
+  No impact on mainstream platforms hopefully.
+
+  PRI2
+
+arch/s390/
+~~~~~~~~~
+
+o A nastly memory management problem causes random crashes.  These appear
+  to be fixed/hidden by the objrmap patch, more investigation is needed.
+
+  PRI1
+
+drivers/s390/
+~~~~~~~~~~~~~
+
+o Early userspace and 64 bit dev_t will allow the removal of most of
+  dasd_devmap.c and dasd_genhd.c.
+
+  PRI2
+
+o The 3270 console driver needs to be replaced with a working one
+  (prototype is there, needs to be finished).
+
+  PRI2
+
+o Minor interface changes are pending in cio/ when the z990 machines are
+  out.
+
+  PRI2
+
+o Jan Glauber is working on a fix for the timer issues related to running
+  on virtualized CPUs (wall-clock vs.  cpu time).
+
+  PRI1
+
+o a block device driver for ramdisks shared among virtual machines
+
+  PRI3
+
+o driver for crypto hardware
+
+  PRI3
+
+o 'claw' network device driver
+
+  PRI3
+
--- diff/arch/i386/kernel/efi.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/i386/kernel/efi.c	2003-12-29 09:30:38.000000000 +0000
@@ -0,0 +1,645 @@
+/*
+ * Extensible Firmware Interface
+ *
+ * Based on Extensible Firmware Interface Specification version 1.0
+ *
+ * Copyright (C) 1999 VA Linux Systems
+ * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
+ * Copyright (C) 1999-2002 Hewlett-Packard Co.
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
+ *	Stephane Eranian <eranian@hpl.hp.com>
+ *
+ * All EFI Runtime Services are not implemented yet as EFI only
+ * supports physical mode addressing on SoftSDV. This is to be fixed
+ * in a future version.  --drummond 1999-07-20
+ *
+ * Implemented EFI runtime services and virtual mode calls.  --davidm
+ *
+ * Goutham Rao: <goutham.rao@intel.com>
+ *	Skip non-WB memory and ignore empty memory ranges.
+ */
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/mm.h>
+#include <linux/types.h>
+#include <linux/time.h>
+#include <linux/spinlock.h>
+#include <linux/bootmem.h>
+#include <linux/ioport.h>
+#include <linux/proc_fs.h>
+#include <linux/efi.h>
+
+#include <asm/setup.h>
+#include <asm/io.h>
+#include <asm/page.h>
+#include <asm/pgtable.h>
+#include <asm/processor.h>
+#include <asm/desc.h>
+#include <asm/pgalloc.h>
+#include <asm/tlbflush.h>
+
+#define EFI_DEBUG	0
+#define PFX 		"EFI: "
+
+extern efi_status_t asmlinkage efi_call_phys(void *, ...);
+
+struct efi efi;
+struct efi efi_phys __initdata;
+struct efi_memory_map memmap __initdata;
+
+/*
+ * We require an early boot_ioremap mapping mechanism initially
+ */
+extern void * boot_ioremap(unsigned long, unsigned long);
+
+/*
+ * efi_dir is allocated here, but the directory isn't created
+ * here, as proc_mkdir() doesn't work this early in the bootup
+ * process.  Therefore, each module, like efivars, must test for
+ *    if (!efi_dir) efi_dir = proc_mkdir("efi", NULL);
+ * prior to creating their own entries under /proc/efi.
+ */
+#ifdef CONFIG_PROC_FS
+struct proc_dir_entry *efi_dir;
+#endif
+
+
+/*
+ * To make EFI call EFI runtime service in physical addressing mode we need
+ * prelog/epilog before/after the invocation to disable interrupt, to
+ * claim EFI runtime service handler exclusively and to duplicate a memory in
+ * low memory space say 0 - 3G.
+ */
+
+static unsigned long efi_rt_eflags;
+static spinlock_t efi_rt_lock = SPIN_LOCK_UNLOCKED;
+static pgd_t efi_bak_pg_dir_pointer[2];
+
+static void efi_call_phys_prelog(void)
+{
+	unsigned long cr4;
+	unsigned long temp;
+
+	spin_lock(&efi_rt_lock);
+	local_irq_save(efi_rt_eflags);
+
+	/*
+	 * If I don't have PSE, I should just duplicate two entries in page
+	 * directory. If I have PSE, I just need to duplicate one entry in
+	 * page directory.
+	 */
+	__asm__ __volatile__("movl %%cr4, %0":"=r"(cr4));
+
+	if (cr4 & X86_CR4_PSE) {
+		efi_bak_pg_dir_pointer[0].pgd =
+		    swapper_pg_dir[pgd_index(0)].pgd;
+		swapper_pg_dir[0].pgd =
+		    swapper_pg_dir[pgd_index(PAGE_OFFSET)].pgd;
+	} else {
+		efi_bak_pg_dir_pointer[0].pgd =
+		    swapper_pg_dir[pgd_index(0)].pgd;
+		efi_bak_pg_dir_pointer[1].pgd =
+		    swapper_pg_dir[pgd_index(0x400000)].pgd;
+		swapper_pg_dir[pgd_index(0)].pgd =
+		    swapper_pg_dir[pgd_index(PAGE_OFFSET)].pgd;
+		temp = PAGE_OFFSET + 0x400000;
+		swapper_pg_dir[pgd_index(0x400000)].pgd =
+		    swapper_pg_dir[pgd_index(temp)].pgd;
+	}
+
+	/*
+	 * After the lock is released, the original page table is restored.
+	 */
+	local_flush_tlb();
+
+	cpu_gdt_descr[0].address = __pa(cpu_gdt_descr[0].address);
+	__asm__ __volatile__("lgdt %0":"=m"
+			    (*(struct Xgt_desc_struct *) __pa(&cpu_gdt_descr[0])));
+}
+
+static void efi_call_phys_epilog(void)
+{
+	unsigned long cr4;
+
+	cpu_gdt_descr[0].address =
+		(unsigned long) __va(cpu_gdt_descr[0].address);
+	__asm__ __volatile__("lgdt %0":"=m"(cpu_gdt_descr));
+	__asm__ __volatile__("movl %%cr4, %0":"=r"(cr4));
+
+	if (cr4 & X86_CR4_PSE) {
+		swapper_pg_dir[pgd_index(0)].pgd =
+		    efi_bak_pg_dir_pointer[0].pgd;
+	} else {
+		swapper_pg_dir[pgd_index(0)].pgd =
+		    efi_bak_pg_dir_pointer[0].pgd;
+		swapper_pg_dir[pgd_index(0x400000)].pgd =
+		    efi_bak_pg_dir_pointer[1].pgd;
+	}
+
+	/*
+	 * After the lock is released, the original page table is restored.
+	 */
+	local_flush_tlb();
+
+	local_irq_restore(efi_rt_eflags);
+	spin_unlock(&efi_rt_lock);
+}
+
+static efi_status_t
+phys_efi_set_virtual_address_map(unsigned long memory_map_size,
+				 unsigned long descriptor_size,
+				 u32 descriptor_version,
+				 efi_memory_desc_t *virtual_map)
+{
+	efi_status_t status;
+
+	efi_call_phys_prelog();
+	status = efi_call_phys(efi_phys.set_virtual_address_map,
+				     memory_map_size, descriptor_size,
+				     descriptor_version, virtual_map);
+	efi_call_phys_epilog();
+	return status;
+}
+
+efi_status_t
+phys_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc)
+{
+	efi_status_t status;
+
+	efi_call_phys_prelog();
+	status = efi_call_phys(efi_phys.get_time, tm, tc);
+	efi_call_phys_epilog();
+	return status;
+}
+
+int inline efi_set_rtc_mmss(unsigned long nowtime)
+{
+	int real_seconds, real_minutes;
+	efi_status_t 	status;
+	efi_time_t 	eft;
+	efi_time_cap_t 	cap;
+
+	spin_lock(&efi_rt_lock);
+	status = efi.get_time(&eft, &cap);
+	spin_unlock(&efi_rt_lock);
+	if (status != EFI_SUCCESS)
+		panic("Ooops, efitime: can't read time!\n");
+	real_seconds = nowtime % 60;
+	real_minutes = nowtime / 60;
+
+	if (((abs(real_minutes - eft.minute) + 15)/30) & 1)
+		real_minutes += 30;
+	real_minutes %= 60;
+
+	eft.minute = real_minutes;
+	eft.second = real_seconds;
+
+	if (status != EFI_SUCCESS) {
+		printk("Ooops: efitime: can't read time!\n");
+		return -1;
+	}
+	return 0;
+}
+/*
+ * This should only be used during kernel init and before runtime
+ * services have been remapped, therefore, we'll need to call in physical
+ * mode.  Note, this call isn't used later, so mark it __init.
+ */
+unsigned long inline __init efi_get_time(void)
+{
+	efi_status_t status;
+	efi_time_t eft;
+	efi_time_cap_t cap;
+
+	status = phys_efi_get_time(&eft, &cap);
+	if (status != EFI_SUCCESS)
+		printk("Oops: efitime: can't read time status: 0x%lx\n",status);
+
+	return mktime(eft.year, eft.month, eft.day, eft.hour,
+			eft.minute, eft.second);
+}
+
+int is_available_memory(efi_memory_desc_t * md)
+{
+	if (!(md->attribute & EFI_MEMORY_WB))
+		return 0;
+
+	switch (md->type) {
+		case EFI_LOADER_CODE:
+		case EFI_LOADER_DATA:
+		case EFI_BOOT_SERVICES_CODE:
+		case EFI_BOOT_SERVICES_DATA:
+		case EFI_CONVENTIONAL_MEMORY:
+			return 1;
+	}
+	return 0;
+}
+
+/*
+ * We need to map the EFI memory map again after paging_init().
+ */
+void __init efi_map_memmap(void)
+{
+	memmap.map = NULL;
+
+	memmap.map = (efi_memory_desc_t *)
+		bt_ioremap((unsigned long) memmap.phys_map,
+			(memmap.nr_map * sizeof(efi_memory_desc_t)));
+
+	if (memmap.map == NULL)
+		printk(KERN_ERR PFX "Could not remap the EFI memmap!\n");
+}
+
+void __init print_efi_memmap(void)
+{
+	efi_memory_desc_t *md;
+	int i;
+
+	for (i = 0; i < memmap.nr_map; i++) {
+		md = &memmap.map[i];
+		printk(KERN_INFO "mem%02u: type=%u, attr=0x%llx, "
+			"range=[0x%016llx-0x%016llx) (%lluMB)\n",
+			i, md->type, md->attribute, md->phys_addr,
+			md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT),
+			(md->num_pages >> (20 - EFI_PAGE_SHIFT)));
+	}
+}
+
+/*
+ * Walks the EFI memory map and calls CALLBACK once for each EFI
+ * memory descriptor that has memory that is available for kernel use.
+ */
+void efi_memmap_walk(efi_freemem_callback_t callback, void *arg)
+{
+	int prev_valid = 0;
+	struct range {
+		unsigned long start;
+		unsigned long end;
+	} prev, curr;
+	efi_memory_desc_t *md;
+	unsigned long start, end;
+	int i;
+
+	for (i = 0; i < memmap.nr_map; i++) {
+		md = &memmap.map[i];
+
+		if ((md->num_pages == 0) || (!is_available_memory(md)))
+			continue;
+
+		curr.start = md->phys_addr;
+		curr.end = curr.start + (md->num_pages << EFI_PAGE_SHIFT);
+
+		if (!prev_valid) {
+			prev = curr;
+			prev_valid = 1;
+		} else {
+			if (curr.start < prev.start)
+				printk(KERN_INFO PFX "Unordered memory map\n");
+			if (prev.end == curr.start)
+				prev.end = curr.end;
+			else {
+				start =
+				    (unsigned long) (PAGE_ALIGN(prev.start));
+				end = (unsigned long) (prev.end & PAGE_MASK);
+				if ((end > start)
+				    && (*callback) (start, end, arg) < 0)
+					return;
+				prev = curr;
+			}
+		}
+	}
+	if (prev_valid) {
+		start = (unsigned long) PAGE_ALIGN(prev.start);
+		end = (unsigned long) (prev.end & PAGE_MASK);
+		if (end > start)
+			(*callback) (start, end, arg);
+	}
+}
+
+void __init efi_init(void)
+{
+	efi_config_table_t *config_tables;
+	efi_runtime_services_t *runtime;
+	efi_char16_t *c16;
+	char vendor[100] = "unknown";
+	unsigned long num_config_tables;
+	int i = 0;
+
+	memset(&efi, 0, sizeof(efi) );
+	memset(&efi_phys, 0, sizeof(efi_phys));
+
+	efi_phys.systab = EFI_SYSTAB;
+	memmap.phys_map = EFI_MEMMAP;
+	memmap.nr_map = EFI_MEMMAP_SIZE/EFI_MEMDESC_SIZE;
+	memmap.desc_version = EFI_MEMDESC_VERSION;
+
+	efi.systab = (efi_system_table_t *)
+		boot_ioremap((unsigned long) efi_phys.systab,
+			sizeof(efi_system_table_t));
+	/*
+	 * Verify the EFI Table
+	 */
+	if (efi.systab == NULL)
+		printk(KERN_ERR PFX "Woah! Couldn't map the EFI system table.\n");
+	if (efi.systab->hdr.signature != EFI_SYSTEM_TABLE_SIGNATURE)
+		printk(KERN_ERR PFX "Woah! EFI system table signature incorrect\n");
+	if ((efi.systab->hdr.revision ^ EFI_SYSTEM_TABLE_REVISION) >> 16 != 0)
+		printk(KERN_ERR PFX
+		       "Warning: EFI system table major version mismatch: "
+		       "got %d.%02d, expected %d.%02d\n",
+		       efi.systab->hdr.revision >> 16,
+		       efi.systab->hdr.revision & 0xffff,
+		       EFI_SYSTEM_TABLE_REVISION >> 16,
+		       EFI_SYSTEM_TABLE_REVISION & 0xffff);
+	/*
+	 * Grab some details from the system table
+	 */
+	num_config_tables = efi.systab->nr_tables;
+	config_tables = (efi_config_table_t *)efi.systab->tables;
+	runtime = efi.systab->runtime;
+
+	/*
+	 * Show what we know for posterity
+	 */
+	c16 = (efi_char16_t *) boot_ioremap(efi.systab->fw_vendor, 2);
+	if (c16) {
+		for (i = 0; i < sizeof(vendor) && *c16; ++i)
+			vendor[i] = *c16++;
+		vendor[i] = '\0';
+	} else
+		printk(KERN_ERR PFX "Could not map the firmware vendor!\n");
+
+	printk(KERN_INFO PFX "EFI v%u.%.02u by %s \n",
+	       efi.systab->hdr.revision >> 16,
+	       efi.systab->hdr.revision & 0xffff, vendor);
+
+	/*
+	 * Let's see what config tables the firmware passed to us.
+	 */
+	config_tables = (efi_config_table_t *)
+				boot_ioremap((unsigned long) config_tables,
+			        num_config_tables * sizeof(efi_config_table_t));
+
+	if (config_tables == NULL)
+		printk(KERN_ERR PFX "Could not map EFI Configuration Table!\n");
+
+	for (i = 0; i < num_config_tables; i++) {
+		if (efi_guidcmp(config_tables[i].guid, MPS_TABLE_GUID) == 0) {
+			efi.mps = (void *)config_tables[i].table;
+			printk(KERN_INFO " MPS=0x%lx ", config_tables[i].table);
+		} else
+		    if (efi_guidcmp(config_tables[i].guid, ACPI_20_TABLE_GUID) == 0) {
+			efi.acpi20 = __va(config_tables[i].table);
+			printk(KERN_INFO " ACPI 2.0=0x%lx ", config_tables[i].table);
+		} else
+		    if (efi_guidcmp(config_tables[i].guid, ACPI_TABLE_GUID) == 0) {
+			efi.acpi = __va(config_tables[i].table);
+			printk(KERN_INFO " ACPI=0x%lx ", config_tables[i].table);
+		} else
+		    if (efi_guidcmp(config_tables[i].guid, SMBIOS_TABLE_GUID) == 0) {
+			efi.smbios = (void *) config_tables[i].table;
+			printk(KERN_INFO " SMBIOS=0x%lx ", config_tables[i].table);
+		} else
+		    if (efi_guidcmp(config_tables[i].guid, HCDP_TABLE_GUID) == 0) {
+			efi.hcdp = (void *)config_tables[i].table;
+			printk(KERN_INFO " HCDP=0x%lx ", config_tables[i].table);
+		} else
+		    if (efi_guidcmp(config_tables[i].guid, UGA_IO_PROTOCOL_GUID) == 0) {
+			efi.uga = (void *)config_tables[i].table;
+			printk(KERN_INFO " UGA=0x%lx ", config_tables[i].table);
+		}
+	}
+	printk("\n");
+
+	/*
+	 * Check out the runtime services table. We need to map
+	 * the runtime services table so that we can grab the physical
+	 * address of several of the EFI runtime functions, needed to
+	 * set the firmware into virtual mode.
+	 */
+
+	runtime = (efi_runtime_services_t *) boot_ioremap((unsigned long)
+						runtime,
+				      		sizeof(efi_runtime_services_t));
+	if (runtime != NULL) {
+		/*
+	 	 * We will only need *early* access to the following
+		 * two EFI runtime services before set_virtual_address_map
+		 * is invoked.
+ 	 	 */
+		efi_phys.get_time = (efi_get_time_t *) runtime->get_time;
+		efi_phys.set_virtual_address_map =
+			(efi_set_virtual_address_map_t *)
+				runtime->set_virtual_address_map;
+	} else
+		printk(KERN_ERR PFX "Could not map the runtime service table!\n");
+
+	/* Map the EFI memory map for use until paging_init() */
+
+	memmap.map = (efi_memory_desc_t *)
+		boot_ioremap((unsigned long) EFI_MEMMAP, EFI_MEMMAP_SIZE);
+
+	if (memmap.map == NULL)
+		printk(KERN_ERR PFX "Could not map the EFI memory map!\n");
+
+	if (EFI_MEMDESC_SIZE != sizeof(efi_memory_desc_t)) {
+		printk(KERN_WARNING PFX "Warning! Kernel-defined memdesc doesn't "
+			   "match the one from EFI!\n");
+	}
+#if EFI_DEBUG
+	print_efi_memmap();
+#endif
+}
+
+/*
+ * This function will switch the EFI runtime services to virtual mode.
+ * Essentially, look through the EFI memmap and map every region that
+ * has the runtime attribute bit set in its memory descriptor and update
+ * that memory descriptor with the virtual address obtained from ioremap().
+ * This enables the runtime services to be called without having to
+ * thunk back into physical mode for every invocation.
+ */
+
+void __init efi_enter_virtual_mode(void)
+{
+	efi_memory_desc_t *md;
+	efi_status_t status;
+	int i;
+
+	efi.systab = NULL;
+
+	for (i = 0; i < memmap.nr_map; i++) {
+		md = &memmap.map[i];
+
+		if (md->attribute & EFI_MEMORY_RUNTIME) {
+			md->virt_addr =
+				(unsigned long)ioremap(md->phys_addr,
+					md->num_pages << EFI_PAGE_SHIFT);
+			if (!(unsigned long)md->virt_addr) {
+				printk(KERN_ERR PFX "ioremap of 0x%lX failed\n",
+					(unsigned long)md->phys_addr);
+			}
+
+			if (((unsigned long)md->phys_addr <=
+					(unsigned long)efi_phys.systab) &&
+				((unsigned long)efi_phys.systab <
+					md->phys_addr +
+					((unsigned long)md->num_pages <<
+						EFI_PAGE_SHIFT))) {
+				unsigned long addr;
+
+				addr = md->virt_addr - md->phys_addr +
+						(unsigned long)efi_phys.systab;
+				efi.systab = (efi_system_table_t *)addr;
+			}
+		}
+	}
+
+	if (!efi.systab)
+		BUG();
+
+	status = phys_efi_set_virtual_address_map(
+			sizeof(efi_memory_desc_t) * memmap.nr_map,
+			sizeof(efi_memory_desc_t),
+			memmap.desc_version,
+		       	memmap.phys_map);
+
+	if (status != EFI_SUCCESS) {
+		printk (KERN_ALERT "You are screwed! "
+			"Unable to switch EFI into virtual mode "
+			"(status=%lx)\n", status);
+		panic("EFI call to SetVirtualAddressMap() failed!");
+	}
+
+	/*
+	 * Now that EFI is in virtual mode, update the function
+	 * pointers in the runtime service table to the new virtual addresses.
+	 */
+
+	efi.get_time = (efi_get_time_t *) efi.systab->runtime->get_time;
+	efi.set_time = (efi_set_time_t *) efi.systab->runtime->set_time;
+	efi.get_wakeup_time = (efi_get_wakeup_time_t *)
+					efi.systab->runtime->get_wakeup_time;
+	efi.set_wakeup_time = (efi_set_wakeup_time_t *)
+					efi.systab->runtime->set_wakeup_time;
+	efi.get_variable = (efi_get_variable_t *)
+					efi.systab->runtime->get_variable;
+	efi.get_next_variable = (efi_get_next_variable_t *)
+					efi.systab->runtime->get_next_variable;
+	efi.set_variable = (efi_set_variable_t *)
+					efi.systab->runtime->set_variable;
+	efi.get_next_high_mono_count = (efi_get_next_high_mono_count_t *)
+					efi.systab->runtime->get_next_high_mono_count;
+	efi.reset_system = (efi_reset_system_t *)
+					efi.systab->runtime->reset_system;
+}
+
+void __init
+efi_initialize_iomem_resources(struct resource *code_resource,
+			       struct resource *data_resource)
+{
+	struct resource *res;
+	efi_memory_desc_t *md;
+	int i;
+
+	for (i = 0; i < memmap.nr_map; i++) {
+		md = &memmap.map[i];
+
+		if ((md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT)) >
+		    0x100000000ULL)
+			continue;
+		res = alloc_bootmem_low(sizeof(struct resource));
+		switch (md->type) {
+		case EFI_RESERVED_TYPE:
+			res->name = "Reserved Memory";
+			break;
+		case EFI_LOADER_CODE:
+			res->name = "Loader Code";
+			break;
+		case EFI_LOADER_DATA:
+			res->name = "Loader Data";
+			break;
+		case EFI_BOOT_SERVICES_DATA:
+			res->name = "BootServices Data";
+			break;
+		case EFI_BOOT_SERVICES_CODE:
+			res->name = "BootServices Code";
+			break;
+		case EFI_RUNTIME_SERVICES_CODE:
+			res->name = "Runtime Service Code";
+			break;
+		case EFI_RUNTIME_SERVICES_DATA:
+			res->name = "Runtime Service Data";
+			break;
+		case EFI_CONVENTIONAL_MEMORY:
+			res->name = "Conventional Memory";
+			break;
+		case EFI_UNUSABLE_MEMORY:
+			res->name = "Unusable Memory";
+			break;
+		case EFI_ACPI_RECLAIM_MEMORY:
+			res->name = "ACPI Reclaim";
+			break;
+		case EFI_ACPI_MEMORY_NVS:
+			res->name = "ACPI NVS";
+			break;
+		case EFI_MEMORY_MAPPED_IO:
+			res->name = "Memory Mapped IO";
+			break;
+		case EFI_MEMORY_MAPPED_IO_PORT_SPACE:
+			res->name = "Memory Mapped IO Port Space";
+			break;
+		default:
+			res->name = "Reserved";
+			break;
+		}
+		res->start = md->phys_addr;
+		res->end = res->start + ((md->num_pages << EFI_PAGE_SHIFT) - 1);
+		res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
+		if (request_resource(&iomem_resource, res) < 0)
+			printk(KERN_ERR PFX "Failed to allocate res %s : 0x%lx-0x%lx\n",
+				res->name, res->start, res->end);
+		/*
+		 * We don't know which region contains kernel data so we try
+		 * it repeatedly and let the resource manager test it.
+		 */
+		if (md->type == EFI_CONVENTIONAL_MEMORY) {
+			request_resource(res, code_resource);
+			request_resource(res, data_resource);
+		}
+	}
+}
+
+/*
+ * Convenience functions to obtain memory types and attributes
+ */
+
+u32 efi_mem_type(unsigned long phys_addr)
+{
+	efi_memory_desc_t *md;
+	int i;
+
+	for (i = 0; i < memmap.nr_map; i++) {
+		md = &memmap.map[i];
+		if ((md->phys_addr <= phys_addr) && (phys_addr <
+			(md->phys_addr + (md-> num_pages << EFI_PAGE_SHIFT)) ))
+			return md->type;
+	}
+	return 0;
+}
+
+u64 efi_mem_attributes(unsigned long phys_addr)
+{
+	efi_memory_desc_t *md;
+	int i;
+
+	for (i = 0; i < memmap.nr_map; i++) {
+		md = &memmap.map[i];
+		if ((md->phys_addr <= phys_addr) && (phys_addr <
+			(md->phys_addr + (md-> num_pages << EFI_PAGE_SHIFT)) ))
+			return md->attribute;
+	}
+	return 0;
+}
--- diff/arch/i386/kernel/efi_stub.S	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/i386/kernel/efi_stub.S	2003-12-29 09:30:38.000000000 +0000
@@ -0,0 +1,124 @@
+/*
+ * EFI call stub for IA32.
+ *
+ * This stub allows us to make EFI calls in physical mode with interrupts
+ * turned off.
+ */
+
+#include <linux/config.h>
+#include <linux/linkage.h>
+#include <asm/page.h>
+#include <asm/pgtable.h>
+
+/*
+ * efi_call_phys(void *, ...) is a function with variable parameters.
+ * All the callers of this function assure that all the parameters are 4-bytes.
+ */
+
+/*
+ * In gcc calling convention, EBX, ESP, EBP, ESI and EDI are all callee save.
+ * So we'd better save all of them at the beginning of this function and restore
+ * at the end no matter how many we use, because we can not assure EFI runtime
+ * service functions will comply with gcc calling convention, too.
+ */
+
+.text
+ENTRY(efi_call_phys)
+	/*
+	 * 0. The function can only be called in Linux kernel. So CS has been
+	 * set to 0x0010, DS and SS have been set to 0x0018. In EFI, I found
+	 * the values of these registers are the same. And, the corresponding
+	 * GDT entries are identical. So I will do nothing about segment reg
+	 * and GDT, but change GDT base register in prelog and epilog.
+	 */
+
+	/*
+	 * 1. Now I am running with EIP = <physical address> + PAGE_OFFSET.
+	 * But to make it smoothly switch from virtual mode to flat mode.
+	 * The mapping of lower virtual memory has been created in prelog and
+	 * epilog.
+	 */
+	movl	$1f, %edx
+	subl	$__PAGE_OFFSET, %edx
+	jmp	*%edx
+1:
+
+	/*
+	 * 2. Now on the top of stack is the return
+	 * address in the caller of efi_call_phys(), then parameter 1,
+	 * parameter 2, ..., param n. To make things easy, we save the return
+	 * address of efi_call_phys in a global variable.
+	 */
+	popl	%edx
+	movl	%edx, saved_return_addr
+	/* get the function pointer into ECX*/
+	popl	%ecx
+	movl	%ecx, efi_rt_function_ptr
+	movl	$2f, %edx
+	subl	$__PAGE_OFFSET, %edx
+	pushl	%edx
+
+	/*
+	 * 3. Clear PG bit in %CR0.
+	 */
+	movl	%cr0, %edx
+	andl	$0x7fffffff, %edx
+	movl	%edx, %cr0
+	jmp	1f
+1:
+
+	/*
+	 * 4. Adjust stack pointer.
+	 */
+	subl	$__PAGE_OFFSET, %esp
+
+	/*
+	 * 5. Call the physical function.
+	 */
+	jmp	*%ecx
+
+2:
+	/*
+	 * 6. After EFI runtime service returns, control will return to
+	 * following instruction. We'd better readjust stack pointer first.
+	 */
+	addl	$__PAGE_OFFSET, %esp
+
+	/*
+	 * 7. Restore PG bit
+	 */
+	movl	%cr0, %edx
+	orl	$0x80000000, %edx
+	movl	%edx, %cr0
+	jmp	1f
+1:
+	/*
+	 * 8. Now restore the virtual mode from flat mode by
+	 * adding EIP with PAGE_OFFSET.
+	 */
+	movl	$1f, %edx
+	jmp	*%edx
+1:
+
+	/*
+	 * 9. Balance the stack. And because EAX contain the return value,
+	 * we'd better not clobber it.
+	 */
+	leal	efi_rt_function_ptr, %edx
+	movl	(%edx), %ecx
+	pushl	%ecx
+
+	/*
+	 * 10. Push the saved return address onto the stack and return.
+	 */
+	leal	saved_return_addr, %edx
+	movl	(%edx), %ecx
+	pushl	%ecx
+	ret
+.previous
+
+.data
+saved_return_addr:
+	.long 0
+efi_rt_function_ptr:
+	.long 0
--- diff/arch/i386/kernel/entry_trampoline.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/i386/kernel/entry_trampoline.c	2003-12-29 09:30:38.000000000 +0000
@@ -0,0 +1,75 @@
+/*
+ * linux/arch/i386/kernel/entry_trampoline.c
+ *
+ * (C) Copyright 2003 Ingo Molnar
+ *
+ * This file contains the needed support code for 4GB userspace
+ */
+
+#include <linux/init.h>
+#include <linux/smp.h>
+#include <linux/mm.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/highmem.h>
+#include <asm/desc.h>
+#include <asm/atomic_kmap.h>
+
+extern char __entry_tramp_start, __entry_tramp_end, __start___entry_text;
+
+void __init init_entry_mappings(void)
+{
+#ifdef CONFIG_X86_HIGH_ENTRY
+	void *tramp;
+
+	/*
+	 * We need a high IDT and GDT for the 4G/4G split:
+	 */
+	trap_init_virtual_IDT();
+
+	__set_fixmap(FIX_ENTRY_TRAMPOLINE_0, __pa((unsigned long)&__entry_tramp_start), PAGE_KERNEL);
+	__set_fixmap(FIX_ENTRY_TRAMPOLINE_1, __pa((unsigned long)&__entry_tramp_start) + PAGE_SIZE, PAGE_KERNEL);
+	tramp = (void *)fix_to_virt(FIX_ENTRY_TRAMPOLINE_0);
+
+	printk("mapped 4G/4G trampoline to %p.\n", tramp);
+	BUG_ON((void *)&__start___entry_text != tramp);
+	/*
+	 * Virtual kernel stack:
+	 */
+	BUG_ON(__kmap_atomic_vaddr(KM_VSTACK0) & 8191);
+	BUG_ON(sizeof(struct desc_struct)*NR_CPUS*GDT_ENTRIES > 2*PAGE_SIZE);
+	BUG_ON((unsigned int)&__entry_tramp_end - (unsigned int)&__entry_tramp_start > 2*PAGE_SIZE);
+
+	/*
+	 * set up the initial thread's virtual stack related
+	 * fields:
+	 */
+	current->thread.stack_page0 = virt_to_page((char *)current->thread_info);
+	current->thread.stack_page1 = virt_to_page((char *)current->thread_info + PAGE_SIZE);
+	current->thread_info->virtual_stack = (void *)__kmap_atomic_vaddr(KM_VSTACK0);
+
+	__kunmap_atomic_type(KM_VSTACK0);
+	__kunmap_atomic_type(KM_VSTACK1);
+        __kmap_atomic(current->thread.stack_page0, KM_VSTACK0);
+        __kmap_atomic(current->thread.stack_page1, KM_VSTACK1);
+
+#endif
+	printk("current: %p\n", current);
+	printk("current->thread_info: %p\n", current->thread_info);
+	current->thread_info->real_stack = (void *)current->thread_info;
+	current->thread_info->user_pgd = NULL;
+	current->thread.esp0 = (unsigned long)current->thread_info->real_stack + THREAD_SIZE;
+}
+
+
+
+void __init entry_trampoline_setup(void)
+{
+	/*
+	 * old IRQ entries set up by the boot code will still hang
+	 * around - they are a sign of hw trouble anyway, now they'll
+	 * produce a double fault message.
+	 */
+	trap_init_virtual_GDT();
+}
--- diff/arch/i386/kernel/kgdb_stub.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/i386/kernel/kgdb_stub.c	2003-12-29 09:30:38.000000000 +0000
@@ -0,0 +1,2492 @@
+/*
+ *
+ * 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.
+ *
+ */
+
+/*
+ * Copyright (c) 2000 VERITAS Software Corporation.
+ *
+ */
+/****************************************************************************
+ *  Header: remcom.c,v 1.34 91/03/09 12:29:49 glenne Exp $
+ *
+ *  Module name: remcom.c $
+ *  Revision: 1.34 $
+ *  Date: 91/03/09 12:29:49 $
+ *  Contributor:     Lake Stevens Instrument Division$
+ *
+ *  Description:     low level support for gdb debugger. $
+ *
+ *  Considerations:  only works on target hardware $
+ *
+ *  Written by:	     Glenn Engel $
+ *  Updated by:	     David Grothe <dave@gcom.com>
+ *  Updated by:	     Robert Walsh <rjwalsh@durables.org>
+ *  Updated by:	     wangdi <wangdi@clusterfs.com>
+ *  ModuleState:     Experimental $
+ *
+ *  NOTES:	     See Below $
+ *
+ *  Modified for 386 by Jim Kingdon, Cygnus Support.
+ *  Compatibility with 2.1.xx kernel by David Grothe <dave@gcom.com>
+ *
+ *  Changes to allow auto initilization.  All that is needed is that it
+ *  be linked with the kernel and a break point (int 3) be executed.
+ *  The header file <asm/kgdb.h> defines BREAKPOINT to allow one to do
+ *  this. It should also be possible, once the interrupt system is up, to
+ *  call putDebugChar("+").  Once this is done, the remote debugger should
+ *  get our attention by sending a ^C in a packet. George Anzinger
+ *  <george@mvista.com>
+ *  Integrated into 2.2.5 kernel by Tigran Aivazian <tigran@sco.com>
+ *  Added thread support, support for multiple processors,
+ *	support for ia-32(x86) hardware debugging.
+ *	Amit S. Kale ( akale@veritas.com )
+ *
+ *  Modified to support debugging over ethernet by Robert Walsh
+ *  <rjwalsh@durables.org> and wangdi <wangdi@clusterfs.com>, based on
+ *  code by San Mehat.
+ *
+ *
+ *  To enable debugger support, two things need to happen.  One, a
+ *  call to set_debug_traps() is necessary in order to allow any breakpoints
+ *  or error conditions to be properly intercepted and reported to gdb.
+ *  Two, a breakpoint needs to be generated to begin communication.  This
+ *  is most easily accomplished by a call to breakpoint().  Breakpoint()
+ *  simulates a breakpoint by executing an int 3.
+ *
+ *************
+ *
+ *    The following gdb commands are supported:
+ *
+ * command	    function				   Return value
+ *
+ *    g		    return the value of the CPU registers  hex data or ENN
+ *    G		    set the value of the CPU registers	   OK or ENN
+ *
+ *    mAA..AA,LLLL  Read LLLL bytes at address AA..AA	   hex data or ENN
+ *    MAA..AA,LLLL: Write LLLL bytes at address AA.AA	   OK or ENN
+ *
+ *    c		    Resume at current address		   SNN	 ( signal NN)
+ *    cAA..AA	    Continue at address AA..AA		   SNN
+ *
+ *    s		    Step one instruction		   SNN
+ *    sAA..AA	    Step one instruction from AA..AA	   SNN
+ *
+ *    k		    kill
+ *
+ *    ?		    What was the last sigval ?		   SNN	 (signal NN)
+ *
+ * All commands and responses are sent with a packet which includes a
+ * checksum.  A packet consists of
+ *
+ * $<packet info>#<checksum>.
+ *
+ * where
+ * <packet info> :: <characters representing the command or response>
+ * <checksum>	 :: < two hex digits computed as modulo 256 sum of <packetinfo>>
+ *
+ * When a packet is received, it is first acknowledged with either '+' or '-'.
+ * '+' indicates a successful transfer.	 '-' indicates a failed transfer.
+ *
+ * Example:
+ *
+ * Host:		  Reply:
+ * $m0,10#2a		   +$00010203040506070809101112131415#42
+ *
+ ****************************************************************************/
+#define KGDB_VERSION "<20030915.1651.33>"
+#include <linux/config.h>
+#include <linux/types.h>
+#include <asm/string.h>		/* for strcpy */
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <asm/vm86.h>
+#include <asm/system.h>
+#include <asm/ptrace.h>		/* for linux pt_regs struct */
+#include <asm/kgdb_local.h>
+#include <linux/list.h>
+#include <asm/atomic.h>
+#include <asm/processor.h>
+#include <linux/irq.h>
+#include <asm/desc.h>
+#include <linux/inet.h>
+#include <linux/kallsyms.h>
+
+/************************************************************************
+ *
+ * external low-level support routines
+ */
+typedef void (*Function) (void);	/* pointer to a function */
+
+/* Thread reference */
+typedef unsigned char threadref[8];
+
+extern int tty_putDebugChar(int);     /* write a single character      */
+extern int tty_getDebugChar(void);    /* read and return a single char */
+extern void tty_flushDebugChar(void); /* flush pending characters      */
+extern int eth_putDebugChar(int);     /* write a single character      */
+extern int eth_getDebugChar(void);    /* read and return a single char */
+extern void eth_flushDebugChar(void); /* flush pending characters      */
+extern void kgdb_eth_set_trapmode(int);
+extern void kgdb_eth_reply_arp(void);   /*send arp request */
+extern volatile int kgdb_eth_is_initializing;
+
+
+/************************************************************************/
+/* BUFMAX defines the maximum number of characters in inbound/outbound buffers*/
+/* at least NUMREGBYTES*2 are needed for register packets */
+/* Longer buffer is needed to list all threads */
+#define BUFMAX 400
+
+char *kgdb_version = KGDB_VERSION;
+
+/*  debug >  0 prints ill-formed commands in valid packets & checksum errors */
+int debug_regs = 0;		/* set to non-zero to print registers */
+
+/* filled in by an external module */
+char *gdb_module_offsets;
+
+static const char hexchars[] = "0123456789abcdef";
+
+/* Number of bytes of registers.  */
+#define NUMREGBYTES 64
+/*
+ * Note that this register image is in a different order than
+ * the register image that Linux produces at interrupt time.
+ *
+ * Linux's register image is defined by struct pt_regs in ptrace.h.
+ * Just why GDB uses a different order is a historical mystery.
+ */
+enum regnames { _EAX,		/* 0 */
+	_ECX,			/* 1 */
+	_EDX,			/* 2 */
+	_EBX,			/* 3 */
+	_ESP,			/* 4 */
+	_EBP,			/* 5 */
+	_ESI,			/* 6 */
+	_EDI,			/* 7 */
+	_PC /* 8 also known as eip */ ,
+	_PS /* 9 also known as eflags */ ,
+	_CS,			/* 10 */
+	_SS,			/* 11 */
+	_DS,			/* 12 */
+	_ES,			/* 13 */
+	_FS,			/* 14 */
+	_GS			/* 15 */
+};
+
+/***************************  ASSEMBLY CODE MACROS *************************/
+/*
+ * Put the error code here just in case the user cares.
+ * Likewise, the vector number here (since GDB only gets the signal
+ * number through the usual means, and that's not very specific).
+ * The called_from is the return address so he can tell how we entered kgdb.
+ * This will allow him to seperate out the various possible entries.
+ */
+#define REMOTE_DEBUG 0		/* set != to turn on printing (also available in info) */
+
+#define PID_MAX PID_MAX_DEFAULT
+
+#ifdef CONFIG_SMP
+void smp_send_nmi_allbutself(void);
+#define IF_SMP(x) x
+#undef MAX_NO_CPUS
+#ifndef CONFIG_NO_KGDB_CPUS
+#define CONFIG_NO_KGDB_CPUS 2
+#endif
+#if CONFIG_NO_KGDB_CPUS > NR_CPUS
+#define MAX_NO_CPUS NR_CPUS
+#else
+#define MAX_NO_CPUS CONFIG_NO_KGDB_CPUS
+#endif
+#define hold_init hold_on_sstep: 1,
+#define MAX_CPU_MASK (unsigned long)((1LL << MAX_NO_CPUS) - 1LL)
+#define NUM_CPUS num_online_cpus()
+#else
+#define IF_SMP(x)
+#define hold_init
+#undef MAX_NO_CPUS
+#define MAX_NO_CPUS 1
+#define NUM_CPUS 1
+#endif
+#define NOCPU (struct task_struct *)0xbad1fbad
+/* *INDENT-OFF*	 */
+struct kgdb_info {
+	int used_malloc;
+	void *called_from;
+	long long entry_tsc;
+	int errcode;
+	int vector;
+	int print_debug_info;
+#ifdef CONFIG_SMP
+	int hold_on_sstep;
+	struct {
+		volatile struct task_struct *task;
+		int pid;
+		int hold;
+		struct pt_regs *regs;
+	} cpus_waiting[MAX_NO_CPUS];
+#endif
+} kgdb_info = {hold_init print_debug_info:REMOTE_DEBUG, vector:-1};
+
+/* *INDENT-ON*	*/
+
+#define used_m kgdb_info.used_malloc
+/*
+ * This is little area we set aside to contain the stack we
+ * need to build to allow gdb to call functions.  We use one
+ * per cpu to avoid locking issues.  We will do all this work
+ * with interrupts off so that should take care of the protection
+ * issues.
+ */
+#define LOOKASIDE_SIZE 200	/* should be more than enough */
+#define MALLOC_MAX   200	/* Max malloc size */
+struct {
+	unsigned int esp;
+	int array[LOOKASIDE_SIZE];
+} fn_call_lookaside[MAX_NO_CPUS];
+
+static int trap_cpu;
+static unsigned int OLD_esp;
+
+#define END_OF_LOOKASIDE  &fn_call_lookaside[trap_cpu].array[LOOKASIDE_SIZE]
+#define IF_BIT 0x200
+#define TF_BIT 0x100
+
+#define MALLOC_ROUND 8-1
+
+static char malloc_array[MALLOC_MAX];
+IF_SMP(static void to_gdb(const char *mess));
+void *
+malloc(int size)
+{
+
+	if (size <= (MALLOC_MAX - used_m)) {
+		int old_used = used_m;
+		used_m += ((size + MALLOC_ROUND) & (~MALLOC_ROUND));
+		return &malloc_array[old_used];
+	} else {
+		return NULL;
+	}
+}
+
+/*
+ * I/O dispatch functions...
+ * Based upon kgdb_eth, either call the ethernet
+ * handler or the serial one..
+ */
+void
+putDebugChar(int c)
+{
+	if (kgdb_eth == -1) {
+		tty_putDebugChar(c);
+	} else {
+		eth_putDebugChar(c);
+	}
+}
+
+int
+getDebugChar(void)
+{
+	if (kgdb_eth == -1) {
+		return tty_getDebugChar();
+	} else {
+		return eth_getDebugChar();
+	}
+}
+
+void
+flushDebugChar(void)
+{
+	if (kgdb_eth == -1) {
+		tty_flushDebugChar();
+	} else {
+		eth_flushDebugChar();
+	}
+}
+
+/*
+ * Gdb calls functions by pushing agruments, including a return address
+ * on the stack and the adjusting EIP to point to the function.	 The
+ * whole assumption in GDB is that we are on a different stack than the
+ * one the "user" i.e. code that hit the break point, is on.  This, of
+ * course is not true in the kernel.  Thus various dodges are needed to
+ * do the call without directly messing with EIP (which we can not change
+ * as it is just a location and not a register.	 To adjust it would then
+ * require that we move every thing below EIP up or down as needed.  This
+ * will not work as we may well have stack relative pointer on the stack
+ * (such as the pointer to regs, for example).
+
+ * So here is what we do:
+ * We detect gdb attempting to store into the stack area and instead, store
+ * into the fn_call_lookaside.array at the same relative location as if it
+ * were the area ESP pointed at.  We also trap ESP modifications
+ * and uses these to adjust fn_call_lookaside.esp.  On entry
+ * fn_call_lookaside.esp will be set to point at the last entry in
+ * fn_call_lookaside.array.  This allows us to check if it has changed, and
+ * if so, on exit, we add the registers we will use to do the move and a
+ * trap/ interrupt return exit sequence.  We then adjust the eflags in the
+ * regs array (remember we now have a copy in the fn_call_lookaside.array) to
+ * kill the interrupt bit, AND we change EIP to point at our set up stub.
+ * As part of the register set up we preset the registers to point at the
+ * begining and end of the fn_call_lookaside.array, so all the stub needs to
+ * do is move words from the array to the stack until ESP= the desired value
+ * then do the rti.  This will then transfer to the desired function with
+ * all the correct registers.  Nifty huh?
+ */
+extern asmlinkage void fn_call_stub(void);
+extern asmlinkage void fn_rtn_stub(void);
+/*					   *INDENT-OFF*	 */
+__asm__("fn_rtn_stub:\n\t"
+	"movl %eax,%esp\n\t"
+	"fn_call_stub:\n\t"
+	"1:\n\t"
+	"addl $-4,%ebx\n\t"
+	"movl (%ebx), %eax\n\t"
+	"pushl %eax\n\t"
+	"cmpl %esp,%ecx\n\t"
+	"jne  1b\n\t"
+	"popl %eax\n\t"
+	"popl %ebx\n\t"
+	"popl %ecx\n\t"
+	"iret \n\t");
+/*					     *INDENT-ON*  */
+#define gdb_i386vector	kgdb_info.vector
+#define gdb_i386errcode kgdb_info.errcode
+#define waiting_cpus	kgdb_info.cpus_waiting
+#define remote_debug	kgdb_info.print_debug_info
+#define hold_cpu(cpu)	kgdb_info.cpus_waiting[cpu].hold
+/* gdb locks */
+
+#ifdef CONFIG_SMP
+static int in_kgdb_called;
+static spinlock_t waitlocks[MAX_NO_CPUS] =
+    {[0 ... MAX_NO_CPUS - 1] = SPIN_LOCK_UNLOCKED };
+/*
+ * The following array has the thread pointer of each of the "other"
+ * cpus.  We make it global so it can be seen by gdb.
+ */
+volatile int in_kgdb_entry_log[MAX_NO_CPUS];
+volatile struct pt_regs *in_kgdb_here_log[MAX_NO_CPUS];
+/*
+static spinlock_t continuelocks[MAX_NO_CPUS];
+*/
+spinlock_t kgdb_spinlock = SPIN_LOCK_UNLOCKED;
+/* waiters on our spinlock plus us */
+static atomic_t spinlock_waiters = ATOMIC_INIT(1);
+static int spinlock_count = 0;
+static int spinlock_cpu = 0;
+/*
+ * Note we use nested spin locks to account for the case where a break
+ * point is encountered when calling a function by user direction from
+ * kgdb. Also there is the memory exception recursion to account for.
+ * Well, yes, but this lets other cpus thru too.  Lets add a
+ * cpu id to the lock.
+ */
+#define KGDB_SPIN_LOCK(x) if( spinlock_count == 0 || \
+			      spinlock_cpu != smp_processor_id()){\
+				      atomic_inc(&spinlock_waiters); \
+				      while (! spin_trylock(x)) {\
+					    in_kgdb(&regs);\
+				      }\
+				      atomic_dec(&spinlock_waiters); \
+				      spinlock_count = 1; \
+				      spinlock_cpu = smp_processor_id(); \
+			  }else{  \
+				      spinlock_count++; \
+			  }
+#define KGDB_SPIN_UNLOCK(x) if( --spinlock_count == 0) spin_unlock(x)
+#else
+unsigned kgdb_spinlock = 0;
+#define KGDB_SPIN_LOCK(x) --*x
+#define KGDB_SPIN_UNLOCK(x) ++*x
+#endif
+
+int
+hex(char ch)
+{
+	if ((ch >= 'a') && (ch <= 'f'))
+		return (ch - 'a' + 10);
+	if ((ch >= '0') && (ch <= '9'))
+		return (ch - '0');
+	if ((ch >= 'A') && (ch <= 'F'))
+		return (ch - 'A' + 10);
+	return (-1);
+}
+
+/* scan for the sequence $<data>#<checksum>	*/
+void
+getpacket(char *buffer)
+{
+	unsigned char checksum;
+	unsigned char xmitcsum;
+	int i;
+	int count;
+	char ch;
+
+	do {
+		/* wait around for the start character, ignore all other characters */
+		while ((ch = (getDebugChar() & 0x7f)) != '$') ;
+		checksum = 0;
+		xmitcsum = -1;
+
+		count = 0;
+
+		/* now, read until a # or end of buffer is found */
+		while (count < BUFMAX) {
+			ch = getDebugChar() & 0x7f;
+			if (ch == '#')
+				break;
+			checksum = checksum + ch;
+			buffer[count] = ch;
+			count = count + 1;
+		}
+		buffer[count] = 0;
+
+		if (ch == '#') {
+			xmitcsum = hex(getDebugChar() & 0x7f) << 4;
+			xmitcsum += hex(getDebugChar() & 0x7f);
+			if ((remote_debug) && (checksum != xmitcsum)) {
+				printk
+				    ("bad checksum.	My count = 0x%x, sent=0x%x. buf=%s\n",
+				     checksum, xmitcsum, buffer);
+			}
+
+			if (checksum != xmitcsum)
+				putDebugChar('-');	/* failed checksum */
+			else {
+				putDebugChar('+');	/* successful transfer */
+				/* if a sequence char is present, reply the sequence ID */
+				if (buffer[2] == ':') {
+					putDebugChar(buffer[0]);
+					putDebugChar(buffer[1]);
+					/* remove sequence chars from buffer */
+					count = strlen(buffer);
+					for (i = 3; i <= count; i++)
+						buffer[i - 3] = buffer[i];
+				}
+			}
+		}
+	} while (checksum != xmitcsum);
+
+	if (remote_debug)
+		printk("R:%s\n", buffer);
+	flushDebugChar();
+}
+
+/* send the packet in buffer.  */
+
+void
+putpacket(char *buffer)
+{
+	unsigned char checksum;
+	int count;
+	char ch;
+
+	/*  $<packet info>#<checksum>. */
+
+	if (kgdb_eth == -1) {
+		do {
+			if (remote_debug)
+				printk("T:%s\n", buffer);
+			putDebugChar('$');
+			checksum = 0;
+			count = 0;
+
+			while ((ch = buffer[count])) {
+				putDebugChar(ch);
+				checksum += ch;
+				count += 1;
+			}
+
+			putDebugChar('#');
+			putDebugChar(hexchars[checksum >> 4]);
+			putDebugChar(hexchars[checksum % 16]);
+			flushDebugChar();
+
+		} while ((getDebugChar() & 0x7f) != '+');
+	} else {
+		/*
+		 * For udp, we can not transfer too much bytes once.
+		 * We only transfer MAX_SEND_COUNT size bytes each time
+		 */
+
+#define MAX_SEND_COUNT 30
+
+		int send_count = 0, i = 0;
+		char send_buf[MAX_SEND_COUNT];
+
+		do {
+			if (remote_debug)
+				printk("T:%s\n", buffer);
+			putDebugChar('$');
+			checksum = 0;
+			count = 0;
+			send_count = 0;
+			while ((ch = buffer[count])) {
+				if (send_count >= MAX_SEND_COUNT) {
+					for(i = 0; i < MAX_SEND_COUNT; i++) {
+						putDebugChar(send_buf[i]);
+					}
+					flushDebugChar();
+					send_count = 0;
+				} else {
+					send_buf[send_count] = ch;
+					checksum += ch;
+					count ++;
+					send_count++;
+				}
+			}
+			for(i = 0; i < send_count; i++)
+				putDebugChar(send_buf[i]);
+			putDebugChar('#');
+			putDebugChar(hexchars[checksum >> 4]);
+			putDebugChar(hexchars[checksum % 16]);
+			flushDebugChar();
+		} while ((getDebugChar() & 0x7f) != '+');
+	}
+}
+
+static char remcomInBuffer[BUFMAX];
+static char remcomOutBuffer[BUFMAX];
+static short error;
+
+void
+debug_error(char *format, char *parm)
+{
+	if (remote_debug)
+		printk(format, parm);
+}
+
+static void
+print_regs(struct pt_regs *regs)
+{
+	printk("EAX=%08lx ", regs->eax);
+	printk("EBX=%08lx ", regs->ebx);
+	printk("ECX=%08lx ", regs->ecx);
+	printk("EDX=%08lx ", regs->edx);
+	printk("\n");
+	printk("ESI=%08lx ", regs->esi);
+	printk("EDI=%08lx ", regs->edi);
+	printk("EBP=%08lx ", regs->ebp);
+	printk("ESP=%08lx ", (long) &regs->esp);
+	printk("\n");
+	printk(" DS=%08x ", regs->xds);
+	printk(" ES=%08x ", regs->xes);
+	printk(" SS=%08x ", __KERNEL_DS);
+	printk(" FL=%08lx ", regs->eflags);
+	printk("\n");
+	printk(" CS=%08x ", regs->xcs);
+	printk(" IP=%08lx ", regs->eip);
+#if 0
+	printk(" FS=%08x ", regs->fs);
+	printk(" GS=%08x ", regs->gs);
+#endif
+	printk("\n");
+
+}				/* print_regs */
+
+#define NEW_esp fn_call_lookaside[trap_cpu].esp
+
+static void
+regs_to_gdb_regs(int *gdb_regs, struct pt_regs *regs)
+{
+	gdb_regs[_EAX] = regs->eax;
+	gdb_regs[_EBX] = regs->ebx;
+	gdb_regs[_ECX] = regs->ecx;
+	gdb_regs[_EDX] = regs->edx;
+	gdb_regs[_ESI] = regs->esi;
+	gdb_regs[_EDI] = regs->edi;
+	gdb_regs[_EBP] = regs->ebp;
+	gdb_regs[_DS] = regs->xds;
+	gdb_regs[_ES] = regs->xes;
+	gdb_regs[_PS] = regs->eflags;
+	gdb_regs[_CS] = regs->xcs;
+	gdb_regs[_PC] = regs->eip;
+	/* Note, as we are a debugging the kernel, we will always
+	 * trap in kernel code, this means no priviledge change,
+	 * and so the pt_regs structure is not completely valid.  In a non
+	 * privilege change trap, only EFLAGS, CS and EIP are put on the stack,
+	 * SS and ESP are not stacked, this means that the last 2 elements of
+	 * pt_regs is not valid (they would normally refer to the user stack)
+	 * also, using regs+1 is no good because you end up will a value that is
+	 * 2 longs (8) too high.  This used to cause stepping over functions
+	 * to fail, so my fix is to use the address of regs->esp, which
+	 * should point at the end of the stack frame.	Note I have ignored
+	 * completely exceptions that cause an error code to be stacked, such
+	 * as double fault.  Stuart Hughes, Zentropix.
+	 * original code: gdb_regs[_ESP] =  (int) (regs + 1) ;
+
+	 * this is now done on entry and moved to OLD_esp (as well as NEW_esp).
+	 */
+	gdb_regs[_ESP] = NEW_esp;
+	gdb_regs[_SS] = __KERNEL_DS;
+	gdb_regs[_FS] = 0xFFFF;
+	gdb_regs[_GS] = 0xFFFF;
+}				/* regs_to_gdb_regs */
+
+static void
+gdb_regs_to_regs(int *gdb_regs, struct pt_regs *regs)
+{
+	regs->eax = gdb_regs[_EAX];
+	regs->ebx = gdb_regs[_EBX];
+	regs->ecx = gdb_regs[_ECX];
+	regs->edx = gdb_regs[_EDX];
+	regs->esi = gdb_regs[_ESI];
+	regs->edi = gdb_regs[_EDI];
+	regs->ebp = gdb_regs[_EBP];
+	regs->xds = gdb_regs[_DS];
+	regs->xes = gdb_regs[_ES];
+	regs->eflags = gdb_regs[_PS];
+	regs->xcs = gdb_regs[_CS];
+	regs->eip = gdb_regs[_PC];
+	NEW_esp = gdb_regs[_ESP];	/* keep the value */
+#if 0				/* can't change these */
+	regs->esp = gdb_regs[_ESP];
+	regs->xss = gdb_regs[_SS];
+	regs->fs = gdb_regs[_FS];
+	regs->gs = gdb_regs[_GS];
+#endif
+
+}				/* gdb_regs_to_regs */
+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)
+
+int thread_list = 0;
+
+void
+get_gdb_regs(struct task_struct *p, struct pt_regs *regs, int *gdb_regs)
+{
+	unsigned long stack_page;
+	int count = 0;
+	IF_SMP(int i);
+	if (!p || p == current) {
+		regs_to_gdb_regs(gdb_regs, regs);
+		return;
+	}
+#ifdef CONFIG_SMP
+	for (i = 0; i < MAX_NO_CPUS; i++) {
+		if (p == kgdb_info.cpus_waiting[i].task) {
+			regs_to_gdb_regs(gdb_regs,
+					 kgdb_info.cpus_waiting[i].regs);
+			gdb_regs[_ESP] =
+			    (int) &kgdb_info.cpus_waiting[i].regs->esp;
+
+			return;
+		}
+	}
+#endif
+	memset(gdb_regs, 0, NUMREGBYTES);
+	gdb_regs[_ESP] = p->thread.esp;
+	gdb_regs[_PC] = p->thread.eip;
+	gdb_regs[_EBP] = *(int *) gdb_regs[_ESP];
+	gdb_regs[_EDI] = *(int *) (gdb_regs[_ESP] + 4);
+	gdb_regs[_ESI] = *(int *) (gdb_regs[_ESP] + 8);
+
+/*
+ * This code is to give a more informative notion of where a process
+ * is waiting.	It is used only when the user asks for a thread info
+ * list.  If he then switches to the thread, s/he will find the task
+ * is in schedule, but a back trace should show the same info we come
+ * up with.  This code was shamelessly purloined from process.c.  It was
+ * then enhanced to provide more registers than simply the program
+ * counter.
+ */
+
+	if (!thread_list) {
+		return;
+	}
+
+	if (p->state == TASK_RUNNING)
+		return;
+	stack_page = (unsigned long) p->thread_info;
+	if (gdb_regs[_ESP] < stack_page || gdb_regs[_ESP] > 8188 + stack_page)
+		return;
+	/* include/asm-i386/system.h:switch_to() pushes ebp last. */
+	do {
+		if (gdb_regs[_EBP] < stack_page ||
+		    gdb_regs[_EBP] > 8184 + stack_page)
+			return;
+		gdb_regs[_PC] = *(unsigned long *) (gdb_regs[_EBP] + 4);
+		gdb_regs[_ESP] = gdb_regs[_EBP] + 8;
+		gdb_regs[_EBP] = *(unsigned long *) gdb_regs[_EBP];
+		if (gdb_regs[_PC] < first_sched || gdb_regs[_PC] >= last_sched)
+			return;
+	} while (count++ < 16);
+	return;
+}
+
+/* Indicate to caller of mem2hex or hex2mem that there has been an
+   error.  */
+static volatile int mem_err = 0;
+static volatile int mem_err_expected = 0;
+static volatile int mem_err_cnt = 0;
+static int garbage_loc = -1;
+
+int
+get_char(char *addr)
+{
+	return *addr;
+}
+
+void
+set_char(char *addr, int val, int may_fault)
+{
+	/*
+	 * This code traps references to the area mapped to the kernel
+	 * stack as given by the regs and, instead, stores to the
+	 * fn_call_lookaside[cpu].array
+	 */
+	if (may_fault &&
+	    (unsigned int) addr < OLD_esp &&
+	    ((unsigned int) addr > (OLD_esp - (unsigned int) LOOKASIDE_SIZE))) {
+		addr = (char *) END_OF_LOOKASIDE - ((char *) OLD_esp - addr);
+	}
+	*addr = val;
+}
+
+/* convert the memory pointed to by mem into hex, placing result in buf */
+/* return a pointer to the last char put in buf (null) */
+/* If MAY_FAULT is non-zero, then we should set mem_err in response to
+   a fault; if zero treat a fault like any other fault in the stub.  */
+char *
+mem2hex(char *mem, char *buf, int count, int may_fault)
+{
+	int i;
+	unsigned char ch;
+
+	if (may_fault) {
+		mem_err_expected = 1;
+		mem_err = 0;
+	}
+	for (i = 0; i < count; i++) {
+		/* printk("%lx = ", mem) ; */
+
+		ch = get_char(mem++);
+
+		/* printk("%02x\n", ch & 0xFF) ; */
+		if (may_fault && mem_err) {
+			if (remote_debug)
+				printk("Mem fault fetching from addr %lx\n",
+				       (long) (mem - 1));
+			*buf = 0;	/* truncate buffer */
+			return (buf);
+		}
+		*buf++ = hexchars[ch >> 4];
+		*buf++ = hexchars[ch % 16];
+	}
+	*buf = 0;
+	if (may_fault)
+		mem_err_expected = 0;
+	return (buf);
+}
+
+/* convert the hex array pointed to by buf into binary to be placed in mem */
+/* return a pointer to the character AFTER the last byte written */
+/* NOTE: We use the may fault flag to also indicate if the write is to
+ * the registers (0) or "other" memory (!=0)
+ */
+char *
+hex2mem(char *buf, char *mem, int count, int may_fault)
+{
+	int i;
+	unsigned char ch;
+
+	if (may_fault) {
+		mem_err_expected = 1;
+		mem_err = 0;
+	}
+	for (i = 0; i < count; i++) {
+		ch = hex(*buf++) << 4;
+		ch = ch + hex(*buf++);
+		set_char(mem++, ch, may_fault);
+
+		if (may_fault && mem_err) {
+			if (remote_debug)
+				printk("Mem fault storing to addr %lx\n",
+				       (long) (mem - 1));
+			return (mem);
+		}
+	}
+	if (may_fault)
+		mem_err_expected = 0;
+	return (mem);
+}
+
+/**********************************************/
+/* WHILE WE FIND NICE HEX CHARS, BUILD AN INT */
+/* RETURN NUMBER OF CHARS PROCESSED	      */
+/**********************************************/
+int
+hexToInt(char **ptr, int *intValue)
+{
+	int numChars = 0;
+	int hexValue;
+
+	*intValue = 0;
+
+	while (**ptr) {
+		hexValue = hex(**ptr);
+		if (hexValue >= 0) {
+			*intValue = (*intValue << 4) | hexValue;
+			numChars++;
+		} else
+			break;
+
+		(*ptr)++;
+	}
+
+	return (numChars);
+}
+
+#define stubhex(h) hex(h)
+#ifdef old_thread_list
+
+static int
+stub_unpack_int(char *buff, int fieldlength)
+{
+	int nibble;
+	int retval = 0;
+
+	while (fieldlength) {
+		nibble = stubhex(*buff++);
+		retval |= nibble;
+		fieldlength--;
+		if (fieldlength)
+			retval = retval << 4;
+	}
+	return retval;
+}
+#endif
+static char *
+pack_hex_byte(char *pkt, int byte)
+{
+	*pkt++ = hexchars[(byte >> 4) & 0xf];
+	*pkt++ = hexchars[(byte & 0xf)];
+	return pkt;
+}
+
+#define BUF_THREAD_ID_SIZE 16
+
+static char *
+pack_threadid(char *pkt, threadref * id)
+{
+	char *limit;
+	unsigned char *altid;
+
+	altid = (unsigned char *) id;
+	limit = pkt + BUF_THREAD_ID_SIZE;
+	while (pkt < limit)
+		pkt = pack_hex_byte(pkt, *altid++);
+	return pkt;
+}
+
+#ifdef old_thread_list
+static char *
+unpack_byte(char *buf, int *value)
+{
+	*value = stub_unpack_int(buf, 2);
+	return buf + 2;
+}
+
+static char *
+unpack_threadid(char *inbuf, threadref * id)
+{
+	char *altref;
+	char *limit = inbuf + BUF_THREAD_ID_SIZE;
+	int x, y;
+
+	altref = (char *) id;
+
+	while (inbuf < limit) {
+		x = stubhex(*inbuf++);
+		y = stubhex(*inbuf++);
+		*altref++ = (x << 4) | y;
+	}
+	return inbuf;
+}
+#endif
+void
+int_to_threadref(threadref * id, int value)
+{
+	unsigned char *scan;
+
+	scan = (unsigned char *) id;
+	{
+		int i = 4;
+		while (i--)
+			*scan++ = 0;
+	}
+	*scan++ = (value >> 24) & 0xff;
+	*scan++ = (value >> 16) & 0xff;
+	*scan++ = (value >> 8) & 0xff;
+	*scan++ = (value & 0xff);
+}
+int
+int_to_hex_v(unsigned char * id, int value)
+{
+	unsigned char *start = id;
+	int shift;
+	int ch;
+
+	for (shift = 28; shift >= 0; shift -= 4) {
+		if ((ch = (value >> shift) & 0xf) || (id != start)) {
+			*id = hexchars[ch];
+			id++;
+		}
+	}
+	if (id == start)
+		*id++ = '0';
+	return id - start;
+}
+#ifdef old_thread_list
+
+static int
+threadref_to_int(threadref * ref)
+{
+	int i, value = 0;
+	unsigned char *scan;
+
+	scan = (char *) ref;
+	scan += 4;
+	i = 4;
+	while (i-- > 0)
+		value = (value << 8) | ((*scan++) & 0xff);
+	return value;
+}
+#endif
+static int
+cmp_str(char *s1, char *s2, int count)
+{
+	while (count--) {
+		if (*s1++ != *s2++)
+			return 0;
+	}
+	return 1;
+}
+
+#if 1				/* this is a hold over from 2.4 where O(1) was "sometimes" */
+extern struct task_struct *kgdb_get_idle(int cpu);
+#define idle_task(cpu) kgdb_get_idle(cpu)
+#else
+#define idle_task(cpu) init_tasks[cpu]
+#endif
+
+extern int kgdb_pid_init_done;
+
+struct task_struct *
+getthread(int pid)
+{
+	struct task_struct *thread;
+	if (pid >= PID_MAX && pid <= (PID_MAX + MAX_NO_CPUS)) {
+
+		return idle_task(pid - PID_MAX);
+	} else {
+		/*
+		 * find_task_by_pid is relatively safe all the time
+		 * Other pid functions require lock downs which imply
+		 * that we may be interrupting them (as we get here
+		 * in the middle of most any lock down).
+		 * Still we don't want to call until the table exists!
+		 */
+		if (kgdb_pid_init_done){
+			thread = find_task_by_pid(pid);
+			if (thread) {
+				return thread;
+			}
+		}
+	}
+	return NULL;
+}
+/* *INDENT-OFF*	 */
+struct hw_breakpoint {
+	unsigned enabled;
+	unsigned type;
+	unsigned len;
+	unsigned addr;
+} breakinfo[4] = { {enabled:0},
+		   {enabled:0},
+		   {enabled:0},
+		   {enabled:0}};
+/* *INDENT-ON*	*/
+unsigned hw_breakpoint_status;
+void
+correct_hw_break(void)
+{
+	int breakno;
+	int correctit;
+	int breakbit;
+	unsigned dr7;
+
+	asm volatile ("movl %%db7, %0\n":"=r" (dr7)
+		      :);
+	/* *INDENT-OFF*	 */
+	do {
+		unsigned addr0, addr1, addr2, addr3;
+		asm volatile ("movl %%db0, %0\n"
+			      "movl %%db1, %1\n"
+			      "movl %%db2, %2\n"
+			      "movl %%db3, %3\n"
+			      :"=r" (addr0), "=r"(addr1),
+			      "=r"(addr2), "=r"(addr3)
+			      :);
+	} while (0);
+	/* *INDENT-ON*	*/
+	correctit = 0;
+	for (breakno = 0; breakno < 3; breakno++) {
+		breakbit = 2 << (breakno << 1);
+		if (!(dr7 & breakbit) && breakinfo[breakno].enabled) {
+			correctit = 1;
+			dr7 |= breakbit;
+			dr7 &= ~(0xf0000 << (breakno << 2));
+			dr7 |= (((breakinfo[breakno].len << 2) |
+				 breakinfo[breakno].type) << 16) <<
+			    (breakno << 2);
+			switch (breakno) {
+			case 0:
+				asm volatile ("movl %0, %%dr0\n"::"r"
+					      (breakinfo[breakno].addr));
+				break;
+
+			case 1:
+				asm volatile ("movl %0, %%dr1\n"::"r"
+					      (breakinfo[breakno].addr));
+				break;
+
+			case 2:
+				asm volatile ("movl %0, %%dr2\n"::"r"
+					      (breakinfo[breakno].addr));
+				break;
+
+			case 3:
+				asm volatile ("movl %0, %%dr3\n"::"r"
+					      (breakinfo[breakno].addr));
+				break;
+			}
+		} else if ((dr7 & breakbit) && !breakinfo[breakno].enabled) {
+			correctit = 1;
+			dr7 &= ~breakbit;
+			dr7 &= ~(0xf0000 << (breakno << 2));
+		}
+	}
+	if (correctit) {
+		asm volatile ("movl %0, %%db7\n"::"r" (dr7));
+	}
+}
+
+int
+remove_hw_break(unsigned breakno)
+{
+	if (!breakinfo[breakno].enabled) {
+		return -1;
+	}
+	breakinfo[breakno].enabled = 0;
+	return 0;
+}
+
+int
+set_hw_break(unsigned breakno, unsigned type, unsigned len, unsigned addr)
+{
+	if (breakinfo[breakno].enabled) {
+		return -1;
+	}
+	breakinfo[breakno].enabled = 1;
+	breakinfo[breakno].type = type;
+	breakinfo[breakno].len = len;
+	breakinfo[breakno].addr = addr;
+	return 0;
+}
+
+#ifdef CONFIG_SMP
+static int in_kgdb_console = 0;
+
+int
+in_kgdb(struct pt_regs *regs)
+{
+	unsigned flags;
+	int cpu = smp_processor_id();
+	in_kgdb_called = 1;
+	if (!spin_is_locked(&kgdb_spinlock)) {
+		if (in_kgdb_here_log[cpu] ||	/* we are holding this cpu */
+		    in_kgdb_console) {	/* or we are doing slow i/o */
+			return 1;
+		}
+		return 0;
+	}
+
+	/* As I see it the only reason not to let all cpus spin on
+	 * the same spin_lock is to allow selected ones to proceed.
+	 * This would be a good thing, so we leave it this way.
+	 * Maybe someday....  Done !
+
+	 * in_kgdb() is called from an NMI so we don't pretend
+	 * to have any resources, like printk() for example.
+	 */
+
+	kgdb_local_irq_save(flags);	/* only local here, to avoid hanging */
+	/*
+	 * log arival of this cpu
+	 * The NMI keeps on ticking.  Protect against recurring more
+	 * than once, and ignor the cpu that has the kgdb lock
+	 */
+	in_kgdb_entry_log[cpu]++;
+	in_kgdb_here_log[cpu] = regs;
+	if (cpu == spinlock_cpu || waiting_cpus[cpu].task) {
+		goto exit_in_kgdb;
+	}
+	/*
+	 * For protection of the initilization of the spin locks by kgdb
+	 * it locks the kgdb spinlock before it gets the wait locks set
+	 * up.	We wait here for the wait lock to be taken.  If the
+	 * kgdb lock goes away first??	Well, it could be a slow exit
+	 * sequence where the wait lock is removed prior to the kgdb lock
+	 * so if kgdb gets unlocked, we just exit.
+	 */
+	while (spin_is_locked(&kgdb_spinlock) &&
+	       !spin_is_locked(waitlocks + cpu)) ;
+	if (!spin_is_locked(&kgdb_spinlock)) {
+		goto exit_in_kgdb;
+	}
+	waiting_cpus[cpu].task = current;
+	waiting_cpus[cpu].pid = (current->pid) ? : (PID_MAX + cpu);
+	waiting_cpus[cpu].regs = regs;
+
+	spin_unlock_wait(waitlocks + cpu);
+	/*
+	 * log departure of this cpu
+	 */
+	waiting_cpus[cpu].task = 0;
+	waiting_cpus[cpu].pid = 0;
+	waiting_cpus[cpu].regs = 0;
+	correct_hw_break();
+      exit_in_kgdb:
+	in_kgdb_here_log[cpu] = 0;
+	kgdb_local_irq_restore(flags);
+	return 1;
+	/*
+	   spin_unlock(continuelocks + smp_processor_id());
+	 */
+}
+
+void
+smp__in_kgdb(struct pt_regs regs)
+{
+	ack_APIC_irq();
+	in_kgdb(&regs);
+}
+#else
+int
+in_kgdb(struct pt_regs *regs)
+{
+	return (kgdb_spinlock);
+}
+#endif
+
+void
+printexceptioninfo(int exceptionNo, int errorcode, char *buffer)
+{
+	unsigned dr6;
+	int i;
+	switch (exceptionNo) {
+	case 1:		/* debug exception */
+		break;
+	case 3:		/* breakpoint */
+		sprintf(buffer, "Software breakpoint");
+		return;
+	default:
+		sprintf(buffer, "Details not available");
+		return;
+	}
+	asm volatile ("movl %%db6, %0\n":"=r" (dr6)
+		      :);
+	if (dr6 & 0x4000) {
+		sprintf(buffer, "Single step");
+		return;
+	}
+	for (i = 0; i < 4; ++i) {
+		if (dr6 & (1 << i)) {
+			sprintf(buffer, "Hardware breakpoint %d", i);
+			return;
+		}
+	}
+	sprintf(buffer, "Unknown trap");
+	return;
+}
+
+/*
+ * This function does all command procesing for interfacing to gdb.
+ *
+ * NOTE:  The INT nn instruction leaves the state of the interrupt
+ *	  enable flag UNCHANGED.  That means that when this routine
+ *	  is entered via a breakpoint (INT 3) instruction from code
+ *	  that has interrupts enabled, then interrupts will STILL BE
+ *	  enabled when this routine is entered.	 The first thing that
+ *	  we do here is disable interrupts so as to prevent recursive
+ *	  entries and bothersome serial interrupts while we are
+ *	  trying to run the serial port in polled mode.
+ *
+ * For kernel version 2.1.xx the kgdb_cli() actually gets a spin lock so
+ * it is always necessary to do a restore_flags before returning
+ * so as to let go of that lock.
+ */
+int
+kgdb_handle_exception(int exceptionVector,
+		      int signo, int err_code, struct pt_regs *linux_regs)
+{
+	struct task_struct *usethread = NULL;
+	struct task_struct *thread_list_start = 0, *thread = NULL;
+	int addr, length;
+	unsigned long address;
+	int breakno, breaktype;
+	char *ptr;
+	int newPC;
+	threadref thref;
+	int threadid;
+	int thread_min = PID_MAX + MAX_NO_CPUS;
+#ifdef old_thread_list
+	int maxthreads;
+#endif
+	int nothreads;
+	unsigned long flags;
+	int gdb_regs[NUMREGBYTES / 4];
+	int dr6;
+	IF_SMP(int entry_state = 0);	/* 0, ok, 1, no nmi, 2 sync failed */
+#define NO_NMI 1
+#define NO_SYNC 2
+#define	regs	(*linux_regs)
+#define NUMREGS NUMREGBYTES/4
+	/*
+	 * If the entry is not from the kernel then return to the Linux
+	 * trap handler and let it process the interrupt normally.
+	 */
+	if ((linux_regs->eflags & VM_MASK) || (3 & linux_regs->xcs)) {
+		printk("ignoring non-kernel exception\n");
+		print_regs(&regs);
+		return (0);
+	}
+	/*
+	 * If we're using eth mode, set the 'mode' in the netdevice.
+	 */
+
+	__asm__("movl %%cr2,%0":"=r" (address));
+
+	if (kgdb_eth != -1) {
+		kgdb_eth_set_trapmode(1);
+	}
+
+	kgdb_local_irq_save(flags);
+
+	/* Get kgdb spinlock */
+
+	KGDB_SPIN_LOCK(&kgdb_spinlock);
+	rdtscll(kgdb_info.entry_tsc);
+	/*
+	 * We depend on this spinlock and the NMI watch dog to control the
+	 * other cpus.	They will arrive at "in_kgdb()" as a result of the
+	 * NMI and will wait there for the following spin locks to be
+	 * released.
+	 */
+#ifdef CONFIG_SMP
+
+#if 0
+	if (cpu_callout_map & ~MAX_CPU_MASK) {
+		printk("kgdb : too many cpus, possibly not mapped"
+		       " in contiguous space, change MAX_NO_CPUS"
+		       " in kgdb_stub and make new kernel.\n"
+		       " cpu_callout_map is %lx\n", cpu_callout_map);
+		goto exit_just_unlock;
+	}
+#endif
+	if (spinlock_count == 1) {
+		int time, end_time, dum;
+		int i;
+		int cpu_logged_in[MAX_NO_CPUS] = {[0 ... MAX_NO_CPUS - 1] = (0)
+		};
+		if (remote_debug) {
+			printk("kgdb : cpu %d entry, syncing others\n",
+			       smp_processor_id());
+		}
+		for (i = 0; i < MAX_NO_CPUS; i++) {
+			/*
+			 * Use trylock as we may already hold the lock if
+			 * we are holding the cpu.  Net result is all
+			 * locked.
+			 */
+			spin_trylock(&waitlocks[i]);
+		}
+		for (i = 0; i < MAX_NO_CPUS; i++)
+			cpu_logged_in[i] = 0;
+		/*
+		 * Wait for their arrival.  We know the watch dog is active if
+		 * in_kgdb() has ever been called, as it is always called on a
+		 * watchdog tick.
+		 */
+		rdtsc(dum, time);
+		end_time = time + 2;	/* Note: we use the High order bits! */
+		i = 1;
+		if (num_online_cpus() > 1) {
+			int me_in_kgdb = in_kgdb_entry_log[smp_processor_id()];
+			smp_send_nmi_allbutself();
+			while (i < num_online_cpus() && time != end_time) {
+				int j;
+				for (j = 0; j < MAX_NO_CPUS; j++) {
+					if (waiting_cpus[j].task &&
+					    !cpu_logged_in[j]) {
+						i++;
+						cpu_logged_in[j] = 1;
+						if (remote_debug) {
+							printk
+							    ("kgdb : cpu %d arrived at kgdb\n",
+							     j);
+						}
+						break;
+					} else if (!waiting_cpus[j].task &&
+						   !cpu_online(j)) {
+						waiting_cpus[j].task = NOCPU;
+						cpu_logged_in[j] = 1;
+						waiting_cpus[j].hold = 1;
+						break;
+					}
+					if (!waiting_cpus[j].task &&
+					    in_kgdb_here_log[j]) {
+
+						int wait = 100000;
+						while (wait--) ;
+						if (!waiting_cpus[j].task &&
+						    in_kgdb_here_log[j]) {
+							printk
+							    ("kgdb : cpu %d stall"
+							     " in in_kgdb\n",
+							     j);
+							i++;
+							cpu_logged_in[j] = 1;
+							waiting_cpus[j].task =
+							    (struct task_struct
+							     *) 1;
+						}
+					}
+				}
+
+				if (in_kgdb_entry_log[smp_processor_id()] >
+				    (me_in_kgdb + 10)) {
+					break;
+				}
+
+				rdtsc(dum, time);
+			}
+			if (i < num_online_cpus()) {
+				printk
+				    ("kgdb : time out, proceeding without sync\n");
+#if 0
+				printk("kgdb : Waiting_cpus: 0 = %d, 1 = %d\n",
+				       waiting_cpus[0].task != 0,
+				       waiting_cpus[1].task != 0);
+				printk("kgdb : Cpu_logged in: 0 = %d, 1 = %d\n",
+				       cpu_logged_in[0], cpu_logged_in[1]);
+				printk
+				    ("kgdb : in_kgdb_here_log in: 0 = %d, 1 = %d\n",
+				     in_kgdb_here_log[0] != 0,
+				     in_kgdb_here_log[1] != 0);
+#endif
+				entry_state = NO_SYNC;
+			} else {
+#if 0
+				int ent =
+				    in_kgdb_entry_log[smp_processor_id()] -
+				    me_in_kgdb;
+				printk("kgdb : sync after %d entries\n", ent);
+#endif
+			}
+		} else {
+			if (remote_debug) {
+				printk
+				    ("kgdb : %d cpus, but watchdog not active\n"
+				     "proceeding without locking down other cpus\n",
+				     num_online_cpus());
+				entry_state = NO_NMI;
+			}
+		}
+	}
+#endif
+
+	if (remote_debug) {
+		printk("handle_exception(exceptionVector=%d, "
+		       "signo=%d, err_code=%d, linux_regs=%p)\n",
+		       exceptionVector, signo, err_code, linux_regs);
+		printk(" address: %lx\n", address);
+
+		if (debug_regs) {
+			print_regs(&regs);
+			show_trace(current, (unsigned long *)&regs);
+		}
+	}
+
+	/* Disable hardware debugging while we are in kgdb */
+	/* Get the debug register status register */
+/*				       *INDENT-OFF*  */
+      __asm__("movl %0,%%db7"
+	      :	/* no output */
+	      :"r"(0));
+
+	asm volatile ("movl %%db6, %0\n"
+		      :"=r" (hw_breakpoint_status)
+		      :);
+
+/*				       *INDENT-ON*  */
+	switch (exceptionVector) {
+	case 0:		/* divide error */
+	case 1:		/* debug exception */
+	case 2:		/* NMI */
+	case 3:		/* breakpoint */
+	case 4:		/* overflow */
+	case 5:		/* bounds check */
+	case 6:		/* invalid opcode */
+	case 7:		/* device not available */
+	case 8:		/* double fault (errcode) */
+	case 10:		/* invalid TSS (errcode) */
+	case 12:		/* stack fault (errcode) */
+	case 16:		/* floating point error */
+	case 17:		/* alignment check (errcode) */
+	default:		/* any undocumented */
+		break;
+	case 11:		/* segment not present (errcode) */
+	case 13:		/* general protection (errcode) */
+	case 14:		/* page fault (special errcode) */
+	case 19:		/* cache flush denied */
+		if (mem_err_expected) {
+			/*
+			 * This fault occured because of the
+			 * get_char or set_char routines.  These
+			 * two routines use either eax of edx to
+			 * indirectly reference the location in
+			 * memory that they are working with.
+			 * For a page fault, when we return the
+			 * instruction will be retried, so we
+			 * have to make sure that these
+			 * registers point to valid memory.
+			 */
+			mem_err = 1;	/* set mem error flag */
+			mem_err_expected = 0;
+			mem_err_cnt++;	/* helps in debugging */
+			/* make valid address */
+			regs.eax = (long) &garbage_loc;
+			/* make valid address */
+			regs.edx = (long) &garbage_loc;
+			if (remote_debug)
+				printk("Return after memory error: "
+				       "mem_err_cnt=%d\n", mem_err_cnt);
+			if (debug_regs)
+				print_regs(&regs);
+			goto exit_kgdb;
+		}
+		break;
+	}
+	if (remote_debug)
+		printk("kgdb : entered kgdb on cpu %d\n", smp_processor_id());
+
+	gdb_i386vector = exceptionVector;
+	gdb_i386errcode = err_code;
+	kgdb_info.called_from = __builtin_return_address(0);
+#ifdef CONFIG_SMP
+	/*
+	 * OK, we can now communicate, lets tell gdb about the sync.
+	 * but only if we had a problem.
+	 */
+	switch (entry_state) {
+	case NO_NMI:
+		to_gdb("NMI not active, other cpus not stopped\n");
+		break;
+	case NO_SYNC:
+		to_gdb("Some cpus not stopped, see 'kgdb_info' for details\n");
+	default:;
+	}
+
+#endif
+/*
+ * Set up the gdb function call area.
+ */
+	trap_cpu = smp_processor_id();
+	OLD_esp = NEW_esp = (int) (&linux_regs->esp);
+
+      IF_SMP(once_again:)
+	    /* reply to host that an exception has occurred */
+	    remcomOutBuffer[0] = 'S';
+	remcomOutBuffer[1] = hexchars[signo >> 4];
+	remcomOutBuffer[2] = hexchars[signo % 16];
+	remcomOutBuffer[3] = 0;
+
+	if (kgdb_eth_is_initializing) {
+		kgdb_eth_is_initializing = 0;
+	} else {
+		putpacket(remcomOutBuffer);
+	}
+
+	kgdb_eth_reply_arp();
+	while (1 == 1) {
+		error = 0;
+		remcomOutBuffer[0] = 0;
+		getpacket(remcomInBuffer);
+		switch (remcomInBuffer[0]) {
+		case '?':
+			remcomOutBuffer[0] = 'S';
+			remcomOutBuffer[1] = hexchars[signo >> 4];
+			remcomOutBuffer[2] = hexchars[signo % 16];
+			remcomOutBuffer[3] = 0;
+			break;
+		case 'd':
+			remote_debug = !(remote_debug);	/* toggle debug flag */
+			printk("Remote debug %s\n",
+			       remote_debug ? "on" : "off");
+			break;
+		case 'g':	/* return the value of the CPU registers */
+			get_gdb_regs(usethread, &regs, gdb_regs);
+			mem2hex((char *) gdb_regs,
+				remcomOutBuffer, NUMREGBYTES, 0);
+			break;
+		case 'G':	/* set the value of the CPU registers - return OK */
+			hex2mem(&remcomInBuffer[1],
+				(char *) gdb_regs, NUMREGBYTES, 0);
+			if (!usethread || usethread == current) {
+				gdb_regs_to_regs(gdb_regs, &regs);
+				strcpy(remcomOutBuffer, "OK");
+			} else {
+				strcpy(remcomOutBuffer, "E00");
+			}
+			break;
+
+		case 'P':{	/* set the value of a single CPU register -
+				   return OK */
+				/*
+				 * For some reason, gdb wants to talk about psudo
+				 * registers (greater than 15).	 These may have
+				 * meaning for ptrace, but for us it is safe to
+				 * ignor them.	We do this by dumping them into
+				 * _GS which we also ignor, but do have memory for.
+				 */
+				int regno;
+
+				ptr = &remcomInBuffer[1];
+				regs_to_gdb_regs(gdb_regs, &regs);
+				if ((!usethread || usethread == current) &&
+				    hexToInt(&ptr, &regno) &&
+				    *ptr++ == '=' && (regno >= 0)) {
+					regno =
+					    (regno >= NUMREGS ? _GS : regno);
+					hex2mem(ptr, (char *) &gdb_regs[regno],
+						4, 0);
+					gdb_regs_to_regs(gdb_regs, &regs);
+					strcpy(remcomOutBuffer, "OK");
+					break;
+				}
+				strcpy(remcomOutBuffer, "E01");
+				break;
+			}
+
+			/* mAA..AA,LLLL	 Read LLLL bytes at address AA..AA */
+		case 'm':
+			/* TRY TO READ %x,%x.  IF SUCCEED, SET PTR = 0 */
+			ptr = &remcomInBuffer[1];
+			if (hexToInt(&ptr, &addr) &&
+			    (*(ptr++) == ',') && (hexToInt(&ptr, &length))) {
+				ptr = 0;
+				/*
+				 * hex doubles the byte count
+				 */
+				if (length > (BUFMAX / 2))
+					length = BUFMAX / 2;
+				mem2hex((char *) addr,
+					remcomOutBuffer, length, 1);
+				if (mem_err) {
+					strcpy(remcomOutBuffer, "E03");
+					debug_error("memory fault\n", NULL);
+				}
+			}
+
+			if (ptr) {
+				strcpy(remcomOutBuffer, "E01");
+				debug_error
+				    ("malformed read memory command: %s\n",
+				     remcomInBuffer);
+			}
+			break;
+
+			/* MAA..AA,LLLL:
+			   Write LLLL bytes at address AA.AA return OK */
+		case 'M':
+			/* TRY TO READ '%x,%x:'.  IF SUCCEED, SET PTR = 0 */
+			ptr = &remcomInBuffer[1];
+			if (hexToInt(&ptr, &addr) &&
+			    (*(ptr++) == ',') &&
+			    (hexToInt(&ptr, &length)) && (*(ptr++) == ':')) {
+				hex2mem(ptr, (char *) addr, length, 1);
+
+				if (mem_err) {
+					strcpy(remcomOutBuffer, "E03");
+					debug_error("memory fault\n", NULL);
+				} else {
+					strcpy(remcomOutBuffer, "OK");
+				}
+
+				ptr = 0;
+			}
+			if (ptr) {
+				strcpy(remcomOutBuffer, "E02");
+				debug_error
+				    ("malformed write memory command: %s\n",
+				     remcomInBuffer);
+			}
+			break;
+		case 'S':
+			remcomInBuffer[0] = 's';
+		case 'C':
+			/* Csig;AA..AA where ;AA..AA is optional
+			 * continue with signal
+			 * Since signals are meaning less to us, delete that
+			 * part and then fall into the 'c' code.
+			 */
+			ptr = &remcomInBuffer[1];
+			length = 2;
+			while (*ptr && *ptr != ';') {
+				length++;
+				ptr++;
+			}
+			if (*ptr) {
+				do {
+					ptr++;
+					*(ptr - length++) = *ptr;
+				} while (*ptr);
+			} else {
+				remcomInBuffer[1] = 0;
+			}
+
+			/* cAA..AA  Continue at address AA..AA(optional) */
+			/* sAA..AA  Step one instruction from AA..AA(optional) */
+			/* D	    detach, reply OK and then continue */
+		case 'c':
+		case 's':
+		case 'D':
+
+			/* try to read optional parameter,
+			   pc unchanged if no parm */
+			ptr = &remcomInBuffer[1];
+			if (hexToInt(&ptr, &addr)) {
+				if (remote_debug)
+					printk("Changing EIP to 0x%x\n", addr);
+
+				regs.eip = addr;
+			}
+
+			newPC = regs.eip;
+
+			if (kgdb_eth != -1) {
+				kgdb_eth_set_trapmode(0);
+			}
+
+			/* clear the trace bit */
+			regs.eflags &= 0xfffffeff;
+
+			/* set the trace bit if we're stepping */
+			if (remcomInBuffer[0] == 's')
+				regs.eflags |= 0x100;
+
+			/* detach is a friendly version of continue. Note that
+			   debugging is still enabled (e.g hit control C)
+			 */
+			if (remcomInBuffer[0] == 'D') {
+				strcpy(remcomOutBuffer, "OK");
+				putpacket(remcomOutBuffer);
+			}
+
+			if (remote_debug) {
+				printk("Resuming execution\n");
+				print_regs(&regs);
+			}
+			asm volatile ("movl %%db6, %0\n":"=r" (dr6)
+				      :);
+			if (!(dr6 & 0x4000)) {
+				for (breakno = 0; breakno < 4; ++breakno) {
+					if (dr6 & (1 << breakno) &&
+					    (breakinfo[breakno].type == 0)) {
+						/* Set restore flag */
+						regs.eflags |= 0x10000;
+						break;
+					}
+				}
+			}
+			correct_hw_break();
+			asm volatile ("movl %0, %%db6\n"::"r" (0));
+			goto exit_kgdb;
+
+			/* kill the program */
+		case 'k':	/* do nothing */
+			break;
+
+			/* query */
+		case 'q':
+			nothreads = 0;
+			switch (remcomInBuffer[1]) {
+			case 'f':
+				threadid = 1;
+				thread_list = 2;
+				thread_list_start = (usethread ? : current);
+			case 's':
+				if (!cmp_str(&remcomInBuffer[2],
+					     "ThreadInfo", 10))
+					break;
+
+				remcomOutBuffer[nothreads++] = 'm';
+				for (; threadid < PID_MAX + MAX_NO_CPUS;
+				     threadid++) {
+					thread = getthread(threadid);
+					if (thread) {
+						nothreads += int_to_hex_v(
+							&remcomOutBuffer[
+								nothreads],
+							threadid);
+						if (thread_min > threadid)
+							thread_min = threadid;
+						remcomOutBuffer[
+							nothreads] = ',';
+						nothreads++;
+						if (nothreads > BUFMAX - 10)
+							break;
+					}
+				}
+				if (remcomOutBuffer[nothreads - 1] == 'm') {
+					remcomOutBuffer[nothreads - 1] = 'l';
+				} else {
+					nothreads--;
+				}
+				remcomOutBuffer[nothreads] = 0;
+				break;
+
+#ifdef old_thread_list /* Old thread info request */
+			case 'L':
+				/* List threads */
+				thread_list = 2;
+				thread_list_start = (usethread ? : current);
+				unpack_byte(remcomInBuffer + 3, &maxthreads);
+				unpack_threadid(remcomInBuffer + 5, &thref);
+				do {
+					int buf_thread_limit =
+					    (BUFMAX - 22) / BUF_THREAD_ID_SIZE;
+					if (maxthreads > buf_thread_limit) {
+						maxthreads = buf_thread_limit;
+					}
+				} while (0);
+				remcomOutBuffer[0] = 'q';
+				remcomOutBuffer[1] = 'M';
+				remcomOutBuffer[4] = '0';
+				pack_threadid(remcomOutBuffer + 5, &thref);
+
+				threadid = threadref_to_int(&thref);
+				for (nothreads = 0;
+				     nothreads < maxthreads &&
+				     threadid < PID_MAX + MAX_NO_CPUS;
+				     threadid++) {
+					thread = getthread(threadid);
+					if (thread) {
+						int_to_threadref(&thref,
+								 threadid);
+						pack_threadid(remcomOutBuffer +
+							      21 +
+							      nothreads * 16,
+							      &thref);
+						nothreads++;
+						if (thread_min > threadid)
+							thread_min = threadid;
+					}
+				}
+
+				if (threadid == PID_MAX + MAX_NO_CPUS) {
+					remcomOutBuffer[4] = '1';
+				}
+				pack_hex_byte(remcomOutBuffer + 2, nothreads);
+				remcomOutBuffer[21 + nothreads * 16] = '\0';
+				break;
+#endif
+			case 'C':
+				/* Current thread id */
+				remcomOutBuffer[0] = 'Q';
+				remcomOutBuffer[1] = 'C';
+				threadid = current->pid;
+				if (!threadid) {
+					/*
+					 * idle thread
+					 */
+					for (threadid = PID_MAX;
+					     threadid < PID_MAX + MAX_NO_CPUS;
+					     threadid++) {
+						if (current ==
+						    idle_task(threadid -
+							      PID_MAX))
+							break;
+					}
+				}
+				int_to_threadref(&thref, threadid);
+				pack_threadid(remcomOutBuffer + 2, &thref);
+				remcomOutBuffer[18] = '\0';
+				break;
+
+			case 'E':
+				/* Print exception info */
+				printexceptioninfo(exceptionVector,
+						   err_code, remcomOutBuffer);
+				break;
+			case 'T':{
+				char * nptr;
+				/* Thread extra info */
+				if (!cmp_str(&remcomInBuffer[2],
+					    "hreadExtraInfo,", 15)) {
+					break;
+				}
+				ptr = &remcomInBuffer[17];
+				hexToInt(&ptr, &threadid);
+				thread = getthread(threadid);
+				nptr = &thread->comm[0];
+				length = 0;
+				ptr = &remcomOutBuffer[0];
+				do {
+					length++;
+					ptr = pack_hex_byte(ptr, *nptr++);
+				 } while (*nptr && length < 16);
+				/*
+				 * would like that 16 to be the size of
+				 * task_struct.comm but don't know the
+				 * syntax..
+				 */
+				*ptr = 0;
+			}
+			}
+			break;
+
+			/* task related */
+		case 'H':
+			switch (remcomInBuffer[1]) {
+			case 'g':
+				ptr = &remcomInBuffer[2];
+				hexToInt(&ptr, &threadid);
+				thread = getthread(threadid);
+				if (!thread) {
+					remcomOutBuffer[0] = 'E';
+					remcomOutBuffer[1] = '\0';
+					break;
+				}
+				/*
+				 * Just in case I forget what this is all about,
+				 * the "thread info" command to gdb causes it
+				 * to ask for a thread list.  It then switches
+				 * to each thread and asks for the registers.
+				 * For this (and only this) usage, we want to
+				 * fudge the registers of tasks not on the run
+				 * list (i.e. waiting) to show the routine that
+				 * called schedule. Also, gdb, is a minimalist
+				 * in that if the current thread is the last
+				 * it will not re-read the info when done.
+				 * This means that in this case we must show
+				 * the real registers. So here is how we do it:
+				 * Each entry we keep track of the min
+				 * thread in the list (the last that gdb will)
+				 * get info for.  We also keep track of the
+				 * starting thread.
+				 * "thread_list" is cleared when switching back
+				 * to the min thread if it is was current, or
+				 * if it was not current, thread_list is set
+				 * to 1.  When the switch to current comes,
+				 * if thread_list is 1, clear it, else do
+				 * nothing.
+				 */
+				usethread = thread;
+				if ((thread_list == 1) &&
+				    (thread == thread_list_start)) {
+					thread_list = 0;
+				}
+				if (thread_list && (threadid == thread_min)) {
+					if (thread == thread_list_start) {
+						thread_list = 0;
+					} else {
+						thread_list = 1;
+					}
+				}
+				/* follow through */
+			case 'c':
+				remcomOutBuffer[0] = 'O';
+				remcomOutBuffer[1] = 'K';
+				remcomOutBuffer[2] = '\0';
+				break;
+			}
+			break;
+
+			/* Query thread status */
+		case 'T':
+			ptr = &remcomInBuffer[1];
+			hexToInt(&ptr, &threadid);
+			thread = getthread(threadid);
+			if (thread) {
+				remcomOutBuffer[0] = 'O';
+				remcomOutBuffer[1] = 'K';
+				remcomOutBuffer[2] = '\0';
+				if (thread_min > threadid)
+					thread_min = threadid;
+			} else {
+				remcomOutBuffer[0] = 'E';
+				remcomOutBuffer[1] = '\0';
+			}
+			break;
+
+		case 'Y': /* set up a hardware breakpoint */
+			ptr = &remcomInBuffer[1];
+			hexToInt(&ptr, &breakno);
+			ptr++;
+			hexToInt(&ptr, &breaktype);
+			ptr++;
+			hexToInt(&ptr, &length);
+			ptr++;
+			hexToInt(&ptr, &addr);
+			if (set_hw_break(breakno & 0x3,
+					 breaktype & 0x3,
+					 length & 0x3, addr) == 0) {
+				strcpy(remcomOutBuffer, "OK");
+			} else {
+				strcpy(remcomOutBuffer, "ERROR");
+			}
+			break;
+
+			/* Remove hardware breakpoint */
+		case 'y':
+			ptr = &remcomInBuffer[1];
+			hexToInt(&ptr, &breakno);
+			if (remove_hw_break(breakno & 0x3) == 0) {
+				strcpy(remcomOutBuffer, "OK");
+			} else {
+				strcpy(remcomOutBuffer, "ERROR");
+			}
+			break;
+
+		case 'r':	/* reboot */
+			strcpy(remcomOutBuffer, "OK");
+			putpacket(remcomOutBuffer);
+			/*to_gdb("Rebooting\n"); */
+			/* triplefault	 no return from here */
+			{
+				static long no_idt[2];
+				__asm__ __volatile__("lidt %0"::"m"(no_idt[0]));
+				BREAKPOINT;
+			}
+
+		}		/* switch */
+
+		/* reply to the request */
+		putpacket(remcomOutBuffer);
+	}			/* while(1==1) */
+	/*
+	 *  reached by goto only.
+	 */
+      exit_kgdb:
+	/*
+	 * Here is where we set up to trap a gdb function call.	 NEW_esp
+	 * will be changed if we are trying to do this.	 We handle both
+	 * adding and subtracting, thus allowing gdb to put grung on
+	 * the stack which it removes later.
+	 */
+	if (NEW_esp != OLD_esp) {
+		int *ptr = END_OF_LOOKASIDE;
+		if (NEW_esp < OLD_esp)
+			ptr -= (OLD_esp - NEW_esp) / sizeof (int);
+		*--ptr = linux_regs->eflags;
+		*--ptr = linux_regs->xcs;
+		*--ptr = linux_regs->eip;
+		*--ptr = linux_regs->ecx;
+		*--ptr = linux_regs->ebx;
+		*--ptr = linux_regs->eax;
+		linux_regs->ecx = NEW_esp - (sizeof (int) * 6);
+		linux_regs->ebx = (unsigned int) END_OF_LOOKASIDE;
+		if (NEW_esp < OLD_esp) {
+			linux_regs->eip = (unsigned int) fn_call_stub;
+		} else {
+			linux_regs->eip = (unsigned int) fn_rtn_stub;
+			linux_regs->eax = NEW_esp;
+		}
+		linux_regs->eflags &= ~(IF_BIT | TF_BIT);
+	}
+#ifdef CONFIG_SMP
+	/*
+	 * Release gdb wait locks
+	 * Sanity check time.  Must have at least one cpu to run.  Also single
+	 * step must not be done if the current cpu is on hold.
+	 */
+	if (spinlock_count == 1) {
+		int ss_hold = (regs.eflags & 0x100) && kgdb_info.hold_on_sstep;
+		int cpu_avail = 0;
+		int i;
+
+		for (i = 0; i < MAX_NO_CPUS; i++) {
+			if (!cpu_online(i))
+				break;
+			if (!hold_cpu(i)) {
+				cpu_avail = 1;
+			}
+		}
+		/*
+		 * Early in the bring up there will be NO cpus on line...
+		 */
+		if (!cpu_avail && !cpus_empty(cpu_online_map)) {
+			to_gdb("No cpus unblocked, see 'kgdb_info.hold_cpu'\n");
+			goto once_again;
+		}
+		if (hold_cpu(smp_processor_id()) && (regs.eflags & 0x100)) {
+			to_gdb
+			    ("Current cpu must be unblocked to single step\n");
+			goto once_again;
+		}
+		if (!(ss_hold)) {
+			int i;
+			for (i = 0; i < MAX_NO_CPUS; i++) {
+				if (!hold_cpu(i)) {
+					spin_unlock(&waitlocks[i]);
+				}
+			}
+		} else {
+			spin_unlock(&waitlocks[smp_processor_id()]);
+		}
+		/* Release kgdb spinlock */
+		KGDB_SPIN_UNLOCK(&kgdb_spinlock);
+		/*
+		 * If this cpu is on hold, this is where we
+		 * do it.  Note, the NMI will pull us out of here,
+		 * but will return as the above lock is not held.
+		 * We will stay here till another cpu releases the lock for us.
+		 */
+		spin_unlock_wait(waitlocks + smp_processor_id());
+		kgdb_local_irq_restore(flags);
+		return (0);
+	}
+#if 0
+exit_just_unlock:
+#endif
+#endif
+	/* Release kgdb spinlock */
+	KGDB_SPIN_UNLOCK(&kgdb_spinlock);
+	kgdb_local_irq_restore(flags);
+	return (0);
+}
+
+/* this function is used to set up exception handlers for tracing and
+ * breakpoints.
+ * This function is not needed as the above line does all that is needed.
+ * We leave it for backward compatitability...
+ */
+void
+set_debug_traps(void)
+{
+	/*
+	 * linux_debug_hook is defined in traps.c.  We store a pointer
+	 * to our own exception handler into it.
+
+	 * But really folks, every hear of labeled common, an old Fortran
+	 * concept.  Lots of folks can reference it and it is define if
+	 * anyone does.	 Only one can initialize it at link time.  We do
+	 * this with the hook.	See the statement above.  No need for any
+	 * executable code and it is ready as soon as the kernel is
+	 * loaded.  Very desirable in kernel debugging.
+
+	 linux_debug_hook = handle_exception ;
+	 */
+
+	/* In case GDB is started before us, ack any packets (presumably
+	   "$?#xx") sitting there.
+	   putDebugChar ('+');
+
+	   initialized = 1;
+	 */
+}
+
+/* This function will generate a breakpoint exception.	It is used at the
+   beginning of a program to sync up with a debugger and can be used
+   otherwise as a quick means to stop program execution and "break" into
+   the debugger. */
+/* But really, just use the BREAKPOINT macro.  We will handle the int stuff
+ */
+
+#ifdef later
+/*
+ * possibly we should not go thru the traps.c code at all?  Someday.
+ */
+void
+do_kgdb_int3(struct pt_regs *regs, long error_code)
+{
+	kgdb_handle_exception(3, 5, error_code, regs);
+	return;
+}
+#endif
+#undef regs
+#ifdef CONFIG_TRAP_BAD_SYSCALL_EXITS
+asmlinkage void
+bad_sys_call_exit(int stuff)
+{
+	struct pt_regs *regs = (struct pt_regs *) &stuff;
+	printk("Sys call %d return with %x preempt_count\n",
+	       (int) regs->orig_eax, preempt_count());
+}
+#endif
+#ifdef CONFIG_STACK_OVERFLOW_TEST
+#include <asm/kgdb.h>
+asmlinkage void
+stack_overflow(void)
+{
+#ifdef BREAKPOINT
+	BREAKPOINT;
+#else
+	printk("Kernel stack overflow, looping forever\n");
+#endif
+	while (1) {
+	}
+}
+#endif
+
+#if defined(CONFIG_SMP) || defined(CONFIG_KGDB_CONSOLE)
+char gdbconbuf[BUFMAX];
+
+static void
+kgdb_gdb_message(const char *s, unsigned count)
+{
+	int i;
+	int wcount;
+	char *bufptr;
+	/*
+	 * This takes care of NMI while spining out chars to gdb
+	 */
+	IF_SMP(in_kgdb_console = 1);
+	gdbconbuf[0] = 'O';
+	bufptr = gdbconbuf + 1;
+	while (count > 0) {
+		if ((count << 1) > (BUFMAX - 2)) {
+			wcount = (BUFMAX - 2) >> 1;
+		} else {
+			wcount = count;
+		}
+		count -= wcount;
+		for (i = 0; i < wcount; i++) {
+			bufptr = pack_hex_byte(bufptr, s[i]);
+		}
+		*bufptr = '\0';
+		s += wcount;
+
+		putpacket(gdbconbuf);
+
+	}
+	IF_SMP(in_kgdb_console = 0);
+}
+#endif
+#ifdef CONFIG_SMP
+static void
+to_gdb(const char *s)
+{
+	int count = 0;
+	while (s[count] && (count++ < BUFMAX)) ;
+	kgdb_gdb_message(s, count);
+}
+#endif
+#ifdef CONFIG_KGDB_CONSOLE
+#include <linux/console.h>
+#include <linux/init.h>
+#include <linux/fs.h>
+#include <asm/uaccess.h>
+#include <asm/semaphore.h>
+
+void
+kgdb_console_write(struct console *co, const char *s, unsigned count)
+{
+
+	if (gdb_i386vector == -1) {
+		/*
+		 * We have not yet talked to gdb.  What to do...
+		 * lets break, on continue we can do the write.
+		 * But first tell him whats up. Uh, well no can do,
+		 * as this IS the console.  Oh well...
+		 * We do need to wait or the messages will be lost.
+		 * Other option would be to tell the above code to
+		 * ignore this breakpoint and do an auto return,
+		 * but that might confuse gdb.	Also this happens
+		 * early enough in boot up that we don't have the traps
+		 * set up yet, so...
+		 */
+		breakpoint();
+	}
+	kgdb_gdb_message(s, count);
+}
+
+/*
+ * ------------------------------------------------------------
+ * Serial KGDB driver
+ * ------------------------------------------------------------
+ */
+
+static struct console kgdbcons = {
+	name:"kgdb",
+	write:kgdb_console_write,
+#ifdef CONFIG_KGDB_USER_CONSOLE
+	device:kgdb_console_device,
+#endif
+	flags:CON_PRINTBUFFER | CON_ENABLED,
+	index:-1,
+};
+
+/*
+ * The trick here is that this file gets linked before printk.o
+ * That means we get to peer at the console info in the command
+ * line before it does.	 If we are up, we register, otherwise,
+ * do nothing.	By returning 0, we allow printk to look also.
+ */
+static int kgdb_console_enabled;
+
+int __init
+kgdb_console_init(char *str)
+{
+	if ((strncmp(str, "kgdb", 4) == 0) || (strncmp(str, "gdb", 3) == 0)) {
+		register_console(&kgdbcons);
+		kgdb_console_enabled = 1;
+	}
+	return 0;		/* let others look at the string */
+}
+
+__setup("console=", kgdb_console_init);
+
+#ifdef CONFIG_KGDB_USER_CONSOLE
+static kdev_t kgdb_console_device(struct console *c);
+/* This stuff sort of works, but it knocks out telnet devices
+ * we are leaving it here in case we (or you) find time to figure it out
+ * better..
+ */
+
+/*
+ * We need a real char device as well for when the console is opened for user
+ * space activities.
+ */
+
+static int
+kgdb_consdev_open(struct inode *inode, struct file *file)
+{
+	return 0;
+}
+
+static ssize_t
+kgdb_consdev_write(struct file *file, const char *buf,
+		   size_t count, loff_t * ppos)
+{
+	int size, ret = 0;
+	static char kbuf[128];
+	static DECLARE_MUTEX(sem);
+
+	/* We are not reentrant... */
+	if (down_interruptible(&sem))
+		return -ERESTARTSYS;
+
+	while (count > 0) {
+		/* need to copy the data from user space */
+		size = count;
+		if (size > sizeof (kbuf))
+			size = sizeof (kbuf);
+		if (copy_from_user(kbuf, buf, size)) {
+			ret = -EFAULT;
+			break;;
+		}
+		kgdb_console_write(&kgdbcons, kbuf, size);
+		count -= size;
+		ret += size;
+		buf += size;
+	}
+
+	up(&sem);
+
+	return ret;
+}
+
+struct file_operations kgdb_consdev_fops = {
+	open:kgdb_consdev_open,
+	write:kgdb_consdev_write
+};
+static kdev_t
+kgdb_console_device(struct console *c)
+{
+	return MKDEV(TTYAUX_MAJOR, 1);
+}
+
+/*
+ * This routine gets called from the serial stub in the i386/lib
+ * This is so it is done late in bring up (just before the console open).
+ */
+void
+kgdb_console_finit(void)
+{
+	if (kgdb_console_enabled) {
+		char *cptr = cdevname(MKDEV(TTYAUX_MAJOR, 1));
+		char *cp = cptr;
+		while (*cptr && *cptr != '(')
+			cptr++;
+		*cptr = 0;
+		unregister_chrdev(TTYAUX_MAJOR, cp);
+		register_chrdev(TTYAUX_MAJOR, "kgdb", &kgdb_consdev_fops);
+	}
+}
+#endif
+#endif
+#ifdef CONFIG_KGDB_TS
+#include <asm/msr.h>		/* time stamp code */
+#include <asm/hardirq.h>	/* in_interrupt */
+#ifdef CONFIG_KGDB_TS_64
+#define DATA_POINTS 64
+#endif
+#ifdef CONFIG_KGDB_TS_128
+#define DATA_POINTS 128
+#endif
+#ifdef CONFIG_KGDB_TS_256
+#define DATA_POINTS 256
+#endif
+#ifdef CONFIG_KGDB_TS_512
+#define DATA_POINTS 512
+#endif
+#ifdef CONFIG_KGDB_TS_1024
+#define DATA_POINTS 1024
+#endif
+#ifndef DATA_POINTS
+#define DATA_POINTS 128		/* must be a power of two */
+#endif
+#define INDEX_MASK (DATA_POINTS - 1)
+#if (INDEX_MASK & DATA_POINTS)
+#error "CONFIG_KGDB_TS_COUNT must be a power of 2"
+#endif
+struct kgdb_and_then_struct {
+#ifdef CONFIG_SMP
+	int on_cpu;
+#endif
+	struct task_struct *task;
+	long long at_time;
+	int from_ln;
+	char *in_src;
+	void *from;
+	int *with_shpf;
+	int data0;
+	int data1;
+};
+struct kgdb_and_then_struct2 {
+#ifdef CONFIG_SMP
+	int on_cpu;
+#endif
+	struct task_struct *task;
+	long long at_time;
+	int from_ln;
+	char *in_src;
+	void *from;
+	int *with_shpf;
+	struct task_struct *t1;
+	struct task_struct *t2;
+};
+struct kgdb_and_then_struct kgdb_data[DATA_POINTS];
+
+struct kgdb_and_then_struct *kgdb_and_then = &kgdb_data[0];
+int kgdb_and_then_count;
+
+void
+kgdb_tstamp(int line, char *source, int data0, int data1)
+{
+	static spinlock_t ts_spin = SPIN_LOCK_UNLOCKED;
+	int flags;
+	kgdb_local_irq_save(flags);
+	spin_lock(&ts_spin);
+	rdtscll(kgdb_and_then->at_time);
+#ifdef CONFIG_SMP
+	kgdb_and_then->on_cpu = smp_processor_id();
+#endif
+	kgdb_and_then->task = current;
+	kgdb_and_then->from_ln = line;
+	kgdb_and_then->in_src = source;
+	kgdb_and_then->from = __builtin_return_address(0);
+	kgdb_and_then->with_shpf = (int *) (((flags & IF_BIT) >> 9) |
+					    (preempt_count() << 8));
+	kgdb_and_then->data0 = data0;
+	kgdb_and_then->data1 = data1;
+	kgdb_and_then = &kgdb_data[++kgdb_and_then_count & INDEX_MASK];
+	spin_unlock(&ts_spin);
+	kgdb_local_irq_restore(flags);
+#ifdef CONFIG_PREEMPT
+
+#endif
+	return;
+}
+#endif
+typedef int gdb_debug_hook(int exceptionVector,
+			   int signo, int err_code, struct pt_regs *linux_regs);
+gdb_debug_hook *linux_debug_hook = &kgdb_handle_exception;	/* histerical reasons... */
+
+static int __init kgdb_opt_kgdbeth(char *str)
+{
+	kgdb_eth = simple_strtoul(str, NULL, 10);
+	return 1;
+}
+
+static int __init kgdb_opt_kgdbeth_remoteip(char *str)
+{
+	kgdb_remoteip = in_aton(str);
+	return 1;
+}
+
+static int __init kgdb_opt_kgdbeth_listenport(char *str)
+{
+	kgdb_listenport = simple_strtoul(str, NULL, 10);
+	kgdb_sendport = kgdb_listenport - 1;
+	return 1;
+}
+
+static int __init parse_hw_addr(char *str, unsigned char *addr)
+{
+	int  i;
+	char *p;
+
+	p = str;
+	i = 0;
+	while(1)
+	{
+		unsigned int c;
+
+		sscanf(p, "%x:", &c);
+		addr[i++] = c;
+		while((*p != 0) && (*p != ':')) {
+			p++;
+		}
+		if (*p == 0) {
+			break;
+		}
+		p++;
+	}
+
+	return 1;
+}
+
+static int __init kgdb_opt_kgdbeth_remotemac(char *str)
+{
+	return parse_hw_addr(str, kgdb_remotemac);
+}
+static int __init kgdb_opt_kgdbeth_localmac(char *str)
+{
+	return parse_hw_addr(str, kgdb_localmac);
+}
+
+
+__setup("gdbeth=", kgdb_opt_kgdbeth);
+__setup("gdbeth_remoteip=", kgdb_opt_kgdbeth_remoteip);
+__setup("gdbeth_listenport=", kgdb_opt_kgdbeth_listenport);
+__setup("gdbeth_remotemac=", kgdb_opt_kgdbeth_remotemac);
+__setup("gdbeth_localmac=", kgdb_opt_kgdbeth_localmac);
+
--- diff/arch/i386/kernel/timers/timer_pm.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/i386/kernel/timers/timer_pm.c	2003-12-29 09:30:38.000000000 +0000
@@ -0,0 +1,203 @@
+/*
+ * (C) Dominik Brodowski <linux@brodo.de> 2003
+ *
+ * Driver to use the Power Management Timer (PMTMR) available in some
+ * southbridges as primary timing source for the Linux kernel.
+ *
+ * Based on parts of linux/drivers/acpi/hardware/hwtimer.c, timer_pit.c,
+ * timer_hpet.c, and on Arjan van de Ven's implementation for 2.4.
+ *
+ * This file is licensed under the GPL v2.
+ */
+
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/device.h>
+#include <linux/init.h>
+#include <asm/types.h>
+#include <asm/timer.h>
+#include <asm/smp.h>
+#include <asm/io.h>
+#include <asm/arch_hooks.h>
+
+
+/* The I/O port the PMTMR resides at.
+ * The location is detected during setup_arch(),
+ * in arch/i386/acpi/boot.c */
+u32 pmtmr_ioport = 0;
+
+
+/* value of the Power timer at last timer interrupt */
+static u32 offset_tick;
+static u32 offset_delay;
+
+static unsigned long long monotonic_base;
+static seqlock_t monotonic_lock = SEQLOCK_UNLOCKED;
+
+#define ACPI_PM_MASK 0xFFFFFF /* limit it to 24 bits */
+
+static int init_pmtmr(char* override)
+{
+	u32 value1, value2;
+	unsigned int i;
+
+ 	if (override[0] && strncmp(override,"pmtmr",5))
+		return -ENODEV;
+
+	if (!pmtmr_ioport)
+		return -ENODEV;
+
+	/* "verify" this timing source */
+	value1 = inl(pmtmr_ioport);
+	value1 &= ACPI_PM_MASK;
+	for (i=0; i < 10000; i++) {
+		value2 = inl(pmtmr_ioport);
+		value2 &= ACPI_PM_MASK;
+		if (value2 == value1)
+			continue;
+		if (value2 > value1)
+			goto pm_good;
+		if ((value2 < value1) && ((value2) < 0xFFF))
+			goto pm_good;
+		printk(KERN_INFO "PM-Timer had inconsistent results: 0x%#x, 0x%#x - aborting.\n", value1, value2);
+		return -EINVAL;
+	}
+	printk(KERN_INFO "PM-Timer had no reasonable result: 0x%#x - aborting.\n", value1);
+	return -ENODEV;
+
+pm_good:
+	init_cpu_khz();
+	return 0;
+}
+
+static inline u32 cyc2us(u32 cycles)
+{
+	/* The Power Management Timer ticks at 3.579545 ticks per microsecond.
+	 * 1 / PM_TIMER_FREQUENCY == 0.27936511 =~ 286/1024 [error: 0.024%]
+	 *
+	 * Even with HZ = 100, delta is at maximum 35796 ticks, so it can
+	 * easily be multiplied with 286 (=0x11E) without having to fear
+	 * u32 overflows.
+	 */
+	cycles *= 286;
+	return (cycles >> 10);
+}
+
+/*
+ * this gets called during each timer interrupt
+ *   - Called while holding the writer xtime_lock
+ */
+static void mark_offset_pmtmr(void)
+{
+	u32 lost, delta, last_offset;
+	static int first_run = 1;
+	last_offset = offset_tick;
+
+	write_seqlock(&monotonic_lock);
+
+	offset_tick = inl(pmtmr_ioport);
+	offset_tick &= ACPI_PM_MASK; /* limit it to 24 bits */
+
+	/* calculate tick interval */
+	delta = (offset_tick - last_offset) & ACPI_PM_MASK;
+
+	/* convert to usecs */
+	delta = cyc2us(delta);
+
+	/* update the monotonic base value */
+	monotonic_base += delta*NSEC_PER_USEC;
+	write_sequnlock(&monotonic_lock);
+
+	/* convert to ticks */
+	delta += offset_delay;
+	lost = delta/(USEC_PER_SEC/HZ);
+	offset_delay = delta%(USEC_PER_SEC/HZ);
+
+
+	/* compensate for lost ticks */
+	if (lost >= 2)
+		jiffies += lost - 1;
+
+	/* don't calculate delay for first run,
+	   or if we've got less then a tick */
+	if (first_run || (lost < 1)) {
+		first_run = 0;
+		offset_delay = 0;
+	}
+
+	return;
+}
+
+
+static unsigned long long monotonic_clock_pmtmr(void)
+{
+	u32 last_offset, this_offset;
+	unsigned long long base, ret;
+	unsigned seq;
+
+
+	/* atomically read monotonic base & last_offset */
+	do {
+		seq = read_seqbegin(&monotonic_lock);
+		last_offset = offset_tick;
+		base = monotonic_base;
+	} while (read_seqretry(&monotonic_lock, seq));
+
+	/* Read the pmtmr */
+	this_offset =  inl(pmtmr_ioport) & ACPI_PM_MASK;
+
+	/* convert to nanoseconds */
+	ret = (this_offset - last_offset) & ACPI_PM_MASK;
+	ret = base + (cyc2us(ret)*NSEC_PER_USEC);
+	return ret;
+}
+
+/*
+ * copied from delay_pit
+ */
+static void delay_pmtmr(unsigned long loops)
+{
+	int d0;
+	__asm__ __volatile__(
+		"\tjmp 1f\n"
+		".align 16\n"
+		"1:\tjmp 2f\n"
+		".align 16\n"
+		"2:\tdecl %0\n\tjns 2b"
+		:"=&a" (d0)
+		:"0" (loops));
+}
+
+
+/*
+ * get the offset (in microseconds) from the last call to mark_offset()
+ *	- Called holding a reader xtime_lock
+ */
+static unsigned long get_offset_pmtmr(void)
+{
+	u32 now, offset, delta = 0;
+
+	offset = offset_tick;
+	now = inl(pmtmr_ioport);
+	now &= ACPI_PM_MASK;
+	delta = (now - offset)&ACPI_PM_MASK;
+
+	return (unsigned long) offset_delay + cyc2us(delta);
+}
+
+
+/* acpi timer_opts struct */
+struct timer_opts timer_pmtmr = {
+	.name			= "acpi_pm_timer",
+	.init 			= init_pmtmr,
+	.mark_offset		= mark_offset_pmtmr,
+	.get_offset		= get_offset_pmtmr,
+	.monotonic_clock 	= monotonic_clock_pmtmr,
+	.delay 			= delay_pmtmr,
+};
+
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Dominik Brodowski <linux@brodo.de>");
+MODULE_DESCRIPTION("Power Management Timer (PMTMR) as primary timing source for x86");
--- diff/arch/i386/lib/kgdb_serial.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/i386/lib/kgdb_serial.c	2003-12-29 09:30:38.000000000 +0000
@@ -0,0 +1,499 @@
+/*
+ * Serial interface GDB stub
+ *
+ * Written (hacked together) by David Grothe (dave@gcom.com)
+ * Modified to allow invokation early in boot see also
+ * kgdb.h for instructions by George Anzinger(george@mvista.com)
+ * Modified to handle debugging over ethernet by Robert Walsh
+ * <rjwalsh@durables.org> and wangdi <wangdi@clusterfs.com>, based on
+ * code by San Mehat.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/errno.h>
+#include <linux/signal.h>
+#include <linux/sched.h>
+#include <linux/timer.h>
+#include <linux/interrupt.h>
+#include <linux/tty.h>
+#include <linux/tty_flip.h>
+#include <linux/serial.h>
+#include <linux/serial_reg.h>
+#include <linux/config.h>
+#include <linux/major.h>
+#include <linux/string.h>
+#include <linux/fcntl.h>
+#include <linux/ptrace.h>
+#include <linux/ioport.h>
+#include <linux/mm.h>
+#include <linux/init.h>
+#include <linux/highmem.h>
+#include <asm/system.h>
+#include <asm/io.h>
+#include <asm/segment.h>
+#include <asm/bitops.h>
+#include <asm/system.h>
+#include <asm/kgdb_local.h>
+#ifdef CONFIG_KGDB_USER_CONSOLE
+extern void kgdb_console_finit(void);
+#endif
+#define PRNT_off
+#define TEST_EXISTANCE
+#ifdef PRNT
+#define dbprintk(s) printk s
+#else
+#define dbprintk(s)
+#endif
+#define TEST_INTERRUPT_off
+#ifdef TEST_INTERRUPT
+#define intprintk(s) printk s
+#else
+#define intprintk(s)
+#endif
+
+#define IRQ_T(info) ((info->flags & ASYNC_SHARE_IRQ) ? SA_SHIRQ : SA_INTERRUPT)
+
+#define	GDB_BUF_SIZE	512	/* power of 2, please */
+
+static char gdb_buf[GDB_BUF_SIZE];
+static int gdb_buf_in_inx;
+static atomic_t gdb_buf_in_cnt;
+static int gdb_buf_out_inx;
+
+struct async_struct *gdb_async_info;
+static int gdb_async_irq;
+
+#define outb_px(a,b) outb_p(b,a)
+
+static void program_uart(struct async_struct *info);
+static void write_char(struct async_struct *info, int chr);
+/*
+ * Get a byte from the hardware data buffer and return it
+ */
+static int
+read_data_bfr(struct async_struct *info)
+{
+	char it = inb_p(info->port + UART_LSR);
+
+	if (it & UART_LSR_DR)
+		return (inb_p(info->port + UART_RX));
+	/*
+	 * If we have a framing error assume somebody messed with
+	 * our uart.  Reprogram it and send '-' both ways...
+	 */
+	if (it & 0xc) {
+		program_uart(info);
+		write_char(info, '-');
+		return ('-');
+	}
+	return (-1);
+
+}				/* read_data_bfr */
+
+/*
+ * Get a char if available, return -1 if nothing available.
+ * Empty the receive buffer first, then look at the interface hardware.
+
+ * Locking here is a bit of a problem.	We MUST not lock out communication
+ * if we are trying to talk to gdb about a kgdb entry.	ON the other hand
+ * we can loose chars in the console pass thru if we don't lock.  It is also
+ * possible that we could hold the lock or be waiting for it when kgdb
+ * NEEDS to talk.  Since kgdb locks down the world, it does not need locks.
+ * We do, of course have possible issues with interrupting a uart operation,
+ * but we will just depend on the uart status to help keep that straight.
+
+ */
+static spinlock_t uart_interrupt_lock = SPIN_LOCK_UNLOCKED;
+#ifdef CONFIG_SMP
+extern spinlock_t kgdb_spinlock;
+#endif
+
+static int
+read_char(struct async_struct *info)
+{
+	int chr;
+	unsigned long flags;
+	local_irq_save(flags);
+#ifdef CONFIG_SMP
+	if (!spin_is_locked(&kgdb_spinlock)) {
+		spin_lock(&uart_interrupt_lock);
+	}
+#endif
+	if (atomic_read(&gdb_buf_in_cnt) != 0) {	/* intr routine has q'd chars */
+		chr = gdb_buf[gdb_buf_out_inx++];
+		gdb_buf_out_inx &= (GDB_BUF_SIZE - 1);
+		atomic_dec(&gdb_buf_in_cnt);
+	} else {
+		chr = read_data_bfr(info);
+	}
+#ifdef CONFIG_SMP
+	if (!spin_is_locked(&kgdb_spinlock)) {
+		spin_unlock(&uart_interrupt_lock);
+	}
+#endif
+	local_irq_restore(flags);
+	return (chr);
+}
+
+/*
+ * Wait until the interface can accept a char, then write it.
+ */
+static void
+write_char(struct async_struct *info, int chr)
+{
+	while (!(inb_p(info->port + UART_LSR) & UART_LSR_THRE)) ;
+
+	outb_p(chr, info->port + UART_TX);
+
+}				/* write_char */
+
+/*
+ * Mostly we don't need a spinlock, but since the console goes
+ * thru here with interrutps on, well, we need to catch those
+ * chars.
+ */
+/*
+ * This is the receiver interrupt routine for the GDB stub.
+ * It will receive a limited number of characters of input
+ * from the gdb  host machine and save them up in a buffer.
+ *
+ * When the gdb stub routine tty_getDebugChar() is called it
+ * draws characters out of the buffer until it is empty and
+ * then reads directly from the serial port.
+ *
+ * We do not attempt to write chars from the interrupt routine
+ * since the stubs do all of that via tty_putDebugChar() which
+ * writes one byte after waiting for the interface to become
+ * ready.
+ *
+ * The debug stubs like to run with interrupts disabled since,
+ * after all, they run as a consequence of a breakpoint in
+ * the kernel.
+ *
+ * Perhaps someone who knows more about the tty driver than I
+ * care to learn can make this work for any low level serial
+ * driver.
+ */
+static irqreturn_t
+gdb_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+	struct async_struct *info;
+	unsigned long flags;
+
+	info = gdb_async_info;
+	if (!info || !info->tty || irq != gdb_async_irq)
+		return IRQ_NONE;
+
+	local_irq_save(flags);
+	spin_lock(&uart_interrupt_lock);
+	do {
+		int chr = read_data_bfr(info);
+		intprintk(("Debug char on int: %x hex\n", chr));
+		if (chr < 0)
+			continue;
+
+		if (chr == 3) {	/* Ctrl-C means remote interrupt */
+			BREAKPOINT;
+			continue;
+		}
+
+		if (atomic_read(&gdb_buf_in_cnt) >= GDB_BUF_SIZE) {
+			/* buffer overflow tosses early char */
+			read_char(info);
+		}
+		gdb_buf[gdb_buf_in_inx++] = chr;
+		gdb_buf_in_inx &= (GDB_BUF_SIZE - 1);
+	} while (inb_p(info->port + UART_IIR) & UART_IIR_RDI);
+	spin_unlock(&uart_interrupt_lock);
+	local_irq_restore(flags);
+	return IRQ_HANDLED;
+}				/* gdb_interrupt */
+
+/*
+ * Just a NULL routine for testing.
+ */
+void
+gdb_null(void)
+{
+}				/* gdb_null */
+
+/* These structure are filled in with values defined in asm/kgdb_local.h
+ */
+static struct serial_state state = SB_STATE;
+static struct async_struct local_info = SB_INFO;
+static int ok_to_enable_ints = 0;
+static void kgdb_enable_ints_now(void);
+
+extern char *kgdb_version;
+/*
+ * Hook an IRQ for KGDB.
+ *
+ * This routine is called from tty_putDebugChar, below.
+ */
+static int ints_disabled = 1;
+int
+gdb_hook_interrupt(struct async_struct *info, int verb)
+{
+	struct serial_state *state = info->state;
+	unsigned long flags;
+	int port;
+#ifdef TEST_EXISTANCE
+	int scratch, scratch2;
+#endif
+
+	/* The above fails if memory managment is not set up yet.
+	 * Rather than fail the set up, just keep track of the fact
+	 * and pick up the interrupt thing later.
+	 */
+	gdb_async_info = info;
+	port = gdb_async_info->port;
+	gdb_async_irq = state->irq;
+	if (verb) {
+		printk("kgdb %s : port =%x, IRQ=%d, divisor =%d\n",
+		       kgdb_version,
+		       port,
+		       gdb_async_irq, gdb_async_info->state->custom_divisor);
+	}
+	local_irq_save(flags);
+#ifdef TEST_EXISTANCE
+	/* Existance test */
+	/* Should not need all this, but just in case.... */
+
+	scratch = inb_p(port + UART_IER);
+	outb_px(port + UART_IER, 0);
+	outb_px(0xff, 0x080);
+	scratch2 = inb_p(port + UART_IER);
+	outb_px(port + UART_IER, scratch);
+	if (scratch2) {
+		printk
+		    ("gdb_hook_interrupt: Could not clear IER, not a UART!\n");
+		local_irq_restore(flags);
+		return 1;	/* We failed; there's nothing here */
+	}
+	scratch2 = inb_p(port + UART_LCR);
+	outb_px(port + UART_LCR, 0xBF);	/* set up for StarTech test */
+	outb_px(port + UART_EFR, 0);	/* EFR is the same as FCR */
+	outb_px(port + UART_LCR, 0);
+	outb_px(port + UART_FCR, UART_FCR_ENABLE_FIFO);
+	scratch = inb_p(port + UART_IIR) >> 6;
+	if (scratch == 1) {
+		printk("gdb_hook_interrupt: Undefined UART type!"
+		       "  Not a UART! \n");
+		local_irq_restore(flags);
+		return 1;
+	} else {
+		dbprintk(("gdb_hook_interrupt: UART type "
+			  "is %d where 0=16450, 2=16550 3=16550A\n", scratch));
+	}
+	scratch = inb_p(port + UART_MCR);
+	outb_px(port + UART_MCR, UART_MCR_LOOP | scratch);
+	outb_px(port + UART_MCR, UART_MCR_LOOP | 0x0A);
+	scratch2 = inb_p(port + UART_MSR) & 0xF0;
+	outb_px(port + UART_MCR, scratch);
+	if (scratch2 != 0x90) {
+		printk("gdb_hook_interrupt: "
+		       "Loop back test failed! Not a UART!\n");
+		local_irq_restore(flags);
+		return scratch2 + 1000;	/* force 0 to fail */
+	}
+#endif				/* test existance */
+	program_uart(info);
+	local_irq_restore(flags);
+
+	return (0);
+
+}				/* gdb_hook_interrupt */
+
+static void
+program_uart(struct async_struct *info)
+{
+	int port = info->port;
+
+	(void) inb_p(port + UART_RX);
+	outb_px(port + UART_IER, 0);
+
+	(void) inb_p(port + UART_RX);	/* serial driver comments say */
+	(void) inb_p(port + UART_IIR);	/* this clears the interrupt regs */
+	(void) inb_p(port + UART_MSR);
+	outb_px(port + UART_LCR, UART_LCR_WLEN8 | UART_LCR_DLAB);
+	outb_px(port + UART_DLL, info->state->custom_divisor & 0xff);	/* LS */
+	outb_px(port + UART_DLM, info->state->custom_divisor >> 8);	/* MS  */
+	outb_px(port + UART_MCR, info->MCR);
+
+	outb_px(port + UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1 | UART_FCR_CLEAR_XMIT | UART_FCR_CLEAR_RCVR);	/* set fcr */
+	outb_px(port + UART_LCR, UART_LCR_WLEN8);	/* reset DLAB */
+	outb_px(port + UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1);	/* set fcr */
+	if (!ints_disabled) {
+		intprintk(("KGDB: Sending %d to port %x offset %d\n",
+			   gdb_async_info->IER,
+			   (int) gdb_async_info->port, UART_IER));
+		outb_px(gdb_async_info->port + UART_IER, gdb_async_info->IER);
+	}
+	return;
+}
+
+/*
+ * tty_getDebugChar
+ *
+ * This is a GDB stub routine.	It waits for a character from the
+ * serial interface and then returns it.  If there is no serial
+ * interface connection then it returns a bogus value which will
+ * almost certainly cause the system to hang.  In the
+ */
+int kgdb_in_isr = 0;
+int kgdb_in_lsr = 0;
+extern spinlock_t kgdb_spinlock;
+
+/* Caller takes needed protections */
+
+int
+tty_getDebugChar(void)
+{
+	volatile int chr, dum, time, end_time;
+
+	dbprintk(("tty_getDebugChar(port %x): ", gdb_async_info->port));
+
+	if (gdb_async_info == NULL) {
+		gdb_hook_interrupt(&local_info, 0);
+	}
+	/*
+	 * This trick says if we wait a very long time and get
+	 * no char, return the -1 and let the upper level deal
+	 * with it.
+	 */
+	rdtsc(dum, time);
+	end_time = time + 2;
+	while (((chr = read_char(gdb_async_info)) == -1) &&
+	       (end_time - time) > 0) {
+		rdtsc(dum, time);
+	};
+	/*
+	 * This covers our butts if some other code messes with
+	 * our uart, hay, it happens :o)
+	 */
+	if (chr == -1)
+		program_uart(gdb_async_info);
+
+	dbprintk(("%c\n", chr > ' ' && chr < 0x7F ? chr : ' '));
+	return (chr);
+
+}				/* tty_getDebugChar */
+
+static int count = 3;
+static spinlock_t one_at_atime = SPIN_LOCK_UNLOCKED;
+
+static int __init
+kgdb_enable_ints(void)
+{
+	if (kgdb_eth != -1) {
+		return 0;
+	}
+	if (gdb_async_info == NULL) {
+		gdb_hook_interrupt(&local_info, 1);
+	}
+	ok_to_enable_ints = 1;
+	kgdb_enable_ints_now();
+#ifdef CONFIG_KGDB_USER_CONSOLE
+	kgdb_console_finit();
+#endif
+	return 0;
+}
+
+#ifdef CONFIG_SERIAL_8250
+void shutdown_for_kgdb(struct async_struct *gdb_async_info);
+#endif
+
+#ifdef CONFIG_DISCONTIGMEM
+static inline int kgdb_mem_init_done(void)
+{
+	return highmem_start_page != NULL;
+}
+#else
+static inline int kgdb_mem_init_done(void)
+{
+	return max_mapnr != 0;
+}
+#endif
+
+static void
+kgdb_enable_ints_now(void)
+{
+	if (!spin_trylock(&one_at_atime))
+		return;
+	if (!ints_disabled)
+		goto exit;
+	if (kgdb_mem_init_done() &&
+			ints_disabled) {	/* don't try till mem init */
+#ifdef CONFIG_SERIAL_8250
+		/*
+		 * The ifdef here allows the system to be configured
+		 * without the serial driver.
+		 * Don't make it a module, however, it will steal the port
+		 */
+		shutdown_for_kgdb(gdb_async_info);
+#endif
+		ints_disabled = request_irq(gdb_async_info->state->irq,
+					    gdb_interrupt,
+					    IRQ_T(gdb_async_info),
+					    "KGDB-stub", NULL);
+		intprintk(("KGDB: request_irq returned %d\n", ints_disabled));
+	}
+	if (!ints_disabled) {
+		intprintk(("KGDB: Sending %d to port %x offset %d\n",
+			   gdb_async_info->IER,
+			   (int) gdb_async_info->port, UART_IER));
+		outb_px(gdb_async_info->port + UART_IER, gdb_async_info->IER);
+	}
+      exit:
+	spin_unlock(&one_at_atime);
+}
+
+/*
+ * tty_putDebugChar
+ *
+ * This is a GDB stub routine.	It waits until the interface is ready
+ * to transmit a char and then sends it.  If there is no serial
+ * interface connection then it simply returns to its caller, having
+ * pretended to send the char.	Caller takes needed protections.
+ */
+void
+tty_putDebugChar(int chr)
+{
+	dbprintk(("tty_putDebugChar(port %x): chr=%02x '%c', ints_on=%d\n",
+		  gdb_async_info->port,
+		  chr,
+		  chr > ' ' && chr < 0x7F ? chr : ' ', ints_disabled ? 0 : 1));
+
+	if (gdb_async_info == NULL) {
+		gdb_hook_interrupt(&local_info, 0);
+	}
+
+	write_char(gdb_async_info, chr);	/* this routine will wait */
+	count = (chr == '#') ? 0 : count + 1;
+	if ((count == 2)) {	/* try to enable after */
+		if (ints_disabled & ok_to_enable_ints)
+			kgdb_enable_ints_now();	/* try to enable after */
+
+		/* We do this a lot because, well we really want to get these
+		 * interrupts.	The serial driver will clear these bits when it
+		 * initializes the chip.  Every thing else it does is ok,
+		 * but this.
+		 */
+		if (!ints_disabled) {
+			outb_px(gdb_async_info->port + UART_IER,
+				gdb_async_info->IER);
+		}
+	}
+
+}				/* tty_putDebugChar */
+
+/*
+ * This does nothing for the serial port, since it doesn't buffer.
+ */
+
+void tty_flushDebugChar(void)
+{
+}
+
+module_init(kgdb_enable_ints);
--- diff/arch/x86_64/ia32/ia32_aout.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/x86_64/ia32/ia32_aout.c	2003-12-29 09:30:39.000000000 +0000
@@ -0,0 +1,506 @@
+/*
+ *  a.out loader for x86-64
+ *
+ *  Copyright (C) 1991, 1992, 1996  Linus Torvalds
+ *  Hacked together by Andi Kleen
+ */
+
+#include <linux/module.h>
+
+#include <linux/time.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/mman.h>
+#include <linux/a.out.h>
+#include <linux/errno.h>
+#include <linux/signal.h>
+#include <linux/string.h>
+#include <linux/fs.h>
+#include <linux/file.h>
+#include <linux/stat.h>
+#include <linux/fcntl.h>
+#include <linux/ptrace.h>
+#include <linux/user.h>
+#include <linux/slab.h>
+#include <linux/binfmts.h>
+#include <linux/personality.h>
+#include <linux/init.h>
+
+#include <asm/system.h>
+#include <asm/uaccess.h>
+#include <asm/pgalloc.h>
+#include <asm/cacheflush.h>
+#include <asm/user32.h>
+
+#undef WARN_OLD
+
+extern int ia32_setup_arg_pages(struct linux_binprm *bprm);
+
+static int load_aout_binary(struct linux_binprm *, struct pt_regs * regs);
+static int load_aout_library(struct file*);
+static int aout_core_dump(long signr, struct pt_regs * regs, struct file *file);
+
+/*
+ * fill in the user structure for a core dump..
+ */
+static void dump_thread32(struct pt_regs * regs, struct user32 * dump)
+{
+	u32 fs,gs;
+
+/* changed the size calculations - should hopefully work better. lbt */
+	dump->magic = CMAGIC;
+	dump->start_code = 0;
+	dump->start_stack = regs->rsp & ~(PAGE_SIZE - 1);
+	dump->u_tsize = ((unsigned long) current->mm->end_code) >> PAGE_SHIFT;
+	dump->u_dsize = ((unsigned long) (current->mm->brk + (PAGE_SIZE-1))) >> PAGE_SHIFT;
+	dump->u_dsize -= dump->u_tsize;
+	dump->u_ssize = 0;
+	dump->u_debugreg[0] = current->thread.debugreg0;  
+	dump->u_debugreg[1] = current->thread.debugreg1;  
+	dump->u_debugreg[2] = current->thread.debugreg2;  
+	dump->u_debugreg[3] = current->thread.debugreg3;  
+	dump->u_debugreg[4] = 0;  
+	dump->u_debugreg[5] = 0;  
+	dump->u_debugreg[6] = current->thread.debugreg6;  
+	dump->u_debugreg[7] = current->thread.debugreg7;  
+
+	if (dump->start_stack < 0xc0000000)
+		dump->u_ssize = ((unsigned long) (0xc0000000 - dump->start_stack)) >> PAGE_SHIFT;
+
+	dump->regs.ebx = regs->rbx;
+	dump->regs.ecx = regs->rcx;
+	dump->regs.edx = regs->rdx;
+	dump->regs.esi = regs->rsi;
+	dump->regs.edi = regs->rdi;
+	dump->regs.ebp = regs->rbp;
+	dump->regs.eax = regs->rax;
+	dump->regs.ds = current->thread.ds;
+	dump->regs.es = current->thread.es;
+	asm("movl %%fs,%0" : "=r" (fs)); dump->regs.fs = fs;
+	asm("movl %%gs,%0" : "=r" (gs)); dump->regs.gs = gs; 
+	dump->regs.orig_eax = regs->orig_rax;
+	dump->regs.eip = regs->rip;
+	dump->regs.cs = regs->cs;
+	dump->regs.eflags = regs->eflags;
+	dump->regs.esp = regs->rsp;
+	dump->regs.ss = regs->ss;
+
+#if 1 /* FIXME */
+	dump->u_fpvalid = 0;
+#else
+	dump->u_fpvalid = dump_fpu (regs, &dump->i387);
+#endif
+}
+
+static struct linux_binfmt aout_format = {
+	.module		= THIS_MODULE,
+	.load_binary	= load_aout_binary,
+	.load_shlib	= load_aout_library,
+	.core_dump	= aout_core_dump,
+	.min_coredump	= PAGE_SIZE
+};
+
+static void set_brk(unsigned long start, unsigned long end)
+{
+	start = PAGE_ALIGN(start);
+	end = PAGE_ALIGN(end);
+	if (end <= start)
+		return;
+	do_brk(start, end - start);
+}
+
+/*
+ * These are the only things you should do on a core-file: use only these
+ * macros to write out all the necessary info.
+ */
+
+static int dump_write(struct file *file, const void *addr, int nr)
+{
+	return file->f_op->write(file, addr, nr, &file->f_pos) == nr;
+}
+
+#define DUMP_WRITE(addr, nr)	\
+	if (!dump_write(file, (void *)(addr), (nr))) \
+		goto end_coredump;
+
+#define DUMP_SEEK(offset) \
+if (file->f_op->llseek) { \
+	if (file->f_op->llseek(file,(offset),0) != (offset)) \
+ 		goto end_coredump; \
+} else file->f_pos = (offset)
+
+/*
+ * Routine writes a core dump image in the current directory.
+ * Currently only a stub-function.
+ *
+ * Note that setuid/setgid files won't make a core-dump if the uid/gid
+ * changed due to the set[u|g]id. It's enforced by the "current->mm->dumpable"
+ * field, which also makes sure the core-dumps won't be recursive if the
+ * dumping of the process results in another error..
+ */
+
+static int aout_core_dump(long signr, struct pt_regs * regs, struct file *file)
+{
+	mm_segment_t fs;
+	int has_dumped = 0;
+	unsigned long dump_start, dump_size;
+	struct user32 dump;
+#       define START_DATA(u)	(u.u_tsize << PAGE_SHIFT)
+#       define START_STACK(u)   (u.start_stack)
+
+	fs = get_fs();
+	set_fs(KERNEL_DS);
+	has_dumped = 1;
+	current->flags |= PF_DUMPCORE;
+       	strncpy(dump.u_comm, current->comm, sizeof(current->comm));
+	dump.u_ar0 = (u32)(((unsigned long)(&dump.regs)) - ((unsigned long)(&dump)));
+	dump.signal = signr;
+	dump_thread32(regs, &dump);
+
+/* If the size of the dump file exceeds the rlimit, then see what would happen
+   if we wrote the stack, but not the data area.  */
+	if ((dump.u_dsize+dump.u_ssize+1) * PAGE_SIZE >
+	    current->rlim[RLIMIT_CORE].rlim_cur)
+		dump.u_dsize = 0;
+
+/* Make sure we have enough room to write the stack and data areas. */
+	if ((dump.u_ssize+1) * PAGE_SIZE >
+	    current->rlim[RLIMIT_CORE].rlim_cur)
+		dump.u_ssize = 0;
+
+/* make sure we actually have a data and stack area to dump */
+	set_fs(USER_DS);
+	if (verify_area(VERIFY_READ, (void *) (unsigned long)START_DATA(dump), dump.u_dsize << PAGE_SHIFT))
+		dump.u_dsize = 0;
+	if (verify_area(VERIFY_READ, (void *) (unsigned long)START_STACK(dump), dump.u_ssize << PAGE_SHIFT))
+		dump.u_ssize = 0;
+
+	set_fs(KERNEL_DS);
+/* struct user */
+	DUMP_WRITE(&dump,sizeof(dump));
+/* Now dump all of the user data.  Include malloced stuff as well */
+	DUMP_SEEK(PAGE_SIZE);
+/* now we start writing out the user space info */
+	set_fs(USER_DS);
+/* Dump the data area */
+	if (dump.u_dsize != 0) {
+		dump_start = START_DATA(dump);
+		dump_size = dump.u_dsize << PAGE_SHIFT;
+		DUMP_WRITE(dump_start,dump_size);
+	}
+/* Now prepare to dump the stack area */
+	if (dump.u_ssize != 0) {
+		dump_start = START_STACK(dump);
+		dump_size = dump.u_ssize << PAGE_SHIFT;
+		DUMP_WRITE(dump_start,dump_size);
+	}
+/* Finally dump the task struct.  Not be used by gdb, but could be useful */
+	set_fs(KERNEL_DS);
+	DUMP_WRITE(current,sizeof(*current));
+end_coredump:
+	set_fs(fs);
+	return has_dumped;
+}
+
+/*
+ * create_aout_tables() parses the env- and arg-strings in new user
+ * memory and creates the pointer tables from them, and puts their
+ * addresses on the "stack", returning the new stack pointer value.
+ */
+static u32 * create_aout_tables(char * p, struct linux_binprm * bprm)
+{
+	u32 *argv, *envp;
+	u32 * sp;
+	int argc = bprm->argc;
+	int envc = bprm->envc;
+
+	sp = (u32 *) ((-(unsigned long)sizeof(u32)) & (unsigned long) p);
+	sp -= envc+1;
+	envp = (u32 *) sp;
+	sp -= argc+1;
+	argv = (u32 *) sp;
+	put_user((unsigned long) envp,--sp);
+	put_user((unsigned long) argv,--sp);
+	put_user(argc,--sp);
+	current->mm->arg_start = (unsigned long) p;
+	while (argc-->0) {
+		char c;
+		put_user((u32)(unsigned long)p,argv++);
+		do {
+			get_user(c,p++);
+		} while (c);
+	}
+	put_user(NULL,argv);
+	current->mm->arg_end = current->mm->env_start = (unsigned long) p;
+	while (envc-->0) {
+		char c;
+		put_user((u32)(unsigned long)p,envp++);
+		do {
+			get_user(c,p++);
+		} while (c);
+	}
+	put_user(NULL,envp);
+	current->mm->env_end = (unsigned long) p;
+	return sp;
+}
+
+/*
+ * These are the functions used to load a.out style executables and shared
+ * libraries.  There is no binary dependent code anywhere else.
+ */
+
+static int load_aout_binary(struct linux_binprm * bprm, struct pt_regs * regs)
+{
+	struct exec ex;
+	unsigned long error;
+	unsigned long fd_offset;
+	unsigned long rlim;
+	int retval;
+
+	ex = *((struct exec *) bprm->buf);		/* exec-header */
+	if ((N_MAGIC(ex) != ZMAGIC && N_MAGIC(ex) != OMAGIC &&
+	     N_MAGIC(ex) != QMAGIC && N_MAGIC(ex) != NMAGIC) ||
+	    N_TRSIZE(ex) || N_DRSIZE(ex) ||
+	    i_size_read(bprm->file->f_dentry->d_inode) < ex.a_text+ex.a_data+N_SYMSIZE(ex)+N_TXTOFF(ex)) {
+		return -ENOEXEC;
+	}
+
+	fd_offset = N_TXTOFF(ex);
+
+	/* Check initial limits. This avoids letting people circumvent
+	 * size limits imposed on them by creating programs with large
+	 * arrays in the data or bss.
+	 */
+	rlim = current->rlim[RLIMIT_DATA].rlim_cur;
+	if (rlim >= RLIM_INFINITY)
+		rlim = ~0;
+	if (ex.a_data + ex.a_bss > rlim)
+		return -ENOMEM;
+
+	/* Flush all traces of the currently running executable */
+	retval = flush_old_exec(bprm);
+	if (retval)
+		return retval;
+
+	regs->cs = __USER32_CS; 
+	regs->r8 = regs->r9 = regs->r10 = regs->r11 = regs->r12 =
+		regs->r13 = regs->r14 = regs->r15 = 0;
+	set_thread_flag(TIF_IA32); 
+
+	/* OK, This is the point of no return */
+	set_personality(PER_LINUX);
+
+	current->mm->end_code = ex.a_text +
+		(current->mm->start_code = N_TXTADDR(ex));
+	current->mm->end_data = ex.a_data +
+		(current->mm->start_data = N_DATADDR(ex));
+	current->mm->brk = ex.a_bss +
+		(current->mm->start_brk = N_BSSADDR(ex));
+	current->mm->free_area_cache = TASK_UNMAPPED_BASE;
+
+	current->mm->rss = 0;
+	current->mm->mmap = NULL;
+	compute_creds(bprm);
+ 	current->flags &= ~PF_FORKNOEXEC;
+
+	if (N_MAGIC(ex) == OMAGIC) {
+		unsigned long text_addr, map_size;
+		loff_t pos;
+
+		text_addr = N_TXTADDR(ex);
+
+		pos = 32;
+		map_size = ex.a_text+ex.a_data;
+
+		error = do_brk(text_addr & PAGE_MASK, map_size);
+		if (error != (text_addr & PAGE_MASK)) {
+			send_sig(SIGKILL, current, 0);
+			return error;
+		}
+
+		error = bprm->file->f_op->read(bprm->file, (char *)text_addr,
+			  ex.a_text+ex.a_data, &pos);
+		if ((signed long)error < 0) {
+			send_sig(SIGKILL, current, 0);
+			return error;
+		}
+			 
+		flush_icache_range(text_addr, text_addr+ex.a_text+ex.a_data);
+	} else {
+#ifdef WARN_OLD
+		static unsigned long error_time, error_time2;
+		if ((ex.a_text & 0xfff || ex.a_data & 0xfff) &&
+		    (N_MAGIC(ex) != NMAGIC) && (jiffies-error_time2) > 5*HZ)
+		{
+			printk(KERN_NOTICE "executable not page aligned\n");
+			error_time2 = jiffies;
+		}
+
+		if ((fd_offset & ~PAGE_MASK) != 0 &&
+		    (jiffies-error_time) > 5*HZ)
+		{
+			printk(KERN_WARNING 
+			       "fd_offset is not page aligned. Please convert program: %s\n",
+			       bprm->file->f_dentry->d_name.name);
+			error_time = jiffies;
+		}
+#endif
+
+		if (!bprm->file->f_op->mmap||((fd_offset & ~PAGE_MASK) != 0)) {
+			loff_t pos = fd_offset;
+			do_brk(N_TXTADDR(ex), ex.a_text+ex.a_data);
+			bprm->file->f_op->read(bprm->file,(char *)N_TXTADDR(ex),
+					ex.a_text+ex.a_data, &pos);
+			flush_icache_range((unsigned long) N_TXTADDR(ex),
+					   (unsigned long) N_TXTADDR(ex) +
+					   ex.a_text+ex.a_data);
+			goto beyond_if;
+		}
+
+		down_write(&current->mm->mmap_sem);
+		error = do_mmap(bprm->file, N_TXTADDR(ex), ex.a_text,
+			PROT_READ | PROT_EXEC,
+			MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE | MAP_32BIT,
+			fd_offset);
+		up_write(&current->mm->mmap_sem);
+
+		if (error != N_TXTADDR(ex)) {
+			send_sig(SIGKILL, current, 0);
+			return error;
+		}
+
+		down_write(&current->mm->mmap_sem);
+ 		error = do_mmap(bprm->file, N_DATADDR(ex), ex.a_data,
+				PROT_READ | PROT_WRITE | PROT_EXEC,
+				MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE | MAP_32BIT,
+				fd_offset + ex.a_text);
+		up_write(&current->mm->mmap_sem);
+		if (error != N_DATADDR(ex)) {
+			send_sig(SIGKILL, current, 0);
+			return error;
+		}
+	}
+beyond_if:
+	set_binfmt(&aout_format);
+
+	set_brk(current->mm->start_brk, current->mm->brk);
+
+	retval = ia32_setup_arg_pages(bprm); 
+	if (retval < 0) { 
+		/* Someone check-me: is this error path enough? */ 
+		send_sig(SIGKILL, current, 0); 
+		return retval;
+	}
+
+	current->mm->start_stack =
+		(unsigned long) create_aout_tables((char *) bprm->p, bprm);
+	/* start thread */
+	asm volatile("movl %0,%%fs" :: "r" (0)); \
+	asm volatile("movl %0,%%es; movl %0,%%ds": :"r" (__USER32_DS));
+	load_gs_index(0); 
+	(regs)->rip = ex.a_entry;
+	(regs)->rsp = current->mm->start_stack;
+	(regs)->eflags = 0x200;
+	(regs)->cs = __USER32_CS;
+	(regs)->ss = __USER32_DS;
+	set_fs(USER_DS);
+	if (unlikely(current->ptrace & PT_PTRACED)) {
+		if (current->ptrace & PT_TRACE_EXEC)
+			ptrace_notify ((PTRACE_EVENT_EXEC << 8) | SIGTRAP);
+		else
+			send_sig(SIGTRAP, current, 0);
+	}
+	return 0;
+}
+
+static int load_aout_library(struct file *file)
+{
+	struct inode * inode;
+	unsigned long bss, start_addr, len;
+	unsigned long error;
+	int retval;
+	struct exec ex;
+
+	inode = file->f_dentry->d_inode;
+
+	retval = -ENOEXEC;
+	error = kernel_read(file, 0, (char *) &ex, sizeof(ex));
+	if (error != sizeof(ex))
+		goto out;
+
+	/* We come in here for the regular a.out style of shared libraries */
+	if ((N_MAGIC(ex) != ZMAGIC && N_MAGIC(ex) != QMAGIC) || N_TRSIZE(ex) ||
+	    N_DRSIZE(ex) || ((ex.a_entry & 0xfff) && N_MAGIC(ex) == ZMAGIC) ||
+	    i_size_read(inode) < ex.a_text+ex.a_data+N_SYMSIZE(ex)+N_TXTOFF(ex)) {
+		goto out;
+	}
+
+	if (N_FLAGS(ex))
+		goto out;
+
+	/* For  QMAGIC, the starting address is 0x20 into the page.  We mask
+	   this off to get the starting address for the page */
+
+	start_addr =  ex.a_entry & 0xfffff000;
+
+	if ((N_TXTOFF(ex) & ~PAGE_MASK) != 0) {
+		loff_t pos = N_TXTOFF(ex);
+
+#ifdef WARN_OLD
+		static unsigned long error_time;
+		if ((jiffies-error_time) > 5*HZ)
+		{
+			printk(KERN_WARNING 
+			       "N_TXTOFF is not page aligned. Please convert library: %s\n",
+			       file->f_dentry->d_name.name);
+			error_time = jiffies;
+		}
+#endif
+
+		do_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss);
+		
+		file->f_op->read(file, (char *)start_addr,
+			ex.a_text + ex.a_data, &pos);
+		flush_icache_range((unsigned long) start_addr,
+				   (unsigned long) start_addr + ex.a_text + ex.a_data);
+
+		retval = 0;
+		goto out;
+	}
+	/* Now use mmap to map the library into memory. */
+	down_write(&current->mm->mmap_sem);
+	error = do_mmap(file, start_addr, ex.a_text + ex.a_data,
+			PROT_READ | PROT_WRITE | PROT_EXEC,
+			MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_32BIT,
+			N_TXTOFF(ex));
+	up_write(&current->mm->mmap_sem);
+	retval = error;
+	if (error != start_addr)
+		goto out;
+
+	len = PAGE_ALIGN(ex.a_text + ex.a_data);
+	bss = ex.a_text + ex.a_data + ex.a_bss;
+	if (bss > len) {
+		error = do_brk(start_addr + len, bss - len);
+		retval = error;
+		if (error != start_addr + len)
+			goto out;
+	}
+	retval = 0;
+out:
+	return retval;
+}
+
+static int __init init_aout_binfmt(void)
+{
+	return register_binfmt(&aout_format);
+}
+
+static void __exit exit_aout_binfmt(void)
+{
+	unregister_binfmt(&aout_format);
+}
+
+module_init(init_aout_binfmt);
+module_exit(exit_aout_binfmt);
+MODULE_LICENSE("GPL");
--- diff/drivers/block/cfq-iosched.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/block/cfq-iosched.c	2003-12-29 09:30:40.000000000 +0000
@@ -0,0 +1,707 @@
+/*
+ *  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);
+
+		BUG_ON(q->last_merge == rq);
+		crq = RQ_DATA(rq);
+		if (crq)
+			BUG_ON(ON_MHASH(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/watchdog/w83627hf_wdt.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/char/watchdog/w83627hf_wdt.c	2003-12-29 09:30:40.000000000 +0000
@@ -0,0 +1,324 @@
+/*
+ *	w83627hf WDT driver
+ *
+ *	(c) Copyright 2003 P�draig Brady <P@draigBrady.com>
+ *
+ *	Based on advantechwdt.c which is based on wdt.c.
+ *	Original copyright messages:
+ *
+ *	(c) Copyright 2000-2001 Marek Michalkiewicz <marekm@linux.org.pl>
+ *
+ *	(c) Copyright 1996 Alan Cox <alan@redhat.com>, All Rights Reserved.
+ *				http://www.redhat.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.
+ *
+ *	Neither Alan Cox nor CymruNet Ltd. admit liability nor provide
+ *	warranty for any of this software. This material is provided
+ *	"AS-IS" and at no charge.
+ *
+ *	(c) Copyright 1995    Alan Cox <alan@redhat.com>
+ */
+
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/types.h>
+#include <linux/miscdevice.h>
+#include <linux/watchdog.h>
+#include <linux/fs.h>
+#include <linux/ioport.h>
+#include <linux/notifier.h>
+#include <linux/reboot.h>
+#include <linux/init.h>
+
+#include <asm/io.h>
+#include <asm/uaccess.h>
+#include <asm/system.h>
+
+#define WATCHDOG_NAME "w83627hf WDT"
+#define PFX WATCHDOG_NAME ": "
+#define WATCHDOG_TIMEOUT 60		/* 60 sec default timeout */
+
+static unsigned long wdt_is_open;
+static char expect_close;
+
+/* You must set this - there is no sane way to probe for this board. */
+static int wdt_io = 0x2E;
+module_param(wdt_io, int, 0);
+MODULE_PARM_DESC(wdt_io, "w83627hf WDT io port (default 0x2E)");
+
+static int timeout = WATCHDOG_TIMEOUT;	/* in seconds */
+module_param(timeout, int, 0);
+MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. 1<= timeout <=63, default=" __MODULE_STRING(WATCHDOG_TIMEOUT) ".");
+
+#ifdef CONFIG_WATCHDOG_NOWAYOUT
+static int nowayout = 1;
+#else
+static int nowayout = 0;
+#endif
+
+module_param(nowayout, int, 0);
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+
+/*
+ *	Kernel methods.
+ */
+
+#define WDT_EFER (wdt_io+0)   /* Extended Function Enable Registers */
+#define WDT_EFIR (wdt_io+0)   /* Extended Function Index Register (same as EFER) */
+#define WDT_EFDR (WDT_EFIR+1) /* Extended Function Data Register */
+
+static void
+wdt_ctrl(int timeout)
+{
+	outb_p(0x87, WDT_EFER); /* Enter extended function mode */
+	outb_p(0x87, WDT_EFER); /* Again according to manual */
+
+	outb_p(0x07, WDT_EFER); /* point to logical device number reg */
+	outb_p(0x08, WDT_EFDR); /* select logical device 8 (GPIO2) */
+	outb_p(0x30, WDT_EFER); /* select CR30 */
+	outb_p(0x01, WDT_EFDR); /* set bit 0 to activate GPIO2 */
+
+	outb_p(0xF6, WDT_EFER);    /* Select CRF6 */
+	outb_p(timeout, WDT_EFDR); /* Write Timeout counter to CRF6 */
+
+	outb_p(0xAA, WDT_EFER); /* Leave extended function mode */
+}
+
+static void
+wdt_ping(void)
+{
+	wdt_ctrl(timeout);
+}
+
+static void
+wdt_disable(void)
+{
+	wdt_ctrl(0);
+}
+
+static ssize_t
+wdt_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
+{
+	/*  Can't seek (pwrite) on this device  */
+	if (ppos != &file->f_pos)
+		return -ESPIPE;
+
+	if (count) {
+		if (!nowayout) {
+			size_t i;
+
+			expect_close = 0;
+
+			for (i = 0; i != count; i++) {
+				char c;
+				if (get_user(c, buf+i))
+					return -EFAULT;
+				if (c == 'V')
+					expect_close = 42;
+			}
+		}
+		wdt_ping();
+	}
+	return count;
+}
+
+static int
+wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
+	  unsigned long arg)
+{
+	int new_timeout;
+	static struct watchdog_info ident = {
+		.options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE,
+		.firmware_version = 1,
+		.identity = "Advantech WDT",
+	};
+
+	switch (cmd) {
+	case WDIOC_GETSUPPORT:
+	  if (copy_to_user((struct watchdog_info *)arg, &ident, sizeof(ident)))
+	    return -EFAULT;
+	  break;
+
+	case WDIOC_GETSTATUS:
+	case WDIOC_GETBOOTSTATUS:
+	  return put_user(0, (int *)arg);
+
+	case WDIOC_KEEPALIVE:
+	  wdt_ping();
+	  break;
+
+	case WDIOC_SETTIMEOUT:
+	  if (get_user(new_timeout, (int *)arg))
+		  return -EFAULT;
+	  if ((new_timeout < 1) || (new_timeout > 63))
+		  return -EINVAL;
+	  timeout = new_timeout;
+	  wdt_ping();
+	  /* Fall */
+
+	case WDIOC_GETTIMEOUT:
+	  return put_user(timeout, (int *)arg);
+
+	case WDIOC_SETOPTIONS:
+	{
+	  int options, retval = -EINVAL;
+
+	  if (get_user(options, (int *)arg))
+	    return -EFAULT;
+
+	  if (options & WDIOS_DISABLECARD) {
+	    wdt_disable();
+	    retval = 0;
+	  }
+
+	  if (options & WDIOS_ENABLECARD) {
+	    wdt_ping();
+	    retval = 0;
+	  }
+
+	  return retval;
+	}
+
+	default:
+	  return -ENOTTY;
+	}
+	return 0;
+}
+
+static int
+wdt_open(struct inode *inode, struct file *file)
+{
+	if (test_and_set_bit(0, &wdt_is_open))
+		return -EBUSY;
+	/*
+	 *	Activate
+	 */
+
+	wdt_ping();
+	return 0;
+}
+
+static int
+wdt_close(struct inode *inode, struct file *file)
+{
+	if (expect_close == 42) {
+		wdt_disable();
+	} else {
+		printk(KERN_CRIT PFX "Unexpected close, not stopping watchdog!\n");
+		wdt_ping();
+	}
+	clear_bit(0, &wdt_is_open);
+	expect_close = 0;
+	return 0;
+}
+
+/*
+ *	Notifier for system down
+ */
+
+static int
+wdt_notify_sys(struct notifier_block *this, unsigned long code,
+	void *unused)
+{
+	if (code == SYS_DOWN || code == SYS_HALT) {
+		/* Turn the WDT off */
+		wdt_disable();
+	}
+	return NOTIFY_DONE;
+}
+
+/*
+ *	Kernel Interfaces
+ */
+
+static struct file_operations wdt_fops = {
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.write		= wdt_write,
+	.ioctl		= wdt_ioctl,
+	.open		= wdt_open,
+	.release	= wdt_close,
+};
+
+static struct miscdevice wdt_miscdev = {
+	.minor = WATCHDOG_MINOR,
+	.name = "watchdog",
+	.fops = &wdt_fops,
+};
+
+/*
+ *	The WDT needs to learn about soft shutdowns in order to
+ *	turn the timebomb registers off.
+ */
+
+static struct notifier_block wdt_notifier = {
+	.notifier_call = wdt_notify_sys,
+	.next = NULL,
+	.priority = 0,
+};
+
+static int __init
+wdt_init(void)
+{
+	int ret;
+
+	printk(KERN_INFO "WDT driver for Advantech single board computer initialising.\n");
+
+	if (timeout < 1 || timeout > 63) {
+		timeout = WATCHDOG_TIMEOUT;
+		printk (KERN_INFO PFX "timeout value must be 1<=x<=63, using %d\n",
+			timeout);
+	}
+
+	if (!request_region(wdt_io, 1, WATCHDOG_NAME)) {
+		printk (KERN_ERR PFX "I/O address 0x%04x already in use\n",
+			wdt_io);
+		ret = -EIO;
+		goto out;
+	}
+
+	ret = register_reboot_notifier(&wdt_notifier);
+	if (ret != 0) {
+		printk (KERN_ERR PFX "cannot register reboot notifier (err=%d)\n",
+			ret);
+		goto unreg_regions;
+	}
+
+	ret = misc_register(&wdt_miscdev);
+	if (ret != 0) {
+		printk (KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n",
+			WATCHDOG_MINOR, ret);
+		goto unreg_reboot;
+	}
+
+	printk (KERN_INFO PFX "initialized. timeout=%d sec (nowayout=%d)\n",
+		timeout, nowayout);
+
+out:
+	return ret;
+unreg_reboot:
+	unregister_reboot_notifier(&wdt_notifier);
+unreg_regions:
+	release_region(wdt_io, 1);
+	goto out;
+}
+
+static void __exit
+wdt_exit(void)
+{
+	misc_deregister(&wdt_miscdev);
+	unregister_reboot_notifier(&wdt_notifier);
+	release_region(wdt_io,1);
+}
+
+module_init(wdt_init);
+module_exit(wdt_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("P�draig Brady <P@draigBrady.com>");
+MODULE_DESCRIPTION("w38627hf WDT driver");
+
--- diff/drivers/ide/pci/sgiioc4.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/ide/pci/sgiioc4.c	2003-12-29 09:30:40.000000000 +0000
@@ -0,0 +1,833 @@
+/*
+ * Copyright (c) 2003 Silicon Graphics, Inc.  All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it would be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
+ *
+ * Contact information:  Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
+ * Mountain View, CA  94043, or:
+ *
+ * http://www.sgi.com
+ *
+ * For further information regarding this notice, see:
+ *
+ * http://oss.sgi.com/projects/GenInfo/NoticeExplan
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/pci.h>
+#include <linux/delay.h>
+#include <linux/hdreg.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/timer.h>
+#include <linux/mm.h>
+#include <linux/ioport.h>
+#include <linux/blkdev.h>
+#include <asm/io.h>
+
+#include <linux/ide.h>
+
+/* IOC4 Specific Definitions */
+#define IOC4_CMD_OFFSET		0x100
+#define IOC4_CTRL_OFFSET	0x120
+#define IOC4_DMA_OFFSET		0x140
+#define IOC4_INTR_OFFSET	0x0
+
+#define IOC4_TIMING		0x00
+#define IOC4_DMA_PTR_L		0x01
+#define IOC4_DMA_PTR_H		0x02
+#define IOC4_DMA_ADDR_L		0x03
+#define IOC4_DMA_ADDR_H		0x04
+#define IOC4_BC_DEV		0x05
+#define IOC4_BC_MEM		0x06
+#define	IOC4_DMA_CTRL		0x07
+#define	IOC4_DMA_END_ADDR	0x08
+
+/* Bits in the IOC4 Control/Status Register */
+#define	IOC4_S_DMA_START	0x01
+#define	IOC4_S_DMA_STOP		0x02
+#define	IOC4_S_DMA_DIR		0x04
+#define	IOC4_S_DMA_ACTIVE	0x08
+#define	IOC4_S_DMA_ERROR	0x10
+#define	IOC4_ATA_MEMERR		0x02
+
+/* Read/Write Directions */
+#define	IOC4_DMA_WRITE		0x04
+#define	IOC4_DMA_READ		0x00
+
+/* Interrupt Register Offsets */
+#define IOC4_INTR_REG		0x03
+#define	IOC4_INTR_SET		0x05
+#define	IOC4_INTR_CLEAR		0x07
+
+#define IOC4_IDE_CACHELINE_SIZE	128
+#define IOC4_CMD_CTL_BLK_SIZE	0x20
+#define IOC4_SUPPORTED_FIRMWARE_REV 46
+
+typedef struct {
+	u32 timing_reg0;
+	u32 timing_reg1;
+	u32 low_mem_ptr;
+	u32 high_mem_ptr;
+	u32 low_mem_addr;
+	u32 high_mem_addr;
+	u32 dev_byte_count;
+	u32 mem_byte_count;
+	u32 status;
+} ioc4_dma_regs_t;
+
+/* Each Physical Region Descriptor Entry size is 16 bytes (2 * 64 bits) */
+/* IOC4 has only 1 IDE channel */
+#define IOC4_PRD_BYTES       16
+#define IOC4_PRD_ENTRIES     (PAGE_SIZE /(4*IOC4_PRD_BYTES))
+
+
+static void
+sgiioc4_init_hwif_ports(hw_regs_t * hw, unsigned long data_port,
+			unsigned long ctrl_port, unsigned long irq_port)
+{
+	unsigned long reg = data_port;
+	int i;
+
+	/* Registers are word (32 bit) aligned */
+	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++)
+		hw->io_ports[i] = reg + i * 4;
+
+	if (ctrl_port)
+		hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
+
+	if (irq_port)
+		hw->io_ports[IDE_IRQ_OFFSET] = irq_port;
+}
+
+static void
+sgiioc4_maskproc(ide_drive_t * drive, int mask)
+{
+	ide_hwif_t *hwif = HWIF(drive);
+	hwif->OUTB(mask ? (drive->ctl | 2) : (drive->ctl & ~2),
+		   IDE_CONTROL_REG);
+}
+
+
+static int
+sgiioc4_checkirq(ide_hwif_t * hwif)
+{
+	u8 intr_reg =
+	    hwif->INL(hwif->io_ports[IDE_IRQ_OFFSET] + IOC4_INTR_REG * 4);
+
+	if (intr_reg & 0x03)
+		return 1;
+
+	return 0;
+}
+
+
+static int
+sgiioc4_clearirq(ide_drive_t * drive)
+{
+	u32 intr_reg;
+	ide_hwif_t *hwif = HWIF(drive);
+	unsigned long other_ir =
+	    hwif->io_ports[IDE_IRQ_OFFSET] + (IOC4_INTR_REG << 2);
+
+	/* Code to check for PCI error conditions */
+	intr_reg = hwif->INL(other_ir);
+	if (intr_reg & 0x03) { /* Valid IOC4-IDE interrupt */
+		/*
+		 * Using hwif->INB to read the IDE_STATUS_REG has a side effect
+		 * of clearing the interrupt.  The first read should clear it
+		 * if it is set.  The second read should return a "clear" status
+		 * if it got cleared.  If not, then spin for a bit trying to
+		 * clear it.
+		 */
+		u8 stat = hwif->INB(IDE_STATUS_REG);
+		int count = 0;
+		stat = hwif->INB(IDE_STATUS_REG);
+		while ((stat & 0x80) && (count++ < 100)) {
+			udelay(1);
+			stat = hwif->INB(IDE_STATUS_REG);
+		}
+
+		if (intr_reg & 0x02) {
+			/* Error when transferring DMA data on PCI bus */
+			u32 pci_err_addr_low, pci_err_addr_high,
+			    pci_stat_cmd_reg;
+
+			pci_err_addr_low =
+				hwif->INL(hwif->io_ports[IDE_IRQ_OFFSET]);
+			pci_err_addr_high =
+				hwif->INL(hwif->io_ports[IDE_IRQ_OFFSET] + 4);
+			pci_read_config_dword(hwif->pci_dev, PCI_COMMAND,
+					      &pci_stat_cmd_reg);
+			printk(KERN_ERR
+			       "%s(%s) : PCI Bus Error when doing DMA:"
+				   " status-cmd reg is 0x%x\n",
+			       __FUNCTION__, drive->name, pci_stat_cmd_reg);
+			printk(KERN_ERR
+			       "%s(%s) : PCI Error Address is 0x%x%x\n",
+			       __FUNCTION__, drive->name,
+			       pci_err_addr_high, pci_err_addr_low);
+			/* Clear the PCI Error indicator */
+			pci_write_config_dword(hwif->pci_dev, PCI_COMMAND,
+					       0x00000146);
+		}
+
+		/* Clear the Interrupt, Error bits on the IOC4 */
+		hwif->OUTL(0x03, other_ir);
+
+		intr_reg = hwif->INL(other_ir);
+	}
+
+	return intr_reg & 3;
+}
+
+static int
+sgiioc4_ide_dma_begin(ide_drive_t * drive)
+{
+	ide_hwif_t *hwif = HWIF(drive);
+	unsigned int reg = hwif->INL(hwif->dma_base + IOC4_DMA_CTRL * 4);
+	unsigned int temp_reg = reg | IOC4_S_DMA_START;
+
+	hwif->OUTL(temp_reg, hwif->dma_base + IOC4_DMA_CTRL * 4);
+
+	return 0;
+}
+
+static u32
+sgiioc4_ide_dma_stop(ide_hwif_t *hwif, u64 dma_base)
+{
+	u32	ioc4_dma;
+	int	count;
+
+	count = 0;
+	ioc4_dma = hwif->INL(dma_base + IOC4_DMA_CTRL * 4);
+	while ((ioc4_dma & IOC4_S_DMA_STOP) && (count++ < 200)) {
+		udelay(1);
+		ioc4_dma = hwif->INL(dma_base + IOC4_DMA_CTRL * 4);
+	}
+	return ioc4_dma;
+}
+
+/* Stops the IOC4 DMA Engine */
+static int
+sgiioc4_ide_dma_end(ide_drive_t * drive)
+{
+	u32 ioc4_dma, bc_dev, bc_mem, num, valid = 0, cnt = 0;
+	ide_hwif_t *hwif = HWIF(drive);
+	u64 dma_base = hwif->dma_base;
+	int dma_stat = 0;
+	unsigned long *ending_dma = (unsigned long *) hwif->dma_base2;
+
+	hwif->OUTL(IOC4_S_DMA_STOP, dma_base + IOC4_DMA_CTRL * 4);
+
+	ioc4_dma = sgiioc4_ide_dma_stop(hwif, dma_base);
+
+	if (ioc4_dma & IOC4_S_DMA_STOP) {
+		printk(KERN_ERR
+		       "%s(%s): IOC4 DMA STOP bit is still 1 :"
+		       "ioc4_dma_reg 0x%x\n",
+		       __FUNCTION__, drive->name, ioc4_dma);
+		dma_stat = 1;
+	}
+
+	/*
+	 * The IOC4 will DMA 1's to the ending dma area to indicate that
+	 * previous data DMA is complete.  This is necessary because of relaxed
+	 * ordering between register reads and DMA writes on the Altix.
+	 */
+	while ((cnt++ < 200) && (!valid)) {
+		for (num = 0; num < 16; num++) {
+			if (ending_dma[num]) {
+				valid = 1;
+				break;
+			}
+		}
+		udelay(1);
+	}
+	if (!valid) {
+		printk(KERN_ERR "%s(%s) : DMA incomplete\n", __FUNCTION__,
+		       drive->name);
+		dma_stat = 1;
+	}
+
+	bc_dev = hwif->INL(dma_base + IOC4_BC_DEV * 4);
+	bc_mem = hwif->INL(dma_base + IOC4_BC_MEM * 4);
+
+	if ((bc_dev & 0x01FF) || (bc_mem & 0x1FF)) {
+		if (bc_dev > bc_mem + 8) {
+			printk(KERN_ERR
+			       "%s(%s): WARNING!! byte_count_dev %d "
+			       "!= byte_count_mem %d\n",
+			       __FUNCTION__, drive->name, bc_dev, bc_mem);
+		}
+	}
+
+	drive->waiting_for_dma = 0;
+	ide_destroy_dmatable(drive);
+
+	return dma_stat;
+}
+
+static int
+sgiioc4_ide_dma_check(ide_drive_t * drive)
+{
+	if (ide_config_drive_speed(drive, XFER_MW_DMA_2) != 0) {
+		printk(KERN_INFO
+		       "Couldnot set %s in Multimode-2 DMA mode | "
+			   "Drive %s using PIO instead\n",
+		       drive->name, drive->name);
+		drive->using_dma = 0;
+	} else
+		drive->using_dma = 1;
+
+	return 0;
+}
+
+static int
+sgiioc4_ide_dma_on(ide_drive_t * drive)
+{
+	drive->using_dma = 1;
+
+	return HWIF(drive)->ide_dma_host_on(drive);
+}
+
+static int
+sgiioc4_ide_dma_off(ide_drive_t * drive)
+{
+	printk(KERN_INFO "%s: DMA disabled\n", drive->name);
+
+	return HWIF(drive)->ide_dma_off_quietly(drive);
+}
+
+static int
+sgiioc4_ide_dma_off_quietly(ide_drive_t * drive)
+{
+	drive->using_dma = 0;
+
+	return HWIF(drive)->ide_dma_host_off(drive);
+}
+
+/* returns 1 if dma irq issued, 0 otherwise */
+static int
+sgiioc4_ide_dma_test_irq(ide_drive_t * drive)
+{
+	return sgiioc4_checkirq(HWIF(drive));
+}
+
+static int
+sgiioc4_ide_dma_host_on(ide_drive_t * drive)
+{
+	if (drive->using_dma)
+		return 0;
+
+	return 1;
+}
+
+static int
+sgiioc4_ide_dma_host_off(ide_drive_t * drive)
+{
+	sgiioc4_clearirq(drive);
+
+	return 0;
+}
+
+static int
+sgiioc4_ide_dma_verbose(ide_drive_t * drive)
+{
+	if (drive->using_dma == 1)
+		printk(", UDMA(16)");
+	else
+		printk(", PIO");
+
+	return 1;
+}
+
+static int
+sgiioc4_ide_dma_lostirq(ide_drive_t * drive)
+{
+	HWIF(drive)->resetproc(drive);
+
+	return __ide_dma_lostirq(drive);
+}
+
+static void
+sgiioc4_resetproc(ide_drive_t * drive)
+{
+	sgiioc4_ide_dma_end(drive);
+	sgiioc4_clearirq(drive);
+}
+
+static u8
+sgiioc4_INB(unsigned long port)
+{
+	u8 reg = (u8) inb(port);
+
+	if ((port & 0xFFF) == 0x11C) {	/* Status register of IOC4 */
+		if (reg & 0x51) {	/* Not busy...check for interrupt */
+			unsigned long other_ir = port - 0x110;
+			unsigned int intr_reg = (u32) inl(other_ir);
+
+			/* Clear the Interrupt, Error bits on the IOC4 */
+			if (intr_reg & 0x03) {
+				outl(0x03, other_ir);
+				intr_reg = (u32) inl(other_ir);
+			}
+		}
+	}
+
+	return reg;
+}
+
+/* Creates a dma map for the scatter-gather list entries */
+static void __init
+ide_dma_sgiioc4(ide_hwif_t * hwif, unsigned long dma_base)
+{
+	int num_ports = sizeof (ioc4_dma_regs_t);
+
+	printk(KERN_INFO "%s: BM-DMA at 0x%04lx-0x%04lx\n", hwif->name,
+	       dma_base, dma_base + num_ports - 1);
+
+	if (!request_region(dma_base, num_ports, hwif->name)) {
+		printk(KERN_ERR
+		       "%s(%s) -- ERROR, Addresses 0x%p to 0x%p "
+		       "ALREADY in use\n",
+		       __FUNCTION__, hwif->name, (void *) dma_base,
+		       (void *) dma_base + num_ports - 1);
+		goto dma_alloc_failure;
+	}
+
+	hwif->dma_base = dma_base;
+	hwif->dmatable_cpu = pci_alloc_consistent(hwif->pci_dev,
+					  IOC4_PRD_ENTRIES * IOC4_PRD_BYTES,
+					  &hwif->dmatable_dma);
+
+	if (!hwif->dmatable_cpu)
+		goto dma_alloc_failure;
+
+	hwif->sg_table =
+	    kmalloc(sizeof (struct scatterlist) * IOC4_PRD_ENTRIES, GFP_KERNEL);
+
+	if (!hwif->sg_table)
+		goto dma_sgalloc_failure;
+
+	hwif->dma_base2 = (unsigned long)
+		pci_alloc_consistent(hwif->pci_dev,
+				     IOC4_IDE_CACHELINE_SIZE,
+				     (dma_addr_t *) &(hwif->dma_status));
+
+	if (!hwif->dma_base2)
+		goto dma_base2alloc_failure;
+
+	return;
+
+dma_base2alloc_failure:
+	kfree(hwif->sg_table);
+
+dma_sgalloc_failure:
+	pci_free_consistent(hwif->pci_dev,
+			    IOC4_PRD_ENTRIES * IOC4_PRD_BYTES,
+			    hwif->dmatable_cpu, hwif->dmatable_dma);
+	printk(KERN_INFO
+	       "%s() -- Error! Unable to allocate DMA Maps for drive %s\n",
+	       __FUNCTION__, hwif->name);
+	printk(KERN_INFO
+	       "Changing from DMA to PIO mode for Drive %s\n", hwif->name);
+
+dma_alloc_failure:
+	/* Disable DMA because we couldnot allocate any DMA maps */
+	hwif->autodma = 0;
+	hwif->atapi_dma = 0;
+}
+
+/* Initializes the IOC4 DMA Engine */
+static void
+sgiioc4_configure_for_dma(int dma_direction, ide_drive_t * drive)
+{
+	u32 ioc4_dma;
+	ide_hwif_t *hwif = HWIF(drive);
+	u64 dma_base = hwif->dma_base;
+	u32 dma_addr, ending_dma_addr;
+
+	ioc4_dma = hwif->INL(dma_base + IOC4_DMA_CTRL * 4);
+
+	if (ioc4_dma & IOC4_S_DMA_ACTIVE) {
+		printk(KERN_WARNING
+			"%s(%s):Warning!! DMA from previous transfer was still active\n",
+		       __FUNCTION__, drive->name);
+		hwif->OUTL(IOC4_S_DMA_STOP, dma_base + IOC4_DMA_CTRL * 4);
+		ioc4_dma = sgiioc4_ide_dma_stop(hwif, dma_base);
+
+		if (ioc4_dma & IOC4_S_DMA_STOP)
+			printk(KERN_ERR
+			       "%s(%s) : IOC4 Dma STOP bit is still 1\n",
+			       __FUNCTION__, drive->name);
+	}
+
+	ioc4_dma = hwif->INL(dma_base + IOC4_DMA_CTRL * 4);
+	if (ioc4_dma & IOC4_S_DMA_ERROR) {
+		printk(KERN_WARNING
+		       "%s(%s) : Warning!! - DMA Error during Previous"
+		       " transfer | status 0x%x\n",
+		       __FUNCTION__, drive->name, ioc4_dma);
+		hwif->OUTL(IOC4_S_DMA_STOP, dma_base + IOC4_DMA_CTRL * 4);
+		ioc4_dma = sgiioc4_ide_dma_stop(hwif, dma_base);
+
+		if (ioc4_dma & IOC4_S_DMA_STOP)
+			printk(KERN_ERR
+			       "%s(%s) : IOC4 DMA STOP bit is still 1\n",
+			       __FUNCTION__, drive->name);
+	}
+
+	/* Address of the Scatter Gather List */
+	dma_addr = cpu_to_le32(hwif->dmatable_dma);
+	hwif->OUTL(dma_addr, dma_base + IOC4_DMA_PTR_L * 4);
+
+	/* Address of the Ending DMA */
+	memset((unsigned int *) hwif->dma_base2, 0, IOC4_IDE_CACHELINE_SIZE);
+	ending_dma_addr = cpu_to_le32(hwif->dma_status);
+	hwif->OUTL(ending_dma_addr, dma_base + IOC4_DMA_END_ADDR * 4);
+
+	hwif->OUTL(dma_direction, dma_base + IOC4_DMA_CTRL * 4);
+	drive->waiting_for_dma = 1;
+}
+
+/* IOC4 Scatter Gather list Format 					 */
+/* 128 Bit entries to support 64 bit addresses in the future		 */
+/* The Scatter Gather list Entry should be in the BIG-ENDIAN Format	 */
+/* --------------------------------------------------------------------- */
+/* | Upper 32 bits - Zero           |	 	Lower 32 bits- address | */
+/* --------------------------------------------------------------------- */
+/* | Upper 32 bits - Zero	    |EOL| 15 unused     | 16 Bit Length| */
+/* --------------------------------------------------------------------- */
+/* Creates the scatter gather list, DMA Table */
+static unsigned int
+sgiioc4_build_dma_table(ide_drive_t * drive, struct request *rq, int ddir)
+{
+	ide_hwif_t *hwif = HWIF(drive);
+	unsigned int *table = hwif->dmatable_cpu;
+	unsigned int count = 0, i = 1;
+	struct scatterlist *sg;
+
+	if (HWGROUP(drive)->rq->flags & REQ_DRIVE_TASKFILE)
+		hwif->sg_nents = i = ide_raw_build_sglist(drive, rq);
+	else
+		hwif->sg_nents = i = ide_build_sglist(drive, rq);
+
+	if (!i)
+		return 0;	/* sglist of length Zero */
+
+	sg = hwif->sg_table;
+	while (i && sg_dma_len(sg)) {
+		dma_addr_t cur_addr;
+		int cur_len;
+		cur_addr = sg_dma_address(sg);
+		cur_len = sg_dma_len(sg);
+
+		while (cur_len) {
+			if (count++ >= IOC4_PRD_ENTRIES) {
+				printk(KERN_WARNING
+				       "%s: DMA table too small\n",
+				       drive->name);
+				goto use_pio_instead;
+			} else {
+				u32 xcount, bcount =
+				    0x10000 - (cur_addr & 0xffff);
+
+				if (bcount > cur_len)
+					bcount = cur_len;
+
+				/* put the addr, length in
+				 * the IOC4 dma-table format */
+				*table = 0x0;
+				table++;
+				*table = cpu_to_be32(cur_addr);
+				table++;
+				*table = 0x0;
+				table++;
+
+				xcount = bcount & 0xffff;
+				*table = cpu_to_be32(xcount);
+				table++;
+
+				cur_addr += bcount;
+				cur_len -= bcount;
+			}
+		}
+
+		sg++;
+		i--;
+	}
+
+	if (count) {
+		table--;
+		*table |= cpu_to_be32(0x80000000);
+		return count;
+	}
+
+use_pio_instead:
+	pci_unmap_sg(hwif->pci_dev, hwif->sg_table, hwif->sg_nents,
+		     hwif->sg_dma_direction);
+	hwif->sg_dma_active = 0;
+
+	return 0;		/* revert to PIO for this request */
+}
+
+static int
+sgiioc4_ide_dma_read(ide_drive_t * drive)
+{
+	struct request *rq = HWGROUP(drive)->rq;
+	unsigned int count = 0;
+
+	if (!(count = sgiioc4_build_dma_table(drive, rq, PCI_DMA_FROMDEVICE))) {
+		/* try PIO instead of DMA */
+		return 1;
+	}
+	/* Writes FROM the IOC4 TO Main Memory */
+	sgiioc4_configure_for_dma(IOC4_DMA_WRITE, drive);
+
+	return 0;
+}
+
+static int
+sgiioc4_ide_dma_write(ide_drive_t * drive)
+{
+	struct request *rq = HWGROUP(drive)->rq;
+	unsigned int count = 0;
+
+	if (!(count = sgiioc4_build_dma_table(drive, rq, PCI_DMA_TODEVICE))) {
+		/* try PIO instead of DMA */
+		return 1;
+	}
+
+	sgiioc4_configure_for_dma(IOC4_DMA_READ, drive);
+	/* Writes TO the IOC4 FROM Main Memory */
+
+	return 0;
+}
+
+static void __init
+ide_init_sgiioc4(ide_hwif_t * hwif)
+{
+	hwif->mmio = 2;
+	hwif->autodma = 1;
+	hwif->atapi_dma = 1;
+	hwif->ultra_mask = 0x0;	/* Disable Ultra DMA */
+	hwif->mwdma_mask = 0x2;	/* Multimode-2 DMA  */
+	hwif->swdma_mask = 0x2;
+	hwif->identify = NULL;
+	hwif->tuneproc = NULL;	/* Sets timing for PIO mode */
+	hwif->speedproc = NULL;	/* Sets timing for DMA &/or PIO modes */
+	hwif->selectproc = NULL;/* Use the default routine to select drive */
+	hwif->reset_poll = NULL;/* No HBA specific reset_poll needed */
+	hwif->pre_reset = NULL;	/* No HBA specific pre_set needed */
+	hwif->resetproc = &sgiioc4_resetproc;/* Reset DMA engine,
+						clear interrupts */
+	hwif->intrproc = NULL;	/* Enable or Disable interrupt from drive */
+	hwif->maskproc = &sgiioc4_maskproc;	/* Mask on/off NIEN register */
+	hwif->quirkproc = NULL;
+	hwif->busproc = NULL;
+
+	hwif->ide_dma_read = &sgiioc4_ide_dma_read;
+	hwif->ide_dma_write = &sgiioc4_ide_dma_write;
+	hwif->ide_dma_begin = &sgiioc4_ide_dma_begin;
+	hwif->ide_dma_end = &sgiioc4_ide_dma_end;
+	hwif->ide_dma_check = &sgiioc4_ide_dma_check;
+	hwif->ide_dma_on = &sgiioc4_ide_dma_on;
+	hwif->ide_dma_off = &sgiioc4_ide_dma_off;
+	hwif->ide_dma_off_quietly = &sgiioc4_ide_dma_off_quietly;
+	hwif->ide_dma_test_irq = &sgiioc4_ide_dma_test_irq;
+	hwif->ide_dma_host_on = &sgiioc4_ide_dma_host_on;
+	hwif->ide_dma_host_off = &sgiioc4_ide_dma_host_off;
+	hwif->ide_dma_bad_drive = &__ide_dma_bad_drive;
+	hwif->ide_dma_good_drive = &__ide_dma_good_drive;
+	hwif->ide_dma_count = &__ide_dma_count;
+	hwif->ide_dma_verbose = &sgiioc4_ide_dma_verbose;
+	hwif->ide_dma_retune = &__ide_dma_retune;
+	hwif->ide_dma_lostirq = &sgiioc4_ide_dma_lostirq;
+	hwif->ide_dma_timeout = &__ide_dma_timeout;
+	hwif->INB = &sgiioc4_INB;
+}
+
+static int __init
+sgiioc4_ide_setup_pci_device(struct pci_dev *dev, ide_pci_device_t * d)
+{
+	unsigned long base, ctl, dma_base, irqport;
+	ide_hwif_t *hwif;
+	int h;
+
+	for (h = 0; h < MAX_HWIFS; ++h) {
+		hwif = &ide_hwifs[h];
+		/* Find an empty HWIF */
+		if (hwif->chipset == ide_unknown)
+			break;
+	}
+
+	/*  Get the CmdBlk and CtrlBlk Base Registers */
+	base = pci_resource_start(dev, 0) + IOC4_CMD_OFFSET;
+	ctl = pci_resource_start(dev, 0) + IOC4_CTRL_OFFSET;
+	irqport = pci_resource_start(dev, 0) + IOC4_INTR_OFFSET;
+	dma_base = pci_resource_start(dev, 0) + IOC4_DMA_OFFSET;
+
+	if (!request_region(base, IOC4_CMD_CTL_BLK_SIZE, hwif->name)) {
+		printk(KERN_ERR
+			"%s : %s -- ERROR, Port Addresses "
+			"0x%p to 0x%p ALREADY in use\n",
+		       __FUNCTION__, hwif->name, (void *) base,
+		       (void *) base + IOC4_CMD_CTL_BLK_SIZE);
+		return 1;
+	}
+
+	if (hwif->io_ports[IDE_DATA_OFFSET] != base) {
+		/* Initialize the IO registers */
+		sgiioc4_init_hwif_ports(&hwif->hw, base, ctl, irqport);
+		memcpy(hwif->io_ports, hwif->hw.io_ports,
+		       sizeof (hwif->io_ports));
+		hwif->noprobe = !hwif->io_ports[IDE_DATA_OFFSET];
+	}
+
+	hwif->irq = dev->irq;
+	hwif->chipset = ide_pci;
+	hwif->pci_dev = dev;
+	hwif->channel = 0;	/* Single Channel chip */
+	hwif->cds = (struct ide_pci_device_s *) d;
+	hwif->gendev.parent = &dev->dev;/* setup proper ancestral information */
+
+	/* Initializing chipset IRQ Registers */
+	hwif->OUTL(0x03, irqport + IOC4_INTR_SET * 4);
+
+	ide_init_sgiioc4(hwif);
+
+	if (dma_base)
+		ide_dma_sgiioc4(hwif, dma_base);
+	else
+		printk(KERN_INFO "%s: %s Bus-Master DMA disabled\n",
+		       hwif->name, d->name);
+
+	probe_hwif_init(hwif);
+	return 0;
+}
+
+/* This ensures that we can build this for generic kernels without
+ * having all the SN2 code sync'd and merged.
+ */
+typedef enum pciio_endian_e {
+	PCIDMA_ENDIAN_BIG,
+	PCIDMA_ENDIAN_LITTLE
+} pciio_endian_t;
+pciio_endian_t __attribute__ ((weak)) snia_pciio_endian_set(struct pci_dev
+					    *pci_dev, pciio_endian_t device_end,
+					    pciio_endian_t desired_end);
+
+static unsigned int __init
+pci_init_sgiioc4(struct pci_dev *dev, ide_pci_device_t * d)
+{
+	unsigned int class_rev;
+
+	if (pci_enable_device(dev)) {
+		printk(KERN_ERR
+		       "Failed to enable device %s at slot %s\n",
+		       d->name, dev->slot_name);
+		return 1;
+	}
+	pci_set_master(dev);
+
+	pci_read_config_dword(dev, PCI_CLASS_REVISION, &class_rev);
+	class_rev &= 0xff;
+	printk(KERN_INFO "%s: IDE controller at PCI slot %s, revision %d\n",
+			d->name, dev->slot_name, class_rev);
+	if (class_rev < IOC4_SUPPORTED_FIRMWARE_REV) {
+		printk(KERN_ERR "Skipping %s IDE controller in slot %s: "
+			"firmware is obsolete - please upgrade to revision"
+			"46 or higher\n", d->name, dev->slot_name);
+		return 1;
+	}
+
+	/* Enable Byte Swapping in the PIC... */
+	if (snia_pciio_endian_set) {
+		snia_pciio_endian_set(dev, PCIDMA_ENDIAN_LITTLE,
+				      PCIDMA_ENDIAN_BIG);
+	} else {
+		printk(KERN_ERR
+		       "Failed to set endianness for device %s at slot %s\n",
+		       d->name, dev->slot_name);
+		return 1;
+	}
+
+	return sgiioc4_ide_setup_pci_device(dev, d);
+}
+
+static ide_pci_device_t sgiioc4_chipsets[] __devinitdata = {
+	{
+	 /* Channel 0 */
+	 .vendor = PCI_VENDOR_ID_SGI,
+	 .device = PCI_DEVICE_ID_SGI_IOC4,
+	 .name = "SGIIOC4",
+	 .init_hwif = ide_init_sgiioc4,
+	 .init_dma = ide_dma_sgiioc4,
+	 .channels = 1,
+	 .autodma = AUTODMA,
+	 /* SGI IOC4 doesn't have enablebits. */
+	 .bootable = ON_BOARD,
+	}
+};
+
+static int __devinit
+sgiioc4_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+{
+	ide_pci_device_t *d = &sgiioc4_chipsets[id->driver_data];
+	if (dev->device != d->device) {
+		printk(KERN_ERR "Error in %s(dev 0x%p | id 0x%p )\n",
+		       __FUNCTION__, (void *) dev, (void *) id);
+		BUG();
+	}
+
+	if (pci_init_sgiioc4(dev, d))
+		return 0;
+
+	MOD_INC_USE_COUNT;
+
+	return 0;
+}
+
+static struct pci_device_id sgiioc4_pci_tbl[] = {
+	{PCI_VENDOR_ID_SGI, PCI_DEVICE_ID_SGI_IOC4, PCI_ANY_ID,
+	 PCI_ANY_ID, 0x0b4000, 0xFFFFFF, 0},
+	{0}
+};
+
+static struct pci_driver driver = {
+	.name = "SGI-IOC4 IDE",
+	.id_table = sgiioc4_pci_tbl,
+	.probe = sgiioc4_init_one,
+};
+
+static int
+sgiioc4_ide_init(void)
+{
+	return ide_pci_register_driver(&driver);
+}
+
+static void
+sgiioc4_ide_exit(void)
+{
+	ide_pci_unregister_driver(&driver);
+}
+
+module_init(sgiioc4_ide_init);
+module_exit(sgiioc4_ide_exit);
+
+MODULE_AUTHOR("Aniket Malatpure - Silicon Graphics Inc. (SGI)");
+MODULE_DESCRIPTION("PCI driver module for SGI IOC4 Base-IO Card");
+MODULE_LICENSE("GPL");
--- diff/drivers/media/dvb/bt8xx/Kconfig	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/media/dvb/bt8xx/Kconfig	2003-12-29 09:30:40.000000000 +0000
@@ -0,0 +1,13 @@
+config DVB_BT8XX
+	tristate "Nebula/Pinnacle PCTV PCI cards"
+	depends on DVB_CORE && PCI && VIDEO_BT848
+	help
+	  Support for PCI cards based on the Bt8xx PCI bridge. Examples are
+	  the Nebula cards, the Pinnacle PCTV cards, and Twinhan DST cards.
+
+          Since these cards have no MPEG decoder onboard, they transmit
+	  only compressed MPEG data over the PCI bus, so you need
+	  an external software decoder to watch TV on your computer.
+
+	  Say Y if you own such a device and want to use it.
+
--- diff/drivers/media/dvb/bt8xx/Makefile	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/media/dvb/bt8xx/Makefile	2003-12-29 09:30:40.000000000 +0000
@@ -0,0 +1,5 @@
+
+obj-$(CONFIG_DVB_BT8XX) += bt878.o dvb-bt8xx.o
+
+EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/video -Idrivers/media/dvb/frontends
+
--- diff/drivers/media/dvb/bt8xx/bt878.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/media/dvb/bt8xx/bt878.c	2003-12-29 09:30:40.000000000 +0000
@@ -0,0 +1,614 @@
+/*
+ * bt878.c: part of the driver for the Pinnacle PCTV Sat DVB PCI card
+ *
+ * Copyright (C) 2002 Peter Hettkamp <peter.hettkamp@t-online.de>
+ *
+ * large parts based on the bttv driver
+ * Copyright (C) 1996,97,98 Ralph  Metzler (rjkm@thp.uni-koeln.de)
+ *                        & Marcus Metzler (mocm@thp.uni-koeln.de)
+ * (c) 1999,2000 Gerd Knorr <kraxel@goldbach.in-berlin.de>
+ *
+ * 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.
+ * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
+ * 
+ */
+
+#include <linux/version.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/pci.h>
+#include <asm/io.h>
+#include <linux/ioport.h>
+#include <asm/pgtable.h>
+#include <asm/page.h>
+#include <linux/types.h>
+#include <linux/interrupt.h>
+#include <linux/kmod.h>
+#include <linux/vmalloc.h>
+#include <linux/init.h>
+
+#include "dmxdev.h"
+#include "dvbdev.h"
+#include "bt878.h"
+#include "dst-bt878.h"
+
+#include "dvb_functions.h"
+
+/**************************************/
+/* Miscellaneous utility  definitions */
+/**************************************/
+
+unsigned int bt878_verbose = 1;
+unsigned int bt878_debug = 0;
+MODULE_PARM(bt878_verbose, "i");
+MODULE_PARM_DESC(bt878_verbose,
+		 "verbose startup messages, default is 1 (yes)");
+MODULE_PARM(bt878_debug, "i");
+MODULE_PARM_DESC(bt878_debug, "debug messages, default is 0 (no)");
+MODULE_LICENSE("GPL");
+
+int bt878_num;
+struct bt878 bt878[BT878_MAX];
+
+EXPORT_SYMBOL(bt878_debug);
+EXPORT_SYMBOL(bt878_verbose);
+EXPORT_SYMBOL(bt878_num);
+EXPORT_SYMBOL(bt878);
+
+#define btwrite(dat,adr)    bmtwrite((dat), (bt->bt878_mem+(adr)))
+#define btread(adr)         bmtread(bt->bt878_mem+(adr))
+
+#define btand(dat,adr)      btwrite((dat) & btread(adr), adr)
+#define btor(dat,adr)       btwrite((dat) | btread(adr), adr)
+#define btaor(dat,mask,adr) btwrite((dat) | ((mask) & btread(adr)), adr)
+
+#if defined(dprintk)
+#undef dprintk
+#endif
+#define dprintk if(bt878_debug) printk
+
+static void bt878_mem_free(struct bt878 *bt)
+{
+	if (bt->buf_cpu) {
+		pci_free_consistent(bt->dev, bt->buf_size, bt->buf_cpu,
+				    bt->buf_dma);
+		bt->buf_cpu = NULL;
+	}
+
+	if (bt->risc_cpu) {
+		pci_free_consistent(bt->dev, bt->risc_size, bt->risc_cpu,
+				    bt->risc_dma);
+		bt->risc_cpu = NULL;
+	}
+}
+
+static int bt878_mem_alloc(struct bt878 *bt)
+{
+	if (!bt->buf_cpu) {
+		bt->buf_size = 128 * 1024;
+
+		bt->buf_cpu =
+		    pci_alloc_consistent(bt->dev, bt->buf_size,
+					 &bt->buf_dma);
+
+		if (!bt->buf_cpu)
+			return -ENOMEM;
+
+		memset(bt->buf_cpu, 0, bt->buf_size);
+	}
+
+	if (!bt->risc_cpu) {
+		bt->risc_size = PAGE_SIZE;
+		bt->risc_cpu =
+		    pci_alloc_consistent(bt->dev, bt->risc_size,
+					 &bt->risc_dma);
+
+		if (!bt->risc_cpu) {
+			bt878_mem_free(bt);
+			return -ENOMEM;
+		}
+
+		memset(bt->risc_cpu, 0, bt->risc_size);
+	}
+
+	return 0;
+}
+
+/* RISC instructions */
+#define RISC_WRITE        	(0x01 << 28)
+#define RISC_JUMP         	(0x07 << 28)
+#define RISC_SYNC         	(0x08 << 28)
+
+/* RISC bits */
+#define RISC_WR_SOL       	(1 << 27)
+#define RISC_WR_EOL       	(1 << 26)
+#define RISC_IRQ          	(1 << 24)
+#define RISC_STATUS(status)	((((~status) & 0x0F) << 20) | ((status & 0x0F) << 16))
+#define RISC_SYNC_RESYNC  	(1 << 15)
+#define RISC_SYNC_FM1     	0x06
+#define RISC_SYNC_VRO     	0x0C
+
+#define RISC_FLUSH()		bt->risc_pos = 0
+#define RISC_INSTR(instr) 	bt->risc_cpu[bt->risc_pos++] = cpu_to_le32(instr)
+
+static int bt878_make_risc(struct bt878 *bt)
+{
+	bt->block_bytes = bt->buf_size >> 4;
+	bt->block_count = 1 << 4;
+	bt->line_bytes = bt->block_bytes;
+	bt->line_count = bt->block_count;
+
+	while (bt->line_bytes > 4095) {
+		bt->line_bytes >>= 1;
+		bt->line_count <<= 1;
+	}
+
+	if (bt->line_count > 255) {
+		printk("bt878: buffer size error!\n");
+		return -EINVAL;
+	}
+	return 0;
+}
+
+
+static void bt878_risc_program(struct bt878 *bt, u32 op_sync_orin)
+{
+	u32 buf_pos = 0;
+	u32 line;
+
+	RISC_FLUSH();
+	RISC_INSTR(RISC_SYNC | RISC_SYNC_FM1 | op_sync_orin);
+	RISC_INSTR(0);
+
+	dprintk("bt878: risc len lines %u, bytes per line %u\n", 
+			bt->line_count, bt->line_bytes);
+	for (line = 0; line < bt->line_count; line++) {
+		// At the beginning of every block we issue an IRQ with previous (finished) block number set
+		if (!(buf_pos % bt->block_bytes))
+			RISC_INSTR(RISC_WRITE | RISC_WR_SOL | RISC_WR_EOL |
+				   RISC_IRQ |
+				   RISC_STATUS(((buf_pos /
+						 bt->block_bytes) +
+						(bt->block_count -
+						 1)) %
+					       bt->block_count) | bt->
+				   line_bytes);
+		else
+			RISC_INSTR(RISC_WRITE | RISC_WR_SOL | RISC_WR_EOL |
+				   bt->line_bytes);
+		RISC_INSTR(bt->buf_dma + buf_pos);
+		buf_pos += bt->line_bytes;
+	}
+
+	RISC_INSTR(RISC_SYNC | op_sync_orin | RISC_SYNC_VRO);
+	RISC_INSTR(0);
+
+	RISC_INSTR(RISC_JUMP);
+	RISC_INSTR(bt->risc_dma);
+
+	btwrite((bt->line_count << 16) | bt->line_bytes, BT878_APACK_LEN);
+}
+
+/*****************************/
+/* Start/Stop grabbing funcs */
+/*****************************/
+
+void bt878_start(struct bt878 *bt, u32 controlreg, u32 op_sync_orin,
+		u32 irq_err_ignore)
+{
+	u32 int_mask;
+
+	dprintk("bt878 debug: bt878_start (ctl=%8.8x)\n", controlreg);
+	/* complete the writing of the risc dma program now we have
+	 * the card specifics
+	 */
+	bt878_risc_program(bt, op_sync_orin);
+	controlreg &= ~0x1f;
+	controlreg |= 0x1b;
+
+	btwrite(cpu_to_le32(bt->risc_dma), BT878_ARISC_START);
+
+	/* original int mask had :
+	 *    6    2    8    4    0
+	 * 1111 1111 1000 0000 0000
+	 * SCERR|OCERR|PABORT|RIPERR|FDSR|FTRGT|FBUS|RISCI
+	 * Hacked for DST to:
+	 * SCERR | OCERR | FDSR | FTRGT | FBUS | RISCI
+	 */
+	int_mask = BT878_ASCERR | BT878_AOCERR | BT878_APABORT | 
+		BT878_ARIPERR | BT878_APPERR | BT878_AFDSR | BT878_AFTRGT | 
+		BT878_AFBUS | BT878_ARISCI;
+
+
+	/* ignore pesky bits */
+	int_mask &= ~irq_err_ignore;
+	
+	btwrite(int_mask, BT878_AINT_MASK);
+	btwrite(controlreg, BT878_AGPIO_DMA_CTL);
+}
+
+void bt878_stop(struct bt878 *bt)
+{
+	u32 stat;
+	int i = 0;
+
+	dprintk("bt878 debug: bt878_stop\n");
+
+	btwrite(0, BT878_AINT_MASK);
+	btand(~0x13, BT878_AGPIO_DMA_CTL);
+
+	do {
+		stat = btread(BT878_AINT_STAT);
+		if (!(stat & BT878_ARISC_EN))
+			break;
+		i++;
+	} while (i < 500);
+
+	dprintk("bt878(%d) debug: bt878_stop, i=%d, stat=0x%8.8x\n",
+		bt->nr, i, stat);
+}
+
+EXPORT_SYMBOL(bt878_start);
+EXPORT_SYMBOL(bt878_stop);
+
+/*****************************/
+/* Interrupt service routine */
+/*****************************/
+
+static irqreturn_t bt878_irq(int irq, void *dev_id, struct pt_regs *regs)
+{
+	u32 stat, astat, mask;
+	int count;
+	struct bt878 *bt;
+
+	bt = (struct bt878 *) dev_id;
+
+	count = 0;
+	while (1) {
+		stat = btread(BT878_AINT_STAT);
+		mask = btread(BT878_AINT_MASK);
+		if (!(astat = (stat & mask)))
+			return IRQ_NONE;	/* this interrupt is not for me */
+/*		dprintk("bt878(%d) debug: irq count %d, stat 0x%8.8x, mask 0x%8.8x\n",bt->nr,count,stat,mask); */
+		btwrite(astat, BT878_AINT_STAT);	/* try to clear interupt condition */
+
+
+		if (astat & (BT878_ASCERR | BT878_AOCERR)) {
+			if (bt878_verbose) {
+				printk("bt878(%d): irq%s%s risc_pc=%08x\n",
+				       bt->nr,
+				       (astat & BT878_ASCERR) ? " SCERR" :
+				       "",
+				       (astat & BT878_AOCERR) ? " OCERR" :
+				       "", btread(BT878_ARISC_PC));
+			}
+		}
+		if (astat & (BT878_APABORT | BT878_ARIPERR | BT878_APPERR)) {
+			if (bt878_verbose) {
+				printk
+				    ("bt878(%d): irq%s%s%s risc_pc=%08x\n",
+				     bt->nr,
+				     (astat & BT878_APABORT) ? " PABORT" :
+				     "",
+				     (astat & BT878_ARIPERR) ? " RIPERR" :
+				     "",
+				     (astat & BT878_APPERR) ? " PPERR" :
+				     "", btread(BT878_ARISC_PC));
+			}
+		}
+		if (astat & (BT878_AFDSR | BT878_AFTRGT | BT878_AFBUS)) {
+			if (bt878_verbose) {
+				printk
+				    ("bt878(%d): irq%s%s%s risc_pc=%08x\n",
+				     bt->nr,
+				     (astat & BT878_AFDSR) ? " FDSR" : "",
+				     (astat & BT878_AFTRGT) ? " FTRGT" :
+				     "",
+				     (astat & BT878_AFBUS) ? " FBUS" : "",
+				     btread(BT878_ARISC_PC));
+			}
+		}
+		if (astat & BT878_ARISCI) {
+			bt->finished_block = (stat & BT878_ARISCS) >> 28;
+			tasklet_schedule(&bt->tasklet);
+			break;
+		}
+		count++;
+		if (count > 20) {
+			btwrite(0, BT878_AINT_MASK);
+			printk(KERN_ERR
+			       "bt878(%d): IRQ lockup, cleared int mask\n",
+			       bt->nr);
+			break;
+		}
+	}
+	return IRQ_HANDLED;
+}
+
+extern int bttv_gpio_enable(unsigned int card, unsigned long mask, unsigned long data);
+extern int bttv_read_gpio(unsigned int card, unsigned long *data);
+extern int bttv_write_gpio(unsigned int card, unsigned long mask, unsigned long data);
+
+int
+bt878_device_control(struct bt878 *bt, unsigned int cmd, union dst_gpio_packet *mp)
+{
+	int retval;
+
+	retval = 0;
+	if (down_interruptible (&bt->gpio_lock))
+		return -ERESTARTSYS;
+	/* special gpio signal */
+	switch (cmd) {
+	    case DST_IG_ENABLE:
+		// dprintk("dvb_bt8xx: dst enable mask 0x%02x enb 0x%02x \n", mp->dstg.enb.mask, mp->dstg.enb.enable);
+		retval = bttv_gpio_enable(bt->bttv_nr,
+				mp->enb.mask,
+				mp->enb.enable);
+		break;
+	    case DST_IG_WRITE:
+		// dprintk("dvb_bt8xx: dst write gpio mask 0x%02x out 0x%02x\n", mp->dstg.outp.mask, mp->dstg.outp.highvals);
+		retval = bttv_write_gpio(bt->bttv_nr,
+				mp->outp.mask,
+				mp->outp.highvals);
+
+		break;
+	    case DST_IG_READ:
+		/* read */
+		retval =  bttv_read_gpio(bt->bttv_nr, &mp->rd.value);
+		// dprintk("dvb_bt8xx: dst read gpio 0x%02x\n", (unsigned)mp->dstg.rd.value);
+		break;
+	    case DST_IG_TS:
+		/* Set packet size */
+		bt->TS_Size = mp->psize;
+		break;
+
+	    default:
+		retval = -EINVAL;
+		break;
+	}
+	up(&bt->gpio_lock);
+	return retval;
+}
+
+EXPORT_SYMBOL(bt878_device_control);
+
+struct bt878 *bt878_find_by_dvb_adap(struct dvb_adapter *adap)
+{
+	unsigned int card_nr;
+	
+	printk("bt878 find by dvb adap: checking \"%s\"\n",adap->name);
+	for (card_nr = 0; card_nr < bt878_num; card_nr++) {
+		if (bt878[card_nr].adap_ptr == adap)
+			return &bt878[card_nr];
+	}
+	printk("bt878 find by dvb adap: NOT found \"%s\"\n",adap->name);
+	return NULL;
+}
+
+EXPORT_SYMBOL(bt878_find_by_dvb_adap);
+
+/***********************/
+/* PCI device handling */
+/***********************/
+
+static int __devinit bt878_probe(struct pci_dev *dev,
+				 const struct pci_device_id *pci_id)
+{
+	int result;
+	unsigned char lat;
+	struct bt878 *bt;
+#if defined(__powerpc__)
+	unsigned int cmd;
+#endif
+
+	printk(KERN_INFO "bt878: Bt878 AUDIO function found (%d).\n",
+	       bt878_num);
+
+	bt = &bt878[bt878_num];
+	bt->dev = dev;
+	bt->nr = bt878_num;
+	bt->shutdown = 0;
+
+	bt->id = dev->device;
+	bt->irq = dev->irq;
+	bt->bt878_adr = pci_resource_start(dev, 0);
+	if (pci_enable_device(dev))
+		return -EIO;
+	if (!request_mem_region(pci_resource_start(dev, 0),
+				pci_resource_len(dev, 0), "bt878")) {
+		return -EBUSY;
+	}
+
+	pci_read_config_byte(dev, PCI_CLASS_REVISION, &bt->revision);
+	pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat);
+	printk(KERN_INFO "bt878(%d): Bt%x (rev %d) at %02x:%02x.%x, ",
+	       bt878_num, bt->id, bt->revision, dev->bus->number,
+	       PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn));
+	printk("irq: %d, latency: %d, memory: 0x%lx\n",
+	       bt->irq, lat, bt->bt878_adr);
+
+
+#if defined(__powerpc__)
+	/* on OpenFirmware machines (PowerMac at least), PCI memory cycle */
+	/* response on cards with no firmware is not enabled by OF */
+	pci_read_config_dword(dev, PCI_COMMAND, &cmd);
+	cmd = (cmd | PCI_COMMAND_MEMORY);
+	pci_write_config_dword(dev, PCI_COMMAND, cmd);
+#endif
+
+#ifdef __sparc__
+	bt->bt878_mem = (unsigned char *) bt->bt878_adr;
+#else
+	bt->bt878_mem = ioremap(bt->bt878_adr, 0x1000);
+#endif
+
+	/* clear interrupt mask */
+	btwrite(0, BT848_INT_MASK);
+
+	result = request_irq(bt->irq, bt878_irq,
+			     SA_SHIRQ | SA_INTERRUPT, "bt878",
+			     (void *) bt);
+	if (result == -EINVAL) {
+		printk(KERN_ERR "bt878(%d): Bad irq number or handler\n",
+		       bt878_num);
+		goto fail1;
+	}
+	if (result == -EBUSY) {
+		printk(KERN_ERR
+		       "bt878(%d): IRQ %d busy, change your PnP config in BIOS\n",
+		       bt878_num, bt->irq);
+		goto fail1;
+	}
+	if (result < 0)
+		goto fail1;
+
+	pci_set_master(dev);
+	pci_set_drvdata(dev, bt);
+
+/*        if(init_bt878(btv) < 0) {
+                bt878_remove(dev);
+                return -EIO;
+        }
+*/
+
+	if ((result = bt878_mem_alloc(bt))) {
+		printk("bt878: failed to allocate memory!\n");
+		goto fail2;
+	}
+
+	bt878_make_risc(bt);
+	btwrite(0, BT878_AINT_MASK);
+	bt878_num++;
+
+	return 0;
+
+      fail2:
+	free_irq(bt->irq, bt);
+      fail1:
+	release_mem_region(pci_resource_start(bt->dev, 0),
+			   pci_resource_len(bt->dev, 0));
+	return result;
+}
+
+static void __devexit bt878_remove(struct pci_dev *pci_dev)
+{
+	u8 command;
+	struct bt878 *bt = pci_get_drvdata(pci_dev);
+
+	if (bt878_verbose)
+		printk("bt878(%d): unloading\n", bt->nr);
+
+	/* turn off all capturing, DMA and IRQs */
+	btand(~13, BT878_AGPIO_DMA_CTL);
+
+	/* first disable interrupts before unmapping the memory! */
+	btwrite(0, BT878_AINT_MASK);
+	btwrite(~0x0UL, BT878_AINT_STAT);
+
+	/* disable PCI bus-mastering */
+	pci_read_config_byte(bt->dev, PCI_COMMAND, &command);
+	/* Should this be &=~ ?? */
+	command &= ~PCI_COMMAND_MASTER;
+	pci_write_config_byte(bt->dev, PCI_COMMAND, command);
+
+	free_irq(bt->irq, bt);
+	printk(KERN_DEBUG "bt878_mem: 0x%p.\n", bt->bt878_mem);
+	if (bt->bt878_mem)
+		iounmap(bt->bt878_mem);
+
+	release_mem_region(pci_resource_start(bt->dev, 0),
+			   pci_resource_len(bt->dev, 0));
+	/* wake up any waiting processes
+	   because shutdown flag is set, no new processes (in this queue)
+	   are expected
+	 */
+	bt->shutdown = 1;
+	bt878_mem_free(bt);
+
+	pci_set_drvdata(pci_dev, NULL);
+	return;
+}
+
+static struct pci_device_id bt878_pci_tbl[] __devinitdata = {
+	{PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BROOKTREE_878,
+	 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+	{0,}
+};
+
+MODULE_DEVICE_TABLE(pci, bt878_pci_tbl);
+
+static struct pci_driver bt878_pci_driver = {
+      .name 	= "bt878",
+      .id_table = bt878_pci_tbl,
+      .probe 	= bt878_probe,
+      .remove 	= bt878_remove,
+};
+
+static int bt878_pci_driver_registered = 0;
+
+/* This will be used later by dvb-bt8xx to only use the audio
+ * dma of certain cards */
+int bt878_find_audio_dma(void)
+{
+	// pci_register_driver(&bt878_pci_driver);
+	bt878_pci_driver_registered = 1;
+	return 0;
+}
+
+EXPORT_SYMBOL(bt878_find_audio_dma);
+
+/*******************************/
+/* Module management functions */
+/*******************************/
+
+int bt878_init_module(void)
+{
+	bt878_num = 0;
+	bt878_pci_driver_registered = 0;
+
+	printk(KERN_INFO "bt878: AUDIO driver version %d.%d.%d loaded\n",
+	       (BT878_VERSION_CODE >> 16) & 0xff,
+	       (BT878_VERSION_CODE >> 8) & 0xff,
+	       BT878_VERSION_CODE & 0xff);
+/*
+        bt878_check_chipset();
+*/
+	/* later we register inside of bt878_find_audio_dma
+	 * because we may want to ignore certain cards */
+	bt878_pci_driver_registered = 1;
+	return pci_module_init(&bt878_pci_driver);
+}
+
+void bt878_cleanup_module(void)
+{
+	if (bt878_pci_driver_registered) {
+		bt878_pci_driver_registered = 0;
+		pci_unregister_driver(&bt878_pci_driver);
+	}
+	return;
+}
+
+EXPORT_SYMBOL(bt878_init_module);
+EXPORT_SYMBOL(bt878_cleanup_module);
+module_init(bt878_init_module);
+module_exit(bt878_cleanup_module);
+
+/*
+ * Local variables:
+ * c-basic-offset: 8
+ * End:
+ */
--- diff/drivers/media/dvb/bt8xx/bt878.h	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/media/dvb/bt8xx/bt878.h	2003-12-29 09:30:40.000000000 +0000
@@ -0,0 +1,145 @@
+/* 
+    bt878.h - Bt878 audio module (register offsets)
+
+    Copyright (C) 2002 Peter Hettkamp <peter.hettkamp@t-online.de>
+
+    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.
+*/
+
+#ifndef _BT878_H_
+#define _BT878_H_
+
+#include <linux/interrupt.h>
+#include <linux/pci.h>
+#include <linux/sched.h>
+#include <linux/spinlock.h>
+#include "bt848.h"
+
+#define BT878_VERSION_CODE 0x000000
+
+#define BT878_AINT_STAT		0x100
+#define BT878_ARISCS		(0xf<<28)
+#define BT878_ARISC_EN		(1<<27)
+#define BT878_ASCERR		(1<<19)
+#define BT878_AOCERR		(1<<18)
+#define BT878_APABORT		(1<<17)
+#define BT878_ARIPERR		(1<<16)
+#define BT878_APPERR		(1<<15)
+#define BT878_AFDSR		(1<<14)
+#define BT878_AFTRGT		(1<<13)
+#define BT878_AFBUS		(1<<12)
+#define BT878_ARISCI		(1<<11)
+#define BT878_AOFLOW		(1<<3)
+
+#define BT878_AINT_MASK		0x104
+
+#define BT878_AGPIO_DMA_CTL	0x10c
+#define BT878_A_GAIN		(0xf<<28)
+#define BT878_A_G2X		(1<<27)
+#define BT878_A_PWRDN		(1<<26)
+#define BT878_A_SEL		(3<<24)
+#define BT878_DA_SCE		(1<<23)
+#define BT878_DA_LRI		(1<<22)
+#define BT878_DA_MLB		(1<<21)
+#define BT878_DA_LRD		(0x1f<<16)
+#define BT878_DA_DPM		(1<<15)
+#define BT878_DA_SBR		(1<<14)
+#define BT878_DA_ES2		(1<<13)
+#define BT878_DA_LMT		(1<<12)
+#define BT878_DA_SDR		(0xf<<8)
+#define BT878_DA_IOM		(3<<6)
+#define BT878_DA_APP		(1<<5)
+#define BT878_ACAP_EN		(1<<4)
+#define BT878_PKTP		(3<<2)
+#define BT878_RISC_EN		(1<<1)
+#define BT878_FIFO_EN		1
+
+#define BT878_APACK_LEN		0x110
+#define BT878_AFP_LEN		(0xff<<16)
+#define BT878_ALP_LEN		0xfff
+
+#define BT878_ARISC_START	0x114
+
+#define BT878_ARISC_PC		0x120
+
+/* BT878 FUNCTION 0 REGISTERS */
+#define BT878_GPIO_DMA_CTL	0x10c
+
+/* Interrupt register */
+#define BT878_INT_STAT		0x100
+#define BT878_INT_MASK		0x104
+#define BT878_I2CRACK		(1<<25)
+#define BT878_I2CDONE		(1<<8)
+
+#define BT878_MAX 4
+
+#define BT878_RISC_SYNC_MASK	(1 << 15)
+
+extern int bt878_num;
+extern struct bt878 bt878[BT878_MAX];
+
+struct bt878 {
+	struct semaphore  gpio_lock;
+	unsigned int nr;
+	unsigned int bttv_nr;
+	struct dvb_adapter *adap_ptr;
+	struct pci_dev *dev;
+	unsigned int id;
+	unsigned int TS_Size;
+	unsigned char revision;
+	unsigned int irq;
+	unsigned long bt878_adr;
+	unsigned char *bt878_mem; /* function 1 */
+
+	volatile u32 finished_block;
+	volatile u32 last_block;
+	u32 block_count;
+	u32 block_bytes;
+	u32 line_bytes;
+	u32 line_count;
+
+	u32 buf_size;
+	u8 *buf_cpu;
+	dma_addr_t buf_dma;
+
+	u32 risc_size;
+	u32 *risc_cpu;
+	dma_addr_t risc_dma;
+	u32 risc_pos;
+
+	struct tasklet_struct tasklet;
+	int shutdown;	
+};
+
+void bt878_start(struct bt878 *bt, u32 controlreg, u32 op_sync_orin,
+		u32 irq_err_ignore);
+void bt878_stop(struct bt878 *bt);	     
+
+#if defined(__powerpc__)	/* big-endian */
+extern __inline__ void io_st_le32(volatile unsigned *addr, unsigned val)
+{
+	__asm__ __volatile__("stwbrx %1,0,%2":"=m"(*addr):"r"(val),
+			     "r"(addr));
+	__asm__ __volatile__("eieio":::"memory");
+}
+
+#define bmtwrite(dat,adr)  io_st_le32((unsigned *)(adr),(dat))
+#define bmtread(adr)       ld_le32((unsigned *)(adr))
+#else
+#define bmtwrite(dat,adr)  writel((dat), (char *) (adr))
+#define bmtread(adr)       readl(adr)
+#endif
+
+#endif
--- diff/drivers/media/dvb/bt8xx/dvb-bt8xx.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/media/dvb/bt8xx/dvb-bt8xx.c	2003-12-29 09:30:40.000000000 +0000
@@ -0,0 +1,530 @@
+/*
+ * Bt8xx based DVB adapter driver 
+ *
+ * Copyright (C) 2002,2003 Florian Schirmer <schirmer@taytron.net>
+ *
+ * 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 <asm/bitops.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/slab.h>
+#include <linux/i2c.h>
+
+#include "dmxdev.h"
+#include "dvbdev.h"
+#include "dvb_demux.h"
+#include "dvb_frontend.h"
+
+#include "dvb-bt8xx.h"
+
+#include "dvb_functions.h"
+
+#include "bt878.h"
+
+/* ID THAT MUST GO INTO i2c ids */
+#ifndef  I2C_DRIVERID_DVB_BT878A
+# define I2C_DRIVERID_DVB_BT878A I2C_DRIVERID_EXP0+10
+#endif
+
+
+#define dprintk if (debug) printk
+
+extern int bttv_get_cardinfo(unsigned int card, int *type, int *cardid);
+extern struct pci_dev* bttv_get_pcidev(unsigned int card);
+
+static LIST_HEAD(card_list);
+static int debug = 0;
+
+static void dvb_bt8xx_task(unsigned long data)
+{
+	struct dvb_bt8xx_card *card = (struct dvb_bt8xx_card *)data;
+
+	//printk("%d ", finished_block);
+
+	while (card->bt->last_block != card->bt->finished_block) {
+		(card->bt->TS_Size ? dvb_dmx_swfilter_204 : dvb_dmx_swfilter)(&card->demux, &card->bt->buf_cpu[card->bt->last_block * card->bt->block_bytes], card->bt->block_bytes);
+		card->bt->last_block = (card->bt->last_block + 1) % card->bt->block_count;
+	}
+}
+
+static int dvb_bt8xx_start_feed(struct dvb_demux_feed *dvbdmxfeed)
+{
+	struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
+	struct dvb_bt8xx_card *card = dvbdmx->priv;
+
+	dprintk("dvb_bt8xx: start_feed\n");
+	
+	if (!dvbdmx->dmx.frontend)
+		return -EINVAL;
+
+	if (card->active)
+		return 0;
+		
+	card->active = 1;
+	
+//	bt878_start(card->bt, card->gpio_mode);
+
+	return 0;
+}
+
+static int dvb_bt8xx_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
+{
+	struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
+	struct dvb_bt8xx_card *card = dvbdmx->priv;
+
+	dprintk("dvb_bt8xx: stop_feed\n");
+	
+	if (!dvbdmx->dmx.frontend)
+		return -EINVAL;
+		
+	if (!card->active)
+		return 0;
+
+//	bt878_stop(card->bt);
+
+	card->active = 0;
+
+	return 0;
+}
+
+static int master_xfer (struct dvb_i2c_bus *i2c, const struct i2c_msg msgs[], int num)
+{
+	struct dvb_bt8xx_card *card = i2c->data;
+	int retval;
+
+	if (down_interruptible (&card->bt->gpio_lock))
+		return -ERESTARTSYS;
+
+	retval = i2c_transfer(card->i2c_adapter,
+			      (struct i2c_msg*) msgs,
+			      num);
+
+	up(&card->bt->gpio_lock);
+
+	return retval;
+}
+
+static int is_pci_slot_eq(struct pci_dev* adev, struct pci_dev* bdev)
+{
+	if ((adev->subsystem_vendor == bdev->subsystem_vendor) &&
+		(adev->subsystem_device == bdev->subsystem_device) &&
+		(adev->bus->number == bdev->bus->number) &&
+		(PCI_SLOT(adev->devfn) == PCI_SLOT(bdev->devfn)))
+		return 1;
+	return 0;
+}
+
+static struct bt878 __init *dvb_bt8xx_878_match(unsigned int bttv_nr, struct pci_dev* bttv_pci_dev)
+{
+	unsigned int card_nr;
+	
+	/* Hmm, n squared. Hope n is small */
+	for (card_nr = 0; card_nr < bt878_num; card_nr++) {
+		if (is_pci_slot_eq(bt878[card_nr].dev, bttv_pci_dev))
+			return &bt878[card_nr];
+	}
+	return NULL;
+}
+
+static int __init dvb_bt8xx_card_match(unsigned int bttv_nr, char *card_name, u32 gpio_mode, u32 op_sync_orin, u32 irq_err_ignore)
+{
+	struct dvb_bt8xx_card *card;
+	struct pci_dev* bttv_pci_dev;
+
+	dprintk("dvb_bt8xx: identified card%d as %s\n", bttv_nr, card_name);
+			
+	if (!(card = kmalloc(sizeof(struct dvb_bt8xx_card), GFP_KERNEL)))
+		return -ENOMEM;
+
+	memset(card, 0, sizeof(*card));
+	card->bttv_nr = bttv_nr;
+	strncpy(card->card_name, card_name, sizeof(card_name) - 1);
+	
+	if (!(bttv_pci_dev = bttv_get_pcidev(bttv_nr))) {
+		printk("dvb_bt8xx: no pci device for card %d\n", card->bttv_nr);
+		kfree(card);
+		return -EFAULT;
+	}
+
+	if (!(card->bt = dvb_bt8xx_878_match(card->bttv_nr, bttv_pci_dev))) {
+		printk("dvb_bt8xx: unable to determine DMA core of card %d\n", card->bttv_nr);
+	
+		kfree(card);
+		return -EFAULT;
+		
+	}
+	init_MUTEX(&card->bt->gpio_lock);
+	card->bt->bttv_nr = bttv_nr;
+	card->gpio_mode = gpio_mode;
+	card->op_sync_orin = op_sync_orin;
+	card->irq_err_ignore = irq_err_ignore;
+	list_add_tail(&card->list, &card_list);
+
+	return 0;
+}
+
+static struct dvb_bt8xx_card *dvb_bt8xx_find_by_i2c_adap(struct i2c_adapter *adap)
+{
+	struct dvb_bt8xx_card *card;
+	struct list_head *item;
+	
+	printk("find by i2c adap: checking \"%s\"\n",adap->name);
+	list_for_each(item, &card_list) {
+		card = list_entry(item, struct dvb_bt8xx_card, list);
+		if (card->i2c_adapter == adap)
+			return card;
+	}
+	return NULL;
+}
+
+static struct dvb_bt8xx_card *dvb_bt8xx_find_by_pci(struct i2c_adapter *adap)
+{
+	struct dvb_bt8xx_card *card;
+	struct list_head *item;
+	struct device  *dev;
+	struct pci_dev *pci;
+	
+	printk("find by pci: checking \"%s\"\n",adap->name);
+	dev = adap->dev.parent;
+	if (NULL == dev) {
+		/* shoudn't happen with 2.6.0-test7 + newer */
+		printk("attach: Huh? i2c adapter not in sysfs tree?\n");
+		return 0;
+	}
+	pci = to_pci_dev(dev);
+	list_for_each(item, &card_list) {
+		card = list_entry(item, struct dvb_bt8xx_card, list);
+		if (is_pci_slot_eq(pci, card->bt->dev)) {
+			return card;
+		}
+	}
+	return NULL;
+}
+
+static int dvb_bt8xx_attach(struct i2c_adapter *adap)
+{
+	struct dvb_bt8xx_card *card;
+	
+	printk("attach: checking \"%s\"\n",adap->name);
+
+	/* looking for bt878 cards ... */
+	if (adap->id != (I2C_ALGO_BIT | I2C_HW_B_BT848))
+		return 0;
+	card = dvb_bt8xx_find_by_pci(adap);
+	if (!card)
+		return 0;
+	card->i2c_adapter = adap;
+	printk("attach: \"%s\", to card %d\n",
+	       adap->name, card->bttv_nr);
+	try_module_get(adap->owner);
+
+	return 0;
+}
+
+static void dvb_bt8xx_i2c_adap_free(struct i2c_adapter *adap)
+{
+	module_put(adap->owner);
+}
+
+static int dvb_bt8xx_detach(struct i2c_adapter *adap)
+{
+	struct dvb_bt8xx_card *card;
+
+	card = dvb_bt8xx_find_by_i2c_adap(adap);
+	if (!card)
+		return 0;
+
+	/* This should not happen. We have locked the module! */
+	printk("detach: \"%s\", for card %d removed\n",
+	       adap->name, card->bttv_nr);
+	return 0;
+}
+
+static struct i2c_driver dvb_bt8xx_driver = {
+	.owner           = THIS_MODULE,
+	.name            = "dvb_bt8xx",
+        .id              = I2C_DRIVERID_DVB_BT878A,
+	.flags           = I2C_DF_NOTIFY,
+        .attach_adapter  = dvb_bt8xx_attach,
+        .detach_adapter  = dvb_bt8xx_detach,
+};
+
+static void __init dvb_bt8xx_get_adaps(void)
+{
+	i2c_add_driver(&dvb_bt8xx_driver);
+}
+
+static void __exit dvb_bt8xx_exit_adaps(void)
+{
+	i2c_del_driver(&dvb_bt8xx_driver);
+}
+
+static int __init dvb_bt8xx_load_card( struct dvb_bt8xx_card *card)
+{
+	int result;
+
+	if (!card->i2c_adapter) {
+		printk("dvb_bt8xx: unable to determine i2c adaptor of card %d, deleting\n", card->bttv_nr);
+
+		return -EFAULT;
+	
+	}
+
+	if ((result = dvb_register_adapter(&card->dvb_adapter, card->card_name)) < 0) {
+	
+		printk("dvb_bt8xx: dvb_register_adapter failed (errno = %d)\n", result);
+		
+		dvb_bt8xx_i2c_adap_free(card->i2c_adapter);
+		return result;
+		
+	}
+	card->bt->adap_ptr = card->dvb_adapter;
+
+	if (!(dvb_register_i2c_bus(master_xfer, card, card->dvb_adapter, 0))) {
+		printk("dvb_bt8xx: dvb_register_i2c_bus of card%d failed\n", card->bttv_nr);
+
+		dvb_unregister_adapter(card->dvb_adapter);
+		dvb_bt8xx_i2c_adap_free(card->i2c_adapter);
+
+		return -EFAULT;
+	}
+
+	memset(&card->demux, 0, sizeof(struct dvb_demux));
+
+	card->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING | DMX_MEMORY_BASED_FILTERING;
+
+	card->demux.priv = card;
+	card->demux.filternum = 256;
+	card->demux.feednum = 256;
+	card->demux.start_feed = dvb_bt8xx_start_feed;
+	card->demux.stop_feed = dvb_bt8xx_stop_feed;
+	card->demux.write_to_decoder = NULL;
+	
+	if ((result = dvb_dmx_init(&card->demux)) < 0) {
+		printk("dvb_bt8xx: dvb_dmx_init failed (errno = %d)\n", result);
+
+		dvb_unregister_i2c_bus(master_xfer, card->dvb_adapter, 0);
+		dvb_unregister_adapter(card->dvb_adapter);
+		dvb_bt8xx_i2c_adap_free(card->i2c_adapter);
+		
+		return result;
+	}
+
+	card->dmxdev.filternum = 256;
+	card->dmxdev.demux = &card->demux.dmx;
+	card->dmxdev.capabilities = 0;
+	
+	if ((result = dvb_dmxdev_init(&card->dmxdev, card->dvb_adapter)) < 0) {
+		printk("dvb_bt8xx: dvb_dmxdev_init failed (errno = %d)\n", result);
+
+		dvb_dmx_release(&card->demux);
+		dvb_unregister_i2c_bus(master_xfer, card->dvb_adapter, 0);
+		dvb_unregister_adapter(card->dvb_adapter);
+		dvb_bt8xx_i2c_adap_free(card->i2c_adapter);
+		
+		return result;
+	}
+
+	card->fe_hw.source = DMX_FRONTEND_0;
+
+	if ((result = card->demux.dmx.add_frontend(&card->demux.dmx, &card->fe_hw)) < 0) {
+		printk("dvb_bt8xx: dvb_dmx_init failed (errno = %d)\n", result);
+
+		dvb_dmxdev_release(&card->dmxdev);
+		dvb_dmx_release(&card->demux);
+		dvb_unregister_i2c_bus(master_xfer, card->dvb_adapter, 0);
+		dvb_unregister_adapter(card->dvb_adapter);
+		dvb_bt8xx_i2c_adap_free(card->i2c_adapter);
+		
+		return result;
+	}
+	
+	card->fe_mem.source = DMX_MEMORY_FE;
+
+	if ((result = card->demux.dmx.add_frontend(&card->demux.dmx, &card->fe_mem)) < 0) {
+		printk("dvb_bt8xx: dvb_dmx_init failed (errno = %d)\n", result);
+
+		card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_hw);
+		dvb_dmxdev_release(&card->dmxdev);
+		dvb_dmx_release(&card->demux);
+		dvb_unregister_i2c_bus(master_xfer, card->dvb_adapter, 0);
+		dvb_unregister_adapter(card->dvb_adapter);
+		dvb_bt8xx_i2c_adap_free(card->i2c_adapter);
+		
+		return result;
+	}
+
+	if ((result = card->demux.dmx.connect_frontend(&card->demux.dmx, &card->fe_hw)) < 0) {
+		printk("dvb_bt8xx: dvb_dmx_init failed (errno = %d)\n", result);
+
+		card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_mem);
+		card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_hw);
+		dvb_dmxdev_release(&card->dmxdev);
+		dvb_dmx_release(&card->demux);
+		dvb_unregister_i2c_bus(master_xfer, card->dvb_adapter, 0);
+		dvb_unregister_adapter(card->dvb_adapter);
+		dvb_bt8xx_i2c_adap_free(card->i2c_adapter);
+		
+		return result;
+	}
+
+	dvb_net_init(card->dvb_adapter, &card->dvbnet, &card->demux.dmx);
+
+	tasklet_init(&card->bt->tasklet, dvb_bt8xx_task, (unsigned long) card);
+	
+	bt878_start(card->bt, card->gpio_mode, card->op_sync_orin, card->irq_err_ignore);
+
+	return 0;
+}
+
+static int __init dvb_bt8xx_load_all(void)
+{
+	struct dvb_bt8xx_card *card;
+	struct list_head *entry, *entry_safe;
+
+	list_for_each_safe(entry, entry_safe, &card_list) {
+		card = list_entry(entry, struct dvb_bt8xx_card, list);
+		if (dvb_bt8xx_load_card(card) < 0) {
+			list_del(&card->list);
+			kfree(card);
+			continue;
+		}
+	}
+	return 0;
+
+}
+
+#define BT878_NEBULA	0x68
+#define BT878_TWINHAN_DST 0x71
+
+static int __init dvb_bt8xx_init(void)
+{
+	unsigned int card_nr = 0;
+	int card_id;
+	int card_type;
+
+	dprintk("dvb_bt8xx: enumerating available bttv cards...\n");
+	
+	while (bttv_get_cardinfo(card_nr, &card_type, &card_id) == 0) {
+		switch(card_id) {
+			case 0x001C11BD:
+				dvb_bt8xx_card_match(card_nr, "Pinnacle PCTV DVB-S",
+					       0x0400C060, 0, 0);
+				/* 26, 15, 14, 6, 5 
+				 * A_G2X  DA_DPM DA_SBR DA_IOM_DA 
+				 * DA_APP(parallel) */
+				break;
+			case 0x01010071:
+nebula:
+				dvb_bt8xx_card_match(card_nr, "Nebula DigiTV DVB-T",
+					     (1 << 26) | (1 << 14) | (1 << 5),
+					     0, 0);
+				/* A_PWRDN DA_SBR DA_APP (high speed serial) */
+				break;
+			case 0x07611461:
+				dvb_bt8xx_card_match(card_nr, "Avermedia DVB-T",
+					     (1 << 26) | (1 << 14) | (1 << 5),
+					     0, 0);
+				/* A_PWRDN DA_SBR DA_APP (high speed serial) */
+				break;
+			case 0x0:
+				if (card_type == BT878_NEBULA ||
+					card_type == BT878_TWINHAN_DST)
+					goto dst;
+				goto unknown_card;
+			case 0x2611BD:
+			case 0x11822:
+dst:
+				dvb_bt8xx_card_match(card_nr, "DST DVB-S", 0x2204f2c,
+						BT878_RISC_SYNC_MASK,
+						BT878_APABORT | BT878_ARIPERR | BT878_APPERR | BT878_AFBUS);
+				/* 25,21,14,11,10,9,8,3,2 then
+				 * 0x33 = 5,4,1,0
+				 * A_SEL=SML, DA_MLB, DA_SBR, 
+				 * DA_SDR=f, fifo trigger = 32 DWORDS
+				 * IOM = 0 == audio A/D
+				 * DPM = 0 == digital audio mode
+				 * == async data parallel port
+				 * then 0x33 (13 is set by start_capture)
+				 * DA_APP = async data parallel port, 
+				 * ACAP_EN = 1,
+				 * RISC+FIFO ENABLE */
+				break;
+			default:
+unknown_card:
+				printk("%s: unknown card_id found %0X\n",
+					__FUNCTION__, card_id);
+				if (card_type == BT878_NEBULA) {
+					printk("%s: bttv type set to nebula\n",
+						__FUNCTION__);
+					goto nebula;
+				}
+				if (card_type == BT878_TWINHAN_DST) {
+					printk("%s: bttv type set to Twinhan DST\n",
+						__FUNCTION__);
+					goto dst;
+				}
+				printk("%s: unknown card_type found %0X, NOT LOADED\n",
+					__FUNCTION__, card_type);
+				printk("%s: unknown card_nr found %0X\n",
+					__FUNCTION__, card_nr);
+		}
+		card_nr++;
+	}
+	dvb_bt8xx_get_adaps();
+	dvb_bt8xx_load_all();
+
+	return 0;
+
+}
+
+static void __exit dvb_bt8xx_exit(void)
+{
+	struct dvb_bt8xx_card *card;
+	struct list_head *entry, *entry_safe;
+
+	dvb_bt8xx_exit_adaps();
+	list_for_each_safe(entry, entry_safe, &card_list) {
+		card = list_entry(entry, struct dvb_bt8xx_card, list);
+		
+		dprintk("dvb_bt8xx: unloading card%d\n", card->bttv_nr);
+
+		bt878_stop(card->bt);
+		tasklet_kill(&card->bt->tasklet);
+		dvb_net_release(&card->dvbnet);
+		card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_mem);
+		card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_hw);
+		dvb_dmxdev_release(&card->dmxdev);
+		dvb_dmx_release(&card->demux);
+		dvb_unregister_i2c_bus(master_xfer, card->dvb_adapter, 0);
+		dvb_bt8xx_i2c_adap_free(card->i2c_adapter);
+		dvb_unregister_adapter(card->dvb_adapter);
+		
+		list_del(&card->list);
+		kfree(card);
+	}
+
+}
+
+module_init(dvb_bt8xx_init);
+module_exit(dvb_bt8xx_exit);
+MODULE_DESCRIPTION("Bt8xx based DVB adapter driver");
+MODULE_AUTHOR("Florian Schirmer <schirmer@taytron.net>");
+MODULE_LICENSE("GPL");
+MODULE_PARM(debug, "i");
--- diff/drivers/media/dvb/bt8xx/dvb-bt8xx.h	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/media/dvb/bt8xx/dvb-bt8xx.h	2003-12-29 09:30:40.000000000 +0000
@@ -0,0 +1,47 @@
+/*
+ * Bt8xx based DVB adapter driver 
+ *
+ * Copyright (C) 2002,2003 Florian Schirmer <schirmer@taytron.net>
+ * Copyright (C) 2002 Peter Hettkamp <peter.hettkamp@t-online.de>
+ * Copyright (C) 1999-2001 Ralph  Metzler & Marcus Metzler for convergence integrated media GmbH
+ * Copyright (C) 1998,1999 Christian Theiss <mistert@rz.fh-augsburg.de>
+ *
+ * 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/i2c.h>
+#include "dvbdev.h"
+#include "dvb_net.h"
+
+struct dvb_bt8xx_card {
+
+	struct list_head list;
+	u8 active;
+	char card_name[32];
+	struct dvb_adapter *dvb_adapter;
+	struct bt878 *bt;
+	unsigned int bttv_nr;
+	struct dvb_demux demux;
+	struct dmxdev dmxdev;
+	struct dmx_frontend fe_hw;
+	struct dmx_frontend fe_mem;
+	u32 gpio_mode;
+	u32 op_sync_orin;
+	u32 irq_err_ignore;
+	struct i2c_adapter *i2c_adapter;
+	struct dvb_net dvbnet;
+				
+};
--- diff/drivers/media/dvb/frontends/dst-bt878.h	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/media/dvb/frontends/dst-bt878.h	2003-12-29 09:30:40.000000000 +0000
@@ -0,0 +1,37 @@
+/*
+ * dst-bt878.h: part of the DST driver for the TwinHan DST Frontend
+ *
+ * Copyright (C) 2003 Jamie Honan
+ */
+
+struct dst_gpio_enable {
+	u32	mask;
+	u32	enable;
+};
+
+struct dst_gpio_output {
+	u32	mask;
+	u32	highvals;
+};
+
+struct dst_gpio_read {
+	unsigned long value;
+};
+
+union dst_gpio_packet {
+	struct dst_gpio_enable enb;
+	struct dst_gpio_output outp;
+	struct dst_gpio_read rd;
+	int    psize;
+};
+
+#define DST_IG_ENABLE	0
+#define DST_IG_WRITE	1
+#define DST_IG_READ	2
+#define DST_IG_TS       3
+
+struct bt878 ;
+
+int bt878_device_control(struct bt878 *bt, unsigned int cmd, union dst_gpio_packet *mp);
+
+struct bt878 *bt878_find_by_dvb_adap(struct dvb_adapter *adap);
--- diff/drivers/media/dvb/frontends/dst.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/media/dvb/frontends/dst.c	2003-12-29 09:30:40.000000000 +0000
@@ -0,0 +1,1189 @@
+/* 
+    Frontend-driver for TwinHan DST Frontend
+
+    Copyright (C) 2003 Jamie Honan
+
+
+
+    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/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/string.h>
+#include <linux/slab.h>
+#include <linux/vmalloc.h>
+#include <asm/div64.h>
+#include <asm/delay.h>
+
+#include "dvb_frontend.h"
+#include "dvb_functions.h"
+#include "dst-bt878.h"
+
+unsigned int dst_debug = 0;
+unsigned int dst_verbose = 0;
+
+MODULE_PARM(dst_verbose, "i");
+MODULE_PARM_DESC(dst_verbose,
+		 "verbose startup messages, default is 1 (yes)");
+MODULE_PARM(dst_debug, "i");
+MODULE_PARM_DESC(dst_debug, "debug messages, default is 0 (no)");
+
+unsigned int dst_type = (-1U);
+unsigned int dst_type_flags = (-1U);
+MODULE_PARM(dst_type, "i");
+MODULE_PARM_DESC(dst_type,
+		"Type of DST card, 0 Satellite, 1 terrestial TV, 2 Cable, default driver determined");
+MODULE_PARM(dst_type_flags, "i");
+MODULE_PARM_DESC(dst_type_flags,
+		"Type flags of DST card, bitfield 1=10 byte tuner, 2=TS is 204, 4=symdiv");
+
+#define dprintk	if (dst_debug) printk
+
+#define DST_TYPE_IS_SAT		0
+#define DST_TYPE_IS_TERR	1
+#define DST_TYPE_IS_CABLE	2
+
+#define DST_TYPE_HAS_NEWTUNE	1
+#define DST_TYPE_HAS_TS204	2
+#define DST_TYPE_HAS_SYMDIV	4
+
+#define HAS_LOCK	1
+#define ATTEMPT_TUNE	2
+#define HAS_POWER	4
+
+struct dst_data {
+	u8	tx_tuna[10];
+	u8	rx_tuna[10];
+	u8	rxbuffer[10];
+	u8	diseq_flags;
+	u8	dst_type;
+	u32	type_flags;
+	u32 frequency;     /* intermediate frequency in kHz for QPSK */
+        fe_spectral_inversion_t inversion;
+        u32   symbol_rate;  /* symbol rate in Symbols per second */
+	fe_code_rate_t  fec;
+	fe_sec_voltage_t voltage;
+	fe_sec_tone_mode_t tone;
+	u32 decode_freq;
+	u8  decode_lock;
+	u16 decode_strength;
+	u16 decode_snr;
+	unsigned long cur_jiff;
+	u8  k22;
+	fe_bandwidth_t bandwidth;
+	struct bt878 *bt;
+	struct dvb_i2c_bus *i2c;
+} ;
+
+static struct dvb_frontend_info dst_info_sat = {
+	.name 			= "DST SAT",
+	.type 			= FE_QPSK,
+	.frequency_min 		= 950000,
+	.frequency_max 		= 2150000,
+	.frequency_stepsize 	= 1000,           /* kHz for QPSK frontends */
+	.frequency_tolerance 	= 29500,
+	.symbol_rate_min	= 1000000,
+	.symbol_rate_max	= 45000000,
+/*     . symbol_rate_tolerance	= 	???,*/
+	.notifier_delay		= 50,                /* 1/20 s */
+	.caps = FE_CAN_INVERSION_AUTO |
+		FE_CAN_FEC_AUTO |
+		FE_CAN_QPSK
+};
+
+static struct dvb_frontend_info dst_info_cable = {
+	.name 			= "DST CABLE",
+	.type 			= FE_QAM,
+        .frequency_stepsize 	= 62500,
+	.frequency_min 		= 51000000,
+	.frequency_max 		= 858000000,
+	.symbol_rate_min	= 1000000,
+	.symbol_rate_max	= 45000000,
+/*     . symbol_rate_tolerance	= 	???,*/
+	.notifier_delay		= 50,                /* 1/20 s */
+	.caps = FE_CAN_INVERSION_AUTO |
+		FE_CAN_FEC_AUTO |
+		FE_CAN_QAM_AUTO
+};
+
+static struct dvb_frontend_info dst_info_tv = {
+	.name 			= "DST TERR",
+	.type 			= FE_OFDM,
+	.frequency_min 		= 137000000,
+	.frequency_max 		= 858000000,
+	.frequency_stepsize 	= 166667,
+	.caps = FE_CAN_INVERSION_AUTO |
+	    FE_CAN_FEC_AUTO |
+	    FE_CAN_QAM_AUTO |
+	    FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO
+};
+
+static void dst_packsize(struct dst_data *dst, int psize)
+{
+	union dst_gpio_packet bits;
+
+	bits.psize = psize;
+	bt878_device_control(dst->bt, DST_IG_TS, &bits);
+}
+
+static int dst_gpio_outb(struct dst_data *dst, u32 mask, u32 enbb, u32 outhigh)
+{
+	union dst_gpio_packet enb;
+	union dst_gpio_packet bits;
+	int err;
+
+	enb.enb.mask = mask;
+	enb.enb.enable = enbb;
+        if ((err = bt878_device_control(dst->bt, DST_IG_ENABLE, &enb)) < 0) {
+		dprintk ("%s: dst_gpio_enb error (err == %i, mask == 0x%02x, enb == 0x%02x)\n", __FUNCTION__, err, mask, enbb);
+		return -EREMOTEIO;
+	}
+
+	/* because complete disabling means no output, no need to do
+	 * output packet */
+	if (enbb == 0)
+		return 0;
+
+	bits.outp.mask = enbb;
+	bits.outp.highvals = outhigh;
+
+        if ((err = bt878_device_control(dst->bt, DST_IG_WRITE, &bits)) < 0) {
+		dprintk ("%s: dst_gpio_outb error (err == %i, enbb == 0x%02x, outhigh == 0x%02x)\n", __FUNCTION__, err, enbb, outhigh);
+		return -EREMOTEIO;
+	}
+        return 0;
+}
+
+static int dst_gpio_inb(struct dst_data *dst, u8 *result)
+{
+	union dst_gpio_packet rd_packet;
+	int err;
+
+	*result = 0;
+
+        if ((err = bt878_device_control(dst->bt, DST_IG_READ, &rd_packet)) < 0) {
+		dprintk ("%s: dst_gpio_inb error (err == %i)\n", __FUNCTION__, err);
+		return -EREMOTEIO;
+	}
+	*result = (u8)rd_packet.rd.value;
+        return 0;
+}
+
+#define DST_I2C_ENABLE	1
+#define DST_8820  	2
+
+static int
+dst_reset8820(struct dst_data *dst)
+{
+int retval;
+	/* pull 8820 gpio pin low, wait, high, wait, then low */
+	// dprintk ("%s: reset 8820\n", __FUNCTION__);
+	retval = dst_gpio_outb(dst, DST_8820, DST_8820, 0);
+	if (retval < 0)
+		return retval;
+	dvb_delay(10);
+	retval = dst_gpio_outb(dst, DST_8820, DST_8820, DST_8820);
+	if (retval < 0)
+		return retval;
+	/* wait for more feedback on what works here *
+	dvb_delay(10);
+	retval = dst_gpio_outb(dst, DST_8820, DST_8820, 0);
+	if (retval < 0)
+		return retval;
+	*/
+	return 0;
+}
+
+static int
+dst_i2c_enable(struct dst_data *dst)
+{
+int retval;
+	/* pull I2C enable gpio pin low, wait */
+	// dprintk ("%s: i2c enable\n", __FUNCTION__);
+	retval = dst_gpio_outb(dst, ~0, DST_I2C_ENABLE, 0);
+	if (retval < 0)
+		return retval;
+	// dprintk ("%s: i2c enable delay\n", __FUNCTION__);
+	dvb_delay(33);
+	return 0;
+}
+
+static int
+dst_i2c_disable(struct dst_data *dst)
+{
+int retval;
+	/* release I2C enable gpio pin, wait */
+	// dprintk ("%s: i2c disable\n", __FUNCTION__);
+	retval = dst_gpio_outb(dst, ~0, 0, 0);
+	if (retval < 0)
+		return retval;
+	// dprintk ("%s: i2c disable delay\n", __FUNCTION__);
+	dvb_delay(33);
+	return 0;
+}
+
+static int
+dst_wait_dst_ready(struct dst_data *dst)
+{
+u8 reply;
+int retval;
+int i;
+	for (i = 0; i < 200; i++) {
+		retval = dst_gpio_inb(dst, &reply);
+		if (retval < 0)
+			return retval;
+		if ((reply & DST_I2C_ENABLE) == 0) {
+			dprintk ("%s: dst wait ready after %d\n", __FUNCTION__, i);
+			return 1;
+		}
+		dvb_delay(5);
+	}
+	dprintk ("%s: dst wait NOT ready after %d\n", __FUNCTION__, i);
+	return 0;
+}
+
+#define DST_I2C_ADDR 0x55
+
+static int write_dst (struct dst_data *dst, u8 *data, u8 len)
+{
+	struct i2c_msg msg = {
+		.addr = DST_I2C_ADDR, .flags = 0, .buf = data, .len = len };
+	int err;
+	int cnt;
+
+	if (dst_debug && dst_verbose) {
+		u8 i;
+		dprintk("%s writing",__FUNCTION__);
+		for (i = 0 ; i < len ; i++) {
+			dprintk(" 0x%02x", data[i]);
+		}
+		dprintk("\n");
+	}
+	dvb_delay(30);
+	for (cnt = 0; cnt < 4; cnt++) {
+		if ((err = dst->i2c->xfer (dst->i2c, &msg, 1)) < 0) {
+			dprintk ("%s: write_dst error (err == %i, len == 0x%02x, b0 == 0x%02x)\n", __FUNCTION__, err, len, data[0]);
+			dst_i2c_disable(dst);
+			dvb_delay(500);
+			dst_i2c_enable(dst);
+			dvb_delay(500);
+			continue;
+		} else
+			break;
+	}
+	if (cnt >= 4)
+		return -EREMOTEIO;
+        return 0;
+}
+
+static int read_dst (struct dst_data *dst, u8 *ret, u8 len)
+{
+	struct i2c_msg msg = 
+		{ .addr = DST_I2C_ADDR, .flags = I2C_M_RD, .buf = ret, .len = len };
+	int err;
+	int cnt;
+
+	for (cnt = 0; cnt < 4; cnt++) {
+		if ((err = dst->i2c->xfer (dst->i2c, &msg, 1)) < 0) {
+			dprintk ("%s: read_dst error (err == %i, len == 0x%02x, b0 == 0x%02x)\n", __FUNCTION__, err, len, ret[0]);
+			dst_i2c_disable(dst);
+			dst_i2c_enable(dst);
+			continue;
+		} else
+			break;
+	}
+	if (cnt >= 4)
+		return -EREMOTEIO;
+	dprintk("%s reply is 0x%x\n", __FUNCTION__, ret[0]);
+	if (dst_debug && dst_verbose) {
+		for (err = 1; err < len; err++)
+			dprintk(" 0x%x", ret[err]);
+		if (err > 1)
+			dprintk("\n");
+	}
+	return 0;
+}
+
+static int dst_set_freq(struct dst_data *dst, u32 freq)
+{
+	u8 *val;
+
+	dst->frequency = freq;
+
+	// dprintk("%s: set frequency %u\n", __FUNCTION__, freq);
+	if (dst->dst_type == DST_TYPE_IS_SAT) {
+		freq = freq / 1000;
+		if (freq < 950 || freq > 2150)
+			return -EINVAL;
+		val = &dst->tx_tuna[0];
+		val[2] = (freq >> 8) & 0x7f;
+		val[3] = (u8)freq;
+		val[4] = 1;
+		val[8] &= ~4;
+		if (freq < 1531)
+			val[8] |= 4;
+	} else if (dst->dst_type == DST_TYPE_IS_TERR) {
+		freq = freq / 1000;
+		if (freq < 137000 || freq > 858000)
+			return -EINVAL;
+		val = &dst->tx_tuna[0];
+		val[2] = (freq >> 16) & 0xff;
+		val[3] = (freq >> 8) & 0xff;
+		val[4] = (u8)freq;
+		val[5] = 0;
+		switch (dst->bandwidth) {
+		case BANDWIDTH_6_MHZ:
+			val[6] = 6;
+			break;
+
+		case BANDWIDTH_7_MHZ:
+		case BANDWIDTH_AUTO:
+			val[6] = 7;
+			break;
+
+		case BANDWIDTH_8_MHZ:
+			val[6] = 8;
+			break;
+		}
+
+		val[7] = 0;
+		val[8] = 0;
+	} else if (dst->dst_type == DST_TYPE_IS_CABLE) {
+		/* guess till will get one */
+		freq = freq / 1000;
+		val = &dst->tx_tuna[0];
+		val[2] = (freq >> 16) & 0xff;
+		val[3] = (freq >> 8) & 0xff;
+		val[4] = (u8)freq;
+	} else
+		return -EINVAL;
+	return 0;
+}
+
+static int dst_set_bandwidth(struct dst_data *dst, fe_bandwidth_t bandwidth)
+{
+	u8 *val;
+
+	dst->bandwidth = bandwidth;
+
+	if (dst->dst_type != DST_TYPE_IS_TERR)
+		return 0;
+
+	val = &dst->tx_tuna[0];
+        switch (bandwidth) {
+	case BANDWIDTH_6_MHZ:
+		val[6] = 6;
+		break;
+
+	case BANDWIDTH_7_MHZ:
+		val[6] = 7;
+		break;
+
+	case BANDWIDTH_8_MHZ:
+		val[6] = 8;
+		break;
+
+	default:
+		return -EINVAL;
+	}
+	return 0;
+}
+
+static int dst_set_inversion (struct dst_data *dst, fe_spectral_inversion_t inversion)
+{
+	u8 *val;
+
+	dst->inversion = inversion;
+
+	val = &dst->tx_tuna[0];
+
+	val[8] &= ~0x80;
+
+	switch (inversion) {
+	case INVERSION_OFF:
+		break;
+	case INVERSION_ON:
+		val[8] |= 0x80;
+		break;
+	case INVERSION_AUTO:
+		break;
+	default:
+		return -EINVAL;
+	}
+	return 0;
+}
+
+
+static int dst_set_fec (struct dst_data *dst, fe_code_rate_t fec)
+{
+	dst->fec = fec;
+	return 0;
+}
+
+static fe_code_rate_t dst_get_fec (struct dst_data *dst)
+{
+	return dst->fec;
+}
+
+static int dst_set_symbolrate (struct dst_data *dst, u32 srate)
+{
+	u8 *val;
+	u32 symcalc;
+	u64 sval;
+
+	dst->symbol_rate = srate;
+
+	if (dst->dst_type == DST_TYPE_IS_TERR) {
+		return 0;
+	}
+
+	// dprintk("%s: set srate %u\n", __FUNCTION__, srate);
+	srate /= 1000;
+	val = &dst->tx_tuna[0];
+
+	if (dst->type_flags & DST_TYPE_HAS_SYMDIV) {
+		sval = srate;
+		sval <<= 20;
+		do_div(sval, 88000);
+	        symcalc = (u32)sval;
+		// dprintk("%s: set symcalc %u\n", __FUNCTION__, symcalc);
+		val[5] = (u8)(symcalc >> 12);
+		val[6] = (u8)(symcalc >> 4);
+		val[7] = (u8)(symcalc << 4);
+	} else {
+		val[5] = (u8)(srate >> 16) & 0x7f;
+		val[6] = (u8)(srate >> 8);
+		val[7] = (u8)srate;
+	}
+	val[8] &= ~0x20;
+	if (srate > 8000)
+		val[8] |= 0x20;
+	return 0;
+}
+
+
+static u8 dst_check_sum(u8 *buf, u32 len)
+{
+	u32 i;
+	u8  val = 0;
+	if (!len)
+		return 0;
+	for (i = 0; i < len; i++) {
+		val += buf[i];
+	}
+	return ((~val) + 1);
+}
+
+typedef struct dst_types {
+	char	*mstr;
+	int	offs;
+	u8	dst_type;
+	u32	type_flags;
+} DST_TYPES;
+
+struct dst_types dst_tlist[] = {
+	{ "DST-020", 0,  DST_TYPE_IS_SAT,    DST_TYPE_HAS_SYMDIV },
+	{ "DST-030", 0,  DST_TYPE_IS_SAT,    DST_TYPE_HAS_TS204|DST_TYPE_HAS_NEWTUNE },
+	{ "DST-03T", 0,  DST_TYPE_IS_SAT,    DST_TYPE_HAS_SYMDIV|DST_TYPE_HAS_TS204},
+	{ "DST-MOT", 0,  DST_TYPE_IS_SAT,    DST_TYPE_HAS_SYMDIV },
+	{ "DST-CI",  1,  DST_TYPE_IS_SAT,    DST_TYPE_HAS_TS204|DST_TYPE_HAS_NEWTUNE },
+	{ "DSTMCI",  1,  DST_TYPE_IS_SAT,    DST_TYPE_HAS_NEWTUNE },
+	{ "DSTFCI",  1,  DST_TYPE_IS_SAT,    DST_TYPE_HAS_NEWTUNE },
+	{ "DCTNEW",  1,  DST_TYPE_IS_CABLE,  DST_TYPE_HAS_NEWTUNE },
+	{ "DCT_CI",  1,  DST_TYPE_IS_CABLE,  DST_TYPE_HAS_NEWTUNE|DST_TYPE_HAS_TS204 },
+	{ "DTTDIG" , 1,  DST_TYPE_IS_TERR,   0} };
+/* DCTNEW and DCT-CI are guesses */
+
+static void dst_type_flags_print(u32 type_flags)
+{
+	printk("DST type flags :");
+	if (type_flags & DST_TYPE_HAS_NEWTUNE)
+		printk(" 0x%x newtuner", DST_TYPE_HAS_NEWTUNE);
+	if (type_flags & DST_TYPE_HAS_TS204)
+		printk(" 0x%x ts204", DST_TYPE_HAS_TS204);
+	if (type_flags & DST_TYPE_HAS_SYMDIV)
+		printk(" 0x%x symdiv", DST_TYPE_HAS_SYMDIV);
+	printk("\n");
+}
+
+static int dst_type_print(u8 type)
+{
+	char *otype;
+	switch (type) {
+		case DST_TYPE_IS_SAT:
+			otype = "satellite";
+			break;
+		case DST_TYPE_IS_TERR:
+			otype = "terrestial TV";
+			break;
+		case DST_TYPE_IS_CABLE:
+			otype = "terrestial TV";
+			break;
+		default:
+			printk("%s: invalid dst type %d\n",
+				__FUNCTION__, type);
+			return -EINVAL;
+	}
+	printk("DST type : %s\n", otype);
+	return 0;
+}
+
+static int dst_check_ci (struct dst_data *dst)
+{
+	u8 txbuf[8];
+	u8 rxbuf[8];
+	int retval;
+	int i;
+	struct dst_types *dsp;
+	u8 use_dst_type;
+	u32 use_type_flags;
+
+	memset(txbuf, 0, sizeof(txbuf));
+	txbuf[1] = 6;
+	txbuf[7] = dst_check_sum (txbuf, 7);
+ 
+	dst_i2c_enable(dst);
+	dst_reset8820(dst);
+	retval = write_dst (dst, txbuf, 8);
+	if (retval < 0) {
+		dst_i2c_disable(dst);
+		dprintk("%s: write not successful, maybe no card?\n", __FUNCTION__);
+		return retval;
+	}
+	dvb_delay(3);
+	retval = read_dst (dst, rxbuf, 1);
+	dst_i2c_disable(dst);
+	if (retval < 0) {
+		dprintk("%s: read not successful, maybe no card?\n", __FUNCTION__);
+		return retval;
+	}
+	if (rxbuf[0] != 0xff) {
+		dprintk("%s: write reply not 0xff, not ci (%02x)\n", __FUNCTION__, rxbuf[0]);
+		return retval;
+	}
+	if (!dst_wait_dst_ready(dst))
+		return 0;
+	// dst_i2c_enable(i2c); Dimitri
+	retval = read_dst (dst, rxbuf, 8);
+	dst_i2c_disable(dst);
+	if (retval < 0) {
+		dprintk("%s: read not successful\n", __FUNCTION__);
+		return retval;
+	}
+	if (rxbuf[7] != dst_check_sum (rxbuf, 7)) {
+		dprintk("%s: checksum failure\n", __FUNCTION__);
+		return retval;
+	}
+	rxbuf[7] = '\0';
+	for (i = 0, dsp = &dst_tlist[0]; i < sizeof(dst_tlist) / sizeof(dst_tlist[0]); i++, dsp++) {
+		if (!strncmp(&rxbuf[dsp->offs],
+				dsp->mstr,
+				strlen(dsp->mstr))) {
+			use_type_flags = dsp->type_flags;
+			use_dst_type = dsp->dst_type;
+			printk("%s: recognize %s\n", __FUNCTION__, dsp->mstr);
+			break;
+		}
+	}
+	if (i >= sizeof(dst_tlist) / sizeof(dst_tlist[0])) {
+		printk("%s: unable to recognize %s or %s\n", __FUNCTION__, &rxbuf[0], &rxbuf[1]);
+		printk("%s please email linux-dvb@linuxtv.org with this type in\n", __FUNCTION__);
+		use_dst_type = DST_TYPE_IS_SAT;
+		use_type_flags = DST_TYPE_HAS_SYMDIV;
+	}
+	switch (dst_type) {
+		case (-1U):
+			/* not used */
+			break;
+		case DST_TYPE_IS_SAT:
+		case DST_TYPE_IS_TERR:
+		case DST_TYPE_IS_CABLE:
+			use_dst_type = (u8)dst_type;
+			break;
+		default:
+			printk("%s: invalid user override dst type %d, not used\n",
+				__FUNCTION__, dst_type);
+			break;
+	}
+	dst_type_print(use_dst_type);
+	if (dst_type_flags != (-1U)) {
+		printk("%s: user override dst type flags 0x%x\n",
+				__FUNCTION__, dst_type_flags);
+		use_type_flags = dst_type_flags;
+	}
+	dst->type_flags = use_type_flags;
+	dst->dst_type= use_dst_type;
+	dst_type_flags_print(dst->type_flags);
+
+	if (dst->type_flags & DST_TYPE_HAS_TS204) {
+		dst_packsize(dst, 204);
+	}
+	return 0;
+}
+
+static int dst_command (struct dst_data *dst, u8 *data, u8 len)
+{
+	int retval;
+	u8 reply;
+
+	dst_i2c_enable(dst);
+	dst_reset8820(dst);
+	retval = write_dst (dst, data, len);
+	if (retval < 0) {
+		dst_i2c_disable(dst);
+		dprintk("%s: write not successful\n", __FUNCTION__);
+		return retval;
+	}
+	dvb_delay(33);
+	retval = read_dst (dst, &reply, 1);
+	dst_i2c_disable(dst);
+	if (retval < 0) {
+		dprintk("%s: read verify  not successful\n", __FUNCTION__);
+		return retval;
+	}
+	if (reply != 0xff) {
+		dprintk("%s: write reply not 0xff 0x%02x \n", __FUNCTION__, reply);
+		return 0;
+	}
+	if (len >= 2 && data[0] == 0 && (data[1] == 1 || data[1] == 3))
+		return 0;
+	if (!dst_wait_dst_ready(dst))
+		return 0;
+	// dst_i2c_enable(i2c); Per dimitri
+	retval = read_dst (dst, dst->rxbuffer, 8);
+	dst_i2c_disable(dst);
+	if (retval < 0) {
+		dprintk("%s: read not successful\n", __FUNCTION__);
+		return 0;
+	}
+	if (dst->rxbuffer[7] != dst_check_sum (dst->rxbuffer, 7)) {
+		dprintk("%s: checksum failure\n", __FUNCTION__);
+		return 0;
+	}
+	return 0;
+}
+
+static int dst_get_signal(struct dst_data *dst)
+{
+	int retval;
+	u8 get_signal[] = {0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb};
+
+	if ((dst->diseq_flags & ATTEMPT_TUNE) == 0) {
+		dst->decode_lock = dst->decode_strength = dst->decode_snr = 0;
+		return 0;
+	}
+	if (0 == (dst->diseq_flags & HAS_LOCK)) {
+		dst->decode_lock = dst->decode_strength = dst->decode_snr = 0;
+		return 0;
+	}
+	if (time_after_eq(jiffies, dst->cur_jiff + (HZ/5))) {
+		retval =  dst_command(dst, get_signal, 8);
+		if (retval < 0)
+			return retval;
+		if (dst->dst_type == DST_TYPE_IS_SAT) {
+			dst->decode_lock = ((dst->rxbuffer[6] & 0x10) == 0) ?
+					1 : 0;
+			dst->decode_strength = dst->rxbuffer[5] << 8;
+			dst->decode_snr = dst->rxbuffer[2] << 8 |
+				dst->rxbuffer[3];
+		} else if ((dst->dst_type == DST_TYPE_IS_TERR) ||
+				(dst->dst_type == DST_TYPE_IS_CABLE)) {
+			dst->decode_lock = (dst->rxbuffer[1]) ?
+					1 : 0;
+			dst->decode_strength = dst->rxbuffer[4] << 8;
+			dst->decode_snr = dst->rxbuffer[3] << 8;
+		}
+		dst->cur_jiff = jiffies;
+	}
+	return 0;
+}
+
+/*
+ * line22k0    0x00, 0x09, 0x00, 0xff, 0x01, 0x00, 0x00, 0x00
+ * line22k1    0x00, 0x09, 0x01, 0xff, 0x01, 0x00, 0x00, 0x00
+ * line22k2    0x00, 0x09, 0x02, 0xff, 0x01, 0x00, 0x00, 0x00
+ * tone        0x00, 0x09, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00
+ * data        0x00, 0x09, 0xff, 0x01, 0x01, 0x00, 0x00, 0x00
+ * power_off   0x00, 0x09, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00
+ * power_on    0x00, 0x09, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00
+ * Diseqc 1    0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf0, 0xec
+ * Diseqc 2    0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf4, 0xe8 
+ * Diseqc 3    0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf8, 0xe4 
+ * Diseqc 4    0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xfc, 0xe0 
+ */
+
+static int dst_set_diseqc (struct dst_data *dst, u8 *cmd, u8 len)
+{
+	u8 paket[8] =  {0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf0, 0xec };
+
+	if (dst->dst_type == DST_TYPE_IS_TERR)
+		return 0;
+
+	if (len == 0 || len > 4)
+		return -EINVAL;
+	memcpy(&paket[3], cmd, len);
+	paket[7] = dst_check_sum (&paket[0], 7);
+	dst_command(dst, paket, 8);
+	return 0;
+}
+
+static int dst_tone_power_cmd (struct dst_data *dst)
+{
+	u8 paket[8] =  {0x00, 0x09, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00};
+
+	if (dst->dst_type == DST_TYPE_IS_TERR)
+		return 0;
+
+	if (dst->voltage == SEC_VOLTAGE_OFF) 
+		paket[4] = 0;
+	else
+		paket[4] = 1;
+	if (dst->tone == SEC_TONE_ON)
+		paket[2] = dst->k22;
+	else
+		paket[2] = 0;
+	paket[7] = dst_check_sum (&paket[0], 7);
+	dst_command(dst, paket, 8);
+	return 0;
+}
+
+static int dst_set_voltage (struct dst_data *dst, fe_sec_voltage_t voltage)
+{
+	u8 *val;
+	int need_cmd;
+
+	dst->voltage = voltage;
+
+	if (dst->dst_type == DST_TYPE_IS_TERR)
+		return 0;
+
+	need_cmd = 0;
+	val = &dst->tx_tuna[0];
+	val[8] &= ~0x40;
+	switch (voltage) {
+	case SEC_VOLTAGE_13:
+		if ((dst->diseq_flags & HAS_POWER) == 0)
+			need_cmd = 1;
+		dst->diseq_flags |= HAS_POWER;
+		break;
+	case SEC_VOLTAGE_18:
+		if ((dst->diseq_flags & HAS_POWER) == 0)
+			need_cmd = 1;
+		dst->diseq_flags |= HAS_POWER;
+		val[8] |= 0x40;
+		break;
+	case SEC_VOLTAGE_OFF:
+		need_cmd = 1;
+		dst->diseq_flags &= ~(HAS_POWER|HAS_LOCK|ATTEMPT_TUNE);
+		break;
+	default:
+		return -EINVAL;
+	}
+	if (need_cmd) {
+		dst_tone_power_cmd(dst);
+	}
+	return 0;
+}
+
+
+static int dst_set_tone (struct dst_data *dst, fe_sec_tone_mode_t tone)
+{
+	u8 *val;
+
+	dst->tone = tone;
+
+	if (dst->dst_type == DST_TYPE_IS_TERR)
+		return 0;
+
+	val = &dst->tx_tuna[0];
+
+	val[8] &= ~0x1;
+
+	switch (tone) {
+	case SEC_TONE_OFF:
+		break;
+	case SEC_TONE_ON:
+		val[8] |= 1;
+		break;
+	default:
+		return -EINVAL;
+	}
+	dst_tone_power_cmd(dst);
+	return 0;
+}
+
+static int dst_get_tuna (struct dst_data *dst)
+{
+int retval;
+	if ((dst->diseq_flags & ATTEMPT_TUNE) == 0)
+		return 0;
+	dst->diseq_flags &= ~(HAS_LOCK);
+	if (!dst_wait_dst_ready(dst))
+		return 0;
+	if (dst->type_flags & DST_TYPE_HAS_NEWTUNE) {
+		/* how to get variable length reply ???? */
+		retval = read_dst (dst, dst->rx_tuna, 10);
+	} else {
+		retval = read_dst (dst, &dst->rx_tuna[2], 8);
+	}
+	if (retval < 0) {
+		dprintk("%s: read not successful\n", __FUNCTION__);
+		return 0;
+	}
+	if (dst->type_flags & DST_TYPE_HAS_NEWTUNE) {
+		if (dst->rx_tuna[9] != dst_check_sum (&dst->rx_tuna[0], 9)) {
+			dprintk("%s: checksum failure?\n", __FUNCTION__);
+			return 0;
+		}
+	} else {
+		if (dst->rx_tuna[9] != dst_check_sum (&dst->rx_tuna[2], 7)) {
+			dprintk("%s: checksum failure?\n", __FUNCTION__);
+			return 0;
+		}
+	}
+	if (dst->rx_tuna[2] == 0 && dst->rx_tuna[3] == 0)
+		return 0;
+	dst->decode_freq = ((dst->rx_tuna[2] & 0x7f) << 8) +  dst->rx_tuna[3];
+
+	dst->decode_lock = 1;
+	/*
+	dst->decode_n1 = (dst->rx_tuna[4] << 8) +  
+			(dst->rx_tuna[5]);
+
+	dst->decode_n2 = (dst->rx_tuna[8] << 8) +  
+			(dst->rx_tuna[7]);
+	*/
+	dst->diseq_flags |= HAS_LOCK;
+	/* dst->cur_jiff = jiffies; */
+	return 1;
+}
+
+static int dst_write_tuna (struct dst_data *dst)
+{
+	int retval;
+	u8 reply;
+
+	dprintk("%s: type_flags 0x%x \n", __FUNCTION__, dst->type_flags);
+	dst->decode_freq = 0;
+	dst->decode_lock = dst->decode_strength = dst->decode_snr = 0;
+	if (dst->dst_type == DST_TYPE_IS_SAT) {
+		if (!(dst->diseq_flags & HAS_POWER))
+			dst_set_voltage (dst, SEC_VOLTAGE_13);
+	}
+	dst->diseq_flags &= ~(HAS_LOCK|ATTEMPT_TUNE);
+	dst_i2c_enable(dst);
+	if (dst->type_flags & DST_TYPE_HAS_NEWTUNE) {
+		dst_reset8820(dst);
+		dst->tx_tuna[9] = dst_check_sum (&dst->tx_tuna[0], 9);
+		retval = write_dst (dst, &dst->tx_tuna[0], 10);
+	} else {
+		dst->tx_tuna[9] = dst_check_sum (&dst->tx_tuna[2], 7);
+		retval = write_dst (dst, &dst->tx_tuna[2], 8);
+	}
+	if (retval < 0) {
+		dst_i2c_disable(dst);
+		dprintk("%s: write not successful\n", __FUNCTION__);
+		return retval;
+	}
+	dvb_delay(3);
+	retval = read_dst (dst, &reply, 1);
+	dst_i2c_disable(dst);
+	if (retval < 0) {
+		dprintk("%s: read verify  not successful\n", __FUNCTION__);
+		return retval;
+	}
+	if (reply != 0xff) {
+		dprintk("%s: write reply not 0xff 0x%02x \n", __FUNCTION__, reply);
+		return 0;
+	}
+	dst->diseq_flags |= ATTEMPT_TUNE;
+	return dst_get_tuna(dst);
+}
+
+static void dst_init (struct dst_data *dst)
+{
+static u8 ini_satci_tuna[] = {  9, 0, 3, 0xb6, 1, 0,    0x73, 0x21, 0, 0 };
+static u8 ini_satfta_tuna[] = { 0, 0, 3, 0xb6, 1, 0x55, 0xbd, 0x50, 0, 0 };
+static u8 ini_tvfta_tuna[] = { 0, 0,  3, 0xb6, 1, 7,    0x0,   0x0, 0, 0 };
+static u8 ini_tvci_tuna[] = { 9, 0,  3, 0xb6, 1, 7,    0x0,   0x0, 0, 0 };
+static u8 ini_cabfta_tuna[] = { 0, 0,  3, 0xb6, 1, 7,    0x0,   0x0, 0, 0 };
+static u8 ini_cabci_tuna[] = { 9, 0,  3, 0xb6, 1, 7,    0x0,   0x0, 0, 0 };
+	dst->inversion = INVERSION_ON;
+	dst->voltage = SEC_VOLTAGE_13;
+	dst->tone = SEC_TONE_OFF;
+	dst->symbol_rate = 29473000;
+	dst->fec = FEC_AUTO;
+	dst->diseq_flags = 0;
+	dst->k22 = 0x02;
+	dst->bandwidth = BANDWIDTH_7_MHZ;
+	dst->cur_jiff = jiffies;
+	if (dst->dst_type == DST_TYPE_IS_SAT) {
+		dst->frequency = 950000;
+		memcpy(dst->tx_tuna, ((dst->type_flags &  DST_TYPE_HAS_NEWTUNE )? 
+					ini_satci_tuna : ini_satfta_tuna),
+				sizeof(ini_satfta_tuna));
+	} else if (dst->dst_type == DST_TYPE_IS_TERR) {
+		dst->frequency = 137000000;
+		memcpy(dst->tx_tuna, ((dst->type_flags &  DST_TYPE_HAS_NEWTUNE )? 
+					ini_tvci_tuna : ini_tvfta_tuna),
+				sizeof(ini_tvfta_tuna));
+	} else if (dst->dst_type == DST_TYPE_IS_CABLE) {
+		dst->frequency = 51000000;
+		memcpy(dst->tx_tuna, ((dst->type_flags &  DST_TYPE_HAS_NEWTUNE )? 
+					ini_cabci_tuna : ini_cabfta_tuna),
+				sizeof(ini_cabfta_tuna));
+	}
+}
+
+struct lkup {
+	unsigned int cmd;
+	char *desc;
+} looker[] = {
+	{FE_GET_INFO,                "FE_GET_INFO:"},
+	{FE_READ_STATUS,             "FE_READ_STATUS:" },
+	{FE_READ_BER,                "FE_READ_BER:" },
+	{FE_READ_SIGNAL_STRENGTH,    "FE_READ_SIGNAL_STRENGTH:" },
+	{FE_READ_SNR,                "FE_READ_SNR:" },
+	{FE_READ_UNCORRECTED_BLOCKS, "FE_READ_UNCORRECTED_BLOCKS:" },
+	{FE_SET_FRONTEND,            "FE_SET_FRONTEND:" },
+	{FE_GET_FRONTEND,            "FE_GET_FRONTEND:" },
+	{FE_SLEEP,                   "FE_SLEEP:" },
+	{FE_INIT,                    "FE_INIT:" },
+	{FE_RESET,                   "FE_RESET:" },
+	{FE_SET_TONE,                "FE_SET_TONE:" },
+	{FE_SET_VOLTAGE,             "FE_SET_VOLTAGE:" },
+	};
+
+static int dst_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
+{
+	struct dst_data *dst = fe->data;
+	int retval;
+	/*
+	char  *cc;
+                
+	cc = "FE_UNSUPP:";
+	for(retval = 0; retval < sizeof(looker) / sizeof(looker[0]); retval++) {
+		if (looker[retval].cmd == cmd) {
+			cc = looker[retval].desc;
+			break;
+		}
+	}
+	dprintk("%s cmd %s (0x%x)\n",__FUNCTION__, cc, cmd);
+	*/
+	// printk("%s: dst %8.8x bt %8.8x i2c %8.8x\n", __FUNCTION__, dst, dst->bt, dst->i2c);
+	/* should be set by attach, but just in case */
+	dst->i2c = fe->i2c;
+        switch (cmd) {
+        case FE_GET_INFO: 
+	{
+	     struct dvb_frontend_info *info;
+		info = &dst_info_sat;
+		if (dst->dst_type == DST_TYPE_IS_TERR)
+			info = &dst_info_tv;
+		else if (dst->dst_type == DST_TYPE_IS_CABLE)
+			info = &dst_info_cable;
+		memcpy (arg, info, sizeof(struct dvb_frontend_info));
+		break;
+	}
+        case FE_READ_STATUS:
+	{
+		fe_status_t *status = arg;
+
+		*status = 0;
+		if (dst->diseq_flags & HAS_LOCK) {
+			dst_get_signal(dst);
+			if (dst->decode_lock)
+				*status |= FE_HAS_LOCK 
+					| FE_HAS_SIGNAL 
+					| FE_HAS_CARRIER
+					| FE_HAS_SYNC
+					| FE_HAS_VITERBI;
+		}
+		break;
+	}
+
+        case FE_READ_BER:
+	{
+		/* guess */
+		// *(u32*) arg = dst->decode_n1;
+		*(u32*) arg = 0;
+		return -EOPNOTSUPP; 
+	}
+
+        case FE_READ_SIGNAL_STRENGTH:
+	{
+		dst_get_signal(dst);
+		*((u16*) arg) = dst->decode_strength;
+		break;
+	}
+
+        case FE_READ_SNR:
+	{
+		dst_get_signal(dst);
+		*((u16*) arg) = dst->decode_snr;
+		break;
+	}
+
+	case FE_READ_UNCORRECTED_BLOCKS: 
+	{
+		*((u32*) arg) = 0;    /* the stv0299 can't measure BER and */
+		return -EOPNOTSUPP;   /* errors at the same time.... */
+	}
+
+        case FE_SET_FRONTEND:
+        {
+		struct dvb_frontend_parameters *p = arg;
+
+		dst_set_freq (dst, p->frequency);
+		dst_set_inversion (dst, p->inversion);
+		if (dst->dst_type == DST_TYPE_IS_SAT) {
+			dst_set_fec (dst, p->u.qpsk.fec_inner);
+			dst_set_symbolrate (dst, p->u.qpsk.symbol_rate);
+		} else if (dst->dst_type == DST_TYPE_IS_TERR) {
+			dst_set_bandwidth(dst, p->u.ofdm.bandwidth);
+		} else if (dst->dst_type == DST_TYPE_IS_CABLE) {
+			dst_set_fec (dst, p->u.qam.fec_inner);
+			dst_set_symbolrate (dst, p->u.qam.symbol_rate);
+		}
+		dst_write_tuna (dst);
+
+                break;
+        }
+
+	case FE_GET_FRONTEND:
+	{
+		struct dvb_frontend_parameters *p = arg;
+
+
+		p->frequency = dst->decode_freq;
+		p->inversion = dst->inversion;
+		if (dst->dst_type == DST_TYPE_IS_SAT) {
+			p->u.qpsk.symbol_rate = dst->symbol_rate;
+			p->u.qpsk.fec_inner = dst_get_fec (dst);
+		} else if (dst->dst_type == DST_TYPE_IS_TERR) {
+			p->u.ofdm.bandwidth = dst->bandwidth;
+		} else if (dst->dst_type == DST_TYPE_IS_CABLE) {
+			p->u.qam.symbol_rate = dst->symbol_rate;
+			p->u.qam.fec_inner = dst_get_fec (dst);
+			p->u.qam.modulation = QAM_AUTO;
+		}
+		break;
+	}
+
+        case FE_SLEEP:
+		return 0;
+
+        case FE_INIT:
+		dst_init(dst);
+		break;
+
+	case FE_RESET:
+		break;
+
+	case FE_DISEQC_SEND_MASTER_CMD:
+	{
+		struct dvb_diseqc_master_cmd *cmd = (struct dvb_diseqc_master_cmd *)arg;
+		retval = dst_set_diseqc (dst, cmd->msg, cmd->msg_len);
+		if (retval < 0)
+			return retval;
+		break;
+	}
+	case FE_SET_TONE:
+		retval = dst_set_tone (dst, (fe_sec_tone_mode_t) arg);
+		if (retval < 0)
+			return retval;
+		break;
+	case FE_SET_VOLTAGE:
+		retval = dst_set_voltage (dst, (fe_sec_voltage_t) arg);
+		if (retval < 0)
+			return retval;
+		break;
+	default:
+		return -EOPNOTSUPP;
+        };
+        
+        return 0;
+} 
+
+
+static int dst_attach (struct dvb_i2c_bus *i2c, void **data)
+{
+	struct dst_data *dst;
+	struct bt878 *bt;
+	struct dvb_frontend_info *info;
+
+	dprintk("%s: check ci\n", __FUNCTION__);
+	bt = bt878_find_by_dvb_adap(i2c->adapter);
+	if (!bt)
+		return -ENODEV;
+	dst = kmalloc(sizeof(struct dst_data), GFP_KERNEL);
+	if (dst == NULL) {
+		printk(KERN_INFO "%s: Out of memory.\n", __FUNCTION__);
+		return -ENOMEM;
+	}
+	memset(dst, 0, sizeof(*dst));
+	*data = dst;
+	dst->bt = bt;
+	dst->i2c = i2c;
+	if (dst_check_ci(dst) < 0) {
+		kfree(dst);
+		return -ENODEV;
+	}
+
+	dst_init (dst);
+	dprintk("%s: register dst %8.8x bt %8.8x i2c %8.8x\n", __FUNCTION__, 
+			(u32)dst, (u32)(dst->bt), (u32)(dst->i2c));
+
+	info = &dst_info_sat;
+	if (dst->dst_type == DST_TYPE_IS_TERR)
+		info = &dst_info_tv;
+	else if (dst->dst_type == DST_TYPE_IS_CABLE)
+		info = &dst_info_cable;
+
+	dvb_register_frontend (dst_ioctl, i2c, dst, info);
+
+	return 0;
+}
+
+static void dst_detach (struct dvb_i2c_bus *i2c, void *data)
+{
+	dvb_unregister_frontend (dst_ioctl, i2c);
+	dprintk("%s: unregister dst %8.8x\n", __FUNCTION__, (u32)(data));
+	if (data)
+		kfree(data);
+}
+
+static int __init init_dst (void)
+{
+	return dvb_register_i2c_device (THIS_MODULE, dst_attach, dst_detach);
+}
+
+static void __exit exit_dst (void)
+{
+	dvb_unregister_i2c_device (dst_attach);
+}
+
+
+module_init(init_dst);
+module_exit(exit_dst);
+
+MODULE_DESCRIPTION("DST DVB-S Frontend");
+MODULE_AUTHOR("Jamie Honan");
+MODULE_LICENSE("GPL");
+
--- diff/drivers/net/forcedeth.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/net/forcedeth.c	2003-12-29 09:30:41.000000000 +0000
@@ -0,0 +1,1495 @@
+/*
+ * forcedeth: Ethernet driver for NVIDIA nForce media access controllers.
+ *
+ * Note: This driver is a cleanroom reimplementation based on reverse
+ *      engineered documentation written by Carl-Daniel Hailfinger
+ *      and Andrew de Quincey. It's neither supported nor endorsed
+ *      by NVIDIA Corp. Use at your own risk.
+ *
+ * NVIDIA, nForce and other NVIDIA marks are trademarks or registered
+ * trademarks of NVIDIA Corporation in the United States and other
+ * countries.
+ *
+ * Copyright (C) 2003 Manfred Spraul
+ *
+ * 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
+ *
+ * Changelog:
+ * 	0.01: 05 Oct 2003: First release that compiles without warnings.
+ * 	0.02: 05 Oct 2003: Fix bug for drain_tx: do not try to free NULL skbs.
+ * 			   Check all PCI BARs for the register window.
+ * 			   udelay added to mii_rw.
+ * 	0.03: 06 Oct 2003: Initialize dev->irq.
+ * 	0.04: 07 Oct 2003: Initialize np->lock, reduce handled irqs, add printks.
+ * 	0.05: 09 Oct 2003: printk removed again, irq status print tx_timeout.
+ * 	0.06: 10 Oct 2003: MAC Address read updated, pff flag generation updated,
+ * 			   irq mask updated
+ * 	0.07: 14 Oct 2003: Further irq mask updates.
+ * 	0.08: 20 Oct 2003: rx_desc.Length initialization added, alloc_rx refill
+ * 			   added into irq handler, NULL check for drain_ring.
+ * 	0.09: 20 Oct 2003: Basic link speed irq implementation. Only handle the
+ * 			   requested interrupt sources.
+ * 	0.10: 20 Oct 2003: First cleanup for release.
+ * 	0.11: 21 Oct 2003: hexdump for tx added, rx buffer sizes increased.
+ * 			   MAC Address init fix, set_multicast cleanup.
+ * 	0.12: 23 Oct 2003: Cleanups for release.
+ * 	0.13: 25 Oct 2003: Limit for concurrent tx packets increased to 10.
+ * 			   Set link speed correctly. start rx before starting
+ * 			   tx (start_rx sets the link speed).
+ * 	0.14: 25 Oct 2003: Nic dependant irq mask.
+ * 	0.15: 08 Nov 2003: fix smp deadlock with set_multicast_list during
+ * 			   open.
+ * 	0.16: 15 Nov 2003: include file cleanup for ppc64, rx buffer size
+ * 			   increased to 1628 bytes.
+ * 	0.17: 16 Nov 2003: undo rx buffer size increase. Substract 1 from
+ * 			   the tx length.
+ * 	0.18: 17 Nov 2003: fix oops due to late initialization of dev_stats
+ * 	0.19: 29 Nov 2003: Handle RxNoBuf, detect & handle invalid mac
+ * 			   addresses, really stop rx if already running
+ * 			   in start_rx, clean up a bit.
+ * 				(C) Carl-Daniel Hailfinger
+ *
+ * Known bugs:
+ * The irq handling is wrong - no tx done interrupts are generated.
+ * This means recovery from netif_stop_queue only happens in the hw timer
+ * interrupt (1/2 second on nForce2, 1/100 second on nForce3), or if an
+ * rx packet arrives by chance.
+ */
+#define FORCEDETH_VERSION		"0.19"
+
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/pci.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/delay.h>
+#include <linux/spinlock.h>
+#include <linux/ethtool.h>
+#include <linux/timer.h>
+#include <linux/skbuff.h>
+#include <linux/mii.h>
+#include <linux/random.h>
+#include <linux/init.h>
+
+#include <asm/io.h>
+#include <asm/uaccess.h>
+#include <asm/system.h>
+
+#if 0
+#define dprintk			printk
+#else
+#define dprintk(x...)		do { } while (0)
+#endif
+
+
+/*
+ * Hardware access:
+ */
+
+#define DEV_NEED_LASTPACKET1	0x0001
+#define DEV_IRQMASK_1		0x0002
+#define DEV_IRQMASK_2		0x0004
+
+enum {
+	NvRegIrqStatus = 0x000,
+#define NVREG_IRQSTAT_MIIEVENT	0x040
+#define NVREG_IRQSTAT_MASK		0x1ff
+	NvRegIrqMask = 0x004,
+#define NVREG_IRQ_RX			0x0002
+#define NVREG_IRQ_RX_NOBUF		0x0004
+#define NVREG_IRQ_TX_ERR		0x0008
+#define NVREG_IRQ_TX2			0x0010
+#define NVREG_IRQ_TIMER			0x0020
+#define NVREG_IRQ_LINK			0x0040
+#define NVREG_IRQ_TX1			0x0100
+#define NVREG_IRQMASK_WANTED_1		0x005f
+#define NVREG_IRQMASK_WANTED_2		0x0147
+#define NVREG_IRQ_UNKNOWN		(~(NVREG_IRQ_RX|NVREG_IRQ_RX_NOBUF|NVREG_IRQ_TX_ERR|NVREG_IRQ_TX2|NVREG_IRQ_TIMER|NVREG_IRQ_LINK|NVREG_IRQ_TX1))
+
+	NvRegUnknownSetupReg6 = 0x008,
+#define NVREG_UNKSETUP6_VAL		3
+
+	NvRegPollingInterval = 0x00c,
+	NvRegMisc1 = 0x080,
+#define NVREG_MISC1_HD		0x02
+#define NVREG_MISC1_FORCE	0x3b0f3c
+
+	NvRegTransmitterControl = 0x084,
+#define NVREG_XMITCTL_START	0x01
+	NvRegTransmitterStatus = 0x088,
+#define NVREG_XMITSTAT_BUSY	0x01
+
+	NvRegPacketFilterFlags = 0x8c,
+#define NVREG_PFF_ALWAYS	0x7F0008
+#define NVREG_PFF_PROMISC	0x80
+#define NVREG_PFF_MYADDR	0x20
+
+	NvRegOffloadConfig = 0x90,
+#define NVREG_OFFLOAD_HOMEPHY	0x601
+#define NVREG_OFFLOAD_NORMAL	0x5ee
+	NvRegReceiverControl = 0x094,
+#define NVREG_RCVCTL_START	0x01
+	NvRegReceiverStatus = 0x98,
+#define NVREG_RCVSTAT_BUSY	0x01
+
+	NvRegRandomSeed = 0x9c,
+#define NVREG_RNDSEED_MASK	0x00ff
+#define NVREG_RNDSEED_FORCE	0x7f00
+
+	NvRegUnknownSetupReg1 = 0xA0,
+#define NVREG_UNKSETUP1_VAL	0x16070f
+	NvRegUnknownSetupReg2 = 0xA4,
+#define NVREG_UNKSETUP2_VAL	0x16
+	NvRegMacAddrA = 0xA8,
+	NvRegMacAddrB = 0xAC,
+	NvRegMulticastAddrA = 0xB0,
+#define NVREG_MCASTADDRA_FORCE	0x01
+	NvRegMulticastAddrB = 0xB4,
+	NvRegMulticastMaskA = 0xB8,
+	NvRegMulticastMaskB = 0xBC,
+
+	NvRegTxRingPhysAddr = 0x100,
+	NvRegRxRingPhysAddr = 0x104,
+	NvRegRingSizes = 0x108,
+#define NVREG_RINGSZ_TXSHIFT 0
+#define NVREG_RINGSZ_RXSHIFT 16
+	NvRegUnknownTransmitterReg = 0x10c,
+	NvRegLinkSpeed = 0x110,
+#define NVREG_LINKSPEED_FORCE 0x10000
+#define NVREG_LINKSPEED_10	10
+#define NVREG_LINKSPEED_100	100
+#define NVREG_LINKSPEED_1000	1000
+	NvRegUnknownSetupReg5 = 0x130,
+#define NVREG_UNKSETUP5_BIT31	(1<<31)
+	NvRegUnknownSetupReg3 = 0x134,
+#define NVREG_UNKSETUP3_VAL1	0x200010
+	NvRegTxRxControl = 0x144,
+#define NVREG_TXRXCTL_KICK	0x0001
+#define NVREG_TXRXCTL_BIT1	0x0002
+#define NVREG_TXRXCTL_BIT2	0x0004
+#define NVREG_TXRXCTL_IDLE	0x0008
+#define NVREG_TXRXCTL_RESET	0x0010
+	NvRegMIIStatus = 0x180,
+#define NVREG_MIISTAT_ERROR		0x0001
+#define NVREG_MIISTAT_LINKCHANGE	0x0008
+#define NVREG_MIISTAT_MASK		0x000f
+#define NVREG_MIISTAT_MASK2		0x000f
+	NvRegUnknownSetupReg4 = 0x184,
+#define NVREG_UNKSETUP4_VAL	8
+
+	NvRegAdapterControl = 0x188,
+#define NVREG_ADAPTCTL_START	0x02
+#define NVREG_ADAPTCTL_LINKUP	0x04
+#define NVREG_ADAPTCTL_PHYVALID	0x4000
+#define NVREG_ADAPTCTL_RUNNING	0x100000
+#define NVREG_ADAPTCTL_PHYSHIFT	24
+	NvRegMIISpeed = 0x18c,
+#define NVREG_MIISPEED_BIT8	(1<<8)
+#define NVREG_MIIDELAY	5
+	NvRegMIIControl = 0x190,
+#define NVREG_MIICTL_INUSE	0x10000
+#define NVREG_MIICTL_WRITE	0x08000
+#define NVREG_MIICTL_ADDRSHIFT	5
+	NvRegMIIData = 0x194,
+	NvRegWakeUpFlags = 0x200,
+#define NVREG_WAKEUPFLAGS_VAL		0x7770
+#define NVREG_WAKEUPFLAGS_BUSYSHIFT	24
+#define NVREG_WAKEUPFLAGS_ENABLESHIFT	16
+#define NVREG_WAKEUPFLAGS_D3SHIFT	12
+#define NVREG_WAKEUPFLAGS_D2SHIFT	8
+#define NVREG_WAKEUPFLAGS_D1SHIFT	4
+#define NVREG_WAKEUPFLAGS_D0SHIFT	0
+#define NVREG_WAKEUPFLAGS_ACCEPT_MAGPAT		0x01
+#define NVREG_WAKEUPFLAGS_ACCEPT_WAKEUPPAT	0x02
+#define NVREG_WAKEUPFLAGS_ACCEPT_LINKCHANGE	0x04
+
+	NvRegPatternCRC = 0x204,
+	NvRegPatternMask = 0x208,
+	NvRegPowerCap = 0x268,
+#define NVREG_POWERCAP_D3SUPP	(1<<30)
+#define NVREG_POWERCAP_D2SUPP	(1<<26)
+#define NVREG_POWERCAP_D1SUPP	(1<<25)
+	NvRegPowerState = 0x26c,
+#define NVREG_POWERSTATE_POWEREDUP	0x8000
+#define NVREG_POWERSTATE_VALID		0x0100
+#define NVREG_POWERSTATE_MASK		0x0003
+#define NVREG_POWERSTATE_D0		0x0000
+#define NVREG_POWERSTATE_D1		0x0001
+#define NVREG_POWERSTATE_D2		0x0002
+#define NVREG_POWERSTATE_D3		0x0003
+};
+
+struct ring_desc {
+	u32 PacketBuffer;
+	u16 Length;
+	u16 Flags;
+};
+
+#define NV_TX_LASTPACKET	(1<<0)
+#define NV_TX_RETRYERROR	(1<<3)
+#define NV_TX_LASTPACKET1	(1<<8)
+#define NV_TX_DEFERRED		(1<<10)
+#define NV_TX_CARRIERLOST	(1<<11)
+#define NV_TX_LATECOLLISION	(1<<12)
+#define NV_TX_UNDERFLOW		(1<<13)
+#define NV_TX_ERROR		(1<<14)
+#define NV_TX_VALID		(1<<15)
+
+#define NV_RX_DESCRIPTORVALID	(1<<0)
+#define NV_RX_MISSEDFRAME	(1<<1)
+#define NV_RX_SUBSTRACT1	(1<<3)
+#define NV_RX_ERROR1		(1<<7)
+#define NV_RX_ERROR2		(1<<8)
+#define NV_RX_ERROR3		(1<<9)
+#define NV_RX_ERROR4		(1<<10)
+#define NV_RX_CRCERR		(1<<11)
+#define NV_RX_OVERFLOW		(1<<12)
+#define NV_RX_FRAMINGERR	(1<<13)
+#define NV_RX_ERROR		(1<<14)
+#define NV_RX_AVAIL		(1<<15)
+
+/* Miscelaneous hardware related defines: */
+#define NV_PCI_REGSZ		0x270
+
+/* various timeout delays: all in usec */
+#define NV_TXRX_RESET_DELAY	4
+#define NV_TXSTOP_DELAY1	10
+#define NV_TXSTOP_DELAY1MAX	500000
+#define NV_TXSTOP_DELAY2	100
+#define NV_RXSTOP_DELAY1	10
+#define NV_RXSTOP_DELAY1MAX	500000
+#define NV_RXSTOP_DELAY2	100
+#define NV_SETUP5_DELAY		5
+#define NV_SETUP5_DELAYMAX	50000
+#define NV_POWERUP_DELAY	5
+#define NV_POWERUP_DELAYMAX	5000
+#define NV_MIIBUSY_DELAY	50
+#define NV_MIIPHY_DELAY	10
+#define NV_MIIPHY_DELAYMAX	10000
+
+#define NV_WAKEUPPATTERNS	5
+#define NV_WAKEUPMASKENTRIES	4
+
+/* General driver defaults */
+#define NV_WATCHDOG_TIMEO	(2*HZ)
+#define DEFAULT_MTU		1500	/* also maximum supported, at least for now */
+
+#define RX_RING		128
+#define TX_RING		16
+/* limited to 1 packet until we understand NV_TX_LASTPACKET */
+#define TX_LIMIT_STOP	10
+#define TX_LIMIT_START	5
+
+/* rx/tx mac addr + type + vlan + align + slack*/
+#define RX_NIC_BUFSIZE		(DEFAULT_MTU + 64)
+/* even more slack */
+#define RX_ALLOC_BUFSIZE	(DEFAULT_MTU + 128)
+
+#define OOM_REFILL	(1+HZ/20)
+#define POLL_WAIT	(1+HZ/100)
+
+/*
+ * SMP locking:
+ * All hardware access under dev->priv->lock, except the performance
+ * critical parts:
+ * - rx is (pseudo-) lockless: it relies on the single-threading provided
+ * 	by the arch code for interrupts.
+ * - tx setup is lockless: it relies on dev->xmit_lock. Actual submission
+ *	needs dev->priv->lock :-(
+ * - set_multicast_list: preparation lockless, relies on dev->xmit_lock.
+ */
+
+/* in dev: base, irq */
+struct fe_priv {
+	spinlock_t lock;
+
+	/* General data:
+	 * Locking: spin_lock(&np->lock); */
+	struct net_device_stats stats;
+	int in_shutdown;
+	u32 linkspeed;
+	int duplex;
+	int phyaddr;
+
+	/* General data: RO fields */
+	dma_addr_t ring_addr;
+	struct pci_dev *pci_dev;
+	u32 orig_mac[2];
+	u32 irqmask;
+
+	/* rx specific fields.
+	 * Locking: Within irq hander or disable_irq+spin_lock(&np->lock);
+	 */
+	struct ring_desc *rx_ring;
+	unsigned int cur_rx, refill_rx;
+	struct sk_buff *rx_skbuff[RX_RING];
+	dma_addr_t rx_dma[RX_RING];
+	unsigned int rx_buf_sz;
+	struct timer_list oom_kick;
+	struct timer_list nic_poll;
+
+	/*
+	 * tx specific fields.
+	 */
+	struct ring_desc *tx_ring;
+	unsigned int next_tx, nic_tx;
+	struct sk_buff *tx_skbuff[TX_RING];
+	dma_addr_t tx_dma[TX_RING];
+	u16 tx_flags;
+};
+
+/*
+ * Maximum number of loops until we assume that a bit in the irq mask
+ * is stuck. Overridable with module param.
+ */
+static int max_interrupt_work = 5;
+
+static inline struct fe_priv *get_nvpriv(struct net_device *dev)
+{
+	return (struct fe_priv *) dev->priv;
+}
+
+static inline u8 *get_hwbase(struct net_device *dev)
+{
+	return (u8 *) dev->base_addr;
+}
+
+static inline void pci_push(u8 * base)
+{
+	/* force out pending posted writes */
+	readl(base);
+}
+
+static int reg_delay(struct net_device *dev, int offset, u32 mask, u32 target,
+				int delay, int delaymax, const char *msg)
+{
+	u8 *base = get_hwbase(dev);
+
+	pci_push(base);
+	do {
+		udelay(delay);
+		delaymax -= delay;
+		if (delaymax < 0) {
+			if (msg)
+				printk(msg);
+			return 1;
+		}
+	} while ((readl(base + offset) & mask) != target);
+	return 0;
+}
+
+#define MII_READ	(-1)
+/* mii_rw: read/write a register on the PHY.
+ *
+ * Caller must guarantee serialization
+ */
+static int mii_rw(struct net_device *dev, int addr, int miireg, int value)
+{
+	u8 *base = get_hwbase(dev);
+	int was_running;
+	u32 reg;
+	int retval;
+
+	writel(NVREG_MIISTAT_MASK, base + NvRegMIIStatus);
+	was_running = 0;
+	reg = readl(base + NvRegAdapterControl);
+	if (reg & NVREG_ADAPTCTL_RUNNING) {
+		was_running = 1;
+		writel(reg & ~NVREG_ADAPTCTL_RUNNING, base + NvRegAdapterControl);
+	}
+	reg = readl(base + NvRegMIIControl);
+	if (reg & NVREG_MIICTL_INUSE) {
+		writel(NVREG_MIICTL_INUSE, base + NvRegMIIControl);
+		udelay(NV_MIIBUSY_DELAY);
+	}
+
+	reg = NVREG_MIICTL_INUSE | (addr << NVREG_MIICTL_ADDRSHIFT) | miireg;
+	if (value != MII_READ) {
+		writel(value, base + NvRegMIIData);
+		reg |= NVREG_MIICTL_WRITE;
+	}
+	writel(reg, base + NvRegMIIControl);
+
+	if (reg_delay(dev, NvRegMIIControl, NVREG_MIICTL_INUSE, 0,
+			NV_MIIPHY_DELAY, NV_MIIPHY_DELAYMAX, NULL)) {
+		dprintk(KERN_DEBUG "%s: mii_rw of reg %d at PHY %d timed out.\n",
+				dev->name, miireg, addr);
+		retval = -1;
+	} else if (value != MII_READ) {
+		/* it was a write operation - fewer failures are detectable */
+		dprintk(KERN_DEBUG "%s: mii_rw wrote 0x%x to reg %d at PHY %d\n",
+				dev->name, value, miireg, addr);
+		retval = 0;
+	} else if (readl(base + NvRegMIIStatus) & NVREG_MIISTAT_ERROR) {
+		dprintk(KERN_DEBUG "%s: mii_rw of reg %d at PHY %d failed.\n",
+				dev->name, miireg, addr);
+		retval = -1;
+	} else {
+		/* FIXME: why is that required? */
+		udelay(50);
+		retval = readl(base + NvRegMIIData);
+		dprintk(KERN_DEBUG "%s: mii_rw read from reg %d at PHY %d: 0x%x.\n",
+				dev->name, miireg, addr, retval);
+	}
+	if (was_running) {
+		reg = readl(base + NvRegAdapterControl);
+		writel(reg | NVREG_ADAPTCTL_RUNNING, base + NvRegAdapterControl);
+	}
+	return retval;
+}
+
+static void start_rx(struct net_device *dev)
+{
+	struct fe_priv *np = get_nvpriv(dev);
+	u8 *base = get_hwbase(dev);
+
+	dprintk(KERN_DEBUG "%s: start_rx\n", dev->name);
+	/* Already running? Stop it. */
+	if (readl(base + NvRegReceiverControl) & NVREG_RCVCTL_START) {
+		writel(0, base + NvRegReceiverControl);
+		pci_push(base);
+	}
+	writel(np->linkspeed, base + NvRegLinkSpeed);
+	pci_push(base);
+	writel(NVREG_RCVCTL_START, base + NvRegReceiverControl);
+	pci_push(base);
+}
+
+static void stop_rx(struct net_device *dev)
+{
+	u8 *base = get_hwbase(dev);
+
+	dprintk(KERN_DEBUG "%s: stop_rx\n", dev->name);
+	writel(0, base + NvRegReceiverControl);
+	reg_delay(dev, NvRegReceiverStatus, NVREG_RCVSTAT_BUSY, 0,
+		       NV_RXSTOP_DELAY1, NV_RXSTOP_DELAY1MAX,
+		       KERN_INFO "stop_rx: ReceiverStatus remained busy");
+
+	udelay(NV_RXSTOP_DELAY2);
+	writel(0, base + NvRegLinkSpeed);
+}
+
+static void start_tx(struct net_device *dev)
+{
+	u8 *base = get_hwbase(dev);
+
+	dprintk(KERN_DEBUG "%s: start_tx\n", dev->name);
+	writel(NVREG_XMITCTL_START, base + NvRegTransmitterControl);
+	pci_push(base);
+}
+
+static void stop_tx(struct net_device *dev)
+{
+	u8 *base = get_hwbase(dev);
+
+	dprintk(KERN_DEBUG "%s: stop_tx\n", dev->name);
+	writel(0, base + NvRegTransmitterControl);
+	reg_delay(dev, NvRegTransmitterStatus, NVREG_XMITSTAT_BUSY, 0,
+		       NV_TXSTOP_DELAY1, NV_TXSTOP_DELAY1MAX,
+		       KERN_INFO "stop_tx: TransmitterStatus remained busy");
+
+	udelay(NV_TXSTOP_DELAY2);
+	writel(0, base + NvRegUnknownTransmitterReg);
+}
+
+static void txrx_reset(struct net_device *dev)
+{
+	u8 *base = get_hwbase(dev);
+
+	dprintk(KERN_DEBUG "%s: txrx_reset\n", dev->name);
+	writel(NVREG_TXRXCTL_BIT2 | NVREG_TXRXCTL_RESET, base + NvRegTxRxControl);
+	pci_push(base);
+	udelay(NV_TXRX_RESET_DELAY);
+	writel(NVREG_TXRXCTL_BIT2, base + NvRegTxRxControl);
+	pci_push(base);
+}
+
+/*
+ * get_stats: dev->get_stats function
+ * Get latest stats value from the nic.
+ * Called with read_lock(&dev_base_lock) held for read -
+ * only synchronized against unregister_netdevice.
+ */
+static struct net_device_stats *get_stats(struct net_device *dev)
+{
+	struct fe_priv *np = get_nvpriv(dev);
+
+	/* It seems that the nic always generates interrupts and doesn't
+	 * accumulate errors internally. Thus the current values in np->stats
+	 * are already up to date.
+	 */
+	return &np->stats;
+}
+
+
+/*
+ * nic_ioctl: dev->do_ioctl function
+ * Called with rtnl_lock held.
+ */
+static int nic_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
+{
+	return -EOPNOTSUPP;
+}
+
+/*
+ * alloc_rx: fill rx ring entries.
+ * Return 1 if the allocations for the skbs failed and the
+ * rx engine is without Available descriptors
+ */
+static int alloc_rx(struct net_device *dev)
+{
+	struct fe_priv *np = get_nvpriv(dev);
+	unsigned int refill_rx = np->refill_rx;
+
+	while (np->cur_rx != refill_rx) {
+		int nr = refill_rx % RX_RING;
+		struct sk_buff *skb;
+
+		if (np->rx_skbuff[nr] == NULL) {
+
+			skb = dev_alloc_skb(RX_ALLOC_BUFSIZE);
+			if (!skb)
+				break;
+
+			skb->dev = dev;
+			np->rx_skbuff[nr] = skb;
+		} else {
+			skb = np->rx_skbuff[nr];
+		}
+		np->rx_dma[nr] = pci_map_single(np->pci_dev, skb->data, skb->len,
+						PCI_DMA_FROMDEVICE);
+		np->rx_ring[nr].PacketBuffer = cpu_to_le32(np->rx_dma[nr]);
+		np->rx_ring[nr].Length = cpu_to_le16(RX_NIC_BUFSIZE);
+		wmb();
+		np->rx_ring[nr].Flags = cpu_to_le16(NV_RX_AVAIL);
+		dprintk(KERN_DEBUG "%s: alloc_rx: Packet  %d marked as Available\n",
+					dev->name, refill_rx);
+		refill_rx++;
+	}
+	np->refill_rx = refill_rx;
+	if (np->cur_rx - refill_rx == RX_RING)
+		return 1;
+	return 0;
+}
+
+static void do_rx_refill(unsigned long data)
+{
+	struct net_device *dev = (struct net_device *) data;
+	struct fe_priv *np = get_nvpriv(dev);
+
+	disable_irq(dev->irq);
+	if (alloc_rx(dev)) {
+		spin_lock(&np->lock);
+		if (!np->in_shutdown)
+			mod_timer(&np->oom_kick, jiffies + OOM_REFILL);
+		spin_unlock(&np->lock);
+	}
+	enable_irq(dev->irq);
+}
+
+static int init_ring(struct net_device *dev)
+{
+	struct fe_priv *np = get_nvpriv(dev);
+	int i;
+
+	np->next_tx = np->nic_tx = 0;
+	for (i = 0; i < TX_RING; i++) {
+		np->tx_ring[i].Flags = 0;
+	}
+
+	np->cur_rx = RX_RING;
+	np->refill_rx = 0;
+	for (i = 0; i < RX_RING; i++) {
+		np->rx_ring[i].Flags = 0;
+	}
+	return alloc_rx(dev);
+}
+
+static void drain_tx(struct net_device *dev)
+{
+	struct fe_priv *np = get_nvpriv(dev);
+	int i;
+	for (i = 0; i < TX_RING; i++) {
+		np->tx_ring[i].Flags = 0;
+		if (np->tx_skbuff[i]) {
+			pci_unmap_single(np->pci_dev, np->tx_dma[i],
+						np->tx_skbuff[i]->len,
+						PCI_DMA_TODEVICE);
+			dev_kfree_skb(np->tx_skbuff[i]);
+			np->tx_skbuff[i] = NULL;
+			np->stats.tx_dropped++;
+		}
+	}
+}
+
+static void drain_rx(struct net_device *dev)
+{
+	struct fe_priv *np = get_nvpriv(dev);
+	int i;
+	for (i = 0; i < RX_RING; i++) {
+		np->rx_ring[i].Flags = 0;
+		wmb();
+		if (np->rx_skbuff[i]) {
+			pci_unmap_single(np->pci_dev, np->rx_dma[i],
+						np->rx_skbuff[i]->len,
+						PCI_DMA_FROMDEVICE);
+			dev_kfree_skb(np->rx_skbuff[i]);
+			np->rx_skbuff[i] = NULL;
+		}
+	}
+}
+
+static void drain_ring(struct net_device *dev)
+{
+	drain_tx(dev);
+	drain_rx(dev);
+}
+
+/*
+ * start_xmit: dev->hard_start_xmit function
+ * Called with dev->xmit_lock held.
+ */
+static int start_xmit(struct sk_buff *skb, struct net_device *dev)
+{
+	struct fe_priv *np = get_nvpriv(dev);
+	int nr = np->next_tx % TX_RING;
+
+	np->tx_skbuff[nr] = skb;
+	np->tx_dma[nr] = pci_map_single(np->pci_dev, skb->data,skb->len,
+					PCI_DMA_TODEVICE);
+
+	np->tx_ring[nr].PacketBuffer = cpu_to_le32(np->tx_dma[nr]);
+	np->tx_ring[nr].Length = cpu_to_le16(skb->len-1);
+
+	spin_lock_irq(&np->lock);
+	wmb();
+	np->tx_ring[nr].Flags = np->tx_flags;
+	dprintk(KERN_DEBUG "%s: start_xmit: packet packet %d queued for transmission.\n",
+				dev->name, np->next_tx);
+	{
+		int j;
+		for (j=0; j<64; j++) {
+			if ((j%16) == 0)
+				dprintk("\n%03x:", j);
+			dprintk(" %02x", ((unsigned char*)skb->data)[j]);
+		}
+		dprintk("\n");
+	}
+
+	np->next_tx++;
+
+	dev->trans_start = jiffies;
+	if (np->next_tx - np->nic_tx >= TX_LIMIT_STOP)
+		netif_stop_queue(dev);
+	spin_unlock_irq(&np->lock);
+	writel(NVREG_TXRXCTL_KICK, get_hwbase(dev) + NvRegTxRxControl);
+	return 0;
+}
+
+/*
+ * tx_done: check for completed packets, release the skbs.
+ *
+ * Caller must own np->lock.
+ */
+static void tx_done(struct net_device *dev)
+{
+	struct fe_priv *np = get_nvpriv(dev);
+
+	while (np->nic_tx < np->next_tx) {
+		struct ring_desc *prd;
+		int i = np->nic_tx % TX_RING;
+
+		prd = &np->tx_ring[i];
+
+		dprintk(KERN_DEBUG "%s: tx_done: looking at packet %d, Flags 0x%x.\n",
+					dev->name, np->nic_tx, prd->Flags);
+		if (prd->Flags & cpu_to_le16(NV_TX_VALID))
+			break;
+		if (prd->Flags & cpu_to_le16(NV_TX_RETRYERROR|NV_TX_CARRIERLOST|NV_TX_LATECOLLISION|
+						NV_TX_UNDERFLOW|NV_TX_ERROR)) {
+			if (prd->Flags & cpu_to_le16(NV_TX_UNDERFLOW))
+				np->stats.tx_fifo_errors++;
+			if (prd->Flags & cpu_to_le16(NV_TX_CARRIERLOST))
+				np->stats.tx_carrier_errors++;
+			np->stats.tx_errors++;
+		} else {
+			np->stats.tx_packets++;
+			np->stats.tx_bytes += np->tx_skbuff[i]->len;
+		}
+		pci_unmap_single(np->pci_dev, np->tx_dma[i],
+					np->tx_skbuff[i]->len,
+					PCI_DMA_TODEVICE);
+		dev_kfree_skb_irq(np->tx_skbuff[i]);
+		np->tx_skbuff[i] = NULL;
+		np->nic_tx++;
+	}
+	if (np->next_tx - np->nic_tx < TX_LIMIT_START)
+		netif_wake_queue(dev);
+}
+
+/*
+ * tx_timeout: dev->tx_timeout function
+ * Called with dev->xmit_lock held.
+ */
+static void tx_timeout(struct net_device *dev)
+{
+	struct fe_priv *np = get_nvpriv(dev);
+	u8 *base = get_hwbase(dev);
+
+	dprintk(KERN_DEBUG "%s: Got tx_timeout. irq: %08x\n", dev->name,
+			readl(base + NvRegIrqStatus) & NVREG_IRQSTAT_MASK);
+
+	spin_lock_irq(&np->lock);
+
+	/* 1) stop tx engine */
+	stop_tx(dev);
+
+	/* 2) check that the packets were not sent already: */
+	tx_done(dev);
+
+	/* 3) if there are dead entries: clear everything */
+	if (np->next_tx != np->nic_tx) {
+		printk(KERN_DEBUG "%s: tx_timeout: dead entries!\n", dev->name);
+		drain_tx(dev);
+		np->next_tx = np->nic_tx = 0;
+		writel((u32) (np->ring_addr + RX_RING*sizeof(struct ring_desc)), base + NvRegTxRingPhysAddr);
+		netif_wake_queue(dev);
+	}
+
+	/* 4) restart tx engine */
+	start_tx(dev);
+	spin_unlock_irq(&np->lock);
+}
+
+static void rx_process(struct net_device *dev)
+{
+	struct fe_priv *np = get_nvpriv(dev);
+
+	for (;;) {
+		struct ring_desc *prd;
+		struct sk_buff *skb;
+		int len;
+		int i;
+		if (np->cur_rx - np->refill_rx >= RX_RING)
+			break;	/* we scanned the whole ring - do not continue */
+
+		i = np->cur_rx % RX_RING;
+		prd = &np->rx_ring[i];
+		dprintk(KERN_DEBUG "%s: rx_process: looking at packet %d, Flags 0x%x.\n",
+					dev->name, np->cur_rx, prd->Flags);
+
+		if (prd->Flags & cpu_to_le16(NV_RX_AVAIL))
+			break;	/* still owned by hardware, */
+
+		/*
+		 * the packet is for us - immediately tear down the pci mapping, and
+		 * prefetch the first cacheline of the packet.
+		 */
+		pci_unmap_single(np->pci_dev, np->rx_dma[i],
+				np->rx_skbuff[i]->len,
+				PCI_DMA_FROMDEVICE);
+		prefetch(np->rx_skbuff[i]->data);
+
+		{
+			int j;
+			dprintk(KERN_DEBUG "Dumping packet (flags 0x%x).",prd->Flags);
+			for (j=0; j<64; j++) {
+				if ((j%16) == 0)
+					dprintk("\n%03x:", j);
+				dprintk(" %02x", ((unsigned char*)np->rx_skbuff[i]->data)[j]);
+			}
+			dprintk("\n");
+		}
+		/* look at what we actually got: */
+		if (!(prd->Flags & cpu_to_le16(NV_RX_DESCRIPTORVALID)))
+			goto next_pkt;
+
+
+		len = le16_to_cpu(prd->Length);
+
+		if (prd->Flags & cpu_to_le16(NV_RX_MISSEDFRAME)) {
+			np->stats.rx_missed_errors++;
+			np->stats.rx_errors++;
+			goto next_pkt;
+		}
+		if (prd->Flags & cpu_to_le16(NV_RX_ERROR1|NV_RX_ERROR2|NV_RX_ERROR3|NV_RX_ERROR4)) {
+			np->stats.rx_errors++;
+			goto next_pkt;
+		}
+		if (prd->Flags & cpu_to_le16(NV_RX_CRCERR)) {
+			np->stats.rx_crc_errors++;
+			np->stats.rx_errors++;
+			goto next_pkt;
+		}
+		if (prd->Flags & cpu_to_le16(NV_RX_OVERFLOW)) {
+			np->stats.rx_over_errors++;
+			np->stats.rx_errors++;
+			goto next_pkt;
+		}
+		if (prd->Flags & cpu_to_le16(NV_RX_ERROR)) {
+			/* framing errors are soft errors, the rest is fatal. */
+			if (prd->Flags & cpu_to_le16(NV_RX_FRAMINGERR)) {
+				if (prd->Flags & cpu_to_le16(NV_RX_SUBSTRACT1)) {
+					len--;
+				}
+			} else {
+				np->stats.rx_errors++;
+				goto next_pkt;
+			}
+		}
+		/* got a valid packet - forward it to the network core */
+		skb = np->rx_skbuff[i];
+		np->rx_skbuff[i] = NULL;
+
+		skb_put(skb, len);
+		skb->protocol = eth_type_trans(skb, dev);
+		dprintk(KERN_DEBUG "%s: rx_process: packet %d with %d bytes, proto %d accepted.\n",
+					dev->name, np->cur_rx, len, skb->protocol);
+		netif_rx(skb);
+		dev->last_rx = jiffies;
+		np->stats.rx_packets++;
+		np->stats.rx_bytes += len;
+next_pkt:
+		np->cur_rx++;
+	}
+}
+
+/*
+ * change_mtu: dev->change_mtu function
+ * Called with dev_base_lock held for read.
+ */
+static int change_mtu(struct net_device *dev, int new_mtu)
+{
+	if (new_mtu > DEFAULT_MTU)
+		return -EINVAL;
+	dev->mtu = new_mtu;
+	return 0;
+}
+
+/*
+ * change_mtu: dev->change_mtu function
+ * Called with dev->xmit_lock held.
+ */
+static void set_multicast(struct net_device *dev)
+{
+	struct fe_priv *np = get_nvpriv(dev);
+	u8 *base = get_hwbase(dev);
+	u32 addr[2];
+	u32 mask[2];
+	u32 pff;
+
+	memset(addr, 0, sizeof(addr));
+	memset(mask, 0, sizeof(mask));
+
+	if (dev->flags & IFF_PROMISC) {
+		printk(KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name);
+		pff = NVREG_PFF_PROMISC;
+	} else {
+		pff = NVREG_PFF_MYADDR;
+
+		if (dev->flags & IFF_ALLMULTI || dev->mc_list) {
+			u32 alwaysOff[2];
+			u32 alwaysOn[2];
+
+			alwaysOn[0] = alwaysOn[1] = alwaysOff[0] = alwaysOff[1] = 0xffffffff;
+			if (dev->flags & IFF_ALLMULTI) {
+				alwaysOn[0] = alwaysOn[1] = alwaysOff[0] = alwaysOff[1] = 0;
+			} else {
+				struct dev_mc_list *walk;
+
+				walk = dev->mc_list;
+				while (walk != NULL) {
+					u32 a, b;
+					a = le32_to_cpu(*(u32 *) walk->dmi_addr);
+					b = le16_to_cpu(*(u16 *) (&walk->dmi_addr[4]));
+					alwaysOn[0] &= a;
+					alwaysOff[0] &= ~a;
+					alwaysOn[1] &= b;
+					alwaysOff[1] &= ~b;
+					walk = walk->next;
+				}
+			}
+			addr[0] = alwaysOn[0];
+			addr[1] = alwaysOn[1];
+			mask[0] = alwaysOn[0] | alwaysOff[0];
+			mask[1] = alwaysOn[1] | alwaysOff[1];
+		}
+	}
+	addr[0] |= NVREG_MCASTADDRA_FORCE;
+	pff |= NVREG_PFF_ALWAYS;
+	spin_lock_irq(&np->lock);
+	stop_rx(dev);
+	writel(addr[0], base + NvRegMulticastAddrA);
+	writel(addr[1], base + NvRegMulticastAddrB);
+	writel(mask[0], base + NvRegMulticastMaskA);
+	writel(mask[1], base + NvRegMulticastMaskB);
+	writel(pff, base + NvRegPacketFilterFlags);
+	start_rx(dev);
+	spin_unlock_irq(&np->lock);
+}
+
+static int update_linkspeed(struct net_device *dev)
+{
+	struct fe_priv *np = get_nvpriv(dev);
+	int adv, lpa, newls, newdup;
+
+	adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ);
+	lpa = mii_rw(dev, np->phyaddr, MII_LPA, MII_READ);
+	dprintk(KERN_DEBUG "%s: update_linkspeed: PHY advertises 0x%04x, lpa 0x%04x.\n",
+				dev->name, adv, lpa);
+
+	/* FIXME: handle parallel detection properly, handle gigabit ethernet */
+	lpa = lpa & adv;
+	if (lpa  & LPA_100FULL) {
+		newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_100;
+		newdup = 1;
+	} else if (lpa & LPA_100HALF) {
+		newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_100;
+		newdup = 0;
+	} else if (lpa & LPA_10FULL) {
+		newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10;
+		newdup = 1;
+	} else if (lpa & LPA_10HALF) {
+		newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10;
+		newdup = 0;
+	} else {
+		dprintk(KERN_DEBUG "%s: bad ability %04x - falling back to 10HD.\n", dev->name, lpa);
+		newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10;
+		newdup = 0;
+	}
+	if (np->duplex != newdup || np->linkspeed != newls) {
+		np->duplex = newdup;
+		np->linkspeed = newls;
+		return 1;
+	}
+	return 0;
+}
+
+static void link_irq(struct net_device *dev)
+{
+	struct fe_priv *np = get_nvpriv(dev);
+	u8 *base = get_hwbase(dev);
+	u32 miistat;
+	int miival;
+
+	miistat = readl(base + NvRegMIIStatus);
+	writel(NVREG_MIISTAT_MASK, base + NvRegMIIStatus);
+	printk(KERN_DEBUG "%s: link change notification, status 0x%x.\n", dev->name, miistat);
+
+	miival = mii_rw(dev, np->phyaddr, MII_BMSR, MII_READ);
+	if (miival & BMSR_ANEGCOMPLETE) {
+		update_linkspeed(dev);
+
+		if (netif_carrier_ok(dev)) {
+			stop_rx(dev);
+		} else {
+			netif_carrier_on(dev);
+			printk(KERN_INFO "%s: link up.\n", dev->name);
+		}
+		writel(NVREG_MISC1_FORCE | ( np->duplex ? 0 : NVREG_MISC1_HD),
+					base + NvRegMisc1);
+		start_rx(dev);
+	} else {
+		if (netif_carrier_ok(dev)) {
+			netif_carrier_off(dev);
+			printk(KERN_INFO "%s: link down.\n", dev->name);
+			stop_rx(dev);
+		}
+		writel(np->linkspeed, base + NvRegLinkSpeed);
+		pci_push(base);
+	}
+}
+
+static irqreturn_t nic_irq(int foo, void *data, struct pt_regs *regs)
+{
+	struct net_device *dev = (struct net_device *) data;
+	struct fe_priv *np = get_nvpriv(dev);
+	u8 *base = get_hwbase(dev);
+	u32 events;
+	int i;
+
+	dprintk(KERN_DEBUG "%s: nic_irq\n", dev->name);
+
+	for (i=0; ; i++) {
+		events = readl(base + NvRegIrqStatus) & NVREG_IRQSTAT_MASK;
+		writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus);
+		pci_push(base);
+		dprintk(KERN_DEBUG "%s: irq: %08x\n", dev->name, events);
+		if (!(events & np->irqmask))
+			break;
+
+		if (events & (NVREG_IRQ_TX1|NVREG_IRQ_TX2|NVREG_IRQ_TX_ERR)) {
+			spin_lock(&np->lock);
+			tx_done(dev);
+			spin_unlock(&np->lock);
+		}
+
+		if (events & (NVREG_IRQ_RX|NVREG_IRQ_RX_NOBUF)) {
+			rx_process(dev);
+			if (alloc_rx(dev)) {
+				spin_lock(&np->lock);
+				if (!np->in_shutdown)
+					mod_timer(&np->oom_kick, jiffies + OOM_REFILL);
+				spin_unlock(&np->lock);
+			}
+		}
+
+		if (events & NVREG_IRQ_LINK) {
+			spin_lock(&np->lock);
+			link_irq(dev);
+			spin_unlock(&np->lock);
+		}
+		if (events & (NVREG_IRQ_TX_ERR)) {
+			dprintk(KERN_DEBUG "%s: received irq with events 0x%x. Probably TX fail.\n",
+						dev->name, events);
+		}
+		if (events & (NVREG_IRQ_UNKNOWN)) {
+			printk(KERN_DEBUG "%s: received irq with unknown events 0x%x. Please report\n",
+						dev->name, events);
+ 		}
+		if (i > max_interrupt_work) {
+			spin_lock(&np->lock);
+			/* disable interrupts on the nic */
+			writel(0, base + NvRegIrqMask);
+			pci_push(base);
+
+			if (!np->in_shutdown)
+				mod_timer(&np->nic_poll, jiffies + POLL_WAIT);
+			printk(KERN_DEBUG "%s: too many iterations (%d) in nic_irq.\n", dev->name, i);
+			spin_unlock(&np->lock);
+			break;
+		}
+
+	}
+	dprintk(KERN_DEBUG "%s: nic_irq completed\n", dev->name);
+
+	return IRQ_RETVAL(i);
+}
+
+static void do_nic_poll(unsigned long data)
+{
+	struct net_device *dev = (struct net_device *) data;
+	struct fe_priv *np = get_nvpriv(dev);
+	u8 *base = get_hwbase(dev);
+
+	disable_irq(dev->irq);
+	/*
+	 * reenable interrupts on the nic, we have to do this before calling
+	 * nic_irq because that may decide to do otherwise
+	 */
+	writel(np->irqmask, base + NvRegIrqMask);
+	pci_push(base);
+	nic_irq((int) 0, (void *) data, (struct pt_regs *) NULL);
+	enable_irq(dev->irq);
+}
+
+static int open(struct net_device *dev)
+{
+	struct fe_priv *np = get_nvpriv(dev);
+	u8 *base = get_hwbase(dev);
+	int ret, oom, i;
+
+	dprintk(KERN_DEBUG "forcedeth: open\n");
+
+	/* 1) erase previous misconfiguration */
+	/* 4.1-1: stop adapter: ignored, 4.3 seems to be overkill */
+	writel(NVREG_MCASTADDRA_FORCE, base + NvRegMulticastAddrA);
+	writel(0, base + NvRegMulticastAddrB);
+	writel(0, base + NvRegMulticastMaskA);
+	writel(0, base + NvRegMulticastMaskB);
+	writel(0, base + NvRegPacketFilterFlags);
+	writel(0, base + NvRegAdapterControl);
+	writel(0, base + NvRegLinkSpeed);
+	writel(0, base + NvRegUnknownTransmitterReg);
+	txrx_reset(dev);
+	writel(0, base + NvRegUnknownSetupReg6);
+
+	/* 2) initialize descriptor rings */
+	np->in_shutdown = 0;
+	oom = init_ring(dev);
+
+	/* 3) set mac address */
+	{
+		u32 mac[2];
+
+		mac[0] = (dev->dev_addr[0] <<  0) + (dev->dev_addr[1] <<  8) +
+				(dev->dev_addr[2] << 16) + (dev->dev_addr[3] << 24);
+		mac[1] = (dev->dev_addr[4] << 0) + (dev->dev_addr[5] << 8);
+
+		writel(mac[0], base + NvRegMacAddrA);
+		writel(mac[1], base + NvRegMacAddrB);
+	}
+
+	/* 4) continue setup */
+	np->linkspeed = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10;
+	np->duplex = 0;
+	writel(NVREG_UNKSETUP3_VAL1, base + NvRegUnknownSetupReg3);
+	writel(0, base + NvRegTxRxControl);
+	pci_push(base);
+	writel(NVREG_TXRXCTL_BIT1, base + NvRegTxRxControl);
+	reg_delay(dev, NvRegUnknownSetupReg5, NVREG_UNKSETUP5_BIT31, NVREG_UNKSETUP5_BIT31,
+			NV_SETUP5_DELAY, NV_SETUP5_DELAYMAX,
+			KERN_INFO "open: SetupReg5, Bit 31 remained off\n");
+	writel(0, base + NvRegUnknownSetupReg4);
+
+	/* 5) Find a suitable PHY */
+	writel(NVREG_MIISPEED_BIT8|NVREG_MIIDELAY, base + NvRegMIISpeed);
+	for (i = 1; i < 32; i++) {
+		int id1, id2;
+
+		id1 = mii_rw(dev, i, MII_PHYSID1, MII_READ);
+		if (id1 < 0)
+			continue;
+		id2 = mii_rw(dev, i, MII_PHYSID2, MII_READ);
+		if (id2 < 0)
+			continue;
+		dprintk(KERN_DEBUG "%s: open: Found PHY %04x:%04x at address %d.\n",
+				dev->name, id1, id2, i);
+		np->phyaddr = i;
+
+		update_linkspeed(dev);
+
+		break;
+	}
+	if (i == 32) {
+		printk(KERN_INFO "%s: open: failing due to lack of suitable PHY.\n",
+				dev->name);
+		ret = -EINVAL;
+		goto out_drain;
+	}
+
+	/* 6) continue setup */
+	writel(NVREG_MISC1_FORCE | ( np->duplex ? 0 : NVREG_MISC1_HD),
+				base + NvRegMisc1);
+	writel(readl(base + NvRegTransmitterStatus), base + NvRegTransmitterStatus);
+	writel(NVREG_PFF_ALWAYS, base + NvRegPacketFilterFlags);
+	writel(NVREG_OFFLOAD_NORMAL, base + NvRegOffloadConfig);
+
+	writel(readl(base + NvRegReceiverStatus), base + NvRegReceiverStatus);
+	get_random_bytes(&i, sizeof(i));
+	writel(NVREG_RNDSEED_FORCE | (i&NVREG_RNDSEED_MASK), base + NvRegRandomSeed);
+	writel(NVREG_UNKSETUP1_VAL, base + NvRegUnknownSetupReg1);
+	writel(NVREG_UNKSETUP2_VAL, base + NvRegUnknownSetupReg2);
+	writel(NVREG_UNKSETUP6_VAL, base + NvRegUnknownSetupReg6);
+	writel((np->phyaddr << NVREG_ADAPTCTL_PHYSHIFT)|NVREG_ADAPTCTL_PHYVALID,
+			base + NvRegAdapterControl);
+	writel(NVREG_UNKSETUP4_VAL, base + NvRegUnknownSetupReg4);
+	writel(NVREG_WAKEUPFLAGS_VAL, base + NvRegWakeUpFlags);
+
+	/* 7) start packet processing */
+	writel((u32) np->ring_addr, base + NvRegRxRingPhysAddr);
+	writel((u32) (np->ring_addr + RX_RING*sizeof(struct ring_desc)), base + NvRegTxRingPhysAddr);
+	writel( ((RX_RING-1) << NVREG_RINGSZ_RXSHIFT) + ((TX_RING-1) << NVREG_RINGSZ_TXSHIFT),
+			base + NvRegRingSizes);
+
+	i = readl(base + NvRegPowerState);
+	if ( (i & NVREG_POWERSTATE_POWEREDUP) == 0) {
+		writel(NVREG_POWERSTATE_POWEREDUP|i, base + NvRegPowerState);
+	}
+	pci_push(base);
+	udelay(10);
+	writel(readl(base + NvRegPowerState) | NVREG_POWERSTATE_VALID, base + NvRegPowerState);
+	writel(NVREG_ADAPTCTL_RUNNING, base + NvRegAdapterControl);
+
+
+	writel(0, base + NvRegIrqMask);
+	pci_push(base);
+	writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus);
+	pci_push(base);
+	writel(NVREG_MIISTAT_MASK2, base + NvRegMIIStatus);
+	writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus);
+	pci_push(base);
+
+	ret = request_irq(dev->irq, &nic_irq, SA_SHIRQ, dev->name, dev);
+	if (ret)
+		goto out_drain;
+
+	writel(np->irqmask, base + NvRegIrqMask);
+
+	spin_lock_irq(&np->lock);
+	writel(NVREG_MCASTADDRA_FORCE, base + NvRegMulticastAddrA);
+	writel(0, base + NvRegMulticastAddrB);
+	writel(0, base + NvRegMulticastMaskA);
+	writel(0, base + NvRegMulticastMaskB);
+	writel(NVREG_PFF_ALWAYS|NVREG_PFF_MYADDR, base + NvRegPacketFilterFlags);
+	start_rx(dev);
+	start_tx(dev);
+	netif_start_queue(dev);
+	if (oom)
+		mod_timer(&np->oom_kick, jiffies + OOM_REFILL);
+	if (!(mii_rw(dev, np->phyaddr, MII_BMSR, MII_READ) & BMSR_ANEGCOMPLETE)) {
+		printk("%s: no link during initialization.\n", dev->name);
+		netif_carrier_off(dev);
+	}
+
+	spin_unlock_irq(&np->lock);
+
+	return 0;
+out_drain:
+	drain_ring(dev);
+	return ret;
+}
+
+static int close(struct net_device *dev)
+{
+	struct fe_priv *np = get_nvpriv(dev);
+
+	spin_lock_irq(&np->lock);
+	np->in_shutdown = 1;
+	spin_unlock_irq(&np->lock);
+	synchronize_irq(dev->irq);
+
+	del_timer_sync(&np->oom_kick);
+	del_timer_sync(&np->nic_poll);
+
+	netif_stop_queue(dev);
+	spin_lock_irq(&np->lock);
+	stop_tx(dev);
+	stop_rx(dev);
+	spin_unlock_irq(&np->lock);
+
+	free_irq(dev->irq, dev);
+
+	drain_ring(dev);
+
+	/* FIXME: power down nic */
+
+	return 0;
+}
+
+static int __devinit probe_nic(struct pci_dev *pci_dev, const struct pci_device_id *id)
+{
+	struct net_device *dev;
+	struct fe_priv *np;
+	unsigned long addr;
+	u8 *base;
+	int err, i;
+
+	dev = alloc_etherdev(sizeof(struct fe_priv));
+	np = get_nvpriv(dev);
+	err = -ENOMEM;
+	if (!dev)
+		goto out;
+
+	np->pci_dev = pci_dev;
+	spin_lock_init(&np->lock);
+	SET_MODULE_OWNER(dev);
+	SET_NETDEV_DEV(dev, &pci_dev->dev);
+
+	init_timer(&np->oom_kick);
+	np->oom_kick.data = (unsigned long) dev;
+	np->oom_kick.function = &do_rx_refill;	/* timer handler */
+	init_timer(&np->nic_poll);
+	np->nic_poll.data = (unsigned long) dev;
+	np->nic_poll.function = &do_nic_poll;	/* timer handler */
+
+	err = pci_enable_device(pci_dev);
+	if (err) {
+		printk(KERN_INFO "forcedeth: pci_enable_dev failed: %d\n", err);
+		goto out_free;
+	}
+
+	pci_set_master(pci_dev);
+
+	err = pci_request_regions(pci_dev, dev->name);
+	if (err < 0)
+		goto out_disable;
+
+	err = -EINVAL;
+	addr = 0;
+	for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
+		dprintk(KERN_DEBUG "forcedeth: resource %d start %p len %ld flags 0x%08lx.\n",
+				i, (void*)pci_resource_start(pci_dev, i),
+				pci_resource_len(pci_dev, i),
+				pci_resource_flags(pci_dev, i));
+		if (pci_resource_flags(pci_dev, i) & IORESOURCE_MEM &&
+				pci_resource_len(pci_dev, i) >= NV_PCI_REGSZ) {
+			addr = pci_resource_start(pci_dev, i);
+			break;
+		}
+	}
+	if (i == DEVICE_COUNT_RESOURCE) {
+		printk(KERN_INFO "forcedeth: Couldn't find register window.\n");
+		goto out_relreg;
+	}
+
+	err = -ENOMEM;
+	dev->base_addr = (unsigned long) ioremap(addr, NV_PCI_REGSZ);
+	if (!dev->base_addr)
+		goto out_disable;
+	dev->irq = pci_dev->irq;
+	np->rx_ring = pci_alloc_consistent(pci_dev, sizeof(struct ring_desc) * (RX_RING + TX_RING),
+						&np->ring_addr);
+	if (!np->rx_ring)
+		goto out_unmap;
+	np->tx_ring = &np->rx_ring[RX_RING];
+
+	dev->open = open;
+	dev->stop = close;
+	dev->hard_start_xmit = start_xmit;
+	dev->get_stats = get_stats;
+	dev->change_mtu = change_mtu;
+	dev->set_multicast_list = set_multicast;
+	dev->do_ioctl = nic_ioctl;
+	dev->tx_timeout = tx_timeout;
+	dev->watchdog_timeo = NV_WATCHDOG_TIMEO;
+
+	pci_set_drvdata(pci_dev, dev);
+
+	err = register_netdev(dev);
+	if (err) {
+		printk(KERN_INFO "forcedeth: unable to register netdev: %d\n", err);
+		goto out_freering;
+	}
+
+	printk(KERN_INFO "%s: forcedeth.c: subsystem: %05x:%04x\n",
+			dev->name, pci_dev->subsystem_vendor, pci_dev->subsystem_device);
+
+
+	/* read the mac address */
+	base = get_hwbase(dev);
+	np->orig_mac[0] = readl(base + NvRegMacAddrA);
+	np->orig_mac[1] = readl(base + NvRegMacAddrB);
+
+	dev->dev_addr[0] = (np->orig_mac[1] >>  8) & 0xff;
+	dev->dev_addr[1] = (np->orig_mac[1] >>  0) & 0xff;
+	dev->dev_addr[2] = (np->orig_mac[0] >> 24) & 0xff;
+	dev->dev_addr[3] = (np->orig_mac[0] >> 16) & 0xff;
+	dev->dev_addr[4] = (np->orig_mac[0] >>  8) & 0xff;
+	dev->dev_addr[5] = (np->orig_mac[0] >>  0) & 0xff;
+
+	if (!is_valid_ether_addr(dev->dev_addr)) {
+		/*
+		 * Bad mac address. At least one bios sets the mac address
+		 * to 01:23:45:67:89:ab
+		 */
+		printk(KERN_ERR "%s: Invalid Mac address detected: %02x:%02x:%02x:%02x:%02x:%02x\n", dev->name,
+			dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
+			dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
+		printk(KERN_ERR "Please complain to your hardware vendor. Switching to a random MAC.\n");
+		dev->dev_addr[0] = 0x00;
+		dev->dev_addr[1] = 0x00;
+		dev->dev_addr[2] = 0x6c;
+		get_random_bytes(&dev->dev_addr[3], 3);
+	}
+
+	dprintk(KERN_DEBUG "%s: MAC Address %02x:%02x:%02x:%02x:%02x:%02x\n", dev->name,
+			dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
+			dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
+
+	np->tx_flags = cpu_to_le16(NV_TX_LASTPACKET|NV_TX_LASTPACKET1|NV_TX_VALID);
+	if (id->driver_data & DEV_NEED_LASTPACKET1)
+		np->tx_flags |= cpu_to_le16(NV_TX_LASTPACKET1);
+	if (id->driver_data & DEV_IRQMASK_1)
+		np->irqmask = NVREG_IRQMASK_WANTED_1;
+	if (id->driver_data & DEV_IRQMASK_2)
+		np->irqmask = NVREG_IRQMASK_WANTED_2;
+
+	return 0;
+
+out_freering:
+	pci_free_consistent(np->pci_dev, sizeof(struct ring_desc) * (RX_RING + TX_RING),
+				np->rx_ring, np->ring_addr);
+out_unmap:
+	iounmap(get_hwbase(dev));
+out_relreg:
+	pci_release_regions(pci_dev);
+out_disable:
+	pci_disable_device(pci_dev);
+out_free:
+	kfree(dev);
+	pci_set_drvdata(pci_dev, NULL);
+out:
+	return err;
+}
+
+static void __devexit remove_nic(struct pci_dev *pci_dev)
+{
+	struct net_device *dev = pci_get_drvdata(pci_dev);
+	struct fe_priv *np = get_nvpriv(dev);
+	u8 *base = get_hwbase(dev);
+
+	unregister_netdev(dev);
+
+	/* special op: write back the misordered MAC address - otherwise
+	 * the next probe_nic would see a wrong address.
+	 */
+	writel(np->orig_mac[0], base + NvRegMacAddrA);
+	writel(np->orig_mac[1], base + NvRegMacAddrB);
+
+	/* free all structures */
+	pci_free_consistent(np->pci_dev, sizeof(struct ring_desc) * (RX_RING + TX_RING), np->rx_ring, np->ring_addr);
+	iounmap(get_hwbase(dev));
+	pci_release_regions(pci_dev);
+	pci_disable_device(pci_dev);
+	kfree(dev);
+	pci_set_drvdata(pci_dev, NULL);
+}
+
+static struct pci_device_id pci_tbl[] = {
+	{	/* nForce Ethernet Controller */
+		.vendor = PCI_VENDOR_ID_NVIDIA,
+		.device = 0x1C3,
+		.subvendor = PCI_ANY_ID,
+		.subdevice = PCI_ANY_ID,
+		.driver_data = DEV_IRQMASK_1,
+	},
+	{	/* nForce2 Ethernet Controller */
+		.vendor = PCI_VENDOR_ID_NVIDIA,
+		.device = 0x0066,
+		.subvendor = PCI_ANY_ID,
+		.subdevice = PCI_ANY_ID,
+		.driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2,
+	},
+	{	/* nForce3 Ethernet Controller */
+		.vendor = PCI_VENDOR_ID_NVIDIA,
+		.device = 0x00D6,
+		.subvendor = PCI_ANY_ID,
+		.subdevice = PCI_ANY_ID,
+		.driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2,
+	},
+	{0,},
+};
+
+static struct pci_driver driver = {
+	.name = "forcedeth",
+	.id_table = pci_tbl,
+	.probe = probe_nic,
+	.remove = __devexit_p(remove_nic),
+};
+
+
+static int __init init_nic(void)
+{
+	printk(KERN_INFO "forcedeth.c: Reverse Engineered nForce ethernet driver. Version %s.\n", FORCEDETH_VERSION);
+	return pci_module_init(&driver);
+}
+
+static void __exit exit_nic(void)
+{
+	pci_unregister_driver(&driver);
+}
+
+MODULE_PARM(max_interrupt_work, "i");
+MODULE_PARM_DESC(max_interrupt_work, "forcedeth maximum events handled per interrupt");
+
+MODULE_AUTHOR("Manfred Spraul <manfred@colorfullife.com>");
+MODULE_DESCRIPTION("Reverse Engineered nForce ethernet driver");
+MODULE_LICENSE("GPL");
+
+MODULE_DEVICE_TABLE(pci, pci_tbl);
+
+module_init(init_nic);
+module_exit(exit_nic);
--- diff/drivers/net/kgdb_eth.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/net/kgdb_eth.c	2003-12-29 09:30:41.000000000 +0000
@@ -0,0 +1,517 @@
+/*
+ * Network interface GDB stub
+ *
+ * Written by San Mehat (nettwerk@biodome.org)
+ * Based upon 'gdbserial' by David Grothe (dave@gcom.com)
+ * and Scott Foehner (sfoehner@engr.sgi.com)
+ *
+ * Twiddled for 2.6 by Robert Walsh <rjwalsh@durables.org>
+ * and wangdi <wangdi@clusterfs.com>.
+ */
+
+#include <linux/module.h>
+#include <linux/errno.h>
+#include <linux/signal.h>
+#include <linux/sched.h>
+#include <linux/timer.h>
+#include <linux/interrupt.h>
+#include <linux/config.h>
+#include <linux/major.h>
+#include <linux/string.h>
+#include <linux/fcntl.h>
+#include <linux/termios.h>
+#include <asm/kgdb.h>
+#include <linux/if_ether.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/skbuff.h>
+#include <linux/delay.h>
+#include <net/tcp.h>
+#include <net/udp.h>
+
+#include <asm/system.h>
+#include <asm/io.h>
+#include <asm/segment.h>
+#include <asm/bitops.h>
+#include <asm/system.h>
+#include <asm/irq.h>
+#include <asm/atomic.h>
+
+#define	GDB_BUF_SIZE	512		/* power of 2, please */
+
+static char	kgdb_buf[GDB_BUF_SIZE] ;
+static int	kgdb_buf_in_inx ;
+static atomic_t	kgdb_buf_in_cnt ;
+static int	kgdb_buf_out_inx ;
+
+extern void	set_debug_traps(void) ;		/* GDB routine */
+extern void	breakpoint(void);
+
+unsigned int	kgdb_remoteip = 0;
+unsigned short	kgdb_listenport = 6443;
+unsigned short	kgdb_sendport= 6442;
+int		kgdb_eth = -1; /* Default tty mode */
+unsigned char	kgdb_remotemac[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
+unsigned char	kgdb_localmac[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
+volatile int	kgdb_eth_is_initializing = 0;
+int		kgdb_eth_need_breakpoint[NR_CPUS];
+
+struct net_device *kgdb_netdevice = NULL;
+
+/*
+ * Get a char if available, return -1 if nothing available.
+ * Empty the receive buffer first, then look at the interface hardware.
+ */
+static int
+read_char(void)
+{
+	/* intr routine has queued chars */
+	if (atomic_read(&kgdb_buf_in_cnt) != 0)
+	{
+		int chr;
+
+		chr = kgdb_buf[kgdb_buf_out_inx++] ;
+		kgdb_buf_out_inx &= (GDB_BUF_SIZE - 1) ;
+		atomic_dec(&kgdb_buf_in_cnt) ;
+		return chr;
+	}
+
+	return -1; /* no data */
+}
+
+/*
+ * Wait until the interface can accept a char, then write it.
+ */
+static void
+write_buffer(char *buf, int len)
+{
+	int			total_len, eth_len, ip_len, udp_len;
+	struct in_device	*in_dev;
+	struct sk_buff		*skb;
+	struct udphdr		*udph;
+	struct iphdr		*iph;
+	struct ethhdr		*eth;
+
+	if (!(in_dev = (struct in_device *) kgdb_netdevice->ip_ptr)) {
+		panic("No in_device available for interface!\n");
+	}
+
+	if (!(in_dev->ifa_list)) {
+		panic("No interface address set for interface!\n");
+	}
+
+	udp_len = len + sizeof(struct udphdr);
+	ip_len = eth_len = udp_len + sizeof(struct iphdr);
+	total_len = eth_len + ETH_HLEN;
+
+	if (!(skb = alloc_skb(total_len, GFP_ATOMIC))) {
+		return;
+	}
+
+	atomic_set(&skb->users, 1);
+	skb_reserve(skb, total_len - len);
+
+	memcpy(skb->data, (unsigned char *) buf, len);
+	skb->len += len;
+
+	udph = (struct udphdr *) skb_push(skb, sizeof(*udph));
+	udph->source = htons(kgdb_listenport);
+	udph->dest   = htons(kgdb_sendport);
+	udph->len    = htons(udp_len);
+	udph->check  = 0;
+
+	iph = (struct iphdr *)skb_push(skb, sizeof(*iph));
+	iph->version  = 4;
+	iph->ihl      = 5;
+	iph->tos      = 0;
+	iph->tot_len  = htons(ip_len);
+	iph->id       = 0;
+	iph->frag_off = 0;
+	iph->ttl      = 64;
+	iph->protocol = IPPROTO_UDP;
+	iph->check    = 0;
+	iph->saddr    = in_dev->ifa_list->ifa_address;
+	iph->daddr    = kgdb_remoteip;
+	iph->check    = ip_fast_csum((unsigned char *)iph, iph->ihl);
+
+	eth = (struct ethhdr *) skb_push(skb, ETH_HLEN);
+	eth->h_proto = htons(ETH_P_IP);
+	memcpy(eth->h_source, kgdb_localmac, kgdb_netdevice->addr_len);
+	memcpy(eth->h_dest, kgdb_remotemac, kgdb_netdevice->addr_len);
+
+repeat:
+	spin_lock(&kgdb_netdevice->xmit_lock);
+	kgdb_netdevice->xmit_lock_owner = smp_processor_id();
+
+	if (netif_queue_stopped(kgdb_netdevice)) {
+		kgdb_netdevice->xmit_lock_owner = -1;
+		spin_unlock(&kgdb_netdevice->xmit_lock);
+
+		kgdb_netdevice->poll_controller(kgdb_netdevice);
+		goto repeat;
+	}
+
+	kgdb_netdevice->hard_start_xmit(skb, kgdb_netdevice);
+	kgdb_netdevice->xmit_lock_owner = -1;
+	spin_unlock(&kgdb_netdevice->xmit_lock);
+}
+
+/*
+ * In the interrupt state the target machine will not respond to any
+ * arp requests, so handle them here.
+ */
+
+static struct sk_buff *send_skb = NULL;
+
+void
+kgdb_eth_reply_arp(void)
+{
+	if (send_skb) {
+		spin_lock(&kgdb_netdevice->xmit_lock);
+		kgdb_netdevice->xmit_lock_owner = smp_processor_id();
+	    	kgdb_netdevice->hard_start_xmit(send_skb, kgdb_netdevice);
+	    	kgdb_netdevice->xmit_lock_owner = -1;
+	    	spin_unlock(&kgdb_netdevice->xmit_lock);
+		send_skb = NULL;
+	}
+}
+
+static int
+make_arp_request(struct sk_buff *skb)
+{
+	struct arphdr *arp;
+	unsigned char *arp_ptr;
+	int type = ARPOP_REPLY;
+	int ptype = ETH_P_ARP;
+	u32 sip, tip;
+	unsigned char *sha, *tha;
+	struct in_device *in_dev = (struct in_device *) kgdb_netdevice->ip_ptr;
+
+	/* No arp on this interface */
+
+	if (kgdb_netdevice->flags & IFF_NOARP) {
+		return 0;
+	}
+
+	if (!pskb_may_pull(skb, (sizeof(struct arphdr) +
+				 (2 * kgdb_netdevice->addr_len) +
+				 (2 * sizeof(u32))))) {
+		return 0;
+	}
+
+	skb->h.raw = skb->nh.raw = skb->data;
+	arp = skb->nh.arph;
+
+	if ((arp->ar_hrd != htons(ARPHRD_ETHER) &&
+	     arp->ar_hrd != htons(ARPHRD_IEEE802)) ||
+	    arp->ar_pro != htons(ETH_P_IP)) {
+		return 0;
+	}
+
+	/* Understand only these message types */
+
+	if (arp->ar_op != htons(ARPOP_REQUEST)) {
+		return 0;
+	}
+
+	/* Extract fields */
+
+	arp_ptr= (unsigned char *)(arp+1);
+	sha = arp_ptr;
+	arp_ptr += kgdb_netdevice->addr_len;
+	memcpy(&sip, arp_ptr, 4);
+	arp_ptr += 4;
+	tha = arp_ptr;
+	arp_ptr += kgdb_netdevice->addr_len;
+	memcpy(&tip, arp_ptr, 4);
+
+	if (tip != in_dev->ifa_list->ifa_address) {
+		return 0;
+	}
+
+	if (kgdb_remoteip != sip) {
+		return 0;
+	}
+
+	/*
+	 * Check for bad requests for 127.x.x.x and requests for multicast
+	 * addresses.  If this is one such, delete it.
+	 */
+
+	if (LOOPBACK(tip) || MULTICAST(tip)) {
+		return 0;
+	}
+
+	/* reply to the ARP request */
+
+	send_skb = alloc_skb(sizeof(struct arphdr) + 2 * (kgdb_netdevice->addr_len + 4) + LL_RESERVED_SPACE(kgdb_netdevice), GFP_ATOMIC);
+
+	if (send_skb == NULL) {
+		return 0;
+	}
+
+	skb_reserve(send_skb, LL_RESERVED_SPACE(kgdb_netdevice));
+	send_skb->nh.raw = send_skb->data;
+	arp = (struct arphdr *) skb_put(send_skb, sizeof(struct arphdr) + 2 * (kgdb_netdevice->addr_len + 4));
+	send_skb->dev = kgdb_netdevice;
+	send_skb->protocol = htons(ETH_P_ARP);
+
+	/* Fill the device header for the ARP frame */
+
+	if (kgdb_netdevice->hard_header &&
+	    kgdb_netdevice->hard_header(send_skb, kgdb_netdevice, ptype,
+				       kgdb_remotemac, kgdb_localmac,
+				       send_skb->len) < 0) {
+		kfree_skb(send_skb);
+		return 0;
+	}
+
+	/*
+	 * Fill out the arp protocol part.
+	 *
+	 * we only support ethernet device type,
+	 * which (according to RFC 1390) should always equal 1 (Ethernet).
+	 */
+
+	arp->ar_hrd = htons(kgdb_netdevice->type);
+	arp->ar_pro = htons(ETH_P_IP);
+
+	arp->ar_hln = kgdb_netdevice->addr_len;
+	arp->ar_pln = 4;
+	arp->ar_op = htons(type);
+
+	arp_ptr=(unsigned char *)(arp + 1);
+
+	memcpy(arp_ptr, kgdb_netdevice->dev_addr, kgdb_netdevice->addr_len);
+	arp_ptr += kgdb_netdevice->addr_len;
+	memcpy(arp_ptr, &tip, 4);
+	arp_ptr += 4;
+	memcpy(arp_ptr, kgdb_localmac, kgdb_netdevice->addr_len);
+	arp_ptr += kgdb_netdevice->addr_len;
+	memcpy(arp_ptr, &sip, 4);
+	return 0;
+}
+
+
+/*
+ * Accept an skbuff from net_device layer and add the payload onto
+ * kgdb buffer
+ *
+ * When the kgdb stub routine getDebugChar() is called it draws characters
+ * out of the buffer until it is empty and then reads directly from the
+ * serial port.
+ *
+ * We do not attempt to write chars from the interrupt routine since
+ * the stubs do all of that via putDebugChar() which writes one byte
+ * after waiting for the interface to become ready.
+ *
+ * The debug stubs like to run with interrupts disabled since, after all,
+ * they run as a consequence of a breakpoint in the kernel.
+ *
+ * NOTE: Return value of 1 means it was for us and is an indication to
+ * the calling driver to destroy the sk_buff and not send it up the stack.
+ */
+int
+kgdb_net_interrupt(struct sk_buff *skb)
+{
+	unsigned char	chr;
+	struct iphdr	*iph = (struct iphdr*)skb->data;
+	struct udphdr	*udph= (struct udphdr*)(skb->data+(iph->ihl<<2));
+	unsigned char	*data = (unsigned char *) udph + sizeof(struct udphdr);
+	int		len;
+	int		i;
+
+	if ((kgdb_eth != -1) && (!kgdb_netdevice) &&
+	    (iph->protocol == IPPROTO_UDP) &&
+	    (be16_to_cpu(udph->dest) == kgdb_listenport)) {
+		kgdb_sendport = be16_to_cpu(udph->source);
+
+		while (kgdb_eth_is_initializing)
+			;
+		if (!kgdb_netdevice)
+			kgdb_eth_hook();
+		if (!kgdb_netdevice) {
+			/* Lets not even try again. */
+			kgdb_eth = -1;
+			return 0;
+		}
+	}
+	if (!kgdb_netdevice) {
+		return 0;
+	}
+	if (skb->protocol == __constant_htons(ETH_P_ARP) && !send_skb) {
+		make_arp_request(skb);
+		return 0;
+	}
+	if (iph->protocol != IPPROTO_UDP) {
+		return 0;
+	}
+
+	if (be16_to_cpu(udph->dest) != kgdb_listenport) {
+		return 0;
+	}
+
+	len = (be16_to_cpu(iph->tot_len) -
+	       (sizeof(struct udphdr) + sizeof(struct iphdr)));
+
+	for (i = 0; i < len; i++) {
+		chr = data[i];
+		if (chr == 3) {
+			kgdb_eth_need_breakpoint[smp_processor_id()] = 1;
+			continue;
+		}
+		if (atomic_read(&kgdb_buf_in_cnt) >= GDB_BUF_SIZE) {
+			/* buffer overflow, clear it */
+			kgdb_buf_in_inx = 0;
+			atomic_set(&kgdb_buf_in_cnt, 0);
+			kgdb_buf_out_inx = 0;
+			break;
+		}
+		kgdb_buf[kgdb_buf_in_inx++] = chr;
+		kgdb_buf_in_inx &= (GDB_BUF_SIZE - 1);
+		atomic_inc(&kgdb_buf_in_cnt);
+	}
+
+	if (!kgdb_netdevice->kgdb_is_trapped) {
+		/*
+		 * If a new gdb instance is trying to attach, we need to
+		 * break here.
+		 */
+		if (!strncmp(data, "$Hc-1#09", 8))
+			kgdb_eth_need_breakpoint[smp_processor_id()] = 1;
+	}
+	return 1;
+}
+EXPORT_SYMBOL(kgdb_net_interrupt);
+
+int
+kgdb_eth_hook(void)
+{
+	char kgdb_netdev[16];
+	extern void kgdb_respond_ok(void);
+
+	if (kgdb_remotemac[0] == 0xff) {
+		panic("ERROR! 'gdbeth_remotemac' option not set!\n");
+	}
+	if (kgdb_localmac[0] == 0xff) {
+		panic("ERROR! 'gdbeth_localmac' option not set!\n");
+	}
+	if (kgdb_remoteip == 0) {
+		panic("ERROR! 'gdbeth_remoteip' option not set!\n");
+	}
+
+	sprintf(kgdb_netdev,"eth%d",kgdb_eth);
+
+#ifdef CONFIG_SMP
+	if (num_online_cpus() > CONFIG_NO_KGDB_CPUS) {
+		printk("kgdb: too manu cpus. Cannot enable debugger with more than %d cpus\n", CONFIG_NO_KGDB_CPUS);
+		return -1;
+	}
+#endif
+	for (kgdb_netdevice = dev_base;
+		kgdb_netdevice != NULL;
+		kgdb_netdevice = kgdb_netdevice->next) {
+		if (strncmp(kgdb_netdevice->name, kgdb_netdev, IFNAMSIZ) == 0) {
+			break;
+		}
+	}
+	if (!kgdb_netdevice) {
+		printk("KGDB NET : Unable to find interface %s\n",kgdb_netdev);
+		return -ENODEV;
+	}
+
+	/*
+	 * Call GDB routine to setup the exception vectors for the debugger
+	 */
+	set_debug_traps();
+
+	/*
+	 * Call the breakpoint() routine in GDB to start the debugging
+	 * session.
+	 */
+	kgdb_eth_is_initializing = 1;
+	kgdb_eth_need_breakpoint[smp_processor_id()] = 1;
+	return 0;
+}
+
+/*
+ * getDebugChar
+ *
+ * This is a GDB stub routine.  It waits for a character from the
+ * serial interface and then returns it.  If there is no serial
+ * interface connection then it returns a bogus value which will
+ * almost certainly cause the system to hang.
+ */
+int
+eth_getDebugChar(void)
+{
+	volatile int	chr;
+
+	while ((chr = read_char()) < 0) {
+		if (send_skb) {
+			kgdb_eth_reply_arp();
+		}
+		if (kgdb_netdevice->poll_controller) {
+			kgdb_netdevice->poll_controller(kgdb_netdevice);
+		} else {
+			printk("KGDB NET: Error - Device %s is not supported!\n", kgdb_netdevice->name);
+			panic("Please add support for kgdb net to this driver");
+		}
+	}
+	return chr;
+}
+
+#define ETH_QUEUE_SIZE 256
+static char eth_queue[ETH_QUEUE_SIZE];
+static int outgoing_queue;
+
+void
+eth_flushDebugChar(void)
+{
+	if(outgoing_queue) {
+		write_buffer(eth_queue, outgoing_queue);
+
+		outgoing_queue = 0;
+	}
+}
+
+static void
+put_char_on_queue(int chr)
+{
+	eth_queue[outgoing_queue++] = chr;
+	if(outgoing_queue == ETH_QUEUE_SIZE)
+	{
+		eth_flushDebugChar();
+	}
+}
+
+/*
+ * eth_putDebugChar
+ *
+ * This is a GDB stub routine.  It waits until the interface is ready
+ * to transmit a char and then sends it.
+ */
+void
+eth_putDebugChar(int chr)
+{
+	put_char_on_queue(chr); /* this routine will wait */
+}
+
+void
+kgdb_eth_set_trapmode(int mode)
+{
+	if (!kgdb_netdevice) {
+		return;
+	}
+	kgdb_netdevice->kgdb_is_trapped = mode;
+}
+
+int
+kgdb_eth_is_trapped()
+{
+	if (!kgdb_netdevice) {
+		return 0;
+	}
+	return kgdb_netdevice->kgdb_is_trapped;
+}
+EXPORT_SYMBOL(kgdb_eth_is_trapped);
--- diff/drivers/pci/msi.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/pci/msi.c	2003-12-29 09:30:41.000000000 +0000
@@ -0,0 +1,1068 @@
+/*
+ * linux/drivers/pci/msi.c
+ */
+
+#include <linux/mm.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/config.h>
+#include <linux/ioport.h>
+#include <linux/smp_lock.h>
+#include <linux/pci.h>
+#include <linux/proc_fs.h>
+
+#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 <linux/pci_msi.h>
+
+_DEFINE_DBG_BUFFER
+
+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 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 };
+#endif
+
+static void msi_cache_ctor(void *p, kmem_cache_t *cache, unsigned long flags)
+{
+	memset(p, 0, NR_IRQS * sizeof(struct msi_desc));
+}
+
+static int msi_cache_init(void)
+{
+	msi_cachep = kmem_cache_create("msi_cache",
+			NR_IRQS * sizeof(struct msi_desc),
+		       	0, SLAB_HWCACHE_ALIGN, msi_cache_ctor, NULL);
+	if (!msi_cachep)
+		return -ENOMEM;
+
+	return 0;
+}
+
+static void msi_set_mask_bit(unsigned int vector, int flag)
+{
+	struct msi_desc *entry;
+
+	entry = (struct msi_desc *)msi_desc[vector];
+	if (!entry || !entry->dev || !entry->mask_base)
+		return;
+	switch (entry->msi_attrib.type) {
+	case PCI_CAP_ID_MSI:
+	{
+		int		pos;
+		unsigned int	mask_bits;
+
+		pos = entry->mask_base;
+	        entry->dev->bus->ops->read(entry->dev->bus, entry->dev->devfn,
+				pos, 4, &mask_bits);
+		mask_bits &= ~(1);
+		mask_bits |= flag;
+	        entry->dev->bus->ops->write(entry->dev->bus, entry->dev->devfn,
+				pos, 4, mask_bits);
+		break;
+	}
+	case PCI_CAP_ID_MSIX:
+	{
+		int offset = entry->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE +
+			PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET;
+		writel(flag, entry->mask_base + offset);
+		break;
+	}
+	default:
+		break;
+	}
+}
+
+#ifdef CONFIG_SMP
+static void set_msi_affinity(unsigned int vector, cpumask_t cpu_mask)
+{
+	struct msi_desc *entry;
+	struct msg_address address;
+	unsigned int dest_id;
+
+	entry = (struct msi_desc *)msi_desc[vector];
+	if (!entry || !entry->dev)
+		return;
+
+	switch (entry->msi_attrib.type) {
+	case PCI_CAP_ID_MSI:
+	{
+		int pos;
+
+   		if (!(pos = pci_find_capability(entry->dev, PCI_CAP_ID_MSI)))
+			return;
+
+	        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;
+		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,
+			address.lo_address.value);
+		break;
+	}
+	case PCI_CAP_ID_MSIX:
+	{
+		int offset = entry->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE +
+			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;
+		entry->msi_attrib.current_cpu = cpu_mask_to_apicid(cpu_mask);
+		writel(address.lo_address.value, entry->mask_base + offset);
+		break;
+	}
+	default:
+		break;
+	}
+}
+
+static inline void move_msi(int vector)
+{
+	if (!cpus_empty(pending_irq_balance_cpumask[vector])) {
+		set_msi_affinity(vector, pending_irq_balance_cpumask[vector]);
+		cpus_clear(pending_irq_balance_cpumask[vector]);
+	}
+}
+#endif
+
+static void mask_MSI_irq(unsigned int vector)
+{
+	msi_set_mask_bit(vector, 1);
+}
+
+static void unmask_MSI_irq(unsigned int vector)
+{
+	msi_set_mask_bit(vector, 0);
+}
+
+static unsigned int startup_msi_irq_wo_maskbit(unsigned int vector)
+{
+	return 0;	/* never anything pending */
+}
+
+static void pci_disable_msi(unsigned int vector);
+static void shutdown_msi_irq(unsigned int vector)
+{
+	pci_disable_msi(vector);
+}
+
+#define shutdown_msi_irq_wo_maskbit	shutdown_msi_irq
+static void enable_msi_irq_wo_maskbit(unsigned int vector) {}
+static void disable_msi_irq_wo_maskbit(unsigned int vector) {}
+static void ack_msi_irq_wo_maskbit(unsigned int vector) {}
+static void end_msi_irq_wo_maskbit(unsigned int vector)
+{
+	move_msi(vector);
+	ack_APIC_irq();
+}
+
+static unsigned int startup_msi_irq_w_maskbit(unsigned int vector)
+{
+	unmask_MSI_irq(vector);
+	return 0;	/* never anything pending */
+}
+
+#define shutdown_msi_irq_w_maskbit	shutdown_msi_irq
+#define enable_msi_irq_w_maskbit	unmask_MSI_irq
+#define disable_msi_irq_w_maskbit	mask_MSI_irq
+#define ack_msi_irq_w_maskbit		mask_MSI_irq
+
+static void end_msi_irq_w_maskbit(unsigned int vector)
+{
+	move_msi(vector);
+	unmask_MSI_irq(vector);
+	ack_APIC_irq();
+}
+
+/*
+ * Interrupt Type for MSI-X PCI/PCI-X/PCI-Express Devices,
+ * which implement the MSI-X Capability Structure.
+ */
+static struct hw_interrupt_type msix_irq_type = {
+	.typename	= "PCI MSI-X",
+	.startup	= startup_msi_irq_w_maskbit,
+	.shutdown	= shutdown_msi_irq_w_maskbit,
+	.enable		= enable_msi_irq_w_maskbit,
+	.disable	= disable_msi_irq_w_maskbit,
+	.ack		= ack_msi_irq_w_maskbit,
+	.end		= end_msi_irq_w_maskbit,
+	.set_affinity	= set_msi_irq_affinity
+};
+
+/*
+ * Interrupt Type for MSI PCI/PCI-X/PCI-Express Devices,
+ * which implement the MSI Capability Structure with
+ * Mask-and-Pending Bits.
+ */
+static struct hw_interrupt_type msi_irq_w_maskbit_type = {
+	.typename	= "PCI MSI",
+	.startup	= startup_msi_irq_w_maskbit,
+	.shutdown	= shutdown_msi_irq_w_maskbit,
+	.enable		= enable_msi_irq_w_maskbit,
+	.disable	= disable_msi_irq_w_maskbit,
+	.ack		= ack_msi_irq_w_maskbit,
+	.end		= end_msi_irq_w_maskbit,
+	.set_affinity	= set_msi_irq_affinity
+};
+
+/*
+ * Interrupt Type for MSI PCI/PCI-X/PCI-Express Devices,
+ * which implement the MSI Capability Structure without
+ * Mask-and-Pending Bits.
+ */
+static struct hw_interrupt_type msi_irq_wo_maskbit_type = {
+	.typename	= "PCI MSI",
+	.startup	= startup_msi_irq_wo_maskbit,
+	.shutdown	= shutdown_msi_irq_wo_maskbit,
+	.enable		= enable_msi_irq_wo_maskbit,
+	.disable	= disable_msi_irq_wo_maskbit,
+	.ack		= ack_msi_irq_wo_maskbit,
+	.end		= end_msi_irq_wo_maskbit,
+	.set_affinity	= set_msi_irq_affinity
+};
+
+static void msi_data_init(struct msg_data *msi_data,
+			  unsigned int vector)
+{
+	memset(msi_data, 0, sizeof(struct msg_data));
+	msi_data->vector = (u8)vector;
+	msi_data->delivery_mode = MSI_DELIVERY_MODE;
+	msi_data->level = MSI_LEVEL_MODE;
+	msi_data->trigger = MSI_TRIGGER_MODE;
+}
+
+static void msi_address_init(struct msg_address *msi_address)
+{
+	unsigned int	dest_id;
+
+	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;
+	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;
+}
+
+static int assign_msi_vector(void)
+{
+	static int new_vector_avail = 1;
+	int vector;
+	unsigned long flags;
+
+	/*
+	 * msi_lock is provided to ensure that successful allocation of MSI
+	 * 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) {
+		/*
+	 	 * vector_irq[] = -1 indicates that this specific vector is:
+	 	 * - assigned for MSI (since MSI have no associated IRQ) or
+	 	 * - assigned for legacy if less than 16, or
+	 	 * - having no corresponding 1:1 vector-to-IOxAPIC IRQ mapping
+	 	 * vector_irq[] = 0 indicates that this vector, previously
+		 * assigned for MSI, is freed by hotplug removed operations.
+		 * This vector will be reused for any subsequent hotplug added
+		 * operations.
+	 	 * vector_irq[] > 0 indicates that this vector is assigned for
+		 * IOxAPIC IRQs. This vector and its value provides a 1-to-1
+		 * vector-to-IOxAPIC IRQ mapping.
+	 	 */
+		for (vector = FIRST_DEVICE_VECTOR; vector < NR_IRQS; vector++) {
+			if (vector_irq[vector] != 0)
+				continue;
+			vector_irq[vector] = -1;
+			nr_released_vectors--;
+			spin_unlock_irqrestore(&msi_lock, flags);
+			return vector;
+		}
+		spin_unlock_irqrestore(&msi_lock, flags);
+		return -EBUSY;
+	}
+
+	vector = assign_irq_vector(MSI_AUTO);
+	if (vector  == (FIRST_SYSTEM_VECTOR - 8))
+		new_vector_avail = 0;
+
+	spin_unlock_irqrestore(&msi_lock, flags);
+	return vector;
+}
+
+static int get_new_vector(void)
+{
+	int vector;
+
+	if ((vector = assign_msi_vector()) > 0)
+		set_intr_gate(vector, interrupt[vector]);
+
+	return vector;
+}
+
+static int msi_init(void)
+{
+	static int status = -ENOMEM;
+
+	if (!status)
+		return status;
+
+	if ((status = msi_cache_init()) < 0) {
+		pci_msi_enable = 0;
+		printk(KERN_INFO "WARNING: MSI INIT FAILURE\n");
+		return status;
+	}
+	printk(KERN_INFO "MSI INIT SUCCESS\n");
+
+	return status;
+}
+
+static int get_msi_vector(struct pci_dev *dev)
+{
+	return get_new_vector();
+}
+
+static struct msi_desc* alloc_msi_entry(void)
+{
+	struct msi_desc *entry;
+
+	entry = (struct msi_desc*) kmem_cache_alloc(msi_cachep, SLAB_KERNEL);
+	if (!entry)
+		return NULL;
+
+	memset(entry, 0, sizeof(struct msi_desc));
+	entry->link.tail = entry->link.head = 0;	/* single message */
+	entry->dev = NULL;
+
+	return entry;
+}
+
+static void attach_msi_entry(struct msi_desc *entry, int vector)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&msi_lock, flags);
+	msi_desc[vector] = entry;
+	spin_unlock_irqrestore(&msi_lock, flags);
+}
+
+static void irq_handler_init(int cap_id, int pos, int mask)
+{
+	spin_lock(&irq_desc[pos].lock);
+	if (cap_id == PCI_CAP_ID_MSIX)
+		irq_desc[pos].handler = &msix_irq_type;
+	else {
+		if (!mask)
+			irq_desc[pos].handler = &msi_irq_wo_maskbit_type;
+		else
+			irq_desc[pos].handler = &msi_irq_w_maskbit_type;
+	}
+	spin_unlock(&irq_desc[pos].lock);
+}
+
+static void enable_msi_mode(struct pci_dev *dev, int pos, int type)
+{
+	u32 control;
+
+	dev->bus->ops->read(dev->bus, dev->devfn,
+		msi_control_reg(pos), 2, &control);
+	if (type == PCI_CAP_ID_MSI) {
+		/* Set enabled bits to single MSI & enable MSI_enable bit */
+		msi_enable(control, 1);
+	        dev->bus->ops->write(dev->bus, dev->devfn,
+			msi_control_reg(pos), 2, control);
+	} else {
+		msix_enable(control);
+	        dev->bus->ops->write(dev->bus, dev->devfn,
+			msi_control_reg(pos), 2, control);
+	}
+    	if (pci_find_capability(dev, PCI_CAP_ID_EXP)) {
+		/* PCI Express Endpoint device detected */
+		u32 cmd;
+	        dev->bus->ops->read(dev->bus, dev->devfn, PCI_COMMAND, 2, &cmd);
+		cmd |= PCI_COMMAND_INTX_DISABLE;
+	        dev->bus->ops->write(dev->bus, dev->devfn, PCI_COMMAND, 2, cmd);
+	}
+}
+
+static void disable_msi_mode(struct pci_dev *dev, int pos, int type)
+{
+	u32 control;
+
+	dev->bus->ops->read(dev->bus, dev->devfn,
+		msi_control_reg(pos), 2, &control);
+	if (type == PCI_CAP_ID_MSI) {
+		/* Set enabled bits to single MSI & enable MSI_enable bit */
+		msi_disable(control);
+	        dev->bus->ops->write(dev->bus, dev->devfn,
+			msi_control_reg(pos), 2, control);
+	} else {
+		msix_disable(control);
+	        dev->bus->ops->write(dev->bus, dev->devfn,
+			msi_control_reg(pos), 2, control);
+	}
+    	if (pci_find_capability(dev, PCI_CAP_ID_EXP)) {
+		/* PCI Express Endpoint device detected */
+		u32 cmd;
+	        dev->bus->ops->read(dev->bus, dev->devfn, PCI_COMMAND, 2, &cmd);
+		cmd &= ~PCI_COMMAND_INTX_DISABLE;
+	        dev->bus->ops->write(dev->bus, dev->devfn, PCI_COMMAND, 2, cmd);
+	}
+}
+
+static int msi_lookup_vector(struct pci_dev *dev)
+{
+	int vector;
+	unsigned long flags;
+
+	spin_lock_irqsave(&msi_lock, flags);
+	for (vector = FIRST_DEVICE_VECTOR; vector < NR_IRQS; vector++) {
+		if (!msi_desc[vector] || msi_desc[vector]->dev != dev ||
+			msi_desc[vector]->msi_attrib.entry_nr ||
+			msi_desc[vector]->msi_attrib.default_vector != dev->irq)
+			continue;	/* not entry 0, skip */
+		spin_unlock_irqrestore(&msi_lock, flags);
+		/* This pre-assigned entry-0 MSI vector for this device
+		   already exits. Override dev->irq with this vector */
+		dev->irq = vector;
+		return 0;
+	}
+	spin_unlock_irqrestore(&msi_lock, flags);
+
+	return -EACCES;
+}
+
+void pci_scan_msi_device(struct pci_dev *dev)
+{
+	if (!dev)
+		return;
+
+   	if (pci_find_capability(dev, PCI_CAP_ID_MSIX) > 0) {
+		nr_reserved_vectors++;
+		nr_msix_devices++;
+	} else if (pci_find_capability(dev, PCI_CAP_ID_MSI) > 0)
+		nr_reserved_vectors++;
+}
+
+/**
+ * msi_capability_init - configure device's MSI capability structure
+ * @dev: pointer to the pci_dev data structure of MSI device function
+ *
+ * Setup the MSI capability structure of device funtion with a single
+ * MSI vector, regardless of device function is capable of handling
+ * multiple messages. A return of zero indicates the successful setup
+ * of an entry zero with the new MSI vector or non-zero for otherwise.
+ **/
+static int msi_capability_init(struct pci_dev *dev)
+{
+	struct msi_desc *entry;
+	struct msg_address address;
+	struct msg_data data;
+	int pos, vector;
+	u32 control;
+
+   	pos = pci_find_capability(dev, PCI_CAP_ID_MSI);
+	if (!pos)
+		return -EINVAL;
+
+	dev->bus->ops->read(dev->bus, dev->devfn, msi_control_reg(pos),
+		2, &control);
+	if (control & PCI_MSI_FLAGS_ENABLE)
+		return 0;
+
+	if (!msi_lookup_vector(dev)) {
+		/* Lookup Sucess */
+		enable_msi_mode(dev, pos, PCI_CAP_ID_MSI);
+		return 0;
+	}
+	/* MSI Entry Initialization */
+	if (!(entry = alloc_msi_entry()))
+		return -ENOMEM;
+
+	if ((vector = get_msi_vector(dev)) < 0) {
+		kmem_cache_free(msi_cachep, entry);
+		return -EBUSY;
+	}
+	entry->msi_attrib.type = PCI_CAP_ID_MSI;
+	entry->msi_attrib.entry_nr = 0;
+	entry->msi_attrib.maskbit = is_mask_bit_support(control);
+	entry->msi_attrib.default_vector = dev->irq;
+	dev->irq = vector;	/* save default pre-assigned ioapic vector */
+	entry->dev = dev;
+	if (is_mask_bit_support(control)) {
+		entry->mask_base = msi_mask_bits_reg(pos,
+				is_64bit_address(control));
+	}
+	/* Replace with MSI handler */
+	irq_handler_init(PCI_CAP_ID_MSI, vector, entry->msi_attrib.maskbit);
+	/* Configure MSI capability structure */
+	msi_address_init(&address);
+	msi_data_init(&data, vector);
+	entry->msi_attrib.current_cpu = ((address.lo_address.u.dest_id >>
+				MSI_TARGET_CPU_SHIFT) & MSI_TARGET_CPU_MASK);
+	dev->bus->ops->write(dev->bus, dev->devfn, msi_lower_address_reg(pos),
+				4, address.lo_address.value);
+	if (is_64bit_address(control)) {
+		dev->bus->ops->write(dev->bus, dev->devfn,
+			msi_upper_address_reg(pos), 4, address.hi_address);
+		dev->bus->ops->write(dev->bus, dev->devfn,
+			msi_data_reg(pos, 1), 2, *((u32*)&data));
+	} else
+		dev->bus->ops->write(dev->bus, dev->devfn,
+			msi_data_reg(pos, 0), 2, *((u32*)&data));
+	if (entry->msi_attrib.maskbit) {
+		unsigned int maskbits, temp;
+		/* All MSIs are unmasked by default, Mask them all */
+	        dev->bus->ops->read(dev->bus, dev->devfn,
+			msi_mask_bits_reg(pos, is_64bit_address(control)), 4,
+			&maskbits);
+		temp = (1 << multi_msi_capable(control));
+		temp = ((temp - 1) & ~temp);
+		maskbits |= temp;
+		dev->bus->ops->write(dev->bus, dev->devfn,
+			msi_mask_bits_reg(pos, is_64bit_address(control)), 4,
+			maskbits);
+	}
+	attach_msi_entry(entry, vector);
+	/* Set MSI enabled bits	 */
+	enable_msi_mode(dev, pos, PCI_CAP_ID_MSI);
+
+	return 0;
+}
+
+/**
+ * msix_capability_init - configure device's MSI-X capability
+ * @dev: pointer to the pci_dev data structure of MSI-X device function
+ *
+ * Setup the MSI-X capability structure of device funtion with a
+ * single MSI-X vector. A return of zero indicates the successful setup
+ * of an entry zero with the new MSI-X vector or non-zero for otherwise.
+ * To request for additional MSI-X vectors, the device drivers are
+ * required to utilize the following supported APIs:
+ * 1) msi_alloc_vectors(...) for requesting one or more MSI-X vectors
+ * 2) msi_free_vectors(...) for releasing one or more MSI-X vectors
+ *    back to PCI subsystem before calling free_irq(...)
+ **/
+static int msix_capability_init(struct pci_dev	*dev)
+{
+	struct msi_desc *entry;
+	struct msg_address address;
+	struct msg_data data;
+	int vector = 0, pos, dev_msi_cap;
+	u32 phys_addr, table_offset;
+	u32 control;
+	u8 bir;
+	void *base;
+
+   	pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
+	if (!pos)
+		return -EINVAL;
+
+	/* Request & Map MSI-X table region */
+	dev->bus->ops->read(dev->bus, dev->devfn, msi_control_reg(pos), 2,
+		&control);
+	if (control & PCI_MSIX_FLAGS_ENABLE)
+		return 0;
+
+	if (!msi_lookup_vector(dev)) {
+		/* Lookup Sucess */
+		enable_msi_mode(dev, pos, PCI_CAP_ID_MSIX);
+		return 0;
+	}
+
+	dev_msi_cap = multi_msix_capable(control);
+	dev->bus->ops->read(dev->bus, dev->devfn,
+		msix_table_offset_reg(pos), 4, &table_offset);
+	bir = (u8)(table_offset & PCI_MSIX_FLAGS_BIRMASK);
+	phys_addr = pci_resource_start (dev, bir);
+	phys_addr += (u32)(table_offset & ~PCI_MSIX_FLAGS_BIRMASK);
+	if (!request_mem_region(phys_addr,
+		dev_msi_cap * PCI_MSIX_ENTRY_SIZE,
+		"MSI-X iomap Failure"))
+		return -ENOMEM;
+	base = ioremap_nocache(phys_addr, dev_msi_cap * PCI_MSIX_ENTRY_SIZE);
+	if (base == NULL)
+		goto free_region;
+	/* MSI Entry Initialization */
+	entry = alloc_msi_entry();
+	if (!entry)
+		goto free_iomap;
+	if ((vector = get_msi_vector(dev)) < 0)
+		goto free_entry;
+
+	entry->msi_attrib.type = PCI_CAP_ID_MSIX;
+	entry->msi_attrib.entry_nr = 0;
+	entry->msi_attrib.maskbit = 1;
+	entry->msi_attrib.default_vector = dev->irq;
+	dev->irq = vector;	/* save default pre-assigned ioapic vector */
+	entry->dev = dev;
+	entry->mask_base = (unsigned long)base;
+	/* Replace with MSI handler */
+	irq_handler_init(PCI_CAP_ID_MSIX, vector, 1);
+	/* Configure MSI-X capability structure */
+	msi_address_init(&address);
+	msi_data_init(&data, vector);
+	entry->msi_attrib.current_cpu = ((address.lo_address.u.dest_id >>
+				MSI_TARGET_CPU_SHIFT) & MSI_TARGET_CPU_MASK);
+	writel(address.lo_address.value, base + PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET);
+	writel(address.hi_address, base + PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET);
+	writel(*(u32*)&data, base + PCI_MSIX_ENTRY_DATA_OFFSET);
+	/* Initialize all entries from 1 up to 0 */
+	for (pos = 1; pos < dev_msi_cap; pos++) {
+		writel(0, base + pos * PCI_MSIX_ENTRY_SIZE +
+			PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET);
+		writel(0, base + pos * PCI_MSIX_ENTRY_SIZE +
+			PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET);
+		writel(0, base + pos * PCI_MSIX_ENTRY_SIZE +
+			PCI_MSIX_ENTRY_DATA_OFFSET);
+	}
+	attach_msi_entry(entry, vector);
+	/* Set MSI enabled bits	 */
+	enable_msi_mode(dev, pos, PCI_CAP_ID_MSIX);
+
+	return 0;
+
+free_entry:
+	kmem_cache_free(msi_cachep, entry);
+free_iomap:
+	iounmap(base);
+free_region:
+	release_mem_region(phys_addr, dev_msi_cap * PCI_MSIX_ENTRY_SIZE);
+
+	return ((vector < 0) ? -EBUSY : -ENOMEM);
+}
+
+/**
+ * pci_enable_msi - configure device's MSI(X) capability structure
+ * @dev: pointer to the pci_dev data structure of MSI(X) device function
+ *
+ * Setup the MSI/MSI-X capability structure of device function with
+ * a single MSI(X) vector upon its software driver call to request for
+ * MSI(X) mode enabled on its hardware device function. A return of zero
+ * indicates the successful setup of an entry zero with the new MSI(X)
+ * vector or non-zero for otherwise.
+ **/
+int pci_enable_msi(struct pci_dev* dev)
+{
+	int status = -EINVAL;
+
+	if (!pci_msi_enable || !dev)
+ 		return status;
+
+	if (msi_init() < 0)
+		return -ENOMEM;
+
+	if ((status = msix_capability_init(dev)) == -EINVAL)
+		status = msi_capability_init(dev);
+	if (!status)
+		nr_reserved_vectors--;
+
+	return status;
+}
+
+static int msi_free_vector(struct pci_dev* dev, int vector);
+static void pci_disable_msi(unsigned int vector)
+{
+	int head, tail, type, default_vector;
+	struct msi_desc *entry;
+	struct pci_dev *dev;
+	unsigned long flags;
+
+	spin_lock_irqsave(&msi_lock, flags);
+	entry = msi_desc[vector];
+	if (!entry || !entry->dev) {
+		spin_unlock_irqrestore(&msi_lock, flags);
+		return;
+	}
+	dev = entry->dev;
+	type = entry->msi_attrib.type;
+	head = entry->link.head;
+	tail = entry->link.tail;
+	default_vector = entry->msi_attrib.default_vector;
+	spin_unlock_irqrestore(&msi_lock, flags);
+
+	disable_msi_mode(dev, pci_find_capability(dev, type), type);
+	/* Restore dev->irq to its default pin-assertion vector */
+	dev->irq = default_vector;
+	if (type == PCI_CAP_ID_MSIX && head != tail) {
+		/* Bad driver, which do not call msi_free_vectors before exit.
+		   We must do a cleanup here */
+		while (1) {
+			spin_lock_irqsave(&msi_lock, flags);
+			entry = msi_desc[vector];
+			head = entry->link.head;
+			tail = entry->link.tail;
+			spin_unlock_irqrestore(&msi_lock, flags);
+			if (tail == head)
+				break;
+			if (msi_free_vector(dev, entry->link.tail))
+				break;
+		}
+	}
+}
+
+static int msi_alloc_vector(struct pci_dev* dev, int head)
+{
+	struct msi_desc *entry;
+	struct msg_address address;
+	struct msg_data data;
+	int i, offset, pos, dev_msi_cap, vector;
+	u32 low_address, control;
+	unsigned long base = 0L;
+	unsigned long flags;
+
+	spin_lock_irqsave(&msi_lock, flags);
+	entry = msi_desc[dev->irq];
+	if (!entry) {
+		spin_unlock_irqrestore(&msi_lock, flags);
+		return -EINVAL;
+	}
+	base = entry->mask_base;
+	spin_unlock_irqrestore(&msi_lock, flags);
+
+   	pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
+	dev->bus->ops->read(dev->bus, dev->devfn, msi_control_reg(pos),
+		2, &control);
+	dev_msi_cap = multi_msix_capable(control);
+	for (i = 1; i < dev_msi_cap; i++) {
+		if (!(low_address = readl(base + i * PCI_MSIX_ENTRY_SIZE)))
+			 break;
+	}
+	if (i >= dev_msi_cap)
+		return -EINVAL;
+
+	/* MSI Entry Initialization */
+	if (!(entry = alloc_msi_entry()))
+		return -ENOMEM;
+
+	if ((vector = get_new_vector()) < 0) {
+		kmem_cache_free(msi_cachep, entry);
+		return vector;
+	}
+	entry->msi_attrib.type = PCI_CAP_ID_MSIX;
+	entry->msi_attrib.entry_nr = i;
+	entry->msi_attrib.maskbit = 1;
+	entry->dev = dev;
+	entry->link.head = head;
+	entry->mask_base = base;
+	irq_handler_init(PCI_CAP_ID_MSIX, vector, 1);
+	/* Configure MSI-X capability structure */
+	msi_address_init(&address);
+	msi_data_init(&data, vector);
+	entry->msi_attrib.current_cpu = ((address.lo_address.u.dest_id >>
+				MSI_TARGET_CPU_SHIFT) & MSI_TARGET_CPU_MASK);
+	offset = entry->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE;
+	writel(address.lo_address.value, base + offset +
+		PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET);
+	writel(address.hi_address, base + offset +
+		PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET);
+	writel(*(u32*)&data, base + offset + PCI_MSIX_ENTRY_DATA_OFFSET);
+	writel(1, base + offset + PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET);
+	attach_msi_entry(entry, vector);
+
+	return vector;
+}
+
+static int msi_free_vector(struct pci_dev* dev, int vector)
+{
+	struct msi_desc *entry;
+	int entry_nr, type;
+	unsigned long base = 0L;
+	unsigned long flags;
+
+	spin_lock_irqsave(&msi_lock, flags);
+	entry = msi_desc[vector];
+	if (!entry || entry->dev != dev) {
+		spin_unlock_irqrestore(&msi_lock, flags);
+		return -EINVAL;
+	}
+	type = entry->msi_attrib.type;
+	entry_nr = entry->msi_attrib.entry_nr;
+	base = entry->mask_base;
+	if (entry->link.tail != entry->link.head) {
+		msi_desc[entry->link.head]->link.tail = entry->link.tail;
+		if (entry->link.tail)
+			msi_desc[entry->link.tail]->link.head = entry->link.head;
+	}
+	entry->dev = NULL;
+	vector_irq[vector] = 0;
+	nr_released_vectors++;
+	msi_desc[vector] = NULL;
+	spin_unlock_irqrestore(&msi_lock, flags);
+
+	kmem_cache_free(msi_cachep, entry);
+	if (type == PCI_CAP_ID_MSIX) {
+		int offset;
+
+		offset = entry_nr * PCI_MSIX_ENTRY_SIZE;
+		writel(1, base + offset + PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET);
+		writel(0, base + offset + PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET);
+	}
+
+	return 0;
+}
+
+/**
+ * msi_alloc_vectors - allocate additional MSI-X vectors
+ * @dev: pointer to the pci_dev data structure of MSI-X device function
+ * @vector: pointer to an array of new allocated MSI-X vectors
+ * @nvec: number of MSI-X vectors requested for allocation by device driver
+ *
+ * Allocate additional MSI-X vectors requested by device driver. A
+ * return of zero indicates the successful setup of MSI-X capability
+ * structure with new allocated MSI-X vectors or non-zero for otherwise.
+ **/
+int msi_alloc_vectors(struct pci_dev* dev, int *vector, int nvec)
+{
+	struct msi_desc *entry;
+	int i, head, pos, vec, free_vectors, alloc_vectors;
+	int *vectors = (int *)vector;
+	u32 control;
+	unsigned long flags;
+
+	if (!pci_msi_enable || !dev)
+ 		return -EINVAL;
+
+   	if (!(pos = pci_find_capability(dev, PCI_CAP_ID_MSIX)))
+ 		return -EINVAL;
+
+	dev->bus->ops->read(dev->bus, dev->devfn, msi_control_reg(pos), 			2, &control);
+	if (nvec > multi_msix_capable(control))
+		return -EINVAL;
+
+	spin_lock_irqsave(&msi_lock, flags);
+	entry = msi_desc[dev->irq];
+	if (!entry || entry->dev != dev ||		/* legal call */
+	   entry->msi_attrib.type != PCI_CAP_ID_MSIX || /* must be MSI-X */
+	   entry->link.head != entry->link.tail) {	/* already multi */
+		spin_unlock_irqrestore(&msi_lock, flags);
+		return -EINVAL;
+	}
+	/*
+	 * msi_lock is provided to ensure that enough vectors resources are
+	 * available before granting.
+	 */
+	free_vectors = pci_vector_resources();
+	/* Ensure that each MSI/MSI-X device has one vector reserved by
+	   default to avoid any MSI-X driver to take all available
+ 	   resources */
+	free_vectors -= nr_reserved_vectors;
+	/* Find the average of free vectors among MSI-X devices */
+	if (nr_msix_devices > 0)
+		free_vectors /= nr_msix_devices;
+	spin_unlock_irqrestore(&msi_lock, flags);
+
+	if (nvec > free_vectors)
+		return -EBUSY;
+
+	alloc_vectors = 0;
+	head = dev->irq;
+	for (i = 0; i < nvec; i++) {
+		if ((vec = msi_alloc_vector(dev, head)) < 0)
+			break;
+		*(vectors + i) = vec;
+		head = vec;
+		alloc_vectors++;
+	}
+	if (alloc_vectors != nvec) {
+		for (i = 0; i < alloc_vectors; i++) {
+			vec = *(vectors + i);
+			msi_free_vector(dev, vec);
+		}
+		spin_lock_irqsave(&msi_lock, flags);
+		msi_desc[dev->irq]->link.tail = msi_desc[dev->irq]->link.head;
+		spin_unlock_irqrestore(&msi_lock, flags);
+		return -EBUSY;
+	}
+	if (nr_msix_devices > 0)
+		nr_msix_devices--;
+
+	return 0;
+}
+
+/**
+ * msi_free_vectors - reclaim MSI-X vectors to unused state
+ * @dev: pointer to the pci_dev data structure of MSI-X device function
+ * @vector: pointer to an array of released MSI-X vectors
+ * @nvec: number of MSI-X vectors requested for release by device driver
+ *
+ * Reclaim MSI-X vectors released by device driver to unused state,
+ * which may be used later on. A return of zero indicates the
+ * success or non-zero for otherwise. Device driver should call this
+ * before calling function free_irq.
+ **/
+int msi_free_vectors(struct pci_dev* dev, int *vector, int nvec)
+{
+	struct msi_desc *entry;
+	int i;
+	unsigned long flags;
+
+	if (!pci_msi_enable)
+ 		return -EINVAL;
+
+	spin_lock_irqsave(&msi_lock, flags);
+	entry = msi_desc[dev->irq];
+	if (!entry || entry->dev != dev ||
+	   	entry->msi_attrib.type != PCI_CAP_ID_MSIX ||
+		entry->link.head == entry->link.tail) {	/* Nothing to free */
+		spin_unlock_irqrestore(&msi_lock, flags);
+		return -EINVAL;
+	}
+	spin_unlock_irqrestore(&msi_lock, flags);
+
+	for (i = 0; i < nvec; i++) {
+		if (*(vector + i) == dev->irq)
+			continue;/* Don't free entry 0 if mistaken by driver */
+		msi_free_vector(dev, *(vector + i));
+	}
+
+	return 0;
+}
+
+/**
+ * msi_remove_pci_irq_vectors - reclaim MSI(X) vectors to unused state
+ * @dev: pointer to the pci_dev data structure of MSI(X) device function
+ *
+ * Being called during hotplug remove, from which the device funciton
+ * is hot-removed. All previous assigned MSI/MSI-X vectors, if
+ * allocated for this device function, are reclaimed to unused state,
+ * which may be used later on.
+ **/
+void msi_remove_pci_irq_vectors(struct pci_dev* dev)
+{
+	struct msi_desc *entry;
+	int type, temp;
+	unsigned long flags;
+
+	if (!pci_msi_enable || !dev)
+ 		return;
+
+   	if (!pci_find_capability(dev, PCI_CAP_ID_MSI)) {
+   		if (!pci_find_capability(dev, PCI_CAP_ID_MSIX))
+			return;
+	}
+	temp = dev->irq;
+	if (msi_lookup_vector(dev))
+		return;
+
+	spin_lock_irqsave(&msi_lock, flags);
+	entry = msi_desc[dev->irq];
+	if (!entry || entry->dev != dev) {
+		spin_unlock_irqrestore(&msi_lock, flags);
+		return;
+	}
+	type = entry->msi_attrib.type;
+	spin_unlock_irqrestore(&msi_lock, flags);
+
+	msi_free_vector(dev, dev->irq);
+	if (type == PCI_CAP_ID_MSIX) {
+		int i, pos, dev_msi_cap;
+		u32 phys_addr, table_offset;
+		u32 control;
+		u8 bir;
+
+   		pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
+		dev->bus->ops->read(dev->bus, dev->devfn, msi_control_reg(pos), 			2, &control);
+		dev_msi_cap = multi_msix_capable(control);
+		dev->bus->ops->read(dev->bus, dev->devfn,
+			msix_table_offset_reg(pos), 4, &table_offset);
+		bir = (u8)(table_offset & PCI_MSIX_FLAGS_BIRMASK);
+		phys_addr = pci_resource_start (dev, bir);
+		phys_addr += (u32)(table_offset & ~PCI_MSIX_FLAGS_BIRMASK);
+		for (i = FIRST_DEVICE_VECTOR; i < NR_IRQS; i++) {
+			spin_lock_irqsave(&msi_lock, flags);
+			if (!msi_desc[i] || msi_desc[i]->dev != dev) {
+				spin_unlock_irqrestore(&msi_lock, flags);
+				continue;
+			}
+			spin_unlock_irqrestore(&msi_lock, flags);
+			msi_free_vector(dev, i);
+		}
+		writel(1, entry->mask_base + PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET);
+		iounmap((void*)entry->mask_base);
+		release_mem_region(phys_addr, dev_msi_cap * PCI_MSIX_ENTRY_SIZE);
+	}
+	dev->irq = temp;
+	nr_reserved_vectors++;
+}
+
+EXPORT_SYMBOL(pci_enable_msi);
+EXPORT_SYMBOL(msi_alloc_vectors);
+EXPORT_SYMBOL(msi_free_vectors);
--- diff/drivers/pnp/isapnp/Kconfig	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/pnp/isapnp/Kconfig	2003-12-29 09:30:41.000000000 +0000
@@ -0,0 +1,11 @@
+#
+# ISA Plug and Play configuration
+#
+config ISAPNP
+	bool "ISA Plug and Play support (EXPERIMENTAL)"
+	depends on PNP && EXPERIMENTAL
+	help
+	  Say Y here if you would like support for ISA Plug and Play devices.
+	  Some information is in <file:Documentation/isapnp.txt>.
+
+	  If unsure, say Y.
--- diff/drivers/pnp/pnpbios/Kconfig	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/pnp/pnpbios/Kconfig	2003-12-29 09:30:41.000000000 +0000
@@ -0,0 +1,41 @@
+#
+# Plug and Play BIOS configuration
+#
+config PNPBIOS
+	bool "Plug and Play BIOS support (EXPERIMENTAL)"
+	depends on PNP && EXPERIMENTAL
+	---help---
+	  Linux uses the PNPBIOS as defined in "Plug and Play BIOS
+	  Specification Version 1.0A May 5, 1994" to autodetect built-in
+	  mainboard resources (e.g. parallel port resources).
+
+	  Some features (e.g. event notification, docking station information,
+	  ISAPNP services) are not currently implemented.
+
+	  If you would like the kernel to detect and allocate resources to
+	  your mainboard devices (on some systems they are disabled by the
+	  BIOS) say Y here.  Also the PNPBIOS can help prevent resource
+	  conflicts between mainboard devices and other bus devices.
+
+	  Note: ACPI is expected to supersede PNPBIOS some day, currently it
+	  co-exists nicely.  If you have a non-ISA system that supports ACPI,
+	  you probably don't need PNPBIOS support.
+
+config PNPBIOS_PROC_FS
+	bool "Plug and Play BIOS /proc interface"
+	depends on PNPBIOS && PROC_FS
+	---help---
+	  If you say Y here and to "/proc file system support", you will be
+	  able to directly access the PNPBIOS.  This includes resource
+	  allocation, ESCD, and other PNPBIOS services.  Using this
+	  interface is potentially dangerous because the PNPBIOS driver will
+	  not be notified of any resource changes made by writting directly.
+	  Also some buggy systems will fault when accessing certain features
+	  in the PNPBIOS /proc interface (e.g. ESCD).
+
+	  See the latest pcmcia-cs (stand-alone package) for a nice set of
+	  PNPBIOS /proc interface tools (lspnp and setpnp).
+
+	  Unless you are debugging or have other specific reasons, it is
+	  recommended that you say N here.
+
--- diff/include/asm-alpha/cpumask.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-alpha/cpumask.h	2003-12-29 09:30:41.000000000 +0000
@@ -0,0 +1,6 @@
+#ifndef _ASM_ALPHA_CPUMASK_H
+#define _ASM_ALPHA_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_ALPHA_CPUMASK_H */
--- diff/include/asm-alpha/lockmeter.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-alpha/lockmeter.h	2003-12-29 09:30:41.000000000 +0000
@@ -0,0 +1,90 @@
+/*
+ *  Written by John Hawkes (hawkes@sgi.com)
+ *  Based on klstat.h by Jack Steiner (steiner@sgi.com)
+ *
+ *  Modified by Peter Rival (frival@zk3.dec.com)
+ */
+
+#ifndef _ALPHA_LOCKMETER_H
+#define _ALPHA_LOCKMETER_H
+
+#include <asm/hwrpb.h>
+#define CPU_CYCLE_FREQUENCY	hwrpb->cycle_freq
+
+#define get_cycles64()		get_cycles()
+
+#define THIS_CPU_NUMBER		smp_processor_id()
+
+#include <linux/version.h>
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
+#define local_irq_save(x) \
+	__save_and_cli(x)
+#define local_irq_restore(x) \
+	__restore_flags(x)
+#endif	/* Linux version 2.2.x */
+
+#define SPINLOCK_MAGIC_INIT /**/
+
+/*
+ * Macros to cache and retrieve an index value inside of a lock
+ * these macros assume that there are less than 65536 simultaneous
+ * (read mode) holders of a rwlock.
+ * We also assume that the hash table has less than 32767 entries.
+ * the high order bit is used for write locking a rw_lock
+ * Note: although these defines and macros are the same as what is being used
+ *       in include/asm-i386/lockmeter.h, they are present here to easily
+ *	 allow an alternate Alpha implementation.
+ */
+/*
+ * instrumented spinlock structure -- never used to allocate storage
+ * only used in macros below to overlay a spinlock_t
+ */
+typedef struct inst_spinlock_s {
+	/* remember, Alpha is little endian */
+	unsigned short lock;
+	unsigned short index;
+} inst_spinlock_t;
+#define PUT_INDEX(lock_ptr,indexv)	((inst_spinlock_t *)(lock_ptr))->index = indexv
+#define GET_INDEX(lock_ptr)		((inst_spinlock_t *)(lock_ptr))->index
+
+/*
+ * macros to cache and retrieve an index value in a read/write lock
+ * as well as the cpu where a reader busy period started
+ * we use the 2nd word (the debug word) for this, so require the
+ * debug word to be present
+ */
+/*
+ * instrumented rwlock structure -- never used to allocate storage
+ * only used in macros below to overlay a rwlock_t
+ */
+typedef struct inst_rwlock_s {
+	volatile int lock;
+	unsigned short index;
+	unsigned short cpu;
+} inst_rwlock_t;
+#define PUT_RWINDEX(rwlock_ptr,indexv)	((inst_rwlock_t *)(rwlock_ptr))->index = indexv
+#define GET_RWINDEX(rwlock_ptr)		((inst_rwlock_t *)(rwlock_ptr))->index
+#define PUT_RW_CPU(rwlock_ptr,cpuv)	((inst_rwlock_t *)(rwlock_ptr))->cpu = cpuv
+#define GET_RW_CPU(rwlock_ptr)		((inst_rwlock_t *)(rwlock_ptr))->cpu
+
+/*
+ * return true if rwlock is write locked
+ * (note that other lock attempts can cause the lock value to be negative)
+ */
+#define RWLOCK_IS_WRITE_LOCKED(rwlock_ptr) (((inst_rwlock_t *)rwlock_ptr)->lock & 1)
+#define IABS(x) ((x) > 0 ? (x) : -(x))
+
+#define RWLOCK_READERS(rwlock_ptr)	rwlock_readers(rwlock_ptr)
+extern inline int rwlock_readers(rwlock_t *rwlock_ptr)
+{
+	int tmp = (int) ((inst_rwlock_t *)rwlock_ptr)->lock;
+	/* readers subtract 2, so we have to:		*/
+	/* 	- andnot off a possible writer (bit 0)	*/
+	/*	- get the absolute value		*/
+	/*	- divide by 2 (right shift by one)	*/
+	/* to find the number of readers		*/
+	if (tmp == 0) return(0);
+	else return(IABS(tmp & ~1)>>1);
+}
+
+#endif /* _ALPHA_LOCKMETER_H */
--- diff/include/asm-arm/cpumask.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/cpumask.h	2003-12-29 09:30:41.000000000 +0000
@@ -0,0 +1,6 @@
+#ifndef _ASM_ARM_CPUMASK_H
+#define _ASM_ARM_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_ARM_CPUMASK_H */
--- diff/include/asm-arm26/cpumask.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm26/cpumask.h	2003-12-29 09:30:41.000000000 +0000
@@ -0,0 +1,6 @@
+#ifndef _ASM_ARM26_CPUMASK_H
+#define _ASM_ARM26_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_ARM26_CPUMASK_H */
--- diff/include/asm-cris/cpumask.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-cris/cpumask.h	2003-12-29 09:30:41.000000000 +0000
@@ -0,0 +1,6 @@
+#ifndef _ASM_CRIS_CPUMASK_H
+#define _ASM_CRIS_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_CRIS_CPUMASK_H */
--- diff/include/asm-generic/cpumask.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-generic/cpumask.h	2003-12-29 09:30:41.000000000 +0000
@@ -0,0 +1,40 @@
+#ifndef __ASM_GENERIC_CPUMASK_H
+#define __ASM_GENERIC_CPUMASK_H
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/threads.h>
+#include <linux/types.h>
+#include <linux/bitmap.h>
+
+#if NR_CPUS > BITS_PER_LONG && NR_CPUS != 1
+#define CPU_ARRAY_SIZE		BITS_TO_LONGS(NR_CPUS)
+
+struct cpumask
+{
+	unsigned long mask[CPU_ARRAY_SIZE];
+};
+
+typedef struct cpumask cpumask_t;
+
+#else
+typedef unsigned long cpumask_t;
+#endif
+
+#ifdef CONFIG_SMP
+#if NR_CPUS > BITS_PER_LONG
+#include <asm-generic/cpumask_array.h>
+#else
+#include <asm-generic/cpumask_arith.h>
+#endif
+#else
+#include <asm-generic/cpumask_up.h>
+#endif
+
+#if NR_CPUS <= 4*BITS_PER_LONG
+#include <asm-generic/cpumask_const_value.h>
+#else
+#include <asm-generic/cpumask_const_reference.h>
+#endif
+
+#endif /* __ASM_GENERIC_CPUMASK_H */
--- diff/include/asm-h8300/cpumask.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-h8300/cpumask.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,6 @@
+#ifndef _ASM_H8300_CPUMASK_H
+#define _ASM_H8300_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_H8300_CPUMASK_H */
--- diff/include/asm-i386/atomic_kmap.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-i386/atomic_kmap.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,95 @@
+/*
+ * atomic_kmap.h: temporary virtual kernel memory mappings
+ *
+ * Copyright (C) 2003 Ingo Molnar <mingo@redhat.com>
+ */
+
+#ifndef _ASM_ATOMIC_KMAP_H
+#define _ASM_ATOMIC_KMAP_H
+
+#ifdef __KERNEL__
+
+#include <linux/config.h>
+#include <asm/tlbflush.h>
+
+#ifdef CONFIG_DEBUG_HIGHMEM
+#define HIGHMEM_DEBUG 1
+#else
+#define HIGHMEM_DEBUG 0
+#endif
+
+extern pte_t *kmap_pte;
+#define kmap_prot PAGE_KERNEL
+
+#define PKMAP_BASE (0xff000000UL)
+#define NR_SHARED_PMDS ((0xffffffff-PKMAP_BASE+1)/PMD_SIZE)
+
+static inline unsigned long __kmap_atomic_vaddr(enum km_type type)
+{
+	enum fixed_addresses idx;
+
+	idx = type + KM_TYPE_NR*smp_processor_id();
+	return __fix_to_virt(FIX_KMAP_BEGIN + idx);
+}
+
+static inline void *__kmap_atomic_noflush(struct page *page, enum km_type type)
+{
+	enum fixed_addresses idx;
+	unsigned long vaddr;
+
+	idx = type + KM_TYPE_NR*smp_processor_id();
+	vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
+	/*
+	 * NOTE: entries that rely on some secondary TLB-flush
+	 * effect must not be global:
+	 */
+	set_pte(kmap_pte-idx, mk_pte(page, PAGE_KERNEL));
+
+	return (void*) vaddr;
+}
+
+static inline void *__kmap_atomic(struct page *page, enum km_type type)
+{
+	enum fixed_addresses idx;
+	unsigned long vaddr;
+
+	idx = type + KM_TYPE_NR*smp_processor_id();
+	vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
+#if HIGHMEM_DEBUG
+	BUG_ON(!pte_none(*(kmap_pte-idx)));
+#else
+	/*
+	 * Performance optimization - do not flush if the new
+	 * pte is the same as the old one:
+	 */
+	if (pte_val(*(kmap_pte-idx)) == pte_val(mk_pte(page, kmap_prot)))
+		return (void *) vaddr;
+#endif
+	set_pte(kmap_pte-idx, mk_pte(page, kmap_prot));
+	__flush_tlb_one(vaddr);
+
+	return (void*) vaddr;
+}
+
+static inline void __kunmap_atomic(void *kvaddr, enum km_type type)
+{
+#if HIGHMEM_DEBUG
+	unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
+	enum fixed_addresses idx = type + KM_TYPE_NR*smp_processor_id();
+
+	BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN+idx));
+	/*
+	 * force other mappings to Oops if they'll try to access
+	 * this pte without first remap it
+	 */
+	pte_clear(kmap_pte-idx);
+	__flush_tlb_one(vaddr);
+#endif
+}
+
+#define __kunmap_atomic_type(type) \
+		__kunmap_atomic((void *)__kmap_atomic_vaddr(type), (type))
+
+#endif /* __KERNEL__ */
+
+#endif /* _ASM_ATOMIC_KMAP_H */
--- diff/include/asm-i386/cpumask.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-i386/cpumask.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,6 @@
+#ifndef _ASM_I386_CPUMASK_H
+#define _ASM_I386_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_I386_CPUMASK_H */
--- diff/include/asm-i386/kgdb.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-i386/kgdb.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,76 @@
+#ifndef __KGDB
+#define __KGDB
+
+/*
+ * This file should not include ANY others.  This makes it usable
+ * most anywhere without the fear of include order or inclusion.
+ * Make it so!
+ *
+ * This file may be included all the time.  It is only active if
+ * CONFIG_KGDB is defined, otherwise it stubs out all the macros
+ * and entry points.
+ */
+#if defined(CONFIG_KGDB) && !defined(__ASSEMBLY__)
+
+extern void breakpoint(void);
+#define INIT_KGDB_INTS kgdb_enable_ints()
+
+#ifndef BREAKPOINT
+#define BREAKPOINT   asm("   int $3")
+#endif
+
+struct sk_buff;
+
+extern int kgdb_eth;
+extern unsigned kgdb_remoteip;
+extern unsigned short kgdb_listenport;
+extern unsigned short kgdb_sendport;
+extern unsigned char kgdb_remotemac[6];
+extern unsigned char kgdb_localmac[6];
+extern int kgdb_eth_need_breakpoint[];
+
+extern int kgdb_tty_hook(void);
+extern int kgdb_eth_hook(void);
+extern int gdb_net_interrupt(struct sk_buff *skb);
+
+/*
+ * GDB debug stub (or any debug stub) can point the 'linux_debug_hook'
+ * pointer to its routine and it will be entered as the first thing
+ * when a trap occurs.
+ *
+ * Return values are, at present, undefined.
+ *
+ * The debug hook routine does not necessarily return to its caller.
+ * It has the register image and thus may choose to resume execution
+ * anywhere it pleases.
+ */
+struct pt_regs;
+struct sk_buff;
+
+extern int kgdb_handle_exception(int trapno,
+				 int signo, int err_code, struct pt_regs *regs);
+extern int in_kgdb(struct pt_regs *regs);
+extern int kgdb_net_interrupt(struct sk_buff *skb);
+
+#ifdef CONFIG_KGDB_TS
+void kgdb_tstamp(int line, char *source, int data0, int data1);
+/*
+ * This is the time stamp function.  The macro adds the source info and
+ * does a cast on the data to allow most any 32-bit value.
+ */
+
+#define kgdb_ts(data0,data1) kgdb_tstamp(__LINE__,__FILE__,(int)data0,(int)data1)
+#else
+#define kgdb_ts(data0,data1)
+#endif
+#else				/* CONFIG_KGDB  && ! __ASSEMBLY__ ,stubs follow... */
+#ifndef BREAKPOINT
+#define BREAKPOINT
+#endif
+#define kgdb_ts(data0,data1)
+#define in_kgdb
+#define kgdb_handle_exception
+#define breakpoint
+#define INIT_KGDB_INTS
+#endif
+#endif				/* __KGDB */
--- diff/include/asm-i386/kgdb_local.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-i386/kgdb_local.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,102 @@
+#ifndef __KGDB_LOCAL
+#define ___KGDB_LOCAL
+#include <linux/config.h>
+#include <linux/types.h>
+#include <linux/serial.h>
+#include <linux/serialP.h>
+#include <linux/spinlock.h>
+#include <asm/processor.h>
+#include <asm/msr.h>
+#include <asm/kgdb.h>
+
+#define PORT 0x3f8
+#ifdef CONFIG_KGDB_PORT
+#undef PORT
+#define PORT CONFIG_KGDB_PORT
+#endif
+#define IRQ 4
+#ifdef CONFIG_KGDB_IRQ
+#undef IRQ
+#define IRQ CONFIG_KGDB_IRQ
+#endif
+#define SB_CLOCK 1843200
+#define SB_BASE (SB_CLOCK/16)
+#define SB_BAUD9600 SB_BASE/9600
+#define SB_BAUD192  SB_BASE/19200
+#define SB_BAUD384  SB_BASE/38400
+#define SB_BAUD576  SB_BASE/57600
+#define SB_BAUD1152 SB_BASE/115200
+#ifdef CONFIG_KGDB_9600BAUD
+#define SB_BAUD SB_BAUD9600
+#endif
+#ifdef CONFIG_KGDB_19200BAUD
+#define SB_BAUD SB_BAUD192
+#endif
+#ifdef CONFIG_KGDB_38400BAUD
+#define SB_BAUD SB_BAUD384
+#endif
+#ifdef CONFIG_KGDB_57600BAUD
+#define SB_BAUD SB_BAUD576
+#endif
+#ifdef CONFIG_KGDB_115200BAUD
+#define SB_BAUD SB_BAUD1152
+#endif
+#ifndef SB_BAUD
+#define SB_BAUD SB_BAUD1152	/* Start with this if not given */
+#endif
+
+#ifndef CONFIG_X86_TSC
+#undef rdtsc
+#define rdtsc(a,b) if (a++ > 10000){a = 0; b++;}
+#undef rdtscll
+#define rdtscll(s) s++
+#endif
+
+#ifdef _raw_read_unlock		/* must use a name that is "define"ed, not an inline */
+#undef spin_lock
+#undef spin_trylock
+#undef spin_unlock
+#define spin_lock	 _raw_spin_lock
+#define spin_trylock	 _raw_spin_trylock
+#define spin_unlock	 _raw_spin_unlock
+#else
+#endif
+#undef spin_unlock_wait
+#define spin_unlock_wait(x)  do { cpu_relax(); barrier();} \
+                                     while(spin_is_locked(x))
+
+#define SB_IER 1
+#define SB_MCR UART_MCR_OUT2 | UART_MCR_DTR | UART_MCR_RTS
+
+#define FLAGS 0
+#define SB_STATE { \
+     magic: SSTATE_MAGIC, \
+     baud_base: SB_BASE,  \
+     port:      PORT,     \
+     irq:       IRQ,      \
+     flags:     FLAGS,    \
+     custom_divisor:SB_BAUD}
+#define SB_INFO  { \
+      magic: SERIAL_MAGIC, \
+      port:  PORT,0,FLAGS, \
+      state: &state,       \
+      tty:   (struct tty_struct *)&state, \
+      IER:   SB_IER,       \
+      MCR:   SB_MCR}
+extern void putDebugChar(int);
+/* RTAI support needs us to really stop/start interrupts */
+
+#define kgdb_sti() __asm__ __volatile__("sti": : :"memory")
+#define kgdb_cli() __asm__ __volatile__("cli": : :"memory")
+#define kgdb_local_save_flags(x) __asm__ __volatile__(\
+                                   "pushfl ; popl %0":"=g" (x): /* no input */)
+#define kgdb_local_irq_restore(x) __asm__ __volatile__(\
+                                   "pushl %0 ; popfl": \
+                                     /* no output */ :"g" (x):"memory", "cc")
+#define kgdb_local_irq_save(x) kgdb_local_save_flags(x); kgdb_cli()
+
+#ifdef CONFIG_SERIAL
+extern void shutdown_for_kgdb(struct async_struct *info);
+#endif
+#define INIT_KDEBUG putDebugChar("+");
+#endif				/* __KGDB_LOCAL */
--- diff/include/asm-i386/lockmeter.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-i386/lockmeter.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,127 @@
+/*
+ *  Copyright (C) 1999,2000 Silicon Graphics, Inc.
+ *
+ *  Written by John Hawkes (hawkes@sgi.com)
+ *  Based on klstat.h by Jack Steiner (steiner@sgi.com)
+ *
+ *  Modified by Ray Bryant (raybry@us.ibm.com)
+ *  Changes Copyright (C) 2000 IBM, Inc.
+ *  Added save of index in spinlock_t to improve efficiency
+ *  of "hold" time reporting for spinlocks.
+ *  Added support for hold time statistics for read and write
+ *  locks.
+ *  Moved machine dependent code here from include/lockmeter.h.
+ *
+ */
+
+#ifndef _I386_LOCKMETER_H
+#define _I386_LOCKMETER_H
+
+#include <asm/spinlock.h>
+#include <asm/rwlock.h>
+
+#include <linux/version.h>
+
+#ifdef __KERNEL__
+extern unsigned long cpu_khz;
+#define CPU_CYCLE_FREQUENCY	(cpu_khz * 1000)
+#else
+#define CPU_CYCLE_FREQUENCY	450000000
+#endif
+
+#define THIS_CPU_NUMBER		smp_processor_id()
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
+#define local_irq_save(x) \
+    __asm__ __volatile__("pushfl ; popl %0 ; cli":"=g" (x): /* no input */ :"memory")
+
+#define local_irq_restore(x) \
+    __asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"g" (x):"memory")
+#endif	/* Linux version 2.2.x */
+
+/*
+ * macros to cache and retrieve an index value inside of a spin lock
+ * these macros assume that there are less than 65536 simultaneous
+ * (read mode) holders of a rwlock.  Not normally a problem!!
+ * we also assume that the hash table has less than 65535 entries.
+ */
+/*
+ * instrumented spinlock structure -- never used to allocate storage
+ * only used in macros below to overlay a spinlock_t
+ */
+typedef struct inst_spinlock_s {
+	/* remember, Intel is little endian */
+	unsigned short lock;
+	unsigned short index;
+} inst_spinlock_t;
+#define PUT_INDEX(lock_ptr,indexv) ((inst_spinlock_t *)(lock_ptr))->index = indexv
+#define GET_INDEX(lock_ptr)        ((inst_spinlock_t *)(lock_ptr))->index
+
+/*
+ * macros to cache and retrieve an index value in a read/write lock
+ * as well as the cpu where a reader busy period started
+ * we use the 2nd word (the debug word) for this, so require the
+ * debug word to be present
+ */
+/*
+ * instrumented rwlock structure -- never used to allocate storage
+ * only used in macros below to overlay a rwlock_t
+ */
+typedef struct inst_rwlock_s {
+	volatile int lock;
+	unsigned short index;
+	unsigned short cpu;
+} inst_rwlock_t;
+#define PUT_RWINDEX(rwlock_ptr,indexv) ((inst_rwlock_t *)(rwlock_ptr))->index = indexv
+#define GET_RWINDEX(rwlock_ptr)        ((inst_rwlock_t *)(rwlock_ptr))->index
+#define PUT_RW_CPU(rwlock_ptr,cpuv)    ((inst_rwlock_t *)(rwlock_ptr))->cpu = cpuv
+#define GET_RW_CPU(rwlock_ptr)         ((inst_rwlock_t *)(rwlock_ptr))->cpu
+
+/*
+ * return the number of readers for a rwlock_t
+ */
+#define RWLOCK_READERS(rwlock_ptr)   rwlock_readers(rwlock_ptr)
+
+extern inline int rwlock_readers(rwlock_t *rwlock_ptr)
+{
+	int tmp = (int) rwlock_ptr->lock;
+	/* read and write lock attempts may cause the lock value to temporarily */
+	/* be negative.  Until it is >= 0 we know nothing (i. e. can't tell if  */
+	/* is -1 because it was write locked and somebody tried to read lock it */
+	/* or if it is -1 because it was read locked and somebody tried to write*/
+	/* lock it. ........................................................... */
+	do {
+		tmp = (int) rwlock_ptr->lock;
+	} while (tmp < 0);
+	if (tmp == 0) return(0);
+	else return(RW_LOCK_BIAS-tmp);
+}
+
+/*
+ * return true if rwlock is write locked
+ * (note that other lock attempts can cause the lock value to be negative)
+ */
+#define RWLOCK_IS_WRITE_LOCKED(rwlock_ptr) ((rwlock_ptr)->lock <= 0)
+#define IABS(x) ((x) > 0 ? (x) : -(x))
+#define RWLOCK_IS_READ_LOCKED(rwlock_ptr)  ((IABS((rwlock_ptr)->lock) % RW_LOCK_BIAS) != 0)
+
+/* this is a lot of typing just to get gcc to emit "rdtsc" */
+static inline long long get_cycles64 (void)
+{
+#ifndef CONFIG_X86_TSC
+	#error this code requires CONFIG_X86_TSC
+#else
+	union longlong_u {
+		long long intlong;
+		struct intint_s {
+			uint32_t eax;
+			uint32_t edx;
+		} intint;
+	} longlong;
+
+	rdtsc(longlong.intint.eax,longlong.intint.edx);
+	return longlong.intlong;
+#endif
+}
+
+#endif /* _I386_LOCKMETER_H */
--- diff/include/asm-ia64/cpumask.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-ia64/cpumask.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,6 @@
+#ifndef _ASM_IA64_CPUMASK_H
+#define _ASM_IA64_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_IA64_CPUMASK_H */
--- diff/include/asm-ia64/lockmeter.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-ia64/lockmeter.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,72 @@
+/*
+ *  Copyright (C) 1999,2000 Silicon Graphics, Inc.
+ *
+ *  Written by John Hawkes (hawkes@sgi.com)
+ *  Based on klstat.h by Jack Steiner (steiner@sgi.com)
+ */
+
+#ifndef _IA64_LOCKMETER_H
+#define _IA64_LOCKMETER_H
+
+#ifdef local_cpu_data
+#define CPU_CYCLE_FREQUENCY	local_cpu_data->itc_freq
+#else
+#define CPU_CYCLE_FREQUENCY	my_cpu_data.itc_freq
+#endif
+#define get_cycles64()		get_cycles()
+
+#define THIS_CPU_NUMBER		smp_processor_id()
+
+/*
+ * macros to cache and retrieve an index value inside of a lock
+ * these macros assume that there are less than 65536 simultaneous
+ * (read mode) holders of a rwlock.
+ * we also assume that the hash table has less than 32767 entries.
+ */
+/*
+ * instrumented spinlock structure -- never used to allocate storage
+ * only used in macros below to overlay a spinlock_t
+ */
+typedef struct inst_spinlock_s {
+	/* remember, Intel is little endian */
+	volatile unsigned short lock;
+	volatile unsigned short index;
+} inst_spinlock_t;
+#define PUT_INDEX(lock_ptr,indexv) ((inst_spinlock_t *)(lock_ptr))->index = indexv
+#define GET_INDEX(lock_ptr)        ((inst_spinlock_t *)(lock_ptr))->index
+
+/*
+ * macros to cache and retrieve an index value in a read/write lock
+ * as well as the cpu where a reader busy period started
+ * we use the 2nd word (the debug word) for this, so require the
+ * debug word to be present
+ */
+/*
+ * instrumented rwlock structure -- never used to allocate storage
+ * only used in macros below to overlay a rwlock_t
+ */
+typedef struct inst_rwlock_s {
+	volatile int read_counter:31;
+	volatile int write_lock:1;
+	volatile unsigned short index;
+	volatile unsigned short cpu;
+} inst_rwlock_t;
+#define PUT_RWINDEX(rwlock_ptr,indexv) ((inst_rwlock_t *)(rwlock_ptr))->index = indexv
+#define GET_RWINDEX(rwlock_ptr)        ((inst_rwlock_t *)(rwlock_ptr))->index
+#define PUT_RW_CPU(rwlock_ptr,cpuv)    ((inst_rwlock_t *)(rwlock_ptr))->cpu = cpuv
+#define GET_RW_CPU(rwlock_ptr)         ((inst_rwlock_t *)(rwlock_ptr))->cpu
+
+/*
+ * return the number of readers for a rwlock_t
+ */
+#define RWLOCK_READERS(rwlock_ptr)	((rwlock_ptr)->read_counter)
+
+/*
+ * return true if rwlock is write locked
+ * (note that other lock attempts can cause the lock value to be negative)
+ */
+#define RWLOCK_IS_WRITE_LOCKED(rwlock_ptr) ((rwlock_ptr)->write_lock)
+#define RWLOCK_IS_READ_LOCKED(rwlock_ptr)  ((rwlock_ptr)->read_counter)
+
+#endif /* _IA64_LOCKMETER_H */
+
--- diff/include/asm-m68k/cpumask.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-m68k/cpumask.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,6 @@
+#ifndef _ASM_M68K_CPUMASK_H
+#define _ASM_M68K_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_M68K_CPUMASK_H */
--- diff/include/asm-m68knommu/cpumask.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-m68knommu/cpumask.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,6 @@
+#ifndef _ASM_M68KNOMMU_CPUMASK_H
+#define _ASM_M68KNOMMU_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_M68KNOMMU_CPUMASK_H */
--- diff/include/asm-mips/cpumask.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-mips/cpumask.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,6 @@
+#ifndef _ASM_MIPS_CPUMASK_H
+#define _ASM_MIPS_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_MIPS_CPUMASK_H */
--- diff/include/asm-mips/lockmeter.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-mips/lockmeter.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,126 @@
+/*
+ *  Copyright (C) 1999,2000 Silicon Graphics, Inc.
+ *
+ *  Written by John Hawkes (hawkes@sgi.com)
+ *  Based on klstat.h by Jack Steiner (steiner@sgi.com)
+ *  Ported to mips32 for Asita Technologies
+ *   by D.J. Barrow ( dj.barrow@asitatechnologies.com )
+ */
+#ifndef _ASM_LOCKMETER_H
+#define _ASM_LOCKMETER_H
+
+/* do_gettimeoffset is a function pointer on mips */
+/* & it is not included by <linux/time.h> */
+#include <asm/time.h>
+#include <linux/time.h>
+#include <asm/div64.h>
+
+#define SPINLOCK_MAGIC_INIT	/* */
+
+#define CPU_CYCLE_FREQUENCY	get_cpu_cycle_frequency()
+
+#define THIS_CPU_NUMBER		smp_processor_id()
+
+static uint32_t cpu_cycle_frequency = 0;
+
+static uint32_t get_cpu_cycle_frequency(void)
+{
+    /* a total hack, slow and invasive, but ... it works */
+    int sec;
+    uint32_t start_cycles;
+    struct timeval tv;
+
+    if (cpu_cycle_frequency == 0) {	/* uninitialized */
+	do_gettimeofday(&tv);
+	sec = tv.tv_sec;	/* set up to catch the tv_sec rollover */
+	while (sec == tv.tv_sec) { do_gettimeofday(&tv); }
+	sec = tv.tv_sec;	/* rolled over to a new sec value */
+	start_cycles = get_cycles();
+	while (sec == tv.tv_sec) { do_gettimeofday(&tv); }
+	cpu_cycle_frequency = get_cycles() - start_cycles;
+    }
+
+    return cpu_cycle_frequency;
+}
+
+extern struct timeval xtime;
+
+static uint64_t get_cycles64(void)
+{
+    static uint64_t last_get_cycles64 = 0;
+    uint64_t ret;
+    unsigned long sec;
+    unsigned long usec, usec_offset;
+
+again:
+    sec  = xtime.tv_sec;
+    usec = xtime.tv_usec;
+    usec_offset = do_gettimeoffset();
+    if ((xtime.tv_sec != sec)  ||
+	(xtime.tv_usec != usec)||
+	(usec_offset >= 20000))
+	goto again;
+
+    ret = ((uint64_t)(usec + usec_offset) * cpu_cycle_frequency);
+    /* We can't do a normal 64 bit division on mips without libgcc.a */
+    do_div(ret,1000000);
+    ret +=  ((uint64_t)sec * cpu_cycle_frequency);
+
+    /* XXX why does time go backwards?  do_gettimeoffset?  general time adj? */
+    if (ret <= last_get_cycles64)
+	ret  = last_get_cycles64+1;
+    last_get_cycles64 = ret;
+
+    return ret;
+}
+
+/*
+ * macros to cache and retrieve an index value inside of a lock
+ * these macros assume that there are less than 65536 simultaneous
+ * (read mode) holders of a rwlock.
+ * we also assume that the hash table has less than 32767 entries.
+ * the high order bit is used for write locking a rw_lock
+ */
+#define INDEX_MASK   0x7FFF0000
+#define READERS_MASK 0x0000FFFF
+#define INDEX_SHIFT 16
+#define PUT_INDEX(lockp,index)   \
+        lockp->lock = (((lockp->lock) & ~INDEX_MASK) | (index) << INDEX_SHIFT)
+#define GET_INDEX(lockp) \
+        (((lockp->lock) & INDEX_MASK) >> INDEX_SHIFT)
+
+/*
+ * macros to cache and retrieve an index value in a read/write lock
+ * as well as the cpu where a reader busy period started
+ * we use the 2nd word (the debug word) for this, so require the
+ * debug word to be present
+ */
+/*
+ * instrumented rwlock structure -- never used to allocate storage
+ * only used in macros below to overlay a rwlock_t
+ */
+typedef struct inst_rwlock_s {
+	volatile int lock;
+	unsigned short index;
+	unsigned short cpu;
+} inst_rwlock_t;
+#define PUT_RWINDEX(rwlock_ptr,indexv) ((inst_rwlock_t *)(rwlock_ptr))->index = indexv
+#define GET_RWINDEX(rwlock_ptr)        ((inst_rwlock_t *)(rwlock_ptr))->index
+#define PUT_RW_CPU(rwlock_ptr,cpuv)    ((inst_rwlock_t *)(rwlock_ptr))->cpu = cpuv
+#define GET_RW_CPU(rwlock_ptr)         ((inst_rwlock_t *)(rwlock_ptr))->cpu
+
+/*
+ * return the number of readers for a rwlock_t
+ */
+#define RWLOCK_READERS(rwlock_ptr)   rwlock_readers(rwlock_ptr)
+
+extern inline int rwlock_readers(rwlock_t *rwlock_ptr)
+{
+	int tmp = (int) rwlock_ptr->lock;
+	return (tmp >= 0) ? tmp : 0;
+}
+
+#define RWLOCK_IS_WRITE_LOCKED(rwlock_ptr) ((rwlock_ptr)->lock < 0)
+#define RWLOCK_IS_READ_LOCKED(rwlock_ptr)  ((rwlock_ptr)->lock > 0)
+
+#endif /* _ASM_LOCKMETER_H */
--- diff/include/asm-parisc/cpumask.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-parisc/cpumask.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,6 @@
+#ifndef _ASM_PARISC_CPUMASK_H
+#define _ASM_PARISC_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_PARISC_CPUMASK_H */
--- diff/include/asm-ppc/cpumask.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-ppc/cpumask.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,6 @@
+#ifndef _ASM_PPC_CPUMASK_H
+#define _ASM_PPC_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_PPC_CPUMASK_H */
--- diff/include/asm-ppc64/cpumask.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-ppc64/cpumask.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,6 @@
+#ifndef _ASM_PPC64_CPUMASK_H
+#define _ASM_PPC64_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_PPC64_CPUMASK_H */
--- diff/include/asm-s390/cpumask.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-s390/cpumask.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,6 @@
+#ifndef _ASM_S390_CPUMASK_H
+#define _ASM_S390_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_S390_CPUMASK_H */
--- diff/include/asm-sh/cpumask.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-sh/cpumask.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,6 @@
+#ifndef _ASM_SH_CPUMASK_H
+#define _ASM_SH_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_SH_CPUMASK_H */
--- diff/include/asm-sparc/cpumask.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-sparc/cpumask.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,6 @@
+#ifndef _ASM_SPARC_CPUMASK_H
+#define _ASM_SPARC_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_SPARC_CPUMASK_H */
--- diff/include/asm-sparc64/cpumask.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-sparc64/cpumask.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,6 @@
+#ifndef _ASM_SPARC64_CPUMASK_H
+#define _ASM_SPARC64_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_SPARC64_CPUMASK_H */
--- diff/include/asm-sparc64/lockmeter.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-sparc64/lockmeter.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2000 Anton Blanchard (anton@linuxcare.com)
+ * Copyright (C) 2003 David S. Miller (davem@redhat.com)
+ */
+
+#ifndef _SPARC64_LOCKMETER_H
+#define _SPARC64_LOCKMETER_H
+
+#include <linux/smp.h>
+#include <asm/spinlock.h>
+#include <asm/timer.h>
+#include <asm/timex.h>
+
+/* Actually, this is not the CPU frequency by the system tick
+ * frequency which is good enough for lock metering.
+ */
+#define CPU_CYCLE_FREQUENCY	(timer_tick_offset * HZ)
+#define THIS_CPU_NUMBER		smp_processor_id()
+
+#define PUT_INDEX(lock_ptr,indexv)	(lock_ptr)->index = (indexv)
+#define GET_INDEX(lock_ptr)		(lock_ptr)->index
+
+#define PUT_RWINDEX(rwlock_ptr,indexv) (rwlock_ptr)->index = (indexv)
+#define GET_RWINDEX(rwlock_ptr)        (rwlock_ptr)->index
+#define PUT_RW_CPU(rwlock_ptr,cpuv)    (rwlock_ptr)->cpu = (cpuv)
+#define GET_RW_CPU(rwlock_ptr)         (rwlock_ptr)->cpu
+
+#define RWLOCK_READERS(rwlock_ptr)	rwlock_readers(rwlock_ptr)
+
+extern inline int rwlock_readers(rwlock_t *rwlock_ptr)
+{
+	signed int tmp = rwlock_ptr->lock;
+
+	if (tmp > 0)
+		return tmp;
+	else
+		return 0;
+}
+
+#define RWLOCK_IS_WRITE_LOCKED(rwlock_ptr)	((signed int)((rwlock_ptr)->lock) < 0)
+#define RWLOCK_IS_READ_LOCKED(rwlock_ptr)	((signed int)((rwlock_ptr)->lock) > 0)
+
+#define get_cycles64()	get_cycles()
+
+#endif /* _SPARC64_LOCKMETER_H */
--- diff/include/asm-um/cpumask.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-um/cpumask.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,6 @@
+#ifndef _ASM_UM_CPUMASK_H
+#define _ASM_UM_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_UM_CPUMASK_H */
--- diff/include/asm-v850/cpumask.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-v850/cpumask.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,6 @@
+#ifndef _ASM_V850_CPUMASK_H
+#define _ASM_V850_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_V850_CPUMASK_H */
--- diff/include/asm-x86_64/cpumask.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-x86_64/cpumask.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,6 @@
+#ifndef _ASM_X86_64_CPUMASK_H
+#define _ASM_X86_64_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_X86_64_CPUMASK_H */
--- diff/include/linux/dwarf2-lang.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/linux/dwarf2-lang.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,132 @@
+#ifndef DWARF2_LANG
+#define DWARF2_LANG
+#include <linux/dwarf2.h>
+
+/*
+ * This 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 file defines macros that allow generation of DWARF debug records
+ * for asm files.  This file is platform independent.  Register numbers
+ * (which are about the only thing that is platform dependent) are to be
+ * supplied by a platform defined file.
+ */
+#define DWARF_preamble()	.section	.debug_frame,"",@progbits
+/*
+ * This macro starts a debug frame section.  The debug_frame describes
+ * where to find the registers that the enclosing function saved on
+ * entry.
+ *
+ * ORD is use by the label generator and should be the same as what is
+ * passed to CFI_postamble.
+ *
+ * pc,	pc register gdb ordinal.
+ *
+ * code_align this is the factor used to define locations or regions
+ * where the given definitions apply.  If you use labels to define these
+ * this should be 1.
+ *
+ * data_align this is the factor used to define register offsets.  If
+ * you use struct offset, this should be the size of the register in
+ * bytes or the negative of that.  This is how it is used: you will
+ * define a register as the reference register, say the stack pointer,
+ * then you will say where a register is located relative to this
+ * reference registers value, say 40 for register 3 (the gdb register
+ * number).  The <40> will be multiplied by <data_align> to define the
+ * byte offset of the given register (3, in this example).  So if your
+ * <40> is the byte offset and the reference register points at the
+ * begining, you would want 1 for the data_offset.  If <40> was the 40th
+ * 4-byte element in that structure you would want 4.  And if your
+ * reference register points at the end of the structure you would want
+ * a negative data_align value(and you would have to do other math as
+ * well).
+ */
+
+#define CFI_preamble(ORD, pc, code_align, data_align)	\
+.section	.debug_frame,"",@progbits ;		\
+frame/**/_/**/ORD:						\
+	.long end/**/_/**/ORD-start/**/_/**/ORD;			\
+start/**/_/**/ORD:						\
+	.long	DW_CIE_ID;				\
+	.byte	DW_CIE_VERSION;			\
+	.byte 0	 ;				\
+	.uleb128 code_align;				\
+	.sleb128 data_align;				\
+	.byte pc;
+
+/*
+ * After the above macro and prior to the CFI_postamble, you need to
+ * define the initial state.  This starts with defining the reference
+ * register and, usually the pc.  Here are some helper macros:
+ */
+
+#define CFA_define_reference(reg, offset)	\
+	.byte DW_CFA_def_cfa;			\
+	.uleb128 reg;				\
+	.uleb128 (offset);
+
+#define CFA_define_offset(reg, offset)		\
+	.byte (DW_CFA_offset + reg);		\
+	.uleb128 (offset);
+
+#define CFI_postamble(ORD)			\
+	.align 4;				\
+end/**/_/**/ORD:
+/*
+ * So now your code pushs stuff on the stack, you need a new location
+ * and the rules for what to do.  This starts a running description of
+ * the call frame.  You need to describe what changes with respect to
+ * the call registers as the location of the pc moves through the code.
+ * The following builds an FDE (fram descriptor entry?).  Like the
+ * above, it has a preamble and a postamble.  It also is tied to the CFI
+ * above.
+ * The first entry after the preamble must be the location in the code
+ * that the call frame is being described for.
+ */
+#define FDE_preamble(ORD, fde_no, initial_address, length)	\
+	.long FDE_end/**/_/**/fde_no-FDE_start/**/_/**/fde_no;		\
+FDE_start/**/_/**/fde_no:						\
+	.long frame/**/_/**/ORD;					\
+	.long initial_address;					\
+	.long length;
+
+#define FDE_postamble(fde_no)			\
+	.align 4;				\
+FDE_end/**/_/**/fde_no:
+/*
+ * That done, you can now add registers, subtract registers, move the
+ * reference and even change the reference.  You can also define a new
+ * area of code the info applies to.  For discontinuous bits you should
+ * start a new FDE.  You may have as many as you like.
+ */
+
+/*
+ * To advance the address by <bytes>
+ */
+
+#define FDE_advance(bytes)			\
+	.byte DW_CFA_advance_loc4		\
+	.long bytes
+
+
+
+/*
+ * With the above you can define all the register locations.  But
+ * suppose the reference register moves... Takes the new offset NOT an
+ * increment.  This is how esp is tracked if it is not saved.
+ */
+
+#define CFA_define_cfa_offset(offset) \
+	.byte $DW_CFA_def_cfa_offset; \
+	.uleb128 (offset);
+/*
+ * Or suppose you want to use a different reference register...
+ */
+#define CFA_define_cfa_register(reg)		\
+	.byte DW_CFA_def_cfa_register;		\
+	.uleb128 reg;
+
+#endif
--- diff/include/linux/dwarf2.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/linux/dwarf2.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,738 @@
+/* Declarations and definitions of codes relating to the DWARF2 symbolic
+   debugging information format.
+   Copyright (C) 1992, 1993, 1995, 1996, 1997, 1999, 2000, 2001, 2002
+   Free Software Foundation, Inc.
+
+   Written by Gary Funck (gary@intrepid.com) The Ada Joint Program
+   Office (AJPO), Florida State Unviversity and Silicon Graphics Inc.
+   provided support for this effort -- June 21, 1995.
+
+   Derived from the DWARF 1 implementation written by Ron Guilmette
+   (rfg@netcom.com), November 1990.
+
+   This file is part of GCC.
+
+   GCC 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.
+
+   GCC 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 GCC; see the file COPYING.  If not, write to the Free
+   Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+   02111-1307, USA.  */
+
+/* This file is derived from the DWARF specification (a public document)
+   Revision 2.0.0 (July 27, 1993) developed by the UNIX International
+   Programming Languages Special Interest Group (UI/PLSIG) and distributed
+   by UNIX International.  Copies of this specification are available from
+   UNIX International, 20 Waterview Boulevard, Parsippany, NJ, 07054.
+
+   This file also now contains definitions from the DWARF 3 specification.  */
+
+/* This file is shared between GCC and GDB, and should not contain
+   prototypes.	*/
+
+#ifndef _ELF_DWARF2_H
+#define _ELF_DWARF2_H
+
+/* Structure found in the .debug_line section.	*/
+#ifndef __ASSEMBLY__
+typedef struct
+{
+  unsigned char li_length	   [4];
+  unsigned char li_version	   [2];
+  unsigned char li_prologue_length [4];
+  unsigned char li_min_insn_length [1];
+  unsigned char li_default_is_stmt [1];
+  unsigned char li_line_base	   [1];
+  unsigned char li_line_range	   [1];
+  unsigned char li_opcode_base	   [1];
+}
+DWARF2_External_LineInfo;
+
+typedef struct
+{
+  unsigned long  li_length;
+  unsigned short li_version;
+  unsigned int	 li_prologue_length;
+  unsigned char  li_min_insn_length;
+  unsigned char  li_default_is_stmt;
+  int		 li_line_base;
+  unsigned char  li_line_range;
+  unsigned char  li_opcode_base;
+}
+DWARF2_Internal_LineInfo;
+
+/* Structure found in .debug_pubnames section.	*/
+typedef struct
+{
+  unsigned char pn_length  [4];
+  unsigned char pn_version [2];
+  unsigned char pn_offset  [4];
+  unsigned char pn_size    [4];
+}
+DWARF2_External_PubNames;
+
+typedef struct
+{
+  unsigned long  pn_length;
+  unsigned short pn_version;
+  unsigned long  pn_offset;
+  unsigned long  pn_size;
+}
+DWARF2_Internal_PubNames;
+
+/* Structure found in .debug_info section.  */
+typedef struct
+{
+  unsigned char  cu_length	  [4];
+  unsigned char  cu_version	  [2];
+  unsigned char  cu_abbrev_offset [4];
+  unsigned char  cu_pointer_size  [1];
+}
+DWARF2_External_CompUnit;
+
+typedef struct
+{
+  unsigned long  cu_length;
+  unsigned short cu_version;
+  unsigned long  cu_abbrev_offset;
+  unsigned char  cu_pointer_size;
+}
+DWARF2_Internal_CompUnit;
+
+typedef struct
+{
+  unsigned char  ar_length	 [4];
+  unsigned char  ar_version	 [2];
+  unsigned char  ar_info_offset  [4];
+  unsigned char  ar_pointer_size [1];
+  unsigned char  ar_segment_size [1];
+}
+DWARF2_External_ARange;
+
+typedef struct
+{
+  unsigned long  ar_length;
+  unsigned short ar_version;
+  unsigned long  ar_info_offset;
+  unsigned char  ar_pointer_size;
+  unsigned char  ar_segment_size;
+}
+DWARF2_Internal_ARange;
+
+#define ENUM(name) enum name {
+#define IF_NOT_ASM(a) a
+#define COMMA ,
+#else
+#define ENUM(name)
+#define IF_NOT_ASM(a)
+#define COMMA
+
+#endif
+
+/* Tag names and codes.  */
+ENUM(dwarf_tag)
+
+    DW_TAG_padding = 0x00 COMMA
+    DW_TAG_array_type = 0x01 COMMA
+    DW_TAG_class_type = 0x02 COMMA
+    DW_TAG_entry_point = 0x03 COMMA
+    DW_TAG_enumeration_type = 0x04 COMMA
+    DW_TAG_formal_parameter = 0x05 COMMA
+    DW_TAG_imported_declaration = 0x08 COMMA
+    DW_TAG_label = 0x0a COMMA
+    DW_TAG_lexical_block = 0x0b COMMA
+    DW_TAG_member = 0x0d COMMA
+    DW_TAG_pointer_type = 0x0f COMMA
+    DW_TAG_reference_type = 0x10 COMMA
+    DW_TAG_compile_unit = 0x11 COMMA
+    DW_TAG_string_type = 0x12 COMMA
+    DW_TAG_structure_type = 0x13 COMMA
+    DW_TAG_subroutine_type = 0x15 COMMA
+    DW_TAG_typedef = 0x16 COMMA
+    DW_TAG_union_type = 0x17 COMMA
+    DW_TAG_unspecified_parameters = 0x18 COMMA
+    DW_TAG_variant = 0x19 COMMA
+    DW_TAG_common_block = 0x1a COMMA
+    DW_TAG_common_inclusion = 0x1b COMMA
+    DW_TAG_inheritance = 0x1c COMMA
+    DW_TAG_inlined_subroutine = 0x1d COMMA
+    DW_TAG_module = 0x1e COMMA
+    DW_TAG_ptr_to_member_type = 0x1f COMMA
+    DW_TAG_set_type = 0x20 COMMA
+    DW_TAG_subrange_type = 0x21 COMMA
+    DW_TAG_with_stmt = 0x22 COMMA
+    DW_TAG_access_declaration = 0x23 COMMA
+    DW_TAG_base_type = 0x24 COMMA
+    DW_TAG_catch_block = 0x25 COMMA
+    DW_TAG_const_type = 0x26 COMMA
+    DW_TAG_constant = 0x27 COMMA
+    DW_TAG_enumerator = 0x28 COMMA
+    DW_TAG_file_type = 0x29 COMMA
+    DW_TAG_friend = 0x2a COMMA
+    DW_TAG_namelist = 0x2b COMMA
+    DW_TAG_namelist_item = 0x2c COMMA
+    DW_TAG_packed_type = 0x2d COMMA
+    DW_TAG_subprogram = 0x2e COMMA
+    DW_TAG_template_type_param = 0x2f COMMA
+    DW_TAG_template_value_param = 0x30 COMMA
+    DW_TAG_thrown_type = 0x31 COMMA
+    DW_TAG_try_block = 0x32 COMMA
+    DW_TAG_variant_part = 0x33 COMMA
+    DW_TAG_variable = 0x34 COMMA
+    DW_TAG_volatile_type = 0x35 COMMA
+    /* DWARF 3.  */
+    DW_TAG_dwarf_procedure = 0x36 COMMA
+    DW_TAG_restrict_type = 0x37 COMMA
+    DW_TAG_interface_type = 0x38 COMMA
+    DW_TAG_namespace = 0x39 COMMA
+    DW_TAG_imported_module = 0x3a COMMA
+    DW_TAG_unspecified_type = 0x3b COMMA
+    DW_TAG_partial_unit = 0x3c COMMA
+    DW_TAG_imported_unit = 0x3d COMMA
+    /* SGI/MIPS Extensions.  */
+    DW_TAG_MIPS_loop = 0x4081 COMMA
+    /* GNU extensions.	*/
+    DW_TAG_format_label = 0x4101 COMMA	/* For FORTRAN 77 and Fortran 90.  */
+    DW_TAG_function_template = 0x4102 COMMA	/* For C++.  */
+    DW_TAG_class_template = 0x4103 COMMA	/* For C++.  */
+    DW_TAG_GNU_BINCL = 0x4104 COMMA
+    DW_TAG_GNU_EINCL = 0x4105 COMMA
+    /* Extensions for UPC.  See: http://upc.gwu.edu/~upc.  */
+    DW_TAG_upc_shared_type = 0x8765 COMMA
+    DW_TAG_upc_strict_type = 0x8766 COMMA
+    DW_TAG_upc_relaxed_type = 0x8767
+IF_NOT_ASM(};)
+
+#define DW_TAG_lo_user	0x4080
+#define DW_TAG_hi_user	0xffff
+
+/* Flag that tells whether entry has a child or not.  */
+#define DW_children_no	 0
+#define	DW_children_yes  1
+
+/* Form names and codes.  */
+ENUM(dwarf_form)
+
+    DW_FORM_addr = 0x01 COMMA
+    DW_FORM_block2 = 0x03 COMMA
+    DW_FORM_block4 = 0x04 COMMA
+    DW_FORM_data2 = 0x05 COMMA
+    DW_FORM_data4 = 0x06 COMMA
+    DW_FORM_data8 = 0x07 COMMA
+    DW_FORM_string = 0x08 COMMA
+    DW_FORM_block = 0x09 COMMA
+    DW_FORM_block1 = 0x0a COMMA
+    DW_FORM_data1 = 0x0b COMMA
+    DW_FORM_flag = 0x0c COMMA
+    DW_FORM_sdata = 0x0d COMMA
+    DW_FORM_strp = 0x0e COMMA
+    DW_FORM_udata = 0x0f COMMA
+    DW_FORM_ref_addr = 0x10 COMMA
+    DW_FORM_ref1 = 0x11 COMMA
+    DW_FORM_ref2 = 0x12 COMMA
+    DW_FORM_ref4 = 0x13 COMMA
+    DW_FORM_ref8 = 0x14 COMMA
+    DW_FORM_ref_udata = 0x15 COMMA
+    DW_FORM_indirect = 0x16
+IF_NOT_ASM(};)
+
+/* Attribute names and codes.  */
+
+ENUM(dwarf_attribute)
+
+    DW_AT_sibling = 0x01 COMMA
+    DW_AT_location = 0x02 COMMA
+    DW_AT_name = 0x03 COMMA
+    DW_AT_ordering = 0x09 COMMA
+    DW_AT_subscr_data = 0x0a COMMA
+    DW_AT_byte_size = 0x0b COMMA
+    DW_AT_bit_offset = 0x0c COMMA
+    DW_AT_bit_size = 0x0d COMMA
+    DW_AT_element_list = 0x0f COMMA
+    DW_AT_stmt_list = 0x10 COMMA
+    DW_AT_low_pc = 0x11 COMMA
+    DW_AT_high_pc = 0x12 COMMA
+    DW_AT_language = 0x13 COMMA
+    DW_AT_member = 0x14 COMMA
+    DW_AT_discr = 0x15 COMMA
+    DW_AT_discr_value = 0x16 COMMA
+    DW_AT_visibility = 0x17 COMMA
+    DW_AT_import = 0x18 COMMA
+    DW_AT_string_length = 0x19 COMMA
+    DW_AT_common_reference = 0x1a COMMA
+    DW_AT_comp_dir = 0x1b COMMA
+    DW_AT_const_value = 0x1c COMMA
+    DW_AT_containing_type = 0x1d COMMA
+    DW_AT_default_value = 0x1e COMMA
+    DW_AT_inline = 0x20 COMMA
+    DW_AT_is_optional = 0x21 COMMA
+    DW_AT_lower_bound = 0x22 COMMA
+    DW_AT_producer = 0x25 COMMA
+    DW_AT_prototyped = 0x27 COMMA
+    DW_AT_return_addr = 0x2a COMMA
+    DW_AT_start_scope = 0x2c COMMA
+    DW_AT_stride_size = 0x2e COMMA
+    DW_AT_upper_bound = 0x2f COMMA
+    DW_AT_abstract_origin = 0x31 COMMA
+    DW_AT_accessibility = 0x32 COMMA
+    DW_AT_address_class = 0x33 COMMA
+    DW_AT_artificial = 0x34 COMMA
+    DW_AT_base_types = 0x35 COMMA
+    DW_AT_calling_convention = 0x36 COMMA
+    DW_AT_count = 0x37 COMMA
+    DW_AT_data_member_location = 0x38 COMMA
+    DW_AT_decl_column = 0x39 COMMA
+    DW_AT_decl_file = 0x3a COMMA
+    DW_AT_decl_line = 0x3b COMMA
+    DW_AT_declaration = 0x3c COMMA
+    DW_AT_discr_list = 0x3d COMMA
+    DW_AT_encoding = 0x3e COMMA
+    DW_AT_external = 0x3f COMMA
+    DW_AT_frame_base = 0x40 COMMA
+    DW_AT_friend = 0x41 COMMA
+    DW_AT_identifier_case = 0x42 COMMA
+    DW_AT_macro_info = 0x43 COMMA
+    DW_AT_namelist_items = 0x44 COMMA
+    DW_AT_priority = 0x45 COMMA
+    DW_AT_segment = 0x46 COMMA
+    DW_AT_specification = 0x47 COMMA
+    DW_AT_static_link = 0x48 COMMA
+    DW_AT_type = 0x49 COMMA
+    DW_AT_use_location = 0x4a COMMA
+    DW_AT_variable_parameter = 0x4b COMMA
+    DW_AT_virtuality = 0x4c COMMA
+    DW_AT_vtable_elem_location = 0x4d COMMA
+    /* DWARF 3 values.	*/
+    DW_AT_allocated	= 0x4e COMMA
+    DW_AT_associated	= 0x4f COMMA
+    DW_AT_data_location = 0x50 COMMA
+    DW_AT_stride	= 0x51 COMMA
+    DW_AT_entry_pc	= 0x52 COMMA
+    DW_AT_use_UTF8	= 0x53 COMMA
+    DW_AT_extension	= 0x54 COMMA
+    DW_AT_ranges	= 0x55 COMMA
+    DW_AT_trampoline	= 0x56 COMMA
+    DW_AT_call_column	= 0x57 COMMA
+    DW_AT_call_file	= 0x58 COMMA
+    DW_AT_call_line	= 0x59 COMMA
+    /* SGI/MIPS extensions.  */
+    DW_AT_MIPS_fde = 0x2001 COMMA
+    DW_AT_MIPS_loop_begin = 0x2002 COMMA
+    DW_AT_MIPS_tail_loop_begin = 0x2003 COMMA
+    DW_AT_MIPS_epilog_begin = 0x2004 COMMA
+    DW_AT_MIPS_loop_unroll_factor = 0x2005 COMMA
+    DW_AT_MIPS_software_pipeline_depth = 0x2006 COMMA
+    DW_AT_MIPS_linkage_name = 0x2007 COMMA
+    DW_AT_MIPS_stride = 0x2008 COMMA
+    DW_AT_MIPS_abstract_name = 0x2009 COMMA
+    DW_AT_MIPS_clone_origin = 0x200a COMMA
+    DW_AT_MIPS_has_inlines = 0x200b COMMA
+    /* GNU extensions.	*/
+    DW_AT_sf_names   = 0x2101 COMMA
+    DW_AT_src_info   = 0x2102 COMMA
+    DW_AT_mac_info   = 0x2103 COMMA
+    DW_AT_src_coords = 0x2104 COMMA
+    DW_AT_body_begin = 0x2105 COMMA
+    DW_AT_body_end   = 0x2106 COMMA
+    DW_AT_GNU_vector = 0x2107 COMMA
+    /* VMS extensions.	*/
+    DW_AT_VMS_rtnbeg_pd_address = 0x2201 COMMA
+    /* UPC extension.  */
+    DW_AT_upc_threads_scaled = 0x3210
+IF_NOT_ASM(};)
+
+#define DW_AT_lo_user	0x2000	/* Implementation-defined range start.	*/
+#define DW_AT_hi_user	0x3ff0	/* Implementation-defined range end.  */
+
+/* Location atom names and codes.  */
+ENUM(dwarf_location_atom)
+
+    DW_OP_addr = 0x03 COMMA
+    DW_OP_deref = 0x06 COMMA
+    DW_OP_const1u = 0x08 COMMA
+    DW_OP_const1s = 0x09 COMMA
+    DW_OP_const2u = 0x0a COMMA
+    DW_OP_const2s = 0x0b COMMA
+    DW_OP_const4u = 0x0c COMMA
+    DW_OP_const4s = 0x0d COMMA
+    DW_OP_const8u = 0x0e COMMA
+    DW_OP_const8s = 0x0f COMMA
+    DW_OP_constu = 0x10 COMMA
+    DW_OP_consts = 0x11 COMMA
+    DW_OP_dup = 0x12 COMMA
+    DW_OP_drop = 0x13 COMMA
+    DW_OP_over = 0x14 COMMA
+    DW_OP_pick = 0x15 COMMA
+    DW_OP_swap = 0x16 COMMA
+    DW_OP_rot = 0x17 COMMA
+    DW_OP_xderef = 0x18 COMMA
+    DW_OP_abs = 0x19 COMMA
+    DW_OP_and = 0x1a COMMA
+    DW_OP_div = 0x1b COMMA
+    DW_OP_minus = 0x1c COMMA
+    DW_OP_mod = 0x1d COMMA
+    DW_OP_mul = 0x1e COMMA
+    DW_OP_neg = 0x1f COMMA
+    DW_OP_not = 0x20 COMMA
+    DW_OP_or = 0x21 COMMA
+    DW_OP_plus = 0x22 COMMA
+    DW_OP_plus_uconst = 0x23 COMMA
+    DW_OP_shl = 0x24 COMMA
+    DW_OP_shr = 0x25 COMMA
+    DW_OP_shra = 0x26 COMMA
+    DW_OP_xor = 0x27 COMMA
+    DW_OP_bra = 0x28 COMMA
+    DW_OP_eq = 0x29 COMMA
+    DW_OP_ge = 0x2a COMMA
+    DW_OP_gt = 0x2b COMMA
+    DW_OP_le = 0x2c COMMA
+    DW_OP_lt = 0x2d COMMA
+    DW_OP_ne = 0x2e COMMA
+    DW_OP_skip = 0x2f COMMA
+    DW_OP_lit0 = 0x30 COMMA
+    DW_OP_lit1 = 0x31 COMMA
+    DW_OP_lit2 = 0x32 COMMA
+    DW_OP_lit3 = 0x33 COMMA
+    DW_OP_lit4 = 0x34 COMMA
+    DW_OP_lit5 = 0x35 COMMA
+    DW_OP_lit6 = 0x36 COMMA
+    DW_OP_lit7 = 0x37 COMMA
+    DW_OP_lit8 = 0x38 COMMA
+    DW_OP_lit9 = 0x39 COMMA
+    DW_OP_lit10 = 0x3a COMMA
+    DW_OP_lit11 = 0x3b COMMA
+    DW_OP_lit12 = 0x3c COMMA
+    DW_OP_lit13 = 0x3d COMMA
+    DW_OP_lit14 = 0x3e COMMA
+    DW_OP_lit15 = 0x3f COMMA
+    DW_OP_lit16 = 0x40 COMMA
+    DW_OP_lit17 = 0x41 COMMA
+    DW_OP_lit18 = 0x42 COMMA
+    DW_OP_lit19 = 0x43 COMMA
+    DW_OP_lit20 = 0x44 COMMA
+    DW_OP_lit21 = 0x45 COMMA
+    DW_OP_lit22 = 0x46 COMMA
+    DW_OP_lit23 = 0x47 COMMA
+    DW_OP_lit24 = 0x48 COMMA
+    DW_OP_lit25 = 0x49 COMMA
+    DW_OP_lit26 = 0x4a COMMA
+    DW_OP_lit27 = 0x4b COMMA
+    DW_OP_lit28 = 0x4c COMMA
+    DW_OP_lit29 = 0x4d COMMA
+    DW_OP_lit30 = 0x4e COMMA
+    DW_OP_lit31 = 0x4f COMMA
+    DW_OP_reg0 = 0x50 COMMA
+    DW_OP_reg1 = 0x51 COMMA
+    DW_OP_reg2 = 0x52 COMMA
+    DW_OP_reg3 = 0x53 COMMA
+    DW_OP_reg4 = 0x54 COMMA
+    DW_OP_reg5 = 0x55 COMMA
+    DW_OP_reg6 = 0x56 COMMA
+    DW_OP_reg7 = 0x57 COMMA
+    DW_OP_reg8 = 0x58 COMMA
+    DW_OP_reg9 = 0x59 COMMA
+    DW_OP_reg10 = 0x5a COMMA
+    DW_OP_reg11 = 0x5b COMMA
+    DW_OP_reg12 = 0x5c COMMA
+    DW_OP_reg13 = 0x5d COMMA
+    DW_OP_reg14 = 0x5e COMMA
+    DW_OP_reg15 = 0x5f COMMA
+    DW_OP_reg16 = 0x60 COMMA
+    DW_OP_reg17 = 0x61 COMMA
+    DW_OP_reg18 = 0x62 COMMA
+    DW_OP_reg19 = 0x63 COMMA
+    DW_OP_reg20 = 0x64 COMMA
+    DW_OP_reg21 = 0x65 COMMA
+    DW_OP_reg22 = 0x66 COMMA
+    DW_OP_reg23 = 0x67 COMMA
+    DW_OP_reg24 = 0x68 COMMA
+    DW_OP_reg25 = 0x69 COMMA
+    DW_OP_reg26 = 0x6a COMMA
+    DW_OP_reg27 = 0x6b COMMA
+    DW_OP_reg28 = 0x6c COMMA
+    DW_OP_reg29 = 0x6d COMMA
+    DW_OP_reg30 = 0x6e COMMA
+    DW_OP_reg31 = 0x6f COMMA
+    DW_OP_breg0 = 0x70 COMMA
+    DW_OP_breg1 = 0x71 COMMA
+    DW_OP_breg2 = 0x72 COMMA
+    DW_OP_breg3 = 0x73 COMMA
+    DW_OP_breg4 = 0x74 COMMA
+    DW_OP_breg5 = 0x75 COMMA
+    DW_OP_breg6 = 0x76 COMMA
+    DW_OP_breg7 = 0x77 COMMA
+    DW_OP_breg8 = 0x78 COMMA
+    DW_OP_breg9 = 0x79 COMMA
+    DW_OP_breg10 = 0x7a COMMA
+    DW_OP_breg11 = 0x7b COMMA
+    DW_OP_breg12 = 0x7c COMMA
+    DW_OP_breg13 = 0x7d COMMA
+    DW_OP_breg14 = 0x7e COMMA
+    DW_OP_breg15 = 0x7f COMMA
+    DW_OP_breg16 = 0x80 COMMA
+    DW_OP_breg17 = 0x81 COMMA
+    DW_OP_breg18 = 0x82 COMMA
+    DW_OP_breg19 = 0x83 COMMA
+    DW_OP_breg20 = 0x84 COMMA
+    DW_OP_breg21 = 0x85 COMMA
+    DW_OP_breg22 = 0x86 COMMA
+    DW_OP_breg23 = 0x87 COMMA
+    DW_OP_breg24 = 0x88 COMMA
+    DW_OP_breg25 = 0x89 COMMA
+    DW_OP_breg26 = 0x8a COMMA
+    DW_OP_breg27 = 0x8b COMMA
+    DW_OP_breg28 = 0x8c COMMA
+    DW_OP_breg29 = 0x8d COMMA
+    DW_OP_breg30 = 0x8e COMMA
+    DW_OP_breg31 = 0x8f COMMA
+    DW_OP_regx = 0x90 COMMA
+    DW_OP_fbreg = 0x91 COMMA
+    DW_OP_bregx = 0x92 COMMA
+    DW_OP_piece = 0x93 COMMA
+    DW_OP_deref_size = 0x94 COMMA
+    DW_OP_xderef_size = 0x95 COMMA
+    DW_OP_nop = 0x96 COMMA
+    /* DWARF 3 extensions.  */
+    DW_OP_push_object_address = 0x97 COMMA
+    DW_OP_call2 = 0x98 COMMA
+    DW_OP_call4 = 0x99 COMMA
+    DW_OP_call_ref = 0x9a COMMA
+    /* GNU extensions.	*/
+    DW_OP_GNU_push_tls_address = 0xe0
+IF_NOT_ASM(};)
+
+#define DW_OP_lo_user	0xe0	/* Implementation-defined range start.	*/
+#define DW_OP_hi_user	0xff	/* Implementation-defined range end.  */
+
+/* Type encodings.  */
+ENUM(dwarf_type)
+
+    DW_ATE_void = 0x0 COMMA
+    DW_ATE_address = 0x1 COMMA
+    DW_ATE_boolean = 0x2 COMMA
+    DW_ATE_complex_float = 0x3 COMMA
+    DW_ATE_float = 0x4 COMMA
+    DW_ATE_signed = 0x5 COMMA
+    DW_ATE_signed_char = 0x6 COMMA
+    DW_ATE_unsigned = 0x7 COMMA
+    DW_ATE_unsigned_char = 0x8 COMMA
+    /* DWARF 3.  */
+    DW_ATE_imaginary_float = 0x9
+IF_NOT_ASM(};)
+
+#define	DW_ATE_lo_user 0x80
+#define	DW_ATE_hi_user 0xff
+
+/* Array ordering names and codes.  */
+ENUM(dwarf_array_dim_ordering)
+
+    DW_ORD_row_major = 0 COMMA
+    DW_ORD_col_major = 1
+IF_NOT_ASM(};)
+
+/* Access attribute.  */
+ENUM(dwarf_access_attribute)
+
+    DW_ACCESS_public = 1 COMMA
+    DW_ACCESS_protected = 2 COMMA
+    DW_ACCESS_private = 3
+IF_NOT_ASM(};)
+
+/* Visibility.	*/
+ENUM(dwarf_visibility_attribute)
+
+    DW_VIS_local = 1 COMMA
+    DW_VIS_exported = 2 COMMA
+    DW_VIS_qualified = 3
+IF_NOT_ASM(};)
+
+/* Virtuality.	*/
+ENUM(dwarf_virtuality_attribute)
+
+    DW_VIRTUALITY_none = 0 COMMA
+    DW_VIRTUALITY_virtual = 1 COMMA
+    DW_VIRTUALITY_pure_virtual = 2
+IF_NOT_ASM(};)
+
+/* Case sensitivity.  */
+ENUM(dwarf_id_case)
+
+    DW_ID_case_sensitive = 0 COMMA
+    DW_ID_up_case = 1 COMMA
+    DW_ID_down_case = 2 COMMA
+    DW_ID_case_insensitive = 3
+IF_NOT_ASM(};)
+
+/* Calling convention.	*/
+ENUM(dwarf_calling_convention)
+
+    DW_CC_normal = 0x1 COMMA
+    DW_CC_program = 0x2 COMMA
+    DW_CC_nocall = 0x3
+IF_NOT_ASM(};)
+
+#define DW_CC_lo_user 0x40
+#define DW_CC_hi_user 0xff
+
+/* Inline attribute.  */
+ENUM(dwarf_inline_attribute)
+
+    DW_INL_not_inlined = 0 COMMA
+    DW_INL_inlined = 1 COMMA
+    DW_INL_declared_not_inlined = 2 COMMA
+    DW_INL_declared_inlined = 3
+IF_NOT_ASM(};)
+
+/* Discriminant lists.	*/
+ENUM(dwarf_discrim_list)
+
+    DW_DSC_label = 0 COMMA
+    DW_DSC_range = 1
+IF_NOT_ASM(};)
+
+/* Line number opcodes.  */
+ENUM(dwarf_line_number_ops)
+
+    DW_LNS_extended_op = 0 COMMA
+    DW_LNS_copy = 1 COMMA
+    DW_LNS_advance_pc = 2 COMMA
+    DW_LNS_advance_line = 3 COMMA
+    DW_LNS_set_file = 4 COMMA
+    DW_LNS_set_column = 5 COMMA
+    DW_LNS_negate_stmt = 6 COMMA
+    DW_LNS_set_basic_block = 7 COMMA
+    DW_LNS_const_add_pc = 8 COMMA
+    DW_LNS_fixed_advance_pc = 9 COMMA
+    /* DWARF 3.  */
+    DW_LNS_set_prologue_end = 10 COMMA
+    DW_LNS_set_epilogue_begin = 11 COMMA
+    DW_LNS_set_isa = 12
+IF_NOT_ASM(};)
+
+/* Line number extended opcodes.  */
+ENUM(dwarf_line_number_x_ops)
+
+    DW_LNE_end_sequence = 1 COMMA
+    DW_LNE_set_address = 2 COMMA
+    DW_LNE_define_file = 3
+IF_NOT_ASM(};)
+
+/* Call frame information.  */
+ENUM(dwarf_call_frame_info)
+
+    DW_CFA_advance_loc = 0x40 COMMA
+    DW_CFA_offset = 0x80 COMMA
+    DW_CFA_restore = 0xc0 COMMA
+    DW_CFA_nop = 0x00 COMMA
+    DW_CFA_set_loc = 0x01 COMMA
+    DW_CFA_advance_loc1 = 0x02 COMMA
+    DW_CFA_advance_loc2 = 0x03 COMMA
+    DW_CFA_advance_loc4 = 0x04 COMMA
+    DW_CFA_offset_extended = 0x05 COMMA
+    DW_CFA_restore_extended = 0x06 COMMA
+    DW_CFA_undefined = 0x07 COMMA
+    DW_CFA_same_value = 0x08 COMMA
+    DW_CFA_register = 0x09 COMMA
+    DW_CFA_remember_state = 0x0a COMMA
+    DW_CFA_restore_state = 0x0b COMMA
+    DW_CFA_def_cfa = 0x0c COMMA
+    DW_CFA_def_cfa_register = 0x0d COMMA
+    DW_CFA_def_cfa_offset = 0x0e COMMA
+
+    /* DWARF 3.  */
+    DW_CFA_def_cfa_expression = 0x0f COMMA
+    DW_CFA_expression = 0x10 COMMA
+    DW_CFA_offset_extended_sf = 0x11 COMMA
+    DW_CFA_def_cfa_sf = 0x12 COMMA
+    DW_CFA_def_cfa_offset_sf = 0x13 COMMA
+
+    /* SGI/MIPS specific.  */
+    DW_CFA_MIPS_advance_loc8 = 0x1d COMMA
+
+    /* GNU extensions.	*/
+    DW_CFA_GNU_window_save = 0x2d COMMA
+    DW_CFA_GNU_args_size = 0x2e COMMA
+    DW_CFA_GNU_negative_offset_extended = 0x2f
+IF_NOT_ASM(};)
+
+#define DW_CIE_ID	  0xffffffff
+#define DW_CIE_VERSION	  1
+
+#define DW_CFA_extended   0
+#define DW_CFA_lo_user	  0x1c
+#define DW_CFA_hi_user	  0x3f
+
+#define DW_CHILDREN_no		     0x00
+#define DW_CHILDREN_yes		     0x01
+
+#define DW_ADDR_none		0
+
+/* Source language names and codes.  */
+ENUM(dwarf_source_language)
+
+    DW_LANG_C89 = 0x0001 COMMA
+    DW_LANG_C = 0x0002 COMMA
+    DW_LANG_Ada83 = 0x0003 COMMA
+    DW_LANG_C_plus_plus = 0x0004 COMMA
+    DW_LANG_Cobol74 = 0x0005 COMMA
+    DW_LANG_Cobol85 = 0x0006 COMMA
+    DW_LANG_Fortran77 = 0x0007 COMMA
+    DW_LANG_Fortran90 = 0x0008 COMMA
+    DW_LANG_Pascal83 = 0x0009 COMMA
+    DW_LANG_Modula2 = 0x000a COMMA
+    DW_LANG_Java = 0x000b COMMA
+    /* DWARF 3.  */
+    DW_LANG_C99 = 0x000c COMMA
+    DW_LANG_Ada95 = 0x000d COMMA
+    DW_LANG_Fortran95 = 0x000e COMMA
+    /* MIPS.  */
+    DW_LANG_Mips_Assembler = 0x8001 COMMA
+    /* UPC.  */
+    DW_LANG_Upc = 0x8765
+IF_NOT_ASM(};)
+
+#define DW_LANG_lo_user 0x8000	/* Implementation-defined range start.	*/
+#define DW_LANG_hi_user 0xffff	/* Implementation-defined range start.	*/
+
+/* Names and codes for macro information.  */
+ENUM(dwarf_macinfo_record_type)
+
+    DW_MACINFO_define = 1 COMMA
+    DW_MACINFO_undef = 2 COMMA
+    DW_MACINFO_start_file = 3 COMMA
+    DW_MACINFO_end_file = 4 COMMA
+    DW_MACINFO_vendor_ext = 255
+IF_NOT_ASM(};)
+
+/* @@@ For use with GNU frame unwind information.  */
+
+#define DW_EH_PE_absptr		0x00
+#define DW_EH_PE_omit		0xff
+
+#define DW_EH_PE_uleb128	0x01
+#define DW_EH_PE_udata2		0x02
+#define DW_EH_PE_udata4		0x03
+#define DW_EH_PE_udata8		0x04
+#define DW_EH_PE_sleb128	0x09
+#define DW_EH_PE_sdata2		0x0A
+#define DW_EH_PE_sdata4		0x0B
+#define DW_EH_PE_sdata8		0x0C
+#define DW_EH_PE_signed		0x08
+
+#define DW_EH_PE_pcrel		0x10
+#define DW_EH_PE_textrel	0x20
+#define DW_EH_PE_datarel	0x30
+#define DW_EH_PE_funcrel	0x40
+#define DW_EH_PE_aligned	0x50
+
+#define DW_EH_PE_indirect	0x80
+
+#endif /* _ELF_DWARF2_H */
--- diff/include/linux/lockmeter.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/linux/lockmeter.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,320 @@
+/*
+ *  Copyright (C) 1999-2002 Silicon Graphics, Inc.
+ *
+ *  Written by John Hawkes (hawkes@sgi.com)
+ *  Based on klstat.h by Jack Steiner (steiner@sgi.com)
+ *
+ *  Modified by Ray Bryant (raybry@us.ibm.com) Feb-Apr 2000
+ *  Changes Copyright (C) 2000 IBM, Inc.
+ *  Added save of index in spinlock_t to improve efficiency
+ *  of "hold" time reporting for spinlocks
+ *  Added support for hold time statistics for read and write
+ *  locks.
+ *  Moved machine dependent code to include/asm/lockmeter.h.
+ *
+ */
+
+#ifndef _LINUX_LOCKMETER_H
+#define _LINUX_LOCKMETER_H
+
+
+/*---------------------------------------------------
+ *	architecture-independent lockmeter.h
+ *-------------------------------------------------*/
+
+/*
+ * raybry -- version 2: added efficient hold time statistics
+ *           requires lstat recompile, so flagged as new version
+ * raybry -- version 3: added global reader lock data
+ * hawkes -- version 4: removed some unnecessary fields to simplify mips64 port
+ */
+#define LSTAT_VERSION	5
+
+int	lstat_update(void*, void*, int);
+int	lstat_update_time(void*, void*, int, uint32_t);
+
+/*
+ * Currently, the mips64 and sparc64 kernels talk to a 32-bit lockstat, so we
+ * need to force compatibility in the inter-communication data structure.
+ */
+
+#if defined(CONFIG_MIPS32_COMPAT)
+#define TIME_T		uint32_t
+#elif defined(CONFIG_SPARC) || defined(CONFIG_SPARC64)
+#define TIME_T		uint64_t
+#else
+#define TIME_T		time_t
+#endif
+
+#if defined(__KERNEL__) || (!defined(CONFIG_MIPS32_COMPAT) && !defined(CONFIG_SPARC) && !defined(CONFIG_SPARC64)) || (_MIPS_SZLONG==32)
+#define POINTER		void *
+#else
+#define	POINTER		int64_t
+#endif
+
+/*
+ * Values for the "action" parameter passed to lstat_update.
+ *	ZZZ - do we want a try-success status here???
+ */
+#define LSTAT_ACT_NO_WAIT	0
+#define LSTAT_ACT_SPIN		1
+#define LSTAT_ACT_REJECT	2
+#define LSTAT_ACT_WW_SPIN       3
+#define LSTAT_ACT_SLEPT		4 /* UNUSED */
+
+#define LSTAT_ACT_MAX_VALUES	4 /* NOTE: Increase to 5 if use ACT_SLEPT */
+
+/*
+ * Special values for the low 2 bits of an RA passed to
+ * lstat_update.
+ */
+/* we use these values to figure out what kind of lock data */
+/* is stored in the statistics table entry at index ....... */
+#define LSTAT_RA_SPIN           0  /* spin lock data */
+#define LSTAT_RA_READ           1  /* read lock statistics */
+#define LSTAT_RA_SEMA		2  /* RESERVED */
+#define LSTAT_RA_WRITE          3  /* write lock statistics*/
+
+#define LSTAT_RA(n)	\
+	((void*)( ((unsigned long)__builtin_return_address(0) & ~3) | n) )
+
+/*
+ * Constants used for lock addresses in the lstat_directory
+ * to indicate special values of the lock address.
+ */
+#define	LSTAT_MULTI_LOCK_ADDRESS	NULL
+
+/*
+ * Maximum size of the lockstats tables. Increase this value
+ * if its not big enough. (Nothing bad happens if its not
+ * big enough although some locks will not be monitored.)
+ * We record overflows of this quantity in lstat_control.dir_overflows
+ *
+ * Note:  The max value here must fit into the field set
+ * and obtained by the macro's PUT_INDEX() and GET_INDEX().
+ * This value depends on how many bits are available in the
+ * lock word in the particular machine implementation we are on.
+ */
+#define LSTAT_MAX_STAT_INDEX		2000
+
+/*
+ * Size and mask for the hash table into the directory.
+ */
+#define LSTAT_HASH_TABLE_SIZE		4096		/* must be 2**N */
+#define LSTAT_HASH_TABLE_MASK		(LSTAT_HASH_TABLE_SIZE-1)
+
+#define DIRHASH(ra)      ((unsigned long)(ra)>>2 & LSTAT_HASH_TABLE_MASK)
+
+/*
+ *	This defines an entry in the lockstat directory. It contains
+ *	information about a lock being monitored.
+ *	A directory entry only contains the lock identification -
+ *	counts on usage of the lock are kept elsewhere in a per-cpu
+ *	data structure to minimize cache line pinging.
+ */
+typedef struct {
+	POINTER	caller_ra;		  /* RA of code that set lock */
+	POINTER	lock_ptr;		  /* lock address */
+	ushort	next_stat_index;  /* Used to link multiple locks that have the same hash table value */
+} lstat_directory_entry_t;
+
+/*
+ *	A multi-dimensioned array used to contain counts for lock accesses.
+ *	The array is 3-dimensional:
+ *		- CPU number. Keep from thrashing cache lines between CPUs
+ *		- Directory entry index. Identifies the lock
+ *		- Action. Indicates what kind of contention occurred on an
+ *		  access to the lock.
+ *
+ *	The index of an entry in the directory is the same as the 2nd index
+ *	of the entry in the counts array.
+ */
+/*
+ *  This table contains data for spin_locks, write locks, and read locks
+ *  Not all data is used for all cases.  In particular, the hold time
+ *  information is not stored here for read locks since that is a global
+ *  (e. g. cannot be separated out by return address) quantity.
+ *  See the lstat_read_lock_counts_t structure for the global read lock
+ *  hold time.
+ */
+typedef struct {
+	uint64_t    cum_wait_ticks;	/* sum of wait times               */
+	                                /* for write locks, sum of time a  */
+					/* writer is waiting for a reader  */
+	int64_t	    cum_hold_ticks;	/* cumulative sum of holds         */
+	                                /* not used for read mode locks    */
+					/* must be signed. ............... */
+	uint32_t    max_wait_ticks;	/* max waiting time                */
+	uint32_t    max_hold_ticks;	/* max holding time                */
+	uint64_t    cum_wait_ww_ticks;  /* sum times writer waits on writer*/
+	uint32_t    max_wait_ww_ticks;  /* max wait time writer vs writer  */
+	                                /* prev 2 only used for write locks*/
+	uint32_t    acquire_time;       /* time lock acquired this CPU     */
+	uint32_t    count[LSTAT_ACT_MAX_VALUES];
+} lstat_lock_counts_t;
+
+typedef lstat_lock_counts_t	lstat_cpu_counts_t[LSTAT_MAX_STAT_INDEX];
+
+/*
+ * User request to:
+ *	- turn statistic collection on/off, or to reset
+ */
+#define LSTAT_OFF	 0
+#define LSTAT_ON	 1
+#define LSTAT_RESET      2
+#define LSTAT_RELEASE    3
+
+#define LSTAT_MAX_READ_LOCK_INDEX 1000
+typedef struct {
+	POINTER	    lock_ptr;            /* address of lock for output stats */
+	uint32_t    read_lock_count;
+	int64_t     cum_hold_ticks;       /* sum of read lock hold times over */
+	                                  /* all callers. ....................*/
+	uint32_t    write_index;          /* last write lock hash table index */
+	uint32_t    busy_periods;         /* count of busy periods ended this */
+	uint64_t    start_busy;           /* time this busy period started. ..*/
+	uint64_t    busy_ticks;           /* sum of busy periods this lock. ..*/
+	uint64_t    max_busy;             /* longest busy period for this lock*/
+	uint32_t    max_readers;          /* maximum number of readers ...... */
+#ifdef USER_MODE_TESTING
+	rwlock_t    entry_lock;           /* lock for this read lock entry... */
+	                                  /* avoid having more than one rdr at*/
+	                                  /* needed for user space testing... */
+	                                  /* not needed for kernel 'cause it  */
+					  /* is non-preemptive. ............. */
+#endif
+} lstat_read_lock_counts_t;
+typedef lstat_read_lock_counts_t	lstat_read_lock_cpu_counts_t[LSTAT_MAX_READ_LOCK_INDEX];
+
+#if defined(__KERNEL__) || defined(USER_MODE_TESTING)
+
+#ifndef USER_MODE_TESTING
+#include <asm/lockmeter.h>
+#else
+#include "asm_newlockmeter.h"
+#endif
+
+/*
+ * Size and mask for the hash table into the directory.
+ */
+#define LSTAT_HASH_TABLE_SIZE		4096		/* must be 2**N */
+#define LSTAT_HASH_TABLE_MASK		(LSTAT_HASH_TABLE_SIZE-1)
+
+#define DIRHASH(ra)      ((unsigned long)(ra)>>2 & LSTAT_HASH_TABLE_MASK)
+
+/*
+ * This version eliminates the per processor lock stack.  What we do is to
+ * store the index of the lock hash structure in unused bits in the lock
+ * itself.  Then on unlock we can find the statistics record without doing
+ * any additional hash or lock stack lookup.  This works for spin_locks.
+ * Hold time reporting is now basically as cheap as wait time reporting
+ * so we ignore the difference between LSTAT_ON_HOLD and LSTAT_ON_WAIT
+ * as in version 1.1.* of lockmeter.
+ *
+ * For rw_locks, we store the index of a global reader stats structure in
+ * the lock and the writer index is stored in the latter structure.
+ * For read mode locks we hash at the time of the lock to find an entry
+ * in the directory for reader wait time and the like.
+ * At unlock time for read mode locks, we update just the global structure
+ * so we don't need to know the reader directory index value at unlock time.
+ *
+ */
+
+/*
+ * Protocol to change lstat_control.state
+ *   This is complicated because we don't want the cum_hold_time for
+ * a rw_lock to be decremented in _read_lock_ without making sure it
+ * is incremented in _read_lock_ and vice versa.  So here is the
+ * way we change the state of lstat_control.state:
+ * I.  To Turn Statistics On
+ *     After allocating storage, set lstat_control.state non-zero.
+ * This works because we don't start updating statistics for in use
+ * locks until the reader lock count goes to zero.
+ * II. To Turn Statistics Off:
+ * (0)  Disable interrupts on this CPU
+ * (1)  Seize the lstat_control.directory_lock
+ * (2)  Obtain the current value of lstat_control.next_free_read_lock_index
+ * (3)  Store a zero in lstat_control.state.
+ * (4)  Release the lstat_control.directory_lock
+ * (5)  For each lock in the read lock list up to the saved value
+ *      (well, -1) of the next_free_read_lock_index, do the following:
+ *      (a)  Check validity of the stored lock address
+ *           by making sure that the word at the saved addr
+ *           has an index that matches this entry.  If not
+ *           valid, then skip this entry.
+ *      (b)  If there is a write lock already set on this lock,
+ *           skip to (d) below.
+ *      (c)  Set a non-metered write lock on the lock
+ *      (d)  set the cached INDEX in the lock to zero
+ *      (e)  Release the non-metered write lock.
+ * (6)  Re-enable interrupts
+ *
+ * These rules ensure that a read lock will not have its statistics
+ * partially updated even though the global lock recording state has
+ * changed.  See put_lockmeter_info() for implementation.
+ *
+ * The reason for (b) is that there may be write locks set on the
+ * syscall path to put_lockmeter_info() from user space.  If we do
+ * not do this check, then we can deadlock.  A similar problem would
+ * occur if the lock was read locked by the current CPU.  At the
+ * moment this does not appear to happen.
+ */
+
+/*
+ * Main control structure for lockstat. Used to turn statistics on/off
+ * and to maintain directory info.
+ */
+typedef struct {
+	int				state;
+	spinlock_t		control_lock;		/* used to serialize turning statistics on/off   */
+	spinlock_t		directory_lock;		/* for serialize adding entries to directory     */
+	volatile int	next_free_dir_index;/* next free entry in the directory */
+	/* FIXME not all of these fields are used / needed .............. */
+                /* the following fields represent data since     */
+		/* first "lstat on" or most recent "lstat reset" */
+	TIME_T      first_started_time;     /* time when measurement first enabled */
+	TIME_T      started_time;           /* time when measurement last started  */
+	TIME_T      ending_time;            /* time when measurement last disabled */
+	uint64_t    started_cycles64;       /* cycles when measurement last started          */
+	uint64_t    ending_cycles64;        /* cycles when measurement last disabled         */
+	uint64_t    enabled_cycles64;       /* total cycles with measurement enabled         */
+	int         intervals;              /* number of measurement intervals recorded      */
+	                                    /* i. e. number of times did lstat on;lstat off  */
+	lstat_directory_entry_t	*dir;		/* directory */
+	int         dir_overflow;           /* count of times ran out of space in directory  */
+	int         rwlock_overflow;        /* count of times we couldn't allocate a rw block*/
+	ushort		*hashtab;		 	    /* hash table for quick dir scans */
+	lstat_cpu_counts_t	*counts[NR_CPUS];	 /* Array of pointers to per-cpu stats */
+    int         next_free_read_lock_index;   /* next rwlock reader (global) stats block  */
+    lstat_read_lock_cpu_counts_t *read_lock_counts[NR_CPUS]; /* per cpu read lock stats  */
+} lstat_control_t;
+
+#endif	/* defined(__KERNEL__) || defined(USER_MODE_TESTING) */
+
+typedef struct {
+	short		lstat_version;		/* version of the data */
+	short		state;			/* the current state is returned */
+	int		maxcpus;		/* Number of cpus present */
+	int		next_free_dir_index;	/* index of the next free directory entry */
+	TIME_T          first_started_time;	/* when measurement enabled for first time */
+	TIME_T          started_time;		/* time in secs since 1969 when stats last turned on  */
+	TIME_T		ending_time;		/* time in secs since 1969 when stats last turned off */
+	uint32_t	cycleval;		/* cycles per second */
+#ifdef notyet
+	void		*kernel_magic_addr;	/* address of kernel_magic */
+	void		*kernel_end_addr;	/* contents of kernel magic (points to "end") */
+#endif
+	int              next_free_read_lock_index; /* index of next (global) read lock stats struct */
+	uint64_t         started_cycles64;	/* cycles when measurement last started        */
+	uint64_t         ending_cycles64;	/* cycles when stats last turned off           */
+	uint64_t         enabled_cycles64;	/* total cycles with measurement enabled       */
+	int              intervals;		/* number of measurement intervals recorded      */
+						/* i.e. number of times we did lstat on;lstat off*/
+	int              dir_overflow;		/* number of times we wanted more space in directory */
+	int              rwlock_overflow;	/* # of times we wanted more space in read_locks_count */
+	struct new_utsname   uts;		/* info about machine where stats are measured */
+						/* -T option of lockstat allows data to be     */
+						/* moved to another machine. ................. */
+} lstat_user_request_t;
+
+#endif /* _LINUX_LOCKMETER_H */
--- diff/include/linux/pci_msi.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/linux/pci_msi.h	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,193 @@
+/*
+ *	../include/linux/pci_msi.h
+ *
+ */
+
+#ifndef _ASM_PCI_MSI_H
+#define _ASM_PCI_MSI_H
+
+#include <linux/pci.h>
+
+#define MSI_AUTO -1
+#define NR_REPEATS	23
+#define NR_RESERVED_VECTORS 3 /*FIRST_DEVICE_VECTOR,FIRST_SYSTEM_VECTOR,0x80 */
+
+/*
+ * Assume the maximum number of hot plug slots supported by the system is about
+ * ten. The worstcase is that each of these slots is hot-added with a device,
+ * which has two MSI/MSI-X capable functions. To avoid any MSI-X driver, which
+ * attempts to request all available vectors, NR_HP_RESERVED_VECTORS is defined
+ * as below to ensure at least one message is assigned to each detected MSI/
+ * MSI-X device function.
+ */
+#define NR_HP_RESERVED_VECTORS 	20
+
+extern int vector_irq[NR_IRQS];
+extern cpumask_t pending_irq_balance_cpumask[NR_IRQS];
+extern void (*interrupt[NR_IRQS])(void);
+
+#ifdef CONFIG_SMP
+#define set_msi_irq_affinity	set_msi_affinity
+#else
+#define set_msi_irq_affinity	NULL
+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
+ */
+#define PCI_MSIX_FLAGS_QSIZE		0x7FF
+#define PCI_MSIX_FLAGS_ENABLE		(1 << 15)
+#define PCI_MSIX_FLAGS_BIRMASK		(7 << 0)
+#define PCI_MSIX_FLAGS_BITMASK		(1 << 0)
+
+#define PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET	0
+#define PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET	4
+#define PCI_MSIX_ENTRY_DATA_OFFSET		8
+#define PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET	12
+#define PCI_MSIX_ENTRY_SIZE			16
+
+#define msi_control_reg(base)		(base + PCI_MSI_FLAGS)
+#define msi_lower_address_reg(base)	(base + PCI_MSI_ADDRESS_LO)
+#define msi_upper_address_reg(base)	(base + PCI_MSI_ADDRESS_HI)
+#define msi_data_reg(base, is64bit)	\
+	( (is64bit == 1) ? base+PCI_MSI_DATA_64 : base+PCI_MSI_DATA_32 )
+#define msi_mask_bits_reg(base, is64bit) \
+	( (is64bit == 1) ? base+PCI_MSI_MASK_BIT : base+PCI_MSI_MASK_BIT-4)
+#define msi_disable(control)		control &= ~PCI_MSI_FLAGS_ENABLE
+#define multi_msi_capable(control) \
+	(1 << ((control & PCI_MSI_FLAGS_QMASK) >> 1))
+#define multi_msi_enable(control, num) \
+	control |= (((num >> 1) << 4) & PCI_MSI_FLAGS_QSIZE);
+#define is_64bit_address(control)	(control & PCI_MSI_FLAGS_64BIT)
+#define is_mask_bit_support(control)	(control & PCI_MSI_FLAGS_MASKBIT)
+#define msi_enable(control, num) multi_msi_enable(control, num); \
+	control |= PCI_MSI_FLAGS_ENABLE
+
+#define msix_control_reg		msi_control_reg
+#define msix_table_offset_reg(base)	(base + 0x04)
+#define msix_pba_offset_reg(base)	(base + 0x08)
+#define msix_enable(control)	 	control |= PCI_MSIX_FLAGS_ENABLE
+#define msix_disable(control)	 	control &= ~PCI_MSIX_FLAGS_ENABLE
+#define msix_table_size(control) 	((control & PCI_MSIX_FLAGS_QSIZE)+1)
+#define multi_msix_capable		msix_table_size
+#define msix_unmask(address)	 	(address & ~PCI_MSIX_FLAGS_BITMASK)
+#define msix_mask(address)		(address | PCI_MSIX_FLAGS_BITMASK)
+#define msix_is_pending(address) 	(address & PCI_MSIX_FLAGS_PENDMASK)
+
+extern char __dbg_str_buf[256];
+#define _DEFINE_DBG_BUFFER	char __dbg_str_buf[256];
+#define _DBG_K_TRACE_ENTRY	((unsigned int)0x00000001)
+#define _DBG_K_TRACE_EXIT	((unsigned int)0x00000002)
+#define _DBG_K_INFO		((unsigned int)0x00000004)
+#define _DBG_K_ERROR		((unsigned int)0x00000008)
+#define _DBG_K_TRACE	(_DBG_K_TRACE_ENTRY | _DBG_K_TRACE_EXIT)
+
+#define _DEBUG_LEVEL	(_DBG_K_INFO | _DBG_K_ERROR | _DBG_K_TRACE)
+#define _DBG_PRINT( dbg_flags, args... )		\
+if ( _DEBUG_LEVEL & (dbg_flags) )			\
+{							\
+	int len;					\
+	len = sprintf(__dbg_str_buf, "%s:%d: %s ", 	\
+		__FILE__, __LINE__, __FUNCTION__ ); 	\
+	sprintf(__dbg_str_buf + len, args);		\
+	printk(KERN_INFO "%s\n", __dbg_str_buf);	\
+}
+
+#define MSI_FUNCTION_TRACE_ENTER	\
+	_DBG_PRINT (_DBG_K_TRACE_ENTRY, "%s", "[Entry]");
+#define MSI_FUNCTION_TRACE_EXIT		\
+	_DBG_PRINT (_DBG_K_TRACE_EXIT, "%s", "[Entry]");
+
+/*
+ * 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_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_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)
+	__u32	vector		:  8;
+	__u32	delivery_mode	:  3;	/* 000b: FIXED | 001b: lowest prior */
+	__u32	reserved_1	:  3;
+	__u32	level		:  1;	/* 0: deassert | 1: assert */
+	__u32	trigger		:  1;	/* 0: edge | 1: level */
+	__u32	reserved_2	: 16;
+#elif defined(__BIG_ENDIAN_BITFIELD)
+	__u32	reserved_2	: 16;
+	__u32	trigger		:  1;	/* 0: edge | 1: level */
+	__u32	level		:  1;	/* 0: deassert | 1: assert */
+	__u32	reserved_1	:  3;
+	__u32	delivery_mode	:  3;	/* 000b: FIXED | 001b: lowest prior */
+	__u32	vector		:  8;
+#else
+#error "Bitfield endianness not defined! Check your byteorder.h"
+#endif
+} __attribute__ ((packed));
+
+struct msg_address {
+	union {
+		struct {
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+			__u32	reserved_1	:  2;
+			__u32	dest_mode	:  1;	/*0:physic | 1:logic */
+			__u32	redirection_hint:  1;  	/*0: dedicated CPU
+							  1: lowest priority */
+			__u32	reserved_2	:  4;
+ 			__u32	dest_id		: 24;	/* Destination ID */
+#elif defined(__BIG_ENDIAN_BITFIELD)
+ 			__u32	dest_id		: 24;	/* Destination ID */
+			__u32	reserved_2	:  4;
+			__u32	redirection_hint:  1;  	/*0: dedicated CPU
+							  1: lowest priority */
+			__u32	dest_mode	:  1;	/*0:physic | 1:logic */
+			__u32	reserved_1	:  2;
+#else
+#error "Bitfield endianness not defined! Check your byteorder.h"
+#endif
+      		}u;
+       		__u32  value;
+	}lo_address;
+	__u32 	hi_address;
+} __attribute__ ((packed));
+
+struct msi_desc {
+	struct {
+		__u8	type	: 5; 	/* {0: unused, 5h:MSI, 11h:MSI-X} */
+		__u8	maskbit	: 1; 	/* mask-pending bit supported ?   */
+		__u8	reserved: 2; 	/* reserved			  */
+		__u8	entry_nr;    	/* specific enabled entry 	  */
+		__u8	default_vector; /* default pre-assigned vector    */
+		__u8	current_cpu; 	/* current destination cpu	  */
+	}msi_attrib;
+
+	struct {
+		__u16	head;
+		__u16	tail;
+	}link;
+
+	unsigned long mask_base;
+	struct pci_dev *dev;
+};
+
+#endif /* _ASM_PCI_MSI_H */
--- diff/kernel/lockmeter.c	1970-01-01 01:00:00.000000000 +0100
+++ source/kernel/lockmeter.c	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,1178 @@
+/*
+ *  Copyright (C) 1999,2000 Silicon Graphics, Inc.
+ *
+ *  Written by John Hawkes (hawkes@sgi.com)
+ *  Based on klstat.c by Jack Steiner (steiner@sgi.com)
+ *
+ *  Modified by Ray Bryant (raybry@us.ibm.com)
+ *  Changes Copyright (C) 2000 IBM, Inc.
+ *  Added save of index in spinlock_t to improve efficiency
+ *  of "hold" time reporting for spinlocks
+ *  Added support for hold time statistics for read and write
+ *  locks.
+ */
+
+#include <linux/config.h>
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <linux/slab.h>
+#include <linux/sched.h>
+#include <linux/smp.h>
+#include <linux/threads.h>
+#include <linux/version.h>
+#include <linux/vmalloc.h>
+#include <linux/spinlock.h>
+#include <linux/utsname.h>
+#include <linux/module.h>
+#include <asm/system.h>
+#include <asm/uaccess.h>
+
+#include <linux/lockmeter.h>
+
+#define ASSERT(cond)
+#define bzero(loc,size)		memset(loc,0,size)
+
+/*<---------------------------------------------------*/
+/*              lockmeter.c                           */
+/*>---------------------------------------------------*/
+
+static lstat_control_t lstat_control __cacheline_aligned =
+	{ LSTAT_OFF, SPIN_LOCK_UNLOCKED, SPIN_LOCK_UNLOCKED,
+	  19 * 0, NR_CPUS * 0, 0, NR_CPUS * 0 };
+
+static ushort lstat_make_dir_entry(void *, void *);
+
+/*
+ * lstat_lookup
+ *
+ * Given a RA, locate the directory entry for the lock.
+ */
+static ushort
+lstat_lookup(void *lock_ptr, void *caller_ra)
+{
+	ushort index;
+	lstat_directory_entry_t *dirp;
+
+	dirp = lstat_control.dir;
+
+	index = lstat_control.hashtab[DIRHASH(caller_ra)];
+	while (dirp[index].caller_ra != caller_ra) {
+		if (index == 0) {
+			return lstat_make_dir_entry(lock_ptr, caller_ra);
+		}
+		index = dirp[index].next_stat_index;
+	}
+
+	if (dirp[index].lock_ptr != NULL && dirp[index].lock_ptr != lock_ptr) {
+		dirp[index].lock_ptr = NULL;
+	}
+
+	return index;
+}
+
+/*
+ * lstat_make_dir_entry
+ * Called to add a new lock to the lock directory.
+ */
+static ushort
+lstat_make_dir_entry(void *lock_ptr, void *caller_ra)
+{
+	lstat_directory_entry_t *dirp;
+	ushort index, hindex;
+	unsigned long flags;
+
+	/* lock the table without recursively reentering this metering code */
+	local_irq_save(flags);
+	_raw_spin_lock(&lstat_control.directory_lock);
+
+	hindex = DIRHASH(caller_ra);
+	index = lstat_control.hashtab[hindex];
+	dirp = lstat_control.dir;
+	while (index && dirp[index].caller_ra != caller_ra)
+		index = dirp[index].next_stat_index;
+
+	if (index == 0) {
+		if (lstat_control.next_free_dir_index < LSTAT_MAX_STAT_INDEX) {
+			index = lstat_control.next_free_dir_index++;
+			lstat_control.dir[index].caller_ra = caller_ra;
+			lstat_control.dir[index].lock_ptr = lock_ptr;
+			lstat_control.dir[index].next_stat_index =
+				lstat_control.hashtab[hindex];
+			lstat_control.hashtab[hindex] = index;
+		} else {
+			lstat_control.dir_overflow++;
+		}
+	}
+	_raw_spin_unlock(&lstat_control.directory_lock);
+	local_irq_restore(flags);
+	return index;
+}
+
+int
+lstat_update(void *lock_ptr, void *caller_ra, int action)
+{
+	int index;
+	int cpu;
+
+	ASSERT(action < LSTAT_ACT_MAX_VALUES);
+
+	if (lstat_control.state == LSTAT_OFF)
+		return 0;
+
+	index = lstat_lookup(lock_ptr, caller_ra);
+	cpu = THIS_CPU_NUMBER;
+	(*lstat_control.counts[cpu])[index].count[action]++;
+	(*lstat_control.counts[cpu])[index].acquire_time = get_cycles();
+
+	return index;
+}
+
+int
+lstat_update_time(void *lock_ptr, void *caller_ra, int action, uint32_t ticks)
+{
+	ushort index;
+	int cpu;
+
+	ASSERT(action < LSTAT_ACT_MAX_VALUES);
+
+	if (lstat_control.state == LSTAT_OFF)
+		return 0;
+
+	index = lstat_lookup(lock_ptr, caller_ra);
+	cpu = THIS_CPU_NUMBER;
+	(*lstat_control.counts[cpu])[index].count[action]++;
+	(*lstat_control.counts[cpu])[index].cum_wait_ticks += (uint64_t) ticks;
+	if ((*lstat_control.counts[cpu])[index].max_wait_ticks < ticks)
+		(*lstat_control.counts[cpu])[index].max_wait_ticks = ticks;
+
+	(*lstat_control.counts[cpu])[index].acquire_time = get_cycles();
+
+	return index;
+}
+
+void
+_metered_spin_lock(spinlock_t * lock_ptr)
+{
+	if (lstat_control.state == LSTAT_OFF) {
+		_raw_spin_lock(lock_ptr);	/* do the real lock */
+		PUT_INDEX(lock_ptr, 0);	/* clean index in case lockmetering  */
+		/* gets turned on before unlock */
+	} else {
+		void *this_pc = LSTAT_RA(LSTAT_RA_SPIN);
+		int index;
+
+		if (_raw_spin_trylock(lock_ptr)) {
+			index = lstat_update(lock_ptr, this_pc,
+						LSTAT_ACT_NO_WAIT);
+		} else {
+			uint32_t start_cycles = get_cycles();
+			_raw_spin_lock(lock_ptr);	/* do the real lock */
+			index = lstat_update_time(lock_ptr, this_pc,
+				LSTAT_ACT_SPIN, get_cycles() - start_cycles);
+		}
+		/* save the index in the lock itself for use in spin unlock */
+		PUT_INDEX(lock_ptr, index);
+	}
+}
+
+int
+_metered_spin_trylock(spinlock_t * lock_ptr)
+{
+	if (lstat_control.state == LSTAT_OFF) {
+		return _raw_spin_trylock(lock_ptr);
+	} else {
+		int retval;
+		void *this_pc = LSTAT_RA(LSTAT_RA_SPIN);
+
+		if ((retval = _raw_spin_trylock(lock_ptr))) {
+			int index = lstat_update(lock_ptr, this_pc,
+						LSTAT_ACT_NO_WAIT);
+			/*
+			 * save the index in the lock itself for use in spin
+			 * unlock
+			 */
+			PUT_INDEX(lock_ptr, index);
+		} else {
+			lstat_update(lock_ptr, this_pc, LSTAT_ACT_REJECT);
+		}
+
+		return retval;
+	}
+}
+
+void
+_metered_spin_unlock(spinlock_t * lock_ptr)
+{
+	int index = -1;
+
+	if (lstat_control.state != LSTAT_OFF) {
+		index = GET_INDEX(lock_ptr);
+		/*
+		 * If statistics were turned off when we set the lock,
+		 * then the index can be zero.  If that is the case,
+		 * then collect no stats on this call.
+		 */
+		if (index > 0) {
+			uint32_t hold_time;
+			int cpu = THIS_CPU_NUMBER;
+			hold_time = get_cycles() -
+			 (*lstat_control.counts[cpu])[index].acquire_time;
+			(*lstat_control.counts[cpu])[index].cum_hold_ticks +=
+				(uint64_t) hold_time;
+			if ((*lstat_control.counts[cpu])[index].max_hold_ticks <
+			    hold_time)
+				(*lstat_control.counts[cpu])[index].
+				    max_hold_ticks = hold_time;
+		}
+	}
+
+	/* make sure we don't have a stale index value saved */
+	PUT_INDEX(lock_ptr, 0);
+	_raw_spin_unlock(lock_ptr);	/* do the real unlock */
+}
+
+/*
+ * allocate the next global read lock structure and store its index
+ * in the rwlock at "lock_ptr".
+ */
+uint32_t
+alloc_rwlock_struct(rwlock_t * rwlock_ptr)
+{
+	int index;
+	unsigned long flags;
+	int cpu = THIS_CPU_NUMBER;
+
+	/* If we've already overflowed, then do a quick exit */
+	if (lstat_control.next_free_read_lock_index >
+			LSTAT_MAX_READ_LOCK_INDEX) {
+		lstat_control.rwlock_overflow++;
+		return 0;
+	}
+
+	local_irq_save(flags);
+	_raw_spin_lock(&lstat_control.directory_lock);
+
+	/* It is possible this changed while we were waiting for the directory_lock */
+	if (lstat_control.state == LSTAT_OFF) {
+		index = 0;
+		goto unlock;
+	}
+
+	/* It is possible someone else got here first and set the index */
+	if ((index = GET_RWINDEX(rwlock_ptr)) == 0) {
+		/*
+		 * we can't turn on read stats for this lock while there are
+		 * readers (this would mess up the running hold time sum at
+		 * unlock time)
+		 */
+		if (RWLOCK_READERS(rwlock_ptr) != 0) {
+			index = 0;
+			goto unlock;
+		}
+
+		/*
+		 * if stats are turned on after being off, we may need to
+		 * return an old index from when the statistics were on last
+		 * time.
+		 */
+		for (index = 1; index < lstat_control.next_free_read_lock_index;
+				index++)
+			if ((*lstat_control.read_lock_counts[cpu])[index].
+					lock_ptr == rwlock_ptr)
+				goto put_index_and_unlock;
+
+		/* allocate the next global read lock structure */
+		if (lstat_control.next_free_read_lock_index >=
+		    LSTAT_MAX_READ_LOCK_INDEX) {
+			lstat_control.rwlock_overflow++;
+			index = 0;
+			goto unlock;
+		}
+		index = lstat_control.next_free_read_lock_index++;
+
+		/*
+		 * initialize the global read stats data structure for each
+		 * cpu
+		 */
+		for (cpu = 0; cpu < num_online_cpus(); cpu++) {
+			(*lstat_control.read_lock_counts[cpu])[index].lock_ptr =
+				rwlock_ptr;
+		}
+put_index_and_unlock:
+		/* store the index for the read lock structure into the lock */
+		PUT_RWINDEX(rwlock_ptr, index);
+	}
+
+unlock:
+	_raw_spin_unlock(&lstat_control.directory_lock);
+	local_irq_restore(flags);
+	return index;
+}
+
+void
+_metered_read_lock(rwlock_t * rwlock_ptr)
+{
+	void *this_pc;
+	uint32_t start_cycles;
+	int index;
+	int cpu;
+	unsigned long flags;
+	int readers_before, readers_after;
+	uint64_t cycles64;
+
+	if (lstat_control.state == LSTAT_OFF) {
+		_raw_read_lock(rwlock_ptr);
+		/* clean index in case lockmetering turns on before an unlock */
+		PUT_RWINDEX(rwlock_ptr, 0);
+		return;
+	}
+
+	this_pc = LSTAT_RA(LSTAT_RA_READ);
+	cpu = THIS_CPU_NUMBER;
+	index = GET_RWINDEX(rwlock_ptr);
+
+	/* allocate the global stats entry for this lock, if needed */
+	if (index == 0)
+		index = alloc_rwlock_struct(rwlock_ptr);
+
+	readers_before = RWLOCK_READERS(rwlock_ptr);
+	if (_raw_read_trylock(rwlock_ptr)) {
+		/*
+		 * We have decremented the lock to count a new reader,
+		 * and have confirmed that no writer has it locked.
+		 */
+		/* update statistics if enabled */
+		if (index > 0) {
+			local_irq_save(flags);
+			lstat_update((void *) rwlock_ptr, this_pc,
+					LSTAT_ACT_NO_WAIT);
+			/* preserve value of TSC so cum_hold_ticks and start_busy use same value */
+			cycles64 = get_cycles64();
+			(*lstat_control.read_lock_counts[cpu])[index].
+				cum_hold_ticks -= cycles64;
+
+			/* record time and cpu of start of busy period */
+			/* this is not perfect (some race conditions are possible) */
+			if (readers_before == 0) {
+				(*lstat_control.read_lock_counts[cpu])[index].
+					start_busy = cycles64;
+				PUT_RW_CPU(rwlock_ptr, cpu);
+			}
+			readers_after = RWLOCK_READERS(rwlock_ptr);
+			if (readers_after >
+				(*lstat_control.read_lock_counts[cpu])[index].
+					max_readers)
+				(*lstat_control.read_lock_counts[cpu])[index].
+					max_readers = readers_after;
+			local_irq_restore(flags);
+		}
+
+		return;
+	}
+	/* If we get here, then we could not quickly grab the read lock */
+
+	start_cycles = get_cycles();	/* start counting the wait time */
+
+	/* Now spin until read_lock is successful */
+	_raw_read_lock(rwlock_ptr);
+
+	lstat_update_time((void *) rwlock_ptr, this_pc, LSTAT_ACT_SPIN,
+			  get_cycles() - start_cycles);
+
+	/* update statistics if they are enabled for this lock */
+	if (index > 0) {
+		local_irq_save(flags);
+		cycles64 = get_cycles64();
+		(*lstat_control.read_lock_counts[cpu])[index].cum_hold_ticks -=
+				cycles64;
+
+		/* this is not perfect (some race conditions are possible) */
+		if (readers_before == 0) {
+			(*lstat_control.read_lock_counts[cpu])[index].
+				start_busy = cycles64;
+			PUT_RW_CPU(rwlock_ptr, cpu);
+		}
+		readers_after = RWLOCK_READERS(rwlock_ptr);
+		if (readers_after >
+		    (*lstat_control.read_lock_counts[cpu])[index].max_readers)
+			(*lstat_control.read_lock_counts[cpu])[index].
+				max_readers = readers_after;
+		local_irq_restore(flags);
+	}
+}
+
+void
+_metered_read_unlock(rwlock_t * rwlock_ptr)
+{
+	int index;
+	int cpu;
+	unsigned long flags;
+	uint64_t busy_length;
+	uint64_t cycles64;
+
+	if (lstat_control.state == LSTAT_OFF) {
+		_raw_read_unlock(rwlock_ptr);
+		return;
+	}
+
+	index = GET_RWINDEX(rwlock_ptr);
+	cpu = THIS_CPU_NUMBER;
+
+	if (index > 0) {
+		local_irq_save(flags);
+		/*
+		 * preserve value of TSC so cum_hold_ticks and busy_ticks are
+		 * consistent.
+		 */
+		cycles64 = get_cycles64();
+		(*lstat_control.read_lock_counts[cpu])[index].cum_hold_ticks +=
+			cycles64;
+		(*lstat_control.read_lock_counts[cpu])[index].read_lock_count++;
+
+		/*
+		 * once again, this is not perfect (some race conditions are
+		 * possible)
+		 */
+		if (RWLOCK_READERS(rwlock_ptr) == 1) {
+			int cpu1 = GET_RW_CPU(rwlock_ptr);
+			uint64_t last_start_busy =
+				(*lstat_control.read_lock_counts[cpu1])[index].
+					start_busy;
+			(*lstat_control.read_lock_counts[cpu])[index].
+				busy_periods++;
+			if (cycles64 > last_start_busy) {
+				busy_length = cycles64 - last_start_busy;
+				(*lstat_control.read_lock_counts[cpu])[index].
+					busy_ticks += busy_length;
+				if (busy_length >
+					(*lstat_control.
+						read_lock_counts[cpu])[index].
+							max_busy)
+					(*lstat_control.
+					 read_lock_counts[cpu])[index].
+						max_busy = busy_length;
+			}
+		}
+		local_irq_restore(flags);
+	}
+	_raw_read_unlock(rwlock_ptr);
+}
+
+void
+_metered_write_lock(rwlock_t * rwlock_ptr)
+{
+	uint32_t start_cycles;
+	void *this_pc;
+	uint32_t spin_ticks = 0; /* in anticipation of a potential wait */
+	int index;
+	int write_index = 0;
+	int cpu;
+	enum {
+		writer_writer_conflict,
+		writer_reader_conflict
+	} why_wait = writer_writer_conflict;
+
+	if (lstat_control.state == LSTAT_OFF) {
+		_raw_write_lock(rwlock_ptr);
+		/* clean index in case lockmetering turns on before an unlock */
+		PUT_RWINDEX(rwlock_ptr, 0);
+		return;
+	}
+
+	this_pc = LSTAT_RA(LSTAT_RA_WRITE);
+	cpu = THIS_CPU_NUMBER;
+	index = GET_RWINDEX(rwlock_ptr);
+
+	/* allocate the global stats entry for this lock, if needed */
+	if (index == 0) {
+		index = alloc_rwlock_struct(rwlock_ptr);
+	}
+
+	if (_raw_write_trylock(rwlock_ptr)) {
+		/* We acquired the lock on the first try */
+		write_index = lstat_update((void *) rwlock_ptr, this_pc,
+					LSTAT_ACT_NO_WAIT);
+		/* save the write_index for use in unlock if stats enabled */
+		if (index > 0)
+			(*lstat_control.read_lock_counts[cpu])[index].
+				write_index = write_index;
+		return;
+	}
+
+	/* If we get here, then we could not quickly grab the write lock */
+	start_cycles = get_cycles();	/* start counting the wait time */
+
+	why_wait = RWLOCK_READERS(rwlock_ptr) ?
+			writer_reader_conflict : writer_writer_conflict;
+
+	/* Now set the lock and wait for conflicts to disappear */
+	_raw_write_lock(rwlock_ptr);
+
+	spin_ticks = get_cycles() - start_cycles;
+
+	/* update stats -- if enabled */
+	if (index > 0 && spin_ticks) {
+		if (why_wait == writer_reader_conflict) {
+			/* waited due to a reader holding the lock */
+			write_index = lstat_update_time((void *)rwlock_ptr,
+					this_pc, LSTAT_ACT_SPIN, spin_ticks);
+		} else {
+			/*
+			 * waited due to another writer holding the lock
+			 */
+			write_index = lstat_update_time((void *)rwlock_ptr,
+				this_pc, LSTAT_ACT_WW_SPIN, spin_ticks);
+			(*lstat_control.counts[cpu])[write_index].
+				cum_wait_ww_ticks += spin_ticks;
+			if (spin_ticks >
+				(*lstat_control.counts[cpu])[write_index].
+					max_wait_ww_ticks) {
+				(*lstat_control.counts[cpu])[write_index].
+					max_wait_ww_ticks = spin_ticks;
+			}
+		}
+
+		/* save the directory index for use on write_unlock */
+		(*lstat_control.read_lock_counts[cpu])[index].
+			write_index = write_index;
+	}
+}
+
+void
+_metered_write_unlock(rwlock_t * rwlock_ptr)
+{
+	int index;
+	int cpu;
+	int write_index;
+	uint32_t hold_time;
+
+	if (lstat_control.state == LSTAT_OFF) {
+		_raw_write_unlock(rwlock_ptr);
+		return;
+	}
+
+	cpu = THIS_CPU_NUMBER;
+	index = GET_RWINDEX(rwlock_ptr);
+
+	/* update statistics if stats enabled for this lock */
+	if (index > 0) {
+		write_index =
+		    (*lstat_control.read_lock_counts[cpu])[index].write_index;
+
+		hold_time = get_cycles() -
+			(*lstat_control.counts[cpu])[write_index].acquire_time;
+		(*lstat_control.counts[cpu])[write_index].cum_hold_ticks +=
+			(uint64_t) hold_time;
+		if ((*lstat_control.counts[cpu])[write_index].max_hold_ticks <
+				hold_time)
+			(*lstat_control.counts[cpu])[write_index].
+				max_hold_ticks = hold_time;
+	}
+	_raw_write_unlock(rwlock_ptr);
+}
+
+int
+_metered_write_trylock(rwlock_t * rwlock_ptr)
+{
+	int retval;
+	void *this_pc = LSTAT_RA(LSTAT_RA_WRITE);
+
+	if ((retval = _raw_write_trylock(rwlock_ptr))) {
+		lstat_update(rwlock_ptr, this_pc, LSTAT_ACT_NO_WAIT);
+	} else {
+		lstat_update(rwlock_ptr, this_pc, LSTAT_ACT_REJECT);
+	}
+
+	return retval;
+}
+
+static void
+init_control_space(void)
+{
+	/* Set all control space pointers to null and indices to "empty" */
+	int cpu;
+
+	/*
+	 * Access CPU_CYCLE_FREQUENCY at the outset, which in some
+	 * architectures may trigger a runtime calculation that uses a
+	 * spinlock.  Let's do this before lockmetering is turned on.
+	 */
+	if (CPU_CYCLE_FREQUENCY == 0)
+		BUG();
+
+	lstat_control.hashtab = NULL;
+	lstat_control.dir = NULL;
+	for (cpu = 0; cpu < NR_CPUS; cpu++) {
+		lstat_control.counts[cpu] = NULL;
+		lstat_control.read_lock_counts[cpu] = NULL;
+	}
+}
+
+static int
+reset_lstat_data(void)
+{
+	int cpu, flags;
+
+	flags = 0;
+	lstat_control.next_free_dir_index = 1;	/* 0 is for overflows */
+	lstat_control.next_free_read_lock_index = 1;
+	lstat_control.dir_overflow = 0;
+	lstat_control.rwlock_overflow = 0;
+
+	lstat_control.started_cycles64 = 0;
+	lstat_control.ending_cycles64 = 0;
+	lstat_control.enabled_cycles64 = 0;
+	lstat_control.first_started_time = 0;
+	lstat_control.started_time = 0;
+	lstat_control.ending_time = 0;
+	lstat_control.intervals = 0;
+
+	/*
+	 * paranoia -- in case someone does a "lockstat reset" before
+	 * "lockstat on"
+	 */
+	if (lstat_control.hashtab) {
+		bzero(lstat_control.hashtab,
+			LSTAT_HASH_TABLE_SIZE * sizeof (short));
+		bzero(lstat_control.dir, LSTAT_MAX_STAT_INDEX *
+				sizeof (lstat_directory_entry_t));
+
+		for (cpu = 0; cpu < num_online_cpus(); cpu++) {
+			bzero(lstat_control.counts[cpu],
+				sizeof (lstat_cpu_counts_t));
+			bzero(lstat_control.read_lock_counts[cpu],
+				sizeof (lstat_read_lock_cpu_counts_t));
+		}
+	}
+#ifdef NOTDEF
+	_raw_spin_unlock(&lstat_control.directory_lock);
+	local_irq_restore(flags);
+#endif
+	return 1;
+}
+
+static void
+release_control_space(void)
+{
+	/*
+	 * Called when either (1) allocation of kmem
+	 * or (2) when user writes LSTAT_RELEASE to /pro/lockmeter.
+	 * Assume that all pointers have been initialized to zero,
+	 * i.e., nonzero pointers are valid addresses.
+	 */
+	int cpu;
+
+	if (lstat_control.hashtab) {
+		kfree(lstat_control.hashtab);
+		lstat_control.hashtab = NULL;
+	}
+
+	if (lstat_control.dir) {
+		vfree(lstat_control.dir);
+		lstat_control.dir = NULL;
+	}
+
+	for (cpu = 0; cpu < NR_CPUS; cpu++) {
+		if (lstat_control.counts[cpu]) {
+			vfree(lstat_control.counts[cpu]);
+			lstat_control.counts[cpu] = NULL;
+		}
+		if (lstat_control.read_lock_counts[cpu]) {
+			kfree(lstat_control.read_lock_counts[cpu]);
+			lstat_control.read_lock_counts[cpu] = NULL;
+		}
+	}
+}
+
+int
+get_lockmeter_info_size(void)
+{
+	return sizeof (lstat_user_request_t)
+		+ num_online_cpus() * sizeof (lstat_cpu_counts_t)
+		+ num_online_cpus() * sizeof (lstat_read_lock_cpu_counts_t)
+		+ (LSTAT_MAX_STAT_INDEX * sizeof (lstat_directory_entry_t));
+}
+
+ssize_t
+get_lockmeter_info(char *buffer, size_t max_len, loff_t * last_index)
+{
+	lstat_user_request_t req;
+	struct timeval tv;
+	ssize_t next_ret_bcount;
+	ssize_t actual_ret_bcount = 0;
+	int cpu;
+
+	*last_index = 0;	/* a one-shot read */
+
+	req.lstat_version = LSTAT_VERSION;
+	req.state = lstat_control.state;
+	req.maxcpus = num_online_cpus();
+	req.cycleval = CPU_CYCLE_FREQUENCY;
+#ifdef notyet
+	req.kernel_magic_addr = (void *) &_etext;
+	req.kernel_end_addr = (void *) &_etext;
+#endif
+	req.uts = system_utsname;
+	req.intervals = lstat_control.intervals;
+
+	req.first_started_time = lstat_control.first_started_time;
+	req.started_time = lstat_control.started_time;
+	req.started_cycles64 = lstat_control.started_cycles64;
+
+	req.next_free_dir_index = lstat_control.next_free_dir_index;
+	req.next_free_read_lock_index = lstat_control.next_free_read_lock_index;
+	req.dir_overflow = lstat_control.dir_overflow;
+	req.rwlock_overflow = lstat_control.rwlock_overflow;
+
+	if (lstat_control.state == LSTAT_OFF) {
+		if (req.intervals == 0) {
+			/* mesasurement is off and no valid data present */
+			next_ret_bcount = sizeof (lstat_user_request_t);
+			req.enabled_cycles64 = 0;
+
+			if ((actual_ret_bcount + next_ret_bcount) > max_len)
+				return actual_ret_bcount;
+
+			copy_to_user(buffer, (void *) &req, next_ret_bcount);
+			actual_ret_bcount += next_ret_bcount;
+			return actual_ret_bcount;
+		} else {
+			/*
+			 * measurement is off but valid data present
+			 * fetch time info from lstat_control
+			 */
+			req.ending_time = lstat_control.ending_time;
+			req.ending_cycles64 = lstat_control.ending_cycles64;
+			req.enabled_cycles64 = lstat_control.enabled_cycles64;
+		}
+	} else {
+		/*
+		 * this must be a read while data active--use current time,
+		 * etc
+		 */
+		do_gettimeofday(&tv);
+		req.ending_time = tv.tv_sec;
+		req.ending_cycles64 = get_cycles64();
+		req.enabled_cycles64 = req.ending_cycles64 -
+			req.started_cycles64 + lstat_control.enabled_cycles64;
+	}
+
+	next_ret_bcount = sizeof (lstat_user_request_t);
+	if ((actual_ret_bcount + next_ret_bcount) > max_len)
+		return actual_ret_bcount;
+
+	copy_to_user(buffer, (void *) &req, next_ret_bcount);
+	actual_ret_bcount += next_ret_bcount;
+
+	if (!lstat_control.counts[0])	/* not initialized? */
+		return actual_ret_bcount;
+
+	next_ret_bcount = sizeof (lstat_cpu_counts_t);
+	for (cpu = 0; cpu < num_online_cpus(); cpu++) {
+		if ((actual_ret_bcount + next_ret_bcount) > max_len)
+			return actual_ret_bcount;	/* leave early */
+		copy_to_user(buffer + actual_ret_bcount,
+				lstat_control.counts[cpu], next_ret_bcount);
+		actual_ret_bcount += next_ret_bcount;
+	}
+
+	next_ret_bcount = LSTAT_MAX_STAT_INDEX *
+			sizeof (lstat_directory_entry_t);
+	if (((actual_ret_bcount + next_ret_bcount) > max_len)
+			|| !lstat_control.dir)
+		return actual_ret_bcount;	/* leave early */
+
+	copy_to_user(buffer + actual_ret_bcount, lstat_control.dir,
+			next_ret_bcount);
+	actual_ret_bcount += next_ret_bcount;
+
+	next_ret_bcount = sizeof (lstat_read_lock_cpu_counts_t);
+	for (cpu = 0; cpu < num_online_cpus(); cpu++) {
+		if (actual_ret_bcount + next_ret_bcount > max_len)
+			return actual_ret_bcount;
+		copy_to_user(buffer + actual_ret_bcount,
+				lstat_control.read_lock_counts[cpu],
+				next_ret_bcount);
+		actual_ret_bcount += next_ret_bcount;
+	}
+
+	return actual_ret_bcount;
+}
+
+/*
+ *  Writing to the /proc lockmeter node enables or disables metering.
+ *  based upon the first byte of the "written" data.
+ *  The following values are defined:
+ *  LSTAT_ON: 1st call: allocates storage, intializes and turns on measurement
+ *            subsequent calls just turn on measurement
+ *  LSTAT_OFF: turns off measurement
+ *  LSTAT_RESET: resets statistics
+ *  LSTAT_RELEASE: releases statistics storage
+ *
+ *  This allows one to accumulate statistics over several lockstat runs:
+ *
+ *  lockstat on
+ *  lockstat off
+ *  ...repeat above as desired...
+ *  lockstat get
+ *  ...now start a new set of measurements...
+ *  lockstat reset
+ *  lockstat on
+ *  ...
+ *
+ */
+ssize_t
+put_lockmeter_info(const char *buffer, size_t len)
+{
+	int error = 0;
+	int dirsize, countsize, read_lock_countsize, hashsize;
+	int cpu;
+	char put_char;
+	int i, read_lock_blocks;
+	unsigned long flags;
+	rwlock_t *lock_ptr;
+	struct timeval tv;
+
+	if (len <= 0)
+		return -EINVAL;
+
+	_raw_spin_lock(&lstat_control.control_lock);
+
+	get_user(put_char, buffer);
+	switch (put_char) {
+
+	case LSTAT_OFF:
+		if (lstat_control.state != LSTAT_OFF) {
+			/*
+			 * To avoid seeing read lock hold times in an
+			 * inconsisent state, we have to follow this protocol
+			 * to turn off statistics
+			 */
+			local_irq_save(flags);
+			/*
+			 * getting this lock will stop any read lock block
+			 * allocations
+			 */
+			_raw_spin_lock(&lstat_control.directory_lock);
+			/*
+			 * keep any more read lock blocks from being
+			 * allocated
+			 */
+			lstat_control.state = LSTAT_OFF;
+			/* record how may read lock blocks there are */
+			read_lock_blocks =
+				lstat_control.next_free_read_lock_index;
+			_raw_spin_unlock(&lstat_control.directory_lock);
+			/* now go through the list of read locks */
+			cpu = THIS_CPU_NUMBER;
+			for (i = 1; i < read_lock_blocks; i++) {
+				lock_ptr =
+				    (*lstat_control.read_lock_counts[cpu])[i].
+				    lock_ptr;
+				/* is this saved lock address still valid? */
+				if (GET_RWINDEX(lock_ptr) == i) {
+					/*
+					 * lock address appears to still be
+					 * valid because we only hold one lock
+					 * at a time, this can't cause a
+					 * deadlock unless this is a lock held
+					 * as part of the current system call
+					 * path. At the moment there
+					 * are no READ mode locks held to get
+					 * here from user space, so we solve
+					 * this by skipping locks held in
+					 * write mode.
+					 */
+					if (RWLOCK_IS_WRITE_LOCKED(lock_ptr)) {
+						PUT_RWINDEX(lock_ptr, 0);
+						continue;
+					}
+					/*
+					 * now we know there are no read
+					 * holders of this lock! stop
+					 * statistics collection for this
+					 * lock
+					 */
+					_raw_write_lock(lock_ptr);
+					PUT_RWINDEX(lock_ptr, 0);
+					_raw_write_unlock(lock_ptr);
+				}
+				/*
+				 * it may still be possible for the hold time
+				 * sum to be negative e.g. if a lock is
+				 * reallocated while "busy" we will have to fix
+				 * this up in the data reduction program.
+				 */
+			}
+			local_irq_restore(flags);
+			lstat_control.intervals++;
+			lstat_control.ending_cycles64 = get_cycles64();
+			lstat_control.enabled_cycles64 +=
+				lstat_control.ending_cycles64 -
+				lstat_control.started_cycles64;
+			do_gettimeofday(&tv);
+			lstat_control.ending_time = tv.tv_sec;
+			/*
+			 * don't deallocate the structures -- we may do a
+			 * lockstat on to add to the data that is already
+			 * there. Use LSTAT_RELEASE to release storage
+			 */
+		} else {
+			error = -EBUSY;	/* already OFF */
+		}
+		break;
+
+	case LSTAT_ON:
+		if (lstat_control.state == LSTAT_OFF) {
+#ifdef DEBUG_LOCKMETER
+			printk("put_lockmeter_info(cpu=%d): LSTAT_ON\n",
+				THIS_CPU_NUMBER);
+#endif
+			lstat_control.next_free_dir_index = 1;	/* 0 is for overflows */
+
+			dirsize = LSTAT_MAX_STAT_INDEX *
+					sizeof (lstat_directory_entry_t);
+			hashsize =
+				(1 + LSTAT_HASH_TABLE_SIZE) * sizeof (ushort);
+			countsize = sizeof (lstat_cpu_counts_t);
+			read_lock_countsize =
+				sizeof (lstat_read_lock_cpu_counts_t);
+#ifdef DEBUG_LOCKMETER
+			printk(" dirsize:%d", dirsize);
+			printk(" hashsize:%d", hashsize);
+			printk(" countsize:%d", countsize);
+			printk(" read_lock_countsize:%d\n",
+				read_lock_countsize);
+#endif
+#ifdef DEBUG_LOCKMETER
+			{
+				int secs;
+				unsigned long cycles;
+				uint64_t cycles64;
+
+				do_gettimeofday(&tv);
+				secs = tv.tv_sec;
+				do {
+					do_gettimeofday(&tv);
+				} while (secs == tv.tv_sec);
+				cycles = get_cycles();
+				cycles64 = get_cycles64();
+				secs = tv.tv_sec;
+				do {
+					do_gettimeofday(&tv);
+				} while (secs == tv.tv_sec);
+				cycles = get_cycles() - cycles;
+				cycles64 = get_cycles64() - cycles;
+				printk("lockmeter: cycleFrequency:%d "
+					"cycles:%d cycles64:%d\n",
+					CPU_CYCLE_FREQUENCY, cycles, cycles64);
+			}
+#endif
+
+			/*
+			 * if this is the first call, allocate storage and
+			 * initialize
+			 */
+			if (!lstat_control.hashtab) {
+
+				spin_lock_init(&lstat_control.directory_lock);
+
+				/* guarantee all pointers at zero */
+				init_control_space();
+
+				lstat_control.hashtab =
+				    kmalloc(hashsize, GFP_KERNEL);
+				if (!lstat_control.hashtab) {
+					error = -ENOSPC;
+#ifdef DEBUG_LOCKMETER
+					printk("!!error kmalloc of hashtab\n");
+#endif
+				}
+				lstat_control.dir = vmalloc(dirsize);
+				if (!lstat_control.dir) {
+					error = -ENOSPC;
+#ifdef DEBUG_LOCKMETER
+					printk("!!error kmalloc of dir\n");
+#endif
+				}
+
+				for (cpu = 0; cpu < num_online_cpus(); cpu++) {
+					lstat_control.counts[cpu] =
+						vmalloc(countsize);
+					if (!lstat_control.counts[cpu]) {
+						error = -ENOSPC;
+#ifdef DEBUG_LOCKMETER
+						printk("!!error vmalloc of "
+							"counts[%d]\n", cpu);
+#endif
+					}
+					lstat_control.read_lock_counts[cpu] =
+						(lstat_read_lock_cpu_counts_t *)
+						kmalloc(read_lock_countsize,
+							GFP_KERNEL);
+					if (!lstat_control.
+							read_lock_counts[cpu]) {
+						error = -ENOSPC;
+#ifdef DEBUG_LOCKMETER
+						printk("!!error kmalloc of "
+						  "read_lock_counts[%d]\n",
+							cpu);
+#endif
+					}
+				}
+			}
+
+			if (error) {
+				/*
+				 * One or more kmalloc failures -- free
+				 * everything
+				 */
+				release_control_space();
+			} else {
+
+				if (!reset_lstat_data()) {
+					error = -EINVAL;
+					break;
+				};
+
+				/*
+				 * record starting and ending times and the
+				 * like
+				 */
+				if (lstat_control.intervals == 0) {
+					do_gettimeofday(&tv);
+					lstat_control.first_started_time =
+						tv.tv_sec;
+				}
+				lstat_control.started_cycles64 = get_cycles64();
+				do_gettimeofday(&tv);
+				lstat_control.started_time = tv.tv_sec;
+
+				lstat_control.state = LSTAT_ON;
+			}
+		} else {
+			error = -EBUSY;	/* already ON */
+		}
+		break;
+
+	case LSTAT_RESET:
+		if (lstat_control.state == LSTAT_OFF) {
+			if (!reset_lstat_data())
+				error = -EINVAL;
+		} else {
+			error = -EBUSY;	/* still on; can't reset */
+		}
+		break;
+
+	case LSTAT_RELEASE:
+		if (lstat_control.state == LSTAT_OFF) {
+			release_control_space();
+			lstat_control.intervals = 0;
+			lstat_control.enabled_cycles64 = 0;
+		} else {
+			error = -EBUSY;
+		}
+		break;
+
+	default:
+		error = -EINVAL;
+	}			/* switch */
+
+	_raw_spin_unlock(&lstat_control.control_lock);
+	return error ? error : len;
+}
+
+#ifdef USER_MODE_TESTING
+/* following used for user mode testing */
+void
+lockmeter_init()
+{
+	int dirsize, hashsize, countsize, read_lock_countsize, cpu;
+
+	printf("lstat_control is at %x size=%d\n", &lstat_control,
+		sizeof (lstat_control));
+	printf("sizeof(spinlock_t)=%d\n", sizeof (spinlock_t));
+	lstat_control.state = LSTAT_ON;
+
+	lstat_control.directory_lock = SPIN_LOCK_UNLOCKED;
+	lstat_control.next_free_dir_index = 1;	/* 0 is for overflows */
+	lstat_control.next_free_read_lock_index = 1;
+
+	dirsize = LSTAT_MAX_STAT_INDEX * sizeof (lstat_directory_entry_t);
+	hashsize = (1 + LSTAT_HASH_TABLE_SIZE) * sizeof (ushort);
+	countsize = sizeof (lstat_cpu_counts_t);
+	read_lock_countsize = sizeof (lstat_read_lock_cpu_counts_t);
+
+	lstat_control.hashtab = (ushort *) malloc(hashsize);
+
+	if (lstat_control.hashtab == 0) {
+		printf("malloc failure for at line %d in lockmeter.c\n",
+			__LINE__);
+		exit(0);
+	}
+
+	lstat_control.dir = (lstat_directory_entry_t *) malloc(dirsize);
+
+	if (lstat_control.dir == 0) {
+		printf("malloc failure for at line %d in lockmeter.c\n", cpu,
+			__LINE__);
+		exit(0);
+	}
+
+	for (cpu = 0; cpu < num_online_cpus(); cpu++) {
+		int j, k;
+		j = (int) (lstat_control.counts[cpu] =
+			   (lstat_cpu_counts_t *) malloc(countsize));
+		k = (int) (lstat_control.read_lock_counts[cpu] =
+			   (lstat_read_lock_cpu_counts_t *)
+			   malloc(read_lock_countsize));
+		if (j * k == 0) {
+			printf("malloc failure for cpu=%d at line %d in "
+				"lockmeter.c\n", cpu, __LINE__);
+			exit(0);
+		}
+	}
+
+	memset(lstat_control.hashtab, 0, hashsize);
+	memset(lstat_control.dir, 0, dirsize);
+
+	for (cpu = 0; cpu < num_online_cpus(); cpu++) {
+		memset(lstat_control.counts[cpu], 0, countsize);
+		memset(lstat_control.read_lock_counts[cpu], 0,
+			read_lock_countsize);
+	}
+}
+
+asm(" \
+.align	4 \
+.globl	__write_lock_failed \
+__write_lock_failed: \
+	" LOCK "addl	$" RW_LOCK_BIAS_STR ",(%eax) \
+1:	cmpl	$" RW_LOCK_BIAS_STR ",(%eax) \
+	jne	1b \
+\
+	" LOCK "subl	$" RW_LOCK_BIAS_STR ",(%eax) \
+	jnz	__write_lock_failed \
+	ret \
+\
+\
+.align	4 \
+.globl	__read_lock_failed \
+__read_lock_failed: \
+	lock ; incl	(%eax) \
+1:	cmpl	$1,(%eax) \
+	js	1b \
+\
+	lock ; decl	(%eax) \
+	js	__read_lock_failed \
+	ret \
+");
+#endif
+
+EXPORT_SYMBOL(_metered_spin_lock);
+EXPORT_SYMBOL(_metered_spin_unlock);
+EXPORT_SYMBOL(_metered_spin_trylock);
+EXPORT_SYMBOL(_metered_read_lock);
+EXPORT_SYMBOL(_metered_read_unlock);
+EXPORT_SYMBOL(_metered_write_lock);
+EXPORT_SYMBOL(_metered_write_unlock);
--- diff/lib/int_sqrt.c	1970-01-01 01:00:00.000000000 +0100
+++ source/lib/int_sqrt.c	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,32 @@
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+
+/**
+ * int_sqrt - rough approximation to sqrt
+ * @x: integer of which to calculate the sqrt
+ *
+ * A very rough approximation to the sqrt() function.
+ */
+unsigned long int_sqrt(unsigned long x)
+{
+	unsigned long op, res, one;
+
+	op = x;
+	res = 0;
+
+	one = 1 << 30;
+	while (one > op)
+		one >>= 2;
+
+	while (one != 0) {
+		if (op >= res + one) {
+			op = op - (res + one);
+			res = res +  2 * one;
+		}
+		res /= 2;
+		one /= 4;
+	}
+	return res;
+}
+EXPORT_SYMBOL(int_sqrt);
--- diff/lib/mask.c	1970-01-01 01:00:00.000000000 +0100
+++ source/lib/mask.c	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,178 @@
+/*
+ * lib/mask.c
+ *
+ * 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 Silicon Graphics, Inc.  All Rights Reserved.
+ */
+
+/*
+ * Routines to manipulate multi-word bit masks, such as cpumasks.
+ *
+ * The ascii representation of multi-word bit masks displays each
+ * 32bit word in hex (not zero filled), and for masks longer than
+ * one word, uses a comma separator between words.  Words are
+ * displayed in big-endian order most significant first.  And hex
+ * digits within a word are also in big-endian order, of course.
+ *
+ * Examples:
+ *   A mask with just bit 0 set displays as "1".
+ *   A mask with just bit 127 set displays as "80000000,0,0,0".
+ *   A mask with just bit 64 set displays as "1,0,0".
+ *   A mask with bits 0, 1, 2, 4, 8, 16, 32 and 64 set displays
+ *     as "1,1,10117".  The first "1" is for bit 64, the second
+ *     for bit 32, the third for bit 16, and so forth, to the
+ *     "7", which is for bits 2, 1 and 0.
+ *   A mask with bits 32 through 39 set displays as "ff,0".
+ *
+ * The internal binary representation of masks is as one or
+ * an array of unsigned longs, perhaps wrapped in a struct for
+ * convenient use as an lvalue.  The following code doesn't know
+ * about any such struct details, relying on inline macros in
+ * files such as cpumask.h to pass in an unsigned long pointer
+ * and a length (in bytes), describing the mask contents.
+ * The 32bit words in the array are in little-endian order,
+ * low order word first.  Beware that this is the reverse order
+ * of the ascii representation.
+ *
+ * Even though the size of the input mask is provided in bytes,
+ * the following code may assume that the mask is a multiple of
+ * 32 or 64 bit words long, and ignore any fractional portion
+ * of a word at the end.  The main reason the size is passed in
+ * bytes is because it is so easy to write 'sizeof(somemask_t)'
+ * in the macros.
+ *
+ * Masks are not a single,simple type, like classic 'C'
+ * nul-term strings.  Rather they are a family of types, one
+ * for each different length.  Inline macros are used to pick
+ * up the actual length, where it is known to the compiler, and
+ * pass it down to these routines, which work on any specified
+ * length array of unsigned longs.  Poor man's templates.
+ *
+ * Many of the inline macros don't call into the following
+ * routines.  Some of them call into other kernel routines,
+ * such as memset(), set_bit() or ffs().  Some of them can
+ * accomplish their task right inline, such as returning the
+ * size or address of the unsigned long array, or optimized
+ * versions of the macros for the most common case of an array
+ * of a single unsigned long.
+ */
+
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/ctype.h>
+#include <linux/slab.h>
+#include <linux/errno.h>
+#include <linux/gfp.h>
+#include <asm/uaccess.h>
+
+#define MAX_HEX_PER_BYTE 4	/* dont need > 4 hex chars to encode byte */
+#define BASE 16			/* masks are input in hex (base 16) */
+#define NUL ((char)'\0')	/* nul-terminator */
+
+/**
+ * __mask_snprintf_len - represent multi-word bit mask as string.
+ * @buf: The buffer to place the result into
+ * @buflen: The size of the buffer, including the trailing null space
+ * @maskp: Points to beginning of multi-word bit mask.
+ * @maskbytes: Number of bytes in bit mask at maskp.
+ *
+ * This routine is expected to be called from a macro such as:
+ *
+ * #define cpumask_snprintf(buf, buflen, mask) \
+ *   __mask_snprintf_len(buf, buflen, cpus_addr(mask), sizeof(mask))
+ */
+
+int __mask_snprintf_len(char *buf, unsigned int buflen,
+	const unsigned long *maskp, unsigned int maskbytes)
+{
+	u32 *wordp = (u32 *)maskp;
+	int i = maskbytes/sizeof(u32) - 1;
+	int len = 0;
+	char *sep = "";
+
+	while (i >= 1 && wordp[i] == 0)
+		i--;
+	while (i >= 0) {
+		len += snprintf(buf+len, buflen-len, "%s%x", sep, wordp[i]);
+		sep = ",";
+		i--;
+	}
+	return len;
+}
+
+/**
+ * __mask_parse_len - parse user string into maskbytes mask at maskp
+ * @ubuf: The user buffer from which to take the string
+ * @ubuflen: The size of this buffer, including the terminating char
+ * @maskp: Place resulting mask (array of unsigned longs) here
+ * @masklen: Construct mask at @maskp to have exactly @masklen bytes
+ *
+ * @masklen is a multiple of sizeof(unsigned long).  A mask of
+ * @masklen bytes is constructed starting at location @maskp.
+ * The value of this mask is specified by the user provided
+ * string starting at address @ubuf.  Only bytes in the range
+ * [@ubuf, @ubuf+@ubuflen) can be read from user space, and
+ * reading will stop after the first byte that is not a comma
+ * or valid hex digit in the characters [,0-9a-fA-F], or at
+ * the point @ubuf+@ubuflen, whichever comes first.
+ *
+ * Since the user only needs about 2.25 chars per byte to encode
+ * a mask (one char per nibble plus one comma separator or nul
+ * terminator per byte), we blow them off with -EINVAL if they
+ * claim a @ubuflen more than 4 (MAX_HEX_PER_BYTE) times maskbytes.
+ * An empty word (delimited by two consecutive commas, for example)
+ * is taken as zero.  If @buflen is zero, the entire @maskp is set
+ * to zero.
+ *
+ * If the user provides fewer comma-separated ascii words
+ * than there are 32 bit words in maskbytes, we zero fill the
+ * remaining high order words.  If they provide more, they fail
+ * with -EINVAL.  Each comma-separate ascii word is taken as
+ * a hex representation; leading zeros are ignored, and do not
+ * imply octal.  '00e1', 'e1', '00E1', 'E1' are all the same.
+ * If user passes a word that is larger than fits in a u32,
+ * they fail with -EOVERFLOW.
+ */
+
+int __mask_parse_len(const char __user *ubuf, unsigned int ubuflen,
+	unsigned long *maskp, unsigned int maskbytes)
+{
+	char buf[maskbytes * MAX_HEX_PER_BYTE + sizeof(NUL)];
+	char *bp = buf;
+	u32 *wordp = (u32 *)maskp;
+	char *p;
+	int i, j;
+
+	if (ubuflen > maskbytes * MAX_HEX_PER_BYTE)
+		return -EINVAL;
+	if (copy_from_user(buf, ubuf, ubuflen))
+		return -EFAULT;
+	buf[ubuflen] = NUL;
+
+	/*
+	 * Put the words into wordp[] in big-endian order,
+	 * then go back and reverse them.
+	 */
+	memset(wordp, 0, maskbytes);
+	i = j = 0;
+	while ((p = strsep(&bp, ",")) != NULL) {
+		unsigned long long t;
+		if (j == maskbytes/sizeof(u32))
+			return -EINVAL;
+		t = simple_strtoull(p, 0, BASE);
+		if (t != (u32)t)
+			return -EOVERFLOW;
+		wordp[j++] = t;
+	}
+	--j;
+	while (i < j) {
+		u32 t = wordp[i];
+		wordp[i] = wordp[j];
+		wordp[j] = t;
+		i++, --j;
+	}
+	return 0;
+}
--- diff/mm/usercopy.c	1970-01-01 01:00:00.000000000 +0100
+++ source/mm/usercopy.c	2003-12-29 09:30:42.000000000 +0000
@@ -0,0 +1,277 @@
+/*
+ * linux/mm/usercopy.c
+ *
+ * (C) Copyright 2003 Ingo Molnar
+ *
+ * Generic implementation of all the user-VM access functions, without
+ * relying on being able to access the VM directly.
+ */
+
+#include <linux/module.h>
+#include <linux/sched.h>
+#include <linux/errno.h>
+#include <linux/mm.h>
+#include <linux/highmem.h>
+#include <linux/pagemap.h>
+#include <linux/smp_lock.h>
+#include <linux/ptrace.h>
+#include <linux/interrupt.h>
+
+#include <asm/pgtable.h>
+#include <asm/uaccess.h>
+#include <asm/atomic_kmap.h>
+
+/*
+ * Get kernel address of the user page and pin it.
+ */
+static inline struct page *pin_page(unsigned long addr, int write)
+{
+	struct mm_struct *mm = current->mm ? : &init_mm;
+	struct page *page = NULL;
+	int ret;
+
+	spin_lock(&mm->page_table_lock);
+	/*
+	 * Do a quick atomic lookup first - this is the fastpath.
+	 */
+	page = follow_page(mm, addr, write);
+	if (likely(page != NULL)) {
+		if (!PageReserved(page))
+			get_page(page);
+		spin_unlock(&mm->page_table_lock);
+		return page;
+	}
+
+	/*
+	 * No luck - bad address or need to fault in the page:
+	 */
+	spin_unlock(&mm->page_table_lock);
+
+	/*
+	 * In the context of filemap_copy_from_user(), we are not allowed
+	 * to sleep.  We must fail this usercopy attempt and allow
+	 * filemap_copy_from_user() to recover: drop its atomic kmap and use
+	 * a sleeping kmap instead.
+	 */
+	if (in_atomic())
+		return NULL;
+
+	down_read(&mm->mmap_sem);
+	ret = get_user_pages(current, mm, addr, 1, write, 0, &page, NULL);
+	up_read(&mm->mmap_sem);
+	if (ret <= 0)
+		return NULL;
+	return page;
+}
+
+static inline void unpin_page(struct page *page)
+{
+	put_page(page);
+}
+
+/*
+ * Access another process' address space.
+ * Source/target buffer must be kernel space,
+ * Do not walk the page table directly, use get_user_pages
+ */
+static int rw_vm(unsigned long addr, void *buf, int len, int write)
+{
+	if (!len)
+		return 0;
+
+	/* ignore errors, just check how much was sucessfully transfered */
+	while (len) {
+		struct page *page = NULL;
+		int bytes, offset;
+		void *maddr;
+
+		page = pin_page(addr, write);
+		if (!page)
+			break;
+
+		bytes = len;
+		offset = addr & (PAGE_SIZE-1);
+		if (bytes > PAGE_SIZE-offset)
+			bytes = PAGE_SIZE-offset;
+
+		maddr = kmap_atomic(page, KM_USER_COPY);
+
+#define HANDLE_TYPE(type) \
+	case sizeof(type): *(type *)(maddr+offset) = *(type *)(buf); break;
+
+		if (write) {
+			switch (bytes) {
+			HANDLE_TYPE(char);
+			HANDLE_TYPE(int);
+			HANDLE_TYPE(long long);
+			default:
+				memcpy(maddr + offset, buf, bytes);
+			}
+		} else {
+#undef HANDLE_TYPE
+#define HANDLE_TYPE(type) \
+	case sizeof(type): *(type *)(buf) = *(type *)(maddr+offset); break;
+			switch (bytes) {
+			HANDLE_TYPE(char);
+			HANDLE_TYPE(int);
+			HANDLE_TYPE(long long);
+			default:
+				memcpy(buf, maddr + offset, bytes);
+			}
+#undef HANDLE_TYPE
+		}
+		kunmap_atomic(maddr, KM_USER_COPY);
+		unpin_page(page);
+		len -= bytes;
+		buf += bytes;
+		addr += bytes;
+	}
+
+	return len;
+}
+
+static int str_vm(unsigned long addr, void *buf0, int len, int copy)
+{
+	struct mm_struct *mm = current->mm ? : &init_mm;
+	struct page *page;
+	void *buf = buf0;
+
+	if (!len)
+		return len;
+
+	down_read(&mm->mmap_sem);
+	/* ignore errors, just check how much was sucessfully transfered */
+	while (len) {
+		int bytes, ret, offset, left, copied;
+		char *maddr;
+
+		ret = get_user_pages(current, mm, addr, 1, copy == 2, 0, &page, NULL);
+		if (ret <= 0) {
+			up_read(&mm->mmap_sem);
+			return -EFAULT;
+		}
+
+		bytes = len;
+		offset = addr & (PAGE_SIZE-1);
+		if (bytes > PAGE_SIZE-offset)
+			bytes = PAGE_SIZE-offset;
+
+		maddr = kmap_atomic(page, KM_USER_COPY);
+		if (copy == 2) {
+			memset(maddr + offset, 0, bytes);
+			copied = bytes;
+			left = 0;
+		} else if (copy == 1) {
+			left = strncpy_count(buf, maddr + offset, bytes);
+			copied = bytes - left;
+		} else {
+			copied = strnlen(maddr + offset, bytes);
+			left = bytes - copied;
+		}
+		BUG_ON(bytes < 0 || copied < 0);
+		kunmap_atomic(maddr, KM_USER_COPY);
+		page_cache_release(page);
+		len -= copied;
+		buf += copied;
+		addr += copied;
+		if (left)
+			break;
+	}
+	up_read(&mm->mmap_sem);
+
+	return len;
+}
+
+/*
+ * Copies memory from userspace (ptr) into kernelspace (val).
+ *
+ * returns # of bytes not copied.
+ */
+int get_user_size(unsigned int size, void *val, const void *ptr)
+{
+	int ret;
+
+	if (unlikely(segment_eq(get_fs(), KERNEL_DS)))
+		ret = __direct_copy_from_user(val, ptr, size);
+	else
+		ret = rw_vm((unsigned long)ptr, val, size, 0);
+	if (ret)
+		/*
+		 * Zero the rest:
+		 */
+		memset(val + size - ret, 0, ret);
+	return ret;
+}
+
+/*
+ * Copies memory from kernelspace (val) into userspace (ptr).
+ *
+ * returns # of bytes not copied.
+ */
+int put_user_size(unsigned int size, const void *val, void *ptr)
+{
+	if (unlikely(segment_eq(get_fs(), KERNEL_DS)))
+		return __direct_copy_to_user(ptr, val, size);
+	else
+		return rw_vm((unsigned long)ptr, (void *)val, size, 1);
+}
+
+int copy_str_fromuser_size(unsigned int size, void *val, const void *ptr)
+{
+	int copied, left;
+
+	if (unlikely(segment_eq(get_fs(), KERNEL_DS))) {
+		left = strncpy_count(val, ptr, size);
+		copied = size - left;
+		BUG_ON(copied < 0);
+
+		return copied;
+	}
+	left = str_vm((unsigned long)ptr, val, size, 1);
+	if (left < 0)
+		return left;
+	copied = size - left;
+	BUG_ON(copied < 0);
+
+	return copied;
+}
+
+int strlen_fromuser_size(unsigned int size, const void *ptr)
+{
+	int copied, left;
+
+	if (unlikely(segment_eq(get_fs(), KERNEL_DS))) {
+		copied = strnlen(ptr, size) + 1;
+		BUG_ON(copied < 0);
+
+		return copied;
+	}
+	left = str_vm((unsigned long)ptr, NULL, size, 0);
+	if (left < 0)
+		return 0;
+	copied = size - left + 1;
+	BUG_ON(copied < 0);
+
+	return copied;
+}
+
+int zero_user_size(unsigned int size, void *ptr)
+{
+	int left;
+
+	if (unlikely(segment_eq(get_fs(), KERNEL_DS))) {
+		memset(ptr, 0, size);
+		return 0;
+	}
+	left = str_vm((unsigned long)ptr, NULL, size, 2);
+	if (left < 0)
+		return size;
+	return left;
+}
+
+EXPORT_SYMBOL(get_user_size);
+EXPORT_SYMBOL(put_user_size);
+EXPORT_SYMBOL(zero_user_size);
+EXPORT_SYMBOL(copy_str_fromuser_size);
+EXPORT_SYMBOL(strlen_fromuser_size);
+
--- diff/drivers/media/dvb/ttpci/av7110_firm.h	2003-10-27 09:20:43.000000000 +0000
+++ source/drivers/media/dvb/ttpci/av7110_firm.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,28315 +0,0 @@
-
-#include <asm/types.h>
-
-static u8 Dpram [] = {
-	0xe5, 0x9f, 0xf0, 0x1c, 0xe1, 0xb0, 0xf0, 0x0e, 
-	0xe5, 0x9f, 0xf0, 0x18, 0xe2, 0x5e, 0xf0, 0x04, 
-	0xe2, 0x5e, 0xf0, 0x08, 0xe1, 0xa0, 0x00, 0x00, 
-	0xea, 0x00, 0x00, 0x06, 0xe2, 0x5e, 0xf0, 0x04, 
-	0x2c, 0x00, 0x00, 0xe8, 0x2e, 0x02, 0x5c, 0xcc, 
-	0x2e, 0x01, 0xcb, 0x40, 0xa5, 0xa5, 0x5a, 0x5a, 
-	0x00, 0x1f, 0x15, 0x55, 0x00, 0x00, 0x00, 0x09, 
-	0xe9, 0x2d, 0x5f, 0xff, 0xe1, 0x4f, 0x00, 0x00, 
-	0xe9, 0x2d, 0x00, 0x01, 0xe2, 0x8f, 0x00, 0x01, 
-	0xe1, 0x2f, 0xff, 0x10, 0x21, 0xff, 0x48, 0x25, 
-	0x68, 0x00, 0x40, 0x52, 0x42, 0x08, 0xd1, 0x0b, 
-	0x32, 0x20, 0x0a, 0x00, 0x42, 0x08, 0xd1, 0x07, 
-	0x32, 0x20, 0x0a, 0x00, 0x42, 0x08, 0xd1, 0x03, 
-	0x0a, 0x00, 0x42, 0x08, 0xd0, 0x29, 0x32, 0x20, 
-	0x21, 0x0f, 0x42, 0x08, 0xd1, 0x01, 0x32, 0x10, 
-	0x09, 0x00, 0x21, 0x01, 0x42, 0x08, 0xd1, 0x08, 
-	0x1d, 0x12, 0x21, 0x02, 0x42, 0x08, 0xd1, 0x04, 
-	0x1d, 0x12, 0x21, 0x04, 0x42, 0x08, 0xd1, 0x00, 
-	0x1d, 0x12, 0x48, 0x13, 0x68, 0x00, 0xb4, 0x01, 
-	0x08, 0x90, 0x21, 0x01, 0x40, 0x81, 0x48, 0x0f, 
-	0x60, 0x01, 0x48, 0x0d, 0x58, 0x82, 0x48, 0x01, 
-	0x46, 0x86, 0x47, 0x10, 0x2c, 0x00, 0x00, 0xb1, 
-	0xbc, 0x02, 0x48, 0x0b, 0x68, 0x02, 0x23, 0x20, 
-	0x05, 0x1b, 0x40, 0x1a, 0x43, 0x99, 0x43, 0x11, 
-	0x60, 0x01, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, 
-	0xe8, 0xbd, 0x00, 0x01, 0xe1, 0x69, 0xf0, 0x00, 
-	0xe8, 0xbd, 0x5f, 0xff, 0xe2, 0x5e, 0xf0, 0x04, 
-	0x2e, 0x08, 0x3a, 0xf4, 0x66, 0x00, 0x00, 0x14, 
-	0x66, 0x00, 0x00, 0x18, 0x66, 0x00, 0x00, 0x1c, 
-	0x00, 0x00, 0x00, 0x0c, 0x2e, 0x02, 0x5d, 0xd4, 
-	0x2c, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	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 u8 Root [] = {
-	0xb4, 0x90, 0x49, 0x18, 0x1c, 0x0b, 0x4a, 0x18, 
-	0x1a, 0x50, 0x4f, 0x18, 0x1a, 0x79, 0x10, 0x8f, 
-	0x21, 0x00, 0x2f, 0x00, 0xdd, 0x04, 0xcb, 0x10, 
-	0xc2, 0x10, 0x31, 0x01, 0x42, 0xb9, 0xdb, 0xfa, 
-	0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, 
-	0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, 
-	0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, 
-	0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, 
-	0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, 
-	0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, 
-	0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, 
-	0x49, 0x13, 0x18, 0x08, 0x49, 0x13, 0x60, 0x08, 
-	0xbc, 0x90, 0x47, 0x70, 0x2e, 0x01, 0xc8, 0x08, 
-	0x9e, 0x00, 0x0a, 0x00, 0x2e, 0x01, 0xc9, 0x08, 
-	0x2e, 0x01, 0xc8, 0x58, 0x2e, 0x01, 0xca, 0x28, 
-	0x2e, 0x01, 0xc8, 0x90, 0x2e, 0x01, 0xca, 0x2c, 
-	0x2e, 0x01, 0xc8, 0xac, 0x2e, 0x01, 0xca, 0x30, 
-	0x2e, 0x01, 0xc8, 0x58, 0x2e, 0x01, 0xca, 0x34, 
-	0x2e, 0x01, 0xc8, 0x74, 0x2e, 0x01, 0xca, 0x38, 
-	0x2e, 0x01, 0xc8, 0xac, 0x2e, 0x01, 0xca, 0x3c, 
-	0x2e, 0x01, 0xc8, 0x90, 0x2e, 0x01, 0xca, 0x40, 
-	0x2e, 0x01, 0xc8, 0x08, 0x2e, 0x01, 0xca, 0x44, 
-	0xb5, 0xf0, 0x1c, 0x0c, 0x1c, 0x15, 0x1c, 0x07, 
-	0xb0, 0x82, 0x2a, 0x00, 0xd1, 0x03, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x0e, 0x38, 
-	0x06, 0x00, 0x21, 0x0b, 0x06, 0x89, 0x4b, 0x43, 
-	0x93, 0x01, 0x42, 0x88, 0xd1, 0x32, 0x08, 0x78, 
-	0xd3, 0x05, 0x1e, 0x78, 0x88, 0x00, 0x70, 0x20, 
-	0x34, 0x01, 0x3d, 0x01, 0x37, 0x01, 0x08, 0xb8, 
-	0xd3, 0x0f, 0x2d, 0x02, 0xdb, 0x0d, 0x08, 0x60, 
-	0xd3, 0x06, 0x88, 0x39, 0x0a, 0x09, 0x70, 0x21, 
-	0x88, 0x38, 0x70, 0x60, 0x34, 0x02, 0xe0, 0x02, 
-	0x88, 0x38, 0x80, 0x20, 0x34, 0x02, 0x3d, 0x02, 
-	0x37, 0x02, 0x07, 0xae, 0x0f, 0xb6, 0x1b, 0xad, 
-	0xd0, 0x08, 0x9b, 0x01, 0x68, 0x1b, 0x1c, 0x38, 
-	0x1c, 0x21, 0x1c, 0x2a, 0xf0, 0x18, 0xfb, 0x6a, 
-	0x19, 0x7f, 0x19, 0x64, 0x2e, 0x00, 0xd0, 0x54, 
-	0x68, 0x38, 0x90, 0x00, 0x46, 0x6f, 0x78, 0x38, 
-	0x70, 0x20, 0x34, 0x01, 0x37, 0x01, 0x3e, 0x01, 
-	0xd1, 0xf9, 0xe0, 0x4a, 0x0e, 0x20, 0x06, 0x00, 
-	0x42, 0x88, 0xd1, 0x3f, 0xe0, 0x14, 0x08, 0x60, 
-	0xd3, 0x08, 0x1e, 0x60, 0x88, 0x01, 0x23, 0xff, 
-	0x02, 0x1b, 0x40, 0x19, 0x78, 0x3a, 0x43, 0x11, 
-	0x80, 0x01, 0xe0, 0x06, 0x88, 0x21, 0x06, 0x09, 
-	0x0e, 0x09, 0x78, 0x3a, 0x02, 0x12, 0x43, 0x11, 
-	0x80, 0x21, 0x34, 0x01, 0x3d, 0x01, 0x37, 0x01, 
-	0x07, 0xb8, 0xd0, 0x01, 0x2d, 0x00, 0xdc, 0xe6, 
-	0x07, 0xae, 0x0f, 0xb6, 0x1b, 0xad, 0xd0, 0x06, 
-	0x9b, 0x01, 0x68, 0x1b, 0x1c, 0x38, 0x1c, 0x21, 
-	0x1c, 0x2a, 0xf0, 0x18, 0xfb, 0x33, 0x19, 0x7f, 
-	0x19, 0x64, 0x2e, 0x00, 0xd0, 0x1d, 0x08, 0x60, 
-	0xd3, 0x08, 0x1e, 0x60, 0x88, 0x01, 0x23, 0xff, 
-	0x02, 0x1b, 0x40, 0x19, 0x78, 0x3a, 0x43, 0x11, 
-	0x80, 0x01, 0xe0, 0x06, 0x88, 0x21, 0x06, 0x09, 
-	0x0e, 0x09, 0x78, 0x3a, 0x02, 0x12, 0x43, 0x11, 
-	0x80, 0x21, 0x34, 0x01, 0x37, 0x01, 0x3e, 0x01, 
-	0xd1, 0xe9, 0xe0, 0x06, 0x9b, 0x01, 0x68, 0x1b, 
-	0x1c, 0x38, 0x1c, 0x21, 0x1c, 0x2a, 0xf0, 0x18, 
-	0xfb, 0x11, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x48, 
-	0xb5, 0x00, 0x20, 0x03, 0xf0, 0x03, 0xfc, 0x50, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x4f, 0x10, 
-	0x89, 0x3c, 0x89, 0xbe, 0x8a, 0x3d, 0x23, 0x04, 
-	0x43, 0xdb, 0x68, 0x78, 0x40, 0x18, 0x0c, 0x1a, 
-	0x60, 0x78, 0xb4, 0x04, 0x1c, 0x13, 0x22, 0x00, 
-	0x21, 0x00, 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x54, 
-	0x20, 0x01, 0x60, 0x78, 0xb0, 0x01, 0x4a, 0x07, 
-	0xb4, 0x04, 0x1c, 0x20, 0x1c, 0x31, 0x1c, 0x2a, 
-	0x4b, 0x04, 0xf0, 0x00, 0xf8, 0x49, 0xb0, 0x01, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 
-	0xb5, 0xb0, 0x06, 0x00, 0x0e, 0x00, 0x4f, 0x1d, 
-	0x24, 0x10, 0x68, 0x3b, 0x2b, 0x00, 0xd1, 0x1a, 
-	0x28, 0x00, 0xd0, 0x18, 0x20, 0xa5, 0x01, 0xc0, 
-	0xf0, 0x05, 0xfb, 0x64, 0x60, 0x38, 0x8a, 0xbf, 
-	0x1c, 0x03, 0x2f, 0x00, 0xd0, 0x0c, 0x2b, 0x00, 
-	0xd0, 0x0a, 0x22, 0x01, 0x21, 0x00, 0x20, 0x1c, 
-	0xb4, 0x07, 0x1c, 0x18, 0x22, 0x1d, 0x1c, 0x39, 
-	0x1c, 0x23, 0xf0, 0x0a, 0xfb, 0xc7, 0xb0, 0x03, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x2b, 0x00, 
-	0xd0, 0xfa, 0x28, 0x00, 0xd1, 0xf8, 0x8a, 0xbd, 
-	0x2d, 0x00, 0xd0, 0x0a, 0x22, 0x00, 0x21, 0x00, 
-	0x20, 0x1c, 0xb4, 0x07, 0x1c, 0x18, 0x22, 0x1d, 
-	0x1c, 0x29, 0x1c, 0x23, 0xf0, 0x0a, 0xfb, 0xb2, 
-	0xb0, 0x03, 0x68, 0x38, 0xf0, 0x05, 0xfb, 0x44, 
-	0x20, 0x00, 0x60, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x00, 
-	0xb5, 0xf0, 0x9f, 0x05, 0x04, 0x04, 0x0c, 0x24, 
-	0x04, 0x0d, 0x0c, 0x2d, 0x04, 0x16, 0x0c, 0x36, 
-	0x04, 0x19, 0x0c, 0x09, 0xb0, 0x82, 0x91, 0x00, 
-	0x04, 0x38, 0x0c, 0x00, 0xb0, 0x81, 0x49, 0x89, 
-	0x4f, 0x89, 0x42, 0x8d, 0xd1, 0x00, 0x89, 0xbd, 
-	0x42, 0x8e, 0xd1, 0x00, 0x8a, 0x3e, 0x4a, 0x87, 
-	0x42, 0x95, 0xd1, 0x02, 0x89, 0xbd, 0x08, 0xd3, 
-	0x81, 0xbb, 0x4b, 0x84, 0x42, 0x9e, 0xd1, 0x02, 
-	0x8a, 0x3e, 0x08, 0xdb, 0x82, 0x3b, 0x9a, 0x01, 
-	0x42, 0x8a, 0xd1, 0x01, 0x8a, 0xba, 0x92, 0x01, 
-	0x8a, 0xbb, 0x99, 0x01, 0x42, 0x99, 0xd0, 0x20, 
-	0x68, 0x38, 0x90, 0x02, 0x28, 0x00, 0xd0, 0x1a, 
-	0x2b, 0x00, 0xd0, 0x0a, 0x22, 0x00, 0x21, 0x00, 
-	0x20, 0x1c, 0xb4, 0x07, 0x1c, 0x19, 0x23, 0x10, 
-	0x22, 0x1d, 0x98, 0x05, 0xf0, 0x0a, 0xfb, 0x6a, 
-	0xb0, 0x03, 0x99, 0x01, 0x29, 0x00, 0xd0, 0x0a, 
-	0x22, 0x01, 0x21, 0x00, 0x20, 0x1c, 0xb4, 0x07, 
-	0x99, 0x04, 0x23, 0x10, 0x22, 0x1d, 0x68, 0x38, 
-	0xf0, 0x0a, 0xfb, 0x5c, 0xb0, 0x03, 0x99, 0x01, 
-	0x82, 0xb9, 0x4b, 0x6d, 0x42, 0x9c, 0xd0, 0x37, 
-	0xdc, 0x28, 0x2c, 0x00, 0xd0, 0x2e, 0x3b, 0x02, 
-	0x42, 0x9c, 0xd0, 0x29, 0x4b, 0x69, 0x42, 0x9c, 
-	0xd1, 0x00, 0x1c, 0x34, 0x22, 0x00, 0xb4, 0x04, 
-	0x23, 0x00, 0x49, 0x62, 0x20, 0x1c, 0xf0, 0x0a, 
-	0xfc, 0xe3, 0x89, 0xb8, 0xb0, 0x01, 0x42, 0x85, 
-	0xd1, 0x02, 0x89, 0x38, 0x42, 0x84, 0xd0, 0x44, 
-	0x81, 0xbd, 0x20, 0x1f, 0xf0, 0x0b, 0xf8, 0x1c, 
-	0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 
-	0x21, 0x02, 0x20, 0x1f, 0xf0, 0x0a, 0xfe, 0x94, 
-	0x2d, 0x00, 0xd0, 0x33, 0x2d, 0x01, 0xd1, 0x11, 
-	0x25, 0x00, 0xe0, 0x32, 0x4b, 0x55, 0x42, 0x9c, 
-	0xd0, 0x04, 0x33, 0x01, 0x42, 0x9c, 0xd1, 0xd9, 
-	0x89, 0x3c, 0xe7, 0xd7, 0x2d, 0x00, 0xd0, 0x01, 
-	0x1c, 0x2c, 0xe7, 0xd3, 0x1c, 0x34, 0xe7, 0xd1, 
-	0x1c, 0x2c, 0xe7, 0xcf, 0x42, 0xac, 0xd1, 0x01, 
-	0x20, 0x80, 0xe0, 0x00, 0x20, 0x00, 0x22, 0x00, 
-	0xb4, 0x04, 0x06, 0x00, 0x0e, 0x00, 0x22, 0x02, 
-	0x43, 0x02, 0x23, 0x01, 0x20, 0x1f, 0x1c, 0x29, 
-	0xf0, 0x0a, 0xfc, 0xaa, 0x23, 0x01, 0x02, 0x9b, 
-	0x00, 0x5a, 0x21, 0x01, 0x20, 0x1f, 0xb0, 0x01, 
-	0xf0, 0x0a, 0xfe, 0x66, 0x21, 0x00, 0x20, 0x1f, 
-	0xf0, 0x0b, 0xfb, 0x58, 0x20, 0x01, 0xf0, 0x0d, 
-	0xff, 0x47, 0xe0, 0x02, 0x20, 0x00, 0xf0, 0x0d, 
-	0xff, 0x43, 0x8a, 0x38, 0x42, 0x86, 0xd1, 0x02, 
-	0x89, 0x39, 0x42, 0x8c, 0xd0, 0x52, 0x28, 0x00, 
-	0xd0, 0x0d, 0x20, 0x03, 0xf0, 0x0e, 0xf8, 0x9a, 
-	0x20, 0x1e, 0xf0, 0x0b, 0xf8, 0x97, 0x23, 0x03, 
-	0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, 
-	0x20, 0x1e, 0xf0, 0x0a, 0xfe, 0x45, 0x82, 0x3e, 
-	0x2e, 0x00, 0xd0, 0x3f, 0x42, 0xb4, 0xd1, 0x02, 
-	0x20, 0x80, 0x90, 0x00, 0xe0, 0x01, 0x20, 0x00, 
-	0x90, 0x00, 0xf0, 0x1c, 0xf9, 0x57, 0x23, 0x01, 
-	0x04, 0x1b, 0x43, 0x18, 0xf0, 0x1c, 0xf9, 0x56, 
-	0x21, 0x00, 0x20, 0x00, 0xf0, 0x0e, 0xfd, 0x78, 
-	0x20, 0xff, 0x49, 0x29, 0x68, 0x09, 0x70, 0x08, 
-	0x49, 0x28, 0x48, 0x29, 0x23, 0x1e, 0x22, 0x10, 
-	0xf0, 0x0e, 0xfe, 0xac, 0x48, 0x27, 0x68, 0x00, 
-	0x78, 0x01, 0x23, 0x06, 0x43, 0x19, 0x70, 0x01, 
-	0xf0, 0x1c, 0xf9, 0x3c, 0x4b, 0x24, 0x40, 0x18, 
-	0xf0, 0x1c, 0xf9, 0x3c, 0x22, 0x00, 0xb4, 0x04, 
-	0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x22, 0x02, 
-	0x43, 0x02, 0x23, 0x02, 0x20, 0x1e, 0x1c, 0x31, 
-	0xf0, 0x0a, 0xfc, 0x4a, 0x23, 0x01, 0x02, 0x9b, 
-	0x00, 0x5a, 0x21, 0x01, 0x20, 0x1e, 0xb0, 0x01, 
-	0xf0, 0x0a, 0xfe, 0x06, 0x21, 0x00, 0x20, 0x1e, 
-	0xf0, 0x0b, 0xfa, 0xf8, 0x42, 0xac, 0xd0, 0x13, 
-	0x42, 0xb4, 0xd0, 0x11, 0x2c, 0x00, 0xd0, 0x0f, 
-	0x23, 0x01, 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 
-	0x20, 0x1c, 0xf0, 0x0a, 0xfd, 0xf5, 0x22, 0x00, 
-	0xb4, 0x04, 0x23, 0x00, 0x22, 0x82, 0x20, 0x1c, 
-	0x1c, 0x21, 0xf0, 0x0a, 0xfc, 0x29, 0xb0, 0x01, 
-	0x81, 0x3c, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 
-	0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0xff, 0xfc, 
-	0x2e, 0x08, 0x5e, 0x2c, 0x2e, 0x08, 0x47, 0x60, 
-	0x2e, 0x08, 0x05, 0xa8, 0x2e, 0x08, 0x5e, 0x58, 
-	0xff, 0xfe, 0xff, 0xff, 0xb5, 0x00, 0x22, 0x00, 
-	0xb4, 0x04, 0x04, 0x01, 0x0c, 0x09, 0x23, 0x00, 
-	0x4a, 0x03, 0x1e, 0x50, 0xf7, 0xff, 0xfe, 0xc0, 
-	0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x00, 0x00, 0xff, 0xff, 0xb5, 0x00, 0x22, 0x00, 
-	0xb4, 0x04, 0x04, 0x02, 0x0c, 0x12, 0x23, 0x00, 
-	0x49, 0x03, 0x1e, 0x48, 0xf7, 0xff, 0xfe, 0xb0, 
-	0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x00, 0x00, 0xff, 0xff, 0xb5, 0x00, 0x04, 0x00, 
-	0x0c, 0x00, 0xd0, 0x08, 0x28, 0x01, 0xd0, 0x0b, 
-	0x28, 0x02, 0xd1, 0x02, 0x02, 0x00, 0xf0, 0x0d, 
-	0xff, 0xf1, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x80, 
-	0xf0, 0x0d, 0xff, 0xec, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0xff, 0x30, 0x01, 0xf0, 0x0d, 0xff, 0xe6, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xb0, 0x27, 0x00, 
-	0x4c, 0x1b, 0x20, 0x01, 0x04, 0x80, 0x21, 0x00, 
-	0x22, 0x00, 0xc4, 0x86, 0xc4, 0x84, 0x3c, 0x14, 
-	0xf0, 0x05, 0xf9, 0x70, 0x61, 0x60, 0x28, 0x00, 
-	0xd0, 0x06, 0x21, 0x01, 0x04, 0x89, 0x61, 0xe1, 
-	0x18, 0x41, 0x62, 0x20, 0x61, 0xa1, 0xe0, 0x02, 
-	0x61, 0xe7, 0x61, 0xa7, 0x62, 0x27, 0x68, 0x21, 
-	0x00, 0xc9, 0x4a, 0x10, 0x18, 0x89, 0x60, 0x48, 
-	0x20, 0x00, 0x49, 0x0f, 0x4d, 0x0f, 0x00, 0x42, 
-	0x52, 0x8d, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 
-	0x28, 0x1d, 0xdb, 0xf8, 0x20, 0x00, 0x1c, 0x39, 
-	0x4c, 0x0b, 0x4f, 0x0c, 0x4b, 0x0c, 0x00, 0x42, 
-	0x52, 0xa5, 0x00, 0x82, 0x50, 0xb9, 0x50, 0x99, 
-	0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x28, 0x20, 
-	0xdb, 0xf5, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x00, 0x1c, 0x2e, 0x08, 0x3b, 0x70, 
-	0x2e, 0x08, 0x48, 0xf8, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x49, 0x30, 0x2e, 0x08, 0x49, 0xe8, 
-	0x2e, 0x08, 0x4a, 0x68, 0xb4, 0xf0, 0xb0, 0x81, 
-	0x49, 0x25, 0xc9, 0x0c, 0x39, 0x08, 0x1a, 0xd2, 
-	0x60, 0x8a, 0xd5, 0x02, 0x32, 0xff, 0x32, 0x01, 
-	0x60, 0x8a, 0x6a, 0x0a, 0x62, 0x8a, 0x68, 0x8f, 
-	0x2f, 0xfe, 0xdb, 0x03, 0x20, 0x00, 0xb0, 0x01, 
-	0xbc, 0xf0, 0x47, 0x70, 0x30, 0x03, 0x08, 0x80, 
-	0x00, 0x80, 0x4c, 0x1b, 0x69, 0xa6, 0x69, 0x64, 
-	0x2f, 0x3e, 0xdb, 0x24, 0x00, 0xdb, 0x4f, 0x19, 
-	0x19, 0xdb, 0x68, 0x5b, 0x62, 0x4b, 0x93, 0x00, 
-	0x1a, 0x9f, 0x4b, 0x15, 0x69, 0xdd, 0x2f, 0x00, 
-	0xdc, 0x00, 0x19, 0x7f, 0x23, 0x01, 0x03, 0x1b, 
-	0x18, 0xc3, 0x42, 0xbb, 0xdd, 0x0f, 0x18, 0x17, 
-	0x42, 0xb7, 0xdb, 0x09, 0x9a, 0x00, 0x1b, 0x12, 
-	0x2a, 0x00, 0xdc, 0x00, 0x19, 0x52, 0x42, 0x93, 
-	0xdd, 0x11, 0x18, 0x20, 0x62, 0x08, 0xe0, 0x0e, 
-	0x62, 0x0f, 0x1c, 0x14, 0xe0, 0x0b, 0x18, 0x10, 
-	0x62, 0x08, 0x1c, 0x14, 0xe0, 0x07, 0x18, 0x12, 
-	0x42, 0xb2, 0xdb, 0x00, 0x62, 0x0c, 0x6a, 0x0a, 
-	0x18, 0x10, 0x62, 0x08, 0x1c, 0x14, 0x1c, 0x20, 
-	0xb0, 0x01, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x00, 0x1c, 0x2e, 0x08, 0x3b, 0x70, 
-	0x48, 0x03, 0x6a, 0x81, 0x62, 0x01, 0x69, 0x01, 
-	0x31, 0x01, 0x61, 0x01, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x00, 0x1c, 0xb5, 0xf7, 0x04, 0x05, 
-	0x0c, 0x2d, 0x04, 0x0e, 0x0c, 0x36, 0xb0, 0x81, 
-	0x23, 0x01, 0x03, 0x1b, 0x98, 0x03, 0x42, 0x9e, 
-	0xdd, 0x05, 0x20, 0xff, 0xb0, 0x01, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x4f, 0x24, 
-	0x68, 0xb9, 0x29, 0xff, 0xdb, 0x02, 0x20, 0xff, 
-	0xb0, 0x01, 0xe7, 0xf4, 0x00, 0x69, 0x19, 0x49, 
-	0x00, 0x89, 0x4a, 0x20, 0x18, 0x8c, 0x89, 0x21, 
-	0x29, 0x01, 0xd0, 0x02, 0x20, 0xff, 0xb0, 0x01, 
-	0xe7, 0xe9, 0x79, 0x81, 0x91, 0x00, 0x88, 0xa0, 
-	0x08, 0x40, 0x07, 0x80, 0xd1, 0x02, 0x1c, 0x28, 
-	0xf0, 0x05, 0xfb, 0xca, 0x88, 0xa0, 0x23, 0x06, 
-	0x40, 0x18, 0x28, 0x02, 0xd1, 0x09, 0x88, 0xe0, 
-	0x99, 0x00, 0x42, 0x88, 0xd1, 0x05, 0x1c, 0x28, 
-	0xf0, 0x05, 0xfb, 0xbe, 0x20, 0xff, 0xb0, 0x01, 
-	0xe7, 0xd1, 0x88, 0xe0, 0x4b, 0x10, 0x42, 0x98, 
-	0xd1, 0x01, 0x99, 0x00, 0x80, 0xe1, 0x68, 0x39, 
-	0x00, 0xc8, 0x4a, 0x0e, 0x52, 0x15, 0x18, 0x80, 
-	0x80, 0x46, 0x9a, 0x03, 0x31, 0x01, 0x60, 0x42, 
-	0x20, 0x00, 0x23, 0xff, 0x60, 0x39, 0x33, 0x01, 
-	0x42, 0x99, 0xd1, 0x00, 0x60, 0x38, 0x68, 0xb9, 
-	0x31, 0x01, 0x60, 0xb9, 0x68, 0xfb, 0x42, 0x99, 
-	0xdd, 0x00, 0x60, 0xf9, 0xb0, 0x01, 0xe7, 0xb2, 
-	0x2e, 0x08, 0x00, 0x1c, 0x2e, 0x08, 0x47, 0x78, 
-	0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x3b, 0x70, 
-	0xb5, 0xf0, 0x20, 0xff, 0xb0, 0x82, 0x49, 0x33, 
-	0x91, 0x01, 0x49, 0x33, 0x8e, 0x89, 0x29, 0x00, 
-	0xd0, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x4f, 0x30, 0xcf, 0x0a, 0x3f, 0x08, 
-	0x1a, 0xc9, 0x60, 0xb9, 0x1c, 0x0a, 0xd5, 0x02, 
-	0x1d, 0xd1, 0x31, 0xf9, 0x60, 0xb9, 0x68, 0xb9, 
-	0x29, 0x00, 0xd1, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0xda, 0x49, 0x28, 
-	0x5a, 0x8d, 0x18, 0x51, 0x88, 0x4c, 0x68, 0x49, 
-	0x91, 0x00, 0x00, 0xa9, 0x4a, 0x25, 0x58, 0x56, 
-	0x2e, 0x00, 0xd0, 0x07, 0x48, 0x24, 0x58, 0x43, 
-	0x99, 0x00, 0x1c, 0x28, 0x1c, 0x22, 0xf0, 0x17, 
-	0xff, 0xff, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x29, 
-	0x06, 0xed, 0x0e, 0xed, 0x1c, 0xe0, 0x08, 0x82, 
-	0x00, 0x92, 0x98, 0x00, 0x99, 0x01, 0x6a, 0xfb, 
-	0xf0, 0x17, 0xff, 0xec, 0x00, 0x68, 0x19, 0x40, 
-	0x00, 0x80, 0x49, 0x1a, 0x18, 0x40, 0x88, 0x80, 
-	0x21, 0x0c, 0x40, 0x01, 0x29, 0x0c, 0xd1, 0x04, 
-	0x02, 0x29, 0x31, 0x02, 0x04, 0x09, 0x0c, 0x09, 
-	0xe0, 0x03, 0x02, 0x29, 0x31, 0x01, 0x04, 0x09, 
-	0x0c, 0x09, 0x08, 0x40, 0xd3, 0x04, 0x04, 0x08, 
-	0x0c, 0x00, 0x21, 0x01, 0x03, 0xc9, 0x43, 0x01, 
-	0x48, 0x09, 0x85, 0x01, 0x85, 0x44, 0x21, 0x01, 
-	0x02, 0x49, 0x86, 0x81, 0x68, 0x78, 0x28, 0xff, 
-	0xd1, 0x02, 0x20, 0x00, 0x60, 0x78, 0xe0, 0x01, 
-	0x30, 0x01, 0x60, 0x78, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x02, 0x00, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x00, 0x1c, 
-	0x2e, 0x08, 0x3b, 0x70, 0x2e, 0x08, 0x49, 0xe8, 
-	0x2e, 0x08, 0x4a, 0x68, 0x2e, 0x08, 0x47, 0x78, 
-	0xb4, 0xf0, 0x06, 0x09, 0x0e, 0x09, 0x4f, 0x14, 
-	0x8e, 0xba, 0x2a, 0x00, 0xd0, 0x03, 0x20, 0x00, 
-	0x43, 0xc0, 0xbc, 0xf0, 0x47, 0x70, 0x1c, 0x05, 
-	0x4c, 0x10, 0x1d, 0x48, 0xd5, 0x00, 0x30, 0x01, 
-	0x10, 0x40, 0x04, 0x01, 0x0c, 0x09, 0x20, 0x00, 
-	0x29, 0x02, 0xdb, 0xf2, 0x29, 0xe0, 0xdc, 0xf0, 
-	0x22, 0x00, 0x29, 0x00, 0xdd, 0x07, 0x00, 0x53, 
-	0x5a, 0xee, 0x52, 0xe6, 0x32, 0x01, 0x04, 0x12, 
-	0x0c, 0x12, 0x42, 0x8a, 0xdb, 0xf7, 0x22, 0x04, 
-	0x85, 0x3a, 0x00, 0x49, 0x85, 0x79, 0x21, 0x0f, 
-	0x02, 0x49, 0x86, 0xb9, 0xbc, 0xf0, 0x47, 0x70, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x1e, 0x00, 
-	0xb5, 0xb0, 0x27, 0x00, 0x4d, 0x13, 0x8e, 0xa9, 
-	0x29, 0x00, 0xd0, 0x03, 0x43, 0xf8, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x1c, 0x79, 0x04, 0x09, 
-	0x0c, 0x09, 0x1c, 0x3a, 0x1c, 0x0f, 0x56, 0x81, 
-	0x29, 0x00, 0xd1, 0xf7, 0x24, 0x00, 0x2f, 0xfe, 
-	0xdd, 0x03, 0x27, 0xfe, 0x1d, 0xc1, 0x31, 0xd9, 
-	0x77, 0xcc, 0x1c, 0x7a, 0x49, 0x08, 0xf7, 0xff, 
-	0xfb, 0xc3, 0x20, 0x04, 0x85, 0x28, 0x1c, 0xf8, 
-	0x08, 0x80, 0x00, 0x80, 0x85, 0x68, 0x20, 0x0f, 
-	0x02, 0x40, 0x86, 0xa8, 0x1c, 0x20, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x1f, 0xc0, 
-	0x2c, 0x00, 0x1e, 0x00, 0xb4, 0xf0, 0x4b, 0x1b, 
-	0x8e, 0x9b, 0x2b, 0x00, 0xd0, 0x03, 0x20, 0x00, 
-	0x43, 0xc0, 0xbc, 0xf0, 0x47, 0x70, 0x1c, 0xd4, 
-	0xd5, 0x00, 0x34, 0x01, 0x10, 0x64, 0x1c, 0x0d, 
-	0x4f, 0x15, 0x02, 0x00, 0x04, 0x00, 0x0c, 0x00, 
-	0x78, 0x4e, 0x0a, 0x33, 0xd3, 0x07, 0x06, 0x73, 
-	0x0e, 0x5b, 0x18, 0x59, 0x78, 0x89, 0x43, 0x08, 
-	0x04, 0x00, 0x0c, 0x00, 0xe0, 0x03, 0x78, 0x89, 
-	0x43, 0x08, 0x04, 0x00, 0x0c, 0x00, 0x80, 0x38, 
-	0x20, 0x00, 0x2c, 0x00, 0xdd, 0x06, 0x00, 0x41, 
-	0x5a, 0x6b, 0x19, 0xc9, 0x80, 0x4b, 0x30, 0x01, 
-	0x42, 0xa0, 0xdb, 0xf8, 0x20, 0x0b, 0x49, 0x05, 
-	0x85, 0x08, 0x1c, 0x90, 0x85, 0x48, 0x20, 0x01, 
-	0x02, 0x40, 0x86, 0x88, 0x20, 0x00, 0xbc, 0xf0, 
-	0x47, 0x70, 0x00, 0x00, 0x2c, 0x00, 0x1f, 0xc0, 
-	0x2c, 0x00, 0x02, 0x00, 0x04, 0x02, 0x0c, 0x12, 
-	0x48, 0x0c, 0x6f, 0xc1, 0x20, 0x00, 0x43, 0xc0, 
-	0x29, 0x00, 0xd1, 0x12, 0x49, 0x0a, 0x8e, 0xcb, 
-	0x2b, 0x00, 0xd1, 0x0e, 0x8d, 0x8b, 0x2b, 0x00, 
-	0xd1, 0x0b, 0x48, 0x08, 0x86, 0xc2, 0x23, 0x07, 
-	0x86, 0x83, 0x85, 0x8b, 0x85, 0xca, 0x20, 0x09, 
-	0x02, 0x40, 0x86, 0xc8, 0x20, 0x01, 0x87, 0x88, 
-	0x20, 0x00, 0x47, 0x70, 0x2c, 0x00, 0x1f, 0x80, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x00, 0xc0, 
-	0xb5, 0x80, 0x1c, 0x01, 0x4a, 0x0d, 0x8e, 0xd3, 
-	0x20, 0x00, 0x43, 0xc0, 0x2b, 0x00, 0xd1, 0x12, 
-	0x8d, 0x93, 0x2b, 0x07, 0xd1, 0x0f, 0x8d, 0xd7, 
-	0x20, 0x00, 0x85, 0x90, 0x2f, 0x00, 0xd0, 0x0a, 
-	0x23, 0x01, 0x02, 0xdb, 0x42, 0x9f, 0xdc, 0x06, 
-	0x1c, 0x3a, 0x48, 0x05, 0x4b, 0x05, 0x6a, 0xdb, 
-	0xf0, 0x17, 0xfe, 0xdc, 0x1c, 0x38, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x1f, 0xc0, 
-	0x2c, 0x00, 0x12, 0x00, 0x2e, 0x08, 0x00, 0x1c, 
-	0xb5, 0xf0, 0xb0, 0x83, 0x49, 0x62, 0x8e, 0x88, 
-	0x28, 0x00, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x4e, 0x5f, 0x78, 0x30, 
-	0x49, 0x5f, 0x91, 0x02, 0x78, 0x09, 0x42, 0x88, 
-	0xd1, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0x00, 0x4d, 0x5b, 0x4b, 0x5c, 
-	0x93, 0x01, 0x1d, 0xd9, 0x31, 0x19, 0x7d, 0x0a, 
-	0x00, 0x53, 0x18, 0x9b, 0x01, 0x1b, 0x19, 0x5b, 
-	0x78, 0xdc, 0x1c, 0x1f, 0x79, 0x1b, 0x42, 0x9c, 
-	0xd1, 0x04, 0x79, 0x7b, 0x07, 0xdb, 0x0f, 0xdb, 
-	0x2b, 0x01, 0xd1, 0x06, 0x7d, 0x0b, 0x93, 0x00, 
-	0x32, 0x01, 0x07, 0x52, 0x0f, 0x52, 0x75, 0x0a, 
-	0xe0, 0x08, 0x32, 0x01, 0x07, 0x52, 0x0f, 0x52, 
-	0x75, 0x0a, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 
-	0x28, 0x08, 0xdb, 0xe0, 0x28, 0x08, 0xd1, 0x03, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x98, 0x00, 0x00, 0x43, 0x18, 0x18, 0x01, 0x00, 
-	0x19, 0x47, 0x78, 0xf8, 0x00, 0xc0, 0x19, 0xc0, 
-	0x89, 0x84, 0x23, 0x01, 0x03, 0x1b, 0x42, 0x9c, 
-	0xdd, 0x00, 0x1c, 0x1c, 0x68, 0x81, 0x89, 0xc0, 
-	0x18, 0x08, 0x1c, 0xe1, 0x08, 0x8a, 0x00, 0x92, 
-	0x49, 0x3e, 0x9b, 0x01, 0x6a, 0xdb, 0xf0, 0x17, 
-	0xfe, 0x79, 0x88, 0x38, 0x02, 0x00, 0x30, 0x09, 
-	0x49, 0x35, 0x85, 0x08, 0x85, 0x4c, 0x20, 0x01, 
-	0x02, 0x40, 0x86, 0x88, 0x78, 0xf8, 0x00, 0xc0, 
-	0x19, 0xc0, 0x89, 0xc1, 0x19, 0x09, 0x81, 0xc1, 
-	0x78, 0xf8, 0x00, 0xc0, 0x19, 0xc0, 0x89, 0x81, 
-	0x1b, 0x09, 0x81, 0x81, 0x78, 0xf8, 0x00, 0xc0, 
-	0x19, 0xc0, 0x89, 0x81, 0x29, 0x00, 0xd1, 0x4f, 
-	0x24, 0x00, 0x81, 0xc4, 0x78, 0xf9, 0x6a, 0xb8, 
-	0x18, 0x40, 0x73, 0x04, 0x78, 0xf8, 0x30, 0x01, 
-	0x07, 0x80, 0x0f, 0x80, 0x70, 0xf8, 0x78, 0x30, 
-	0x30, 0x01, 0x70, 0x30, 0x78, 0xf8, 0x79, 0x39, 
-	0x42, 0x88, 0xd1, 0x3d, 0x79, 0x78, 0x21, 0x02, 
-	0x40, 0x01, 0x29, 0x02, 0xd1, 0x1e, 0x70, 0xfc, 
-	0x71, 0x3c, 0x71, 0x7c, 0x49, 0x22, 0x80, 0x39, 
-	0x6a, 0xb8, 0x68, 0x00, 0xf0, 0x04, 0xfe, 0xac, 
-	0x6a, 0xb8, 0xf0, 0x04, 0xfe, 0xa9, 0x20, 0x00, 
-	0x49, 0x1d, 0x00, 0x42, 0x18, 0x12, 0x01, 0x12, 
-	0x5a, 0xaa, 0x42, 0x8a, 0xd1, 0x04, 0x30, 0x01, 
-	0x06, 0x00, 0x0e, 0x00, 0x28, 0x08, 0xdb, 0xf4, 
-	0x28, 0x08, 0xd1, 0x1d, 0x70, 0x34, 0x99, 0x02, 
-	0x70, 0x0c, 0xe0, 0x19, 0x07, 0xc0, 0x0f, 0xc0, 
-	0x28, 0x01, 0xd1, 0x15, 0x70, 0xfc, 0x71, 0x3c, 
-	0x21, 0x06, 0x1d, 0xf8, 0x30, 0x19, 0x73, 0x41, 
-	0x6a, 0xb9, 0x72, 0x0c, 0x79, 0x79, 0x08, 0x49, 
-	0x00, 0x49, 0x71, 0x79, 0x22, 0x04, 0x7b, 0x01, 
-	0xb4, 0x06, 0x78, 0xb9, 0x22, 0x0a, 0x20, 0x85, 
-	0x6a, 0xbb, 0xf0, 0x0a, 0xfb, 0x07, 0xb0, 0x02, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x03, 0xbc, 
-	0x2e, 0x08, 0x03, 0xb8, 0x2e, 0x08, 0x44, 0x68, 
-	0x2e, 0x08, 0x00, 0x1c, 0x2c, 0x00, 0x02, 0x00, 
-	0x00, 0x00, 0xff, 0xff, 0xb5, 0x80, 0x4f, 0x0b, 
-	0x68, 0x38, 0x28, 0x00, 0xd1, 0x0f, 0x20, 0x2f, 
-	0x02, 0x80, 0xf0, 0x04, 0xfe, 0x87, 0x60, 0x38, 
-	0x20, 0x00, 0x49, 0x07, 0x60, 0x08, 0x49, 0x07, 
-	0x60, 0x08, 0x49, 0x07, 0x60, 0x08, 0x20, 0x2f, 
-	0x02, 0x80, 0x49, 0x06, 0x60, 0x08, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x02, 0x5c, 0x90, 
-	0x2e, 0x02, 0x5c, 0x98, 0x2e, 0x02, 0x5c, 0x94, 
-	0x2e, 0x02, 0x5c, 0x9c, 0x2e, 0x02, 0x5c, 0xa0, 
-	0xb5, 0x80, 0x4f, 0x04, 0x68, 0x38, 0xf0, 0x04, 
-	0xfe, 0x73, 0x20, 0x00, 0x60, 0x38, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x02, 0x5c, 0x90, 
-	0xb5, 0xf0, 0xb0, 0x82, 0x4a, 0x36, 0x8e, 0x90, 
-	0x28, 0x00, 0xd0, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x48, 0x33, 0x68, 0x01, 
-	0x4e, 0x33, 0x68, 0x30, 0x1a, 0x0f, 0xd1, 0x03, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2f, 0x00, 0xda, 0x02, 0x23, 0x2f, 0x02, 0x9b, 
-	0x18, 0xff, 0x4c, 0x2e, 0x6b, 0xa1, 0x1c, 0x4a, 
-	0x49, 0x2d, 0x68, 0x09, 0x42, 0x8a, 0xd9, 0x13, 
-	0x23, 0x2f, 0x01, 0x1b, 0x42, 0x9f, 0xda, 0x03, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x4a, 0x23, 0x8e, 0xd2, 0x2a, 0x00, 0xd0, 0x07, 
-	0x23, 0xeb, 0x01, 0x1b, 0x42, 0x9f, 0xda, 0x03, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x63, 0xa1, 0x4b, 0x22, 0x42, 0x9f, 0xdd, 0x00, 
-	0x1c, 0x1f, 0x21, 0x2f, 0x02, 0x89, 0x1a, 0x0d, 
-	0x49, 0x1f, 0x91, 0x01, 0x42, 0xaf, 0xdd, 0x14, 
-	0x1b, 0x7a, 0x92, 0x00, 0x99, 0x01, 0x68, 0x09, 
-	0x18, 0x08, 0x1c, 0x2a, 0x49, 0x1b, 0x6b, 0x23, 
-	0xf0, 0x17, 0xfd, 0x84, 0x4b, 0x19, 0x18, 0xe9, 
-	0x98, 0x01, 0x9a, 0x00, 0x68, 0x00, 0x6b, 0x23, 
-	0xf0, 0x17, 0xfd, 0x7c, 0x9a, 0x00, 0x60, 0x32, 
-	0xe0, 0x0e, 0x99, 0x01, 0x68, 0x09, 0x18, 0x08, 
-	0x1c, 0x3a, 0x49, 0x12, 0x6b, 0x23, 0xf0, 0x17, 
-	0xfd, 0x71, 0x68, 0x30, 0x19, 0xc1, 0x20, 0x2f, 
-	0x02, 0x80, 0xf0, 0x17, 0xfd, 0x75, 0x60, 0x31, 
-	0x20, 0x12, 0x4a, 0x05, 0x85, 0x10, 0x85, 0x57, 
-	0x20, 0x01, 0x02, 0x40, 0x86, 0x90, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x02, 0x5c, 0x98, 
-	0x2e, 0x02, 0x5c, 0x94, 0x2e, 0x08, 0x00, 0x1c, 
-	0x2e, 0x08, 0x05, 0xb0, 0x00, 0x00, 0x0f, 0x6c, 
-	0x2e, 0x02, 0x5c, 0x90, 0x2c, 0x00, 0x02, 0x00, 
-	0x20, 0x00, 0x49, 0x03, 0x60, 0x08, 0x49, 0x03, 
-	0x60, 0x08, 0x49, 0x03, 0x60, 0x08, 0x47, 0x70, 
-	0x2e, 0x02, 0x5c, 0x98, 0x2e, 0x02, 0x5c, 0x94, 
-	0x2e, 0x02, 0x5c, 0x9c, 0x2a, 0x00, 0xd0, 0x05, 
-	0x78, 0x03, 0x70, 0x0b, 0x30, 0x01, 0x31, 0x01, 
-	0x3a, 0x01, 0xd1, 0xf9, 0x47, 0x70, 0xb5, 0xf3, 
-	0xb0, 0x83, 0x98, 0x03, 0x78, 0x40, 0x00, 0x80, 
-	0x1c, 0x0f, 0x49, 0x3d, 0x58, 0x08, 0x28, 0x00, 
-	0xd1, 0x05, 0x20, 0xb0, 0xb0, 0x03, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x03, 
-	0x88, 0x45, 0x30, 0x04, 0xc8, 0x41, 0x1d, 0xf2, 
-	0x32, 0xb9, 0x1a, 0x14, 0x23, 0x01, 0x03, 0x1b, 
-	0x42, 0x9d, 0xdd, 0x03, 0x20, 0x00, 0x43, 0xc0, 
-	0xb0, 0x03, 0xe7, 0xec, 0x19, 0x79, 0x91, 0x00, 
-	0x4b, 0x30, 0x93, 0x02, 0x2c, 0xbc, 0xdc, 0x01, 
-	0x2c, 0x00, 0xda, 0x07, 0x9b, 0x02, 0x68, 0x18, 
-	0x30, 0x01, 0x60, 0x18, 0x20, 0x00, 0x43, 0xc0, 
-	0xb0, 0x03, 0xe7, 0xdc, 0x42, 0xac, 0xdb, 0x06, 
-	0x9b, 0x02, 0x68, 0x5b, 0x1c, 0x39, 0x1c, 0x2a, 
-	0xf0, 0x17, 0xfd, 0x00, 0xe0, 0x44, 0x2d, 0x00, 
-	0xdd, 0x42, 0x4b, 0x25, 0x93, 0x01, 0x99, 0x00, 
-	0x42, 0x8f, 0xd9, 0x07, 0x9b, 0x02, 0x68, 0x18, 
-	0x30, 0x01, 0x60, 0x18, 0x20, 0x00, 0x43, 0xc0, 
-	0xb0, 0x03, 0xe7, 0xc4, 0x42, 0xa5, 0xdd, 0x07, 
-	0x9b, 0x02, 0x68, 0x5b, 0x1c, 0x39, 0x1c, 0x22, 
-	0xf0, 0x17, 0xfc, 0xe8, 0x68, 0x36, 0xe0, 0x05, 
-	0x9b, 0x02, 0x68, 0x5b, 0x1c, 0x39, 0x1c, 0x2a, 
-	0xf0, 0x17, 0xfc, 0xe0, 0x19, 0x3f, 0x1b, 0x2d, 
-	0x79, 0xb0, 0x19, 0x80, 0x9a, 0x03, 0x78, 0x52, 
-	0x00, 0xd3, 0x1a, 0x9a, 0x00, 0x92, 0x9b, 0x01, 
-	0x68, 0x1b, 0x18, 0xd2, 0x78, 0x92, 0x06, 0xd2, 
-	0x0e, 0xd2, 0x1d, 0x31, 0x2a, 0x12, 0xd1, 0x06, 
-	0x78, 0xca, 0x0a, 0x12, 0xd2, 0x03, 0x78, 0x89, 
-	0x29, 0x09, 0xd1, 0x00, 0x38, 0x01, 0x1d, 0xf1, 
-	0x31, 0xb9, 0x1a, 0x0c, 0x2c, 0xbc, 0xdc, 0x01, 
-	0x2c, 0x00, 0xda, 0x03, 0x20, 0x00, 0x43, 0xc0, 
-	0xb0, 0x03, 0xe7, 0x90, 0x2d, 0x00, 0xdc, 0xbe, 
-	0x20, 0x00, 0xb0, 0x03, 0xe7, 0x8b, 0x00, 0x00, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x00, 0x58, 
-	0x2e, 0x08, 0x5d, 0xc4, 0xb4, 0xf0, 0x68, 0x42, 
-	0x68, 0x84, 0x1d, 0xe1, 0x31, 0xb7, 0x1c, 0x16, 
-	0xb0, 0x81, 0x42, 0x91, 0xd9, 0x09, 0x78, 0x51, 
-	0x07, 0x09, 0x0f, 0x09, 0x02, 0x09, 0x78, 0x92, 
-	0x43, 0x11, 0x31, 0x03, 0x04, 0x09, 0x0c, 0x09, 
-	0xe0, 0x5b, 0x68, 0x21, 0x79, 0x8b, 0x93, 0x00, 
-	0x1d, 0x0f, 0x18, 0x59, 0x78, 0x45, 0x00, 0xeb, 
-	0x1b, 0x5b, 0x00, 0x9b, 0x4d, 0x2b, 0x68, 0x2d, 
-	0x19, 0x5b, 0x78, 0x9b, 0x06, 0xdb, 0x0e, 0xdb, 
-	0x2b, 0x12, 0xd1, 0x31, 0x1d, 0xe3, 0x33, 0xb9, 
-	0x1b, 0x9b, 0x06, 0x1d, 0x0e, 0x2d, 0x78, 0xfe, 
-	0x0a, 0x33, 0xd2, 0x29, 0x2d, 0x0e, 0xda, 0x27, 
-	0x9b, 0x00, 0x2b, 0x09, 0xdd, 0x06, 0x79, 0x3b, 
-	0x18, 0xfb, 0x33, 0x05, 0x42, 0x8b, 0xd0, 0x1f, 
-	0x39, 0x01, 0xe0, 0x1d, 0x9b, 0x00, 0x2b, 0x09, 
-	0xd1, 0x1a, 0x79, 0x3b, 0x2b, 0x00, 0xd0, 0x01, 
-	0x39, 0x01, 0xe0, 0x15, 0x39, 0x01, 0x1d, 0xe3, 
-	0x33, 0xb8, 0x42, 0x93, 0xd9, 0x09, 0x78, 0x53, 
-	0x07, 0x1b, 0x0f, 0x1b, 0x02, 0x1b, 0x04, 0x1b, 
-	0x0c, 0x1b, 0x33, 0x03, 0x04, 0x1b, 0x0c, 0x1b, 
-	0xe0, 0x03, 0x78, 0x4b, 0x33, 0x03, 0x04, 0x1b, 
-	0x0c, 0x1b, 0x42, 0x9d, 0xda, 0x00, 0x31, 0x01, 
-	0x1d, 0xe3, 0x33, 0xb8, 0x42, 0x93, 0xd9, 0x0b, 
-	0x78, 0x52, 0x07, 0x12, 0x0f, 0x12, 0x02, 0x12, 
-	0x04, 0x12, 0x0c, 0x12, 0x78, 0x09, 0x18, 0x51, 
-	0x31, 0x03, 0x04, 0x09, 0x0c, 0x09, 0xe0, 0x08, 
-	0x78, 0x0a, 0x07, 0x12, 0x0f, 0x12, 0x02, 0x12, 
-	0x78, 0x49, 0x43, 0x11, 0x31, 0x03, 0x04, 0x09, 
-	0x0c, 0x09, 0x80, 0x41, 0xb0, 0x01, 0xbc, 0xf0, 
-	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xc4, 
-	0x4a, 0x02, 0xc2, 0x03, 0x3a, 0x08, 0x20, 0x00, 
-	0x60, 0x90, 0x47, 0x70, 0x2e, 0x08, 0x43, 0x70, 
-	0x48, 0x01, 0x68, 0x80, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x43, 0x70, 0x48, 0x01, 0x68, 0x80, 
-	0x08, 0xc0, 0x47, 0x70, 0x2e, 0x08, 0x43, 0x70, 
-	0x48, 0x02, 0x68, 0x81, 0x08, 0xc9, 0x68, 0x00, 
-	0x18, 0x08, 0x47, 0x70, 0x2e, 0x08, 0x43, 0x70, 
-	0xb4, 0xf0, 0x1c, 0x03, 0x20, 0x00, 0xb0, 0x82, 
-	0x49, 0x53, 0x91, 0x01, 0x68, 0x89, 0x18, 0xcf, 
-	0x97, 0x00, 0x08, 0xca, 0x07, 0x4c, 0x0f, 0x64, 
-	0x49, 0x4f, 0x68, 0x09, 0xd1, 0x32, 0x1c, 0x1f, 
-	0xd5, 0x04, 0x42, 0x7f, 0x07, 0x7f, 0x0f, 0x7f, 
-	0x42, 0x7f, 0xe0, 0x01, 0x07, 0x7f, 0x0f, 0x7f, 
-	0x2f, 0x00, 0xd1, 0x27, 0x2b, 0x10, 0xd0, 0x16, 
-	0xdc, 0x05, 0x2b, 0x00, 0xd0, 0x5a, 0x2b, 0x08, 
-	0xd1, 0x59, 0x5c, 0x88, 0xe0, 0x81, 0x2b, 0x18, 
-	0xd0, 0x13, 0x2b, 0x20, 0xd1, 0x53, 0x5c, 0x88, 
-	0x06, 0x00, 0x18, 0x89, 0x78, 0x4a, 0x04, 0x12, 
-	0x18, 0x80, 0x78, 0x8a, 0x02, 0x12, 0x18, 0x80, 
-	0x78, 0xc9, 0x18, 0x40, 0xe0, 0x71, 0x5c, 0x88, 
-	0x02, 0x00, 0x18, 0x89, 0x78, 0x49, 0x18, 0x40, 
-	0xe0, 0x6b, 0x5c, 0x88, 0x04, 0x00, 0x18, 0x89, 
-	0x78, 0x4a, 0x02, 0x12, 0x18, 0x80, 0x78, 0x89, 
-	0x18, 0x40, 0xe0, 0x62, 0x2b, 0x00, 0xd1, 0x03, 
-	0x20, 0x00, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 
-	0x9f, 0x00, 0x08, 0xfd, 0x07, 0x7f, 0x0f, 0x7f, 
-	0x2b, 0x20, 0xdc, 0x56, 0x1a, 0xae, 0x4d, 0x2f, 
-	0x2e, 0x05, 0xd2, 0x52, 0xa3, 0x01, 0x5d, 0x9b, 
-	0x00, 0x5b, 0x44, 0x9f, 0x02, 0x09, 0x14, 0x25, 
-	0x38, 0x00, 0x5c, 0x88, 0x5d, 0x29, 0x40, 0x08, 
-	0x21, 0x08, 0x1b, 0xc9, 0x40, 0xc8, 0xe0, 0x44, 
-	0x1c, 0x50, 0x5c, 0x8a, 0x5d, 0x2b, 0x40, 0x1a, 
-	0x02, 0x12, 0x5c, 0x08, 0x18, 0x80, 0x21, 0x08, 
-	0x1b, 0xc9, 0x40, 0xc8, 0xe0, 0x39, 0x1c, 0x50, 
-	0x5c, 0x8a, 0x5d, 0x2b, 0x40, 0x1a, 0x02, 0x12, 
-	0x1c, 0x43, 0x5c, 0x08, 0x18, 0x80, 0x02, 0x00, 
-	0x5c, 0xc9, 0x18, 0x08, 0x21, 0x08, 0x1b, 0xc9, 
-	0x40, 0xc8, 0xe0, 0x2a, 0xe0, 0x29, 0xe0, 0x28, 
-	0x1c, 0x50, 0x5c, 0x8a, 0x5d, 0x2b, 0x40, 0x1a, 
-	0x02, 0x12, 0x1c, 0x43, 0x5c, 0x08, 0x18, 0x80, 
-	0x02, 0x00, 0x1c, 0x5a, 0x5c, 0xcb, 0x18, 0x18, 
-	0x02, 0x00, 0x5c, 0x89, 0x18, 0x08, 0x21, 0x08, 
-	0x1b, 0xc9, 0x40, 0xc8, 0xe0, 0x15, 0x1c, 0x50, 
-	0x5c, 0x8a, 0x5d, 0x2b, 0x40, 0x1a, 0x02, 0x12, 
-	0x1c, 0x43, 0x5c, 0x08, 0x18, 0x80, 0x02, 0x00, 
-	0x1c, 0x5a, 0x5c, 0xcb, 0x18, 0x18, 0x02, 0x03, 
-	0x1c, 0x50, 0x5c, 0x8a, 0x18, 0xd2, 0x40, 0xba, 
-	0x5c, 0x08, 0x21, 0x08, 0x1b, 0xc9, 0x40, 0xc8, 
-	0x18, 0x80, 0x99, 0x01, 0x9f, 0x00, 0x60, 0x8f, 
-	0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x43, 0x70, 0x2e, 0x08, 0x00, 0x60, 
-	0xb5, 0xb0, 0x1c, 0x07, 0x20, 0x00, 0x24, 0x00, 
-	0x2f, 0x00, 0xdd, 0x09, 0x00, 0x85, 0x18, 0x2d, 
-	0x00, 0x6d, 0x20, 0x04, 0xf7, 0xff, 0xff, 0x44, 
-	0x19, 0x40, 0x34, 0x01, 0x42, 0xbc, 0xdb, 0xf5, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x47, 0x70, 0xb5, 0xb0, 0x1c, 0x0c, 0x1c, 0x05, 
-	0x1c, 0x17, 0xb0, 0x90, 0xf0, 0x1b, 0xfb, 0x16, 
-	0x49, 0x25, 0x20, 0x0c, 0xf0, 0x1b, 0xfa, 0xde, 
-	0xf0, 0x1b, 0xfa, 0xd4, 0x4b, 0x23, 0x40, 0x18, 
-	0xf0, 0x1b, 0xfa, 0xd4, 0xf0, 0x1b, 0xfb, 0x40, 
-	0x20, 0x10, 0x90, 0x0a, 0x20, 0xff, 0x90, 0x0b, 
-	0xa8, 0x0f, 0x90, 0x0c, 0x20, 0x0c, 0x90, 0x0d, 
-	0x48, 0x1d, 0x90, 0x0e, 0xa8, 0x0a, 0xf0, 0x0f, 
-	0xf8, 0xd5, 0xab, 0x07, 0x70, 0x1d, 0x94, 0x08, 
-	0x72, 0x1f, 0x24, 0x00, 0xab, 0x09, 0x70, 0x5c, 
-	0x27, 0x00, 0x4d, 0x18, 0xf0, 0x0f, 0xf9, 0x36, 
-	0x28, 0x00, 0xd0, 0x02, 0x37, 0x01, 0x42, 0xaf, 
-	0xdb, 0xf8, 0x20, 0x01, 0xa9, 0x07, 0xf0, 0x0f, 
-	0xf9, 0x37, 0xf0, 0x0f, 0xf9, 0x2b, 0x28, 0x00, 
-	0xd1, 0xfb, 0x94, 0x0b, 0xa8, 0x0a, 0xf0, 0x0f, 
-	0xf8, 0xb9, 0xf0, 0x1b, 0xfa, 0xdf, 0x21, 0x00, 
-	0x20, 0x0c, 0xf0, 0x1b, 0xfa, 0xa7, 0xf0, 0x1b, 
-	0xfa, 0x9d, 0x23, 0x01, 0x02, 0xdb, 0x43, 0x18, 
-	0xf0, 0x1b, 0xfa, 0x9c, 0xf0, 0x1b, 0xfb, 0x08, 
-	0x46, 0x68, 0xf0, 0x0f, 0xf8, 0xf3, 0x98, 0x04, 
-	0xb0, 0x10, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x00, 0x15, 0x45, 0xff, 0xff, 0xf7, 0xff, 
-	0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x27, 0x10, 
-	0xb5, 0xff, 0x9e, 0x09, 0x1c, 0x04, 0x1c, 0x0d, 
-	0x1c, 0x17, 0xb0, 0x93, 0xf0, 0x1b, 0xfa, 0xba, 
-	0x49, 0x31, 0x20, 0x0c, 0xf0, 0x1b, 0xfa, 0x82, 
-	0xf0, 0x1b, 0xfa, 0x78, 0x4b, 0x2f, 0x40, 0x18, 
-	0xf0, 0x1b, 0xfa, 0x78, 0xf0, 0x1b, 0xfa, 0xe4, 
-	0x20, 0x10, 0x90, 0x0d, 0x20, 0xff, 0x90, 0x0e, 
-	0xa8, 0x12, 0x90, 0x0f, 0x20, 0x0c, 0x90, 0x10, 
-	0x48, 0x29, 0x90, 0x11, 0xa8, 0x0d, 0xf0, 0x0f, 
-	0xf8, 0x79, 0xab, 0x07, 0x70, 0x1c, 0x95, 0x08, 
-	0x72, 0x1f, 0x20, 0xff, 0xab, 0x09, 0x70, 0x58, 
-	0x1c, 0x60, 0x71, 0x18, 0x9b, 0x16, 0x93, 0x0b, 
-	0xab, 0x0c, 0x70, 0x1e, 0x20, 0xff, 0x70, 0x58, 
-	0x24, 0x00, 0x4d, 0x20, 0xf0, 0x0f, 0xf8, 0xd2, 
-	0x28, 0x00, 0xd0, 0x02, 0x34, 0x01, 0x42, 0xac, 
-	0xdb, 0xf8, 0x2f, 0x00, 0xd1, 0x04, 0x20, 0x01, 
-	0xa9, 0x0a, 0xf0, 0x0f, 0xf8, 0xd1, 0xe0, 0x03, 
-	0x20, 0x02, 0xa9, 0x07, 0xf0, 0x0f, 0xf8, 0xcc, 
-	0xf0, 0x0f, 0xf8, 0xc0, 0x28, 0x00, 0xd1, 0xfb, 
-	0x27, 0x00, 0x97, 0x0e, 0xa8, 0x0d, 0xf0, 0x0f, 
-	0xf8, 0x4d, 0xf0, 0x1b, 0xfa, 0x73, 0x21, 0x00, 
-	0x20, 0x0c, 0xf0, 0x1b, 0xfa, 0x3b, 0xf0, 0x1b, 
-	0xfa, 0x31, 0x23, 0x01, 0x02, 0xdb, 0x43, 0x18, 
-	0xf0, 0x1b, 0xfa, 0x30, 0xf0, 0x1b, 0xfa, 0x9c, 
-	0x46, 0x68, 0xf0, 0x0f, 0xf8, 0x87, 0x98, 0x01, 
-	0x0a, 0x80, 0xd2, 0x05, 0x20, 0x01, 0xb0, 0x13, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x38, 0xb0, 0x13, 0xe7, 0xf8, 0x00, 0x00, 
-	0x2e, 0x00, 0x15, 0x45, 0xff, 0xff, 0xf7, 0xff, 
-	0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x27, 0x10, 
-	0x1c, 0x01, 0x48, 0x04, 0x61, 0xc1, 0x68, 0x00, 
-	0x28, 0x00, 0xd1, 0x01, 0x48, 0x02, 0x60, 0x01, 
-	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x68, 
-	0x6e, 0x00, 0x17, 0x00, 0xb5, 0xb0, 0x4f, 0x41, 
-	0x69, 0x38, 0x4c, 0x41, 0x28, 0x00, 0xd0, 0x07, 
-	0x20, 0x03, 0x60, 0x20, 0x69, 0x38, 0x38, 0x01, 
-	0x61, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x21, 0x02, 0x69, 0x78, 0x28, 0x00, 0xd0, 0x04, 
-	0x60, 0x21, 0x69, 0x78, 0x38, 0x01, 0x61, 0x78, 
-	0xd1, 0xf3, 0x68, 0xf8, 0x28, 0x00, 0xd0, 0x20, 
-	0x38, 0x01, 0x60, 0xf8, 0x4a, 0x35, 0xd0, 0x08, 
-	0x68, 0xbb, 0x18, 0xd2, 0x3a, 0x20, 0x7f, 0xd2, 
-	0x1e, 0x45, 0x40, 0xea, 0x07, 0xd2, 0x0f, 0xd2, 
-	0xe0, 0x09, 0x68, 0xbb, 0x18, 0xd2, 0x3a, 0x20, 
-	0x7f, 0xd2, 0x4b, 0x2f, 0x5c, 0x9a, 0x23, 0x01, 
-	0x40, 0x5a, 0x06, 0x12, 0x0e, 0x12, 0x23, 0x01, 
-	0x2a, 0x00, 0xd0, 0x02, 0x61, 0x79, 0x61, 0x3b, 
-	0xe0, 0x01, 0x61, 0x39, 0x61, 0x7b, 0x28, 0x00, 
-	0xd1, 0xcf, 0x68, 0xb8, 0x30, 0x01, 0x60, 0xb8, 
-	0x23, 0x09, 0x68, 0x7a, 0x1c, 0x01, 0x42, 0x90, 
-	0xdc, 0x03, 0x60, 0xfb, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0x20, 0x1c, 0x55, 0x42, 0x8d, 
-	0xd1, 0x03, 0x61, 0x78, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x1c, 0x95, 0x42, 0x8d, 0xd1, 0x0d, 
-	0x7e, 0x3d, 0x2d, 0xff, 0xd0, 0x0a, 0x2d, 0x00, 
-	0xd0, 0x03, 0x60, 0xfb, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0x19, 0x61, 0x38, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x32, 0x03, 0x42, 0x8a, 
-	0xd1, 0x04, 0x20, 0x22, 0x61, 0x78, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x69, 0xf9, 0x60, 0x21, 
-	0x68, 0x79, 0x68, 0xba, 0x31, 0x04, 0x42, 0x91, 
-	0xd1, 0x0a, 0x69, 0xf9, 0x29, 0x00, 0xd0, 0x03, 
-	0x61, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x61, 0x78, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0xf0, 0x04, 0xf8, 0xac, 0x20, 0x00, 0x60, 0x38, 
-	0x69, 0xf8, 0x60, 0x20, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x68, 
-	0x6e, 0x00, 0x17, 0x00, 0x2e, 0x08, 0x43, 0x7c, 
-	0x2e, 0x08, 0x00, 0x68, 0xb5, 0xb0, 0x04, 0x0b, 
-	0x0c, 0x1b, 0x04, 0x14, 0x0c, 0x24, 0x49, 0x14, 
-	0x68, 0x0a, 0x2a, 0x00, 0xd0, 0x02, 0x68, 0x0a, 
-	0x2a, 0x00, 0xd1, 0xfc, 0x22, 0x01, 0x60, 0x0a, 
-	0x2b, 0x0a, 0xdd, 0x00, 0x23, 0x0a, 0x22, 0x00, 
-	0x4f, 0x0e, 0x2b, 0x00, 0xdd, 0x05, 0x00, 0x55, 
-	0x5b, 0x45, 0x54, 0xbd, 0x32, 0x01, 0x42, 0x9a, 
-	0xdb, 0xf9, 0x76, 0x0c, 0x20, 0xff, 0x18, 0xfa, 
-	0x70, 0x50, 0x20, 0x00, 0x60, 0x4b, 0x22, 0x20, 
-	0x61, 0x08, 0x61, 0x4a, 0x60, 0x88, 0x60, 0xc8, 
-	0x49, 0x05, 0x20, 0x32, 0xf0, 0x04, 0xf8, 0x48, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x01, 0x68, 0x2e, 0x08, 0x43, 0x7c, 
-	0x2e, 0x00, 0x17, 0x01, 0xb5, 0x80, 0x04, 0x01, 
-	0x0c, 0x09, 0x20, 0x00, 0x22, 0x00, 0xb0, 0x88, 
-	0x00, 0x47, 0x46, 0x6b, 0x53, 0xda, 0x30, 0x01, 
-	0x04, 0x00, 0x14, 0x00, 0x28, 0x10, 0xdb, 0xf7, 
-	0x22, 0x80, 0x00, 0x43, 0x46, 0x68, 0x52, 0xc2, 
-	0x46, 0x6a, 0x1c, 0x08, 0x21, 0x05, 0xf0, 0x04, 
-	0xfb, 0x17, 0x49, 0x06, 0x80, 0x88, 0x00, 0x42, 
-	0x18, 0x12, 0x00, 0x92, 0x4b, 0x04, 0x5a, 0x9a, 
-	0x81, 0x0a, 0xb0, 0x08, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x88, 
-	0x2e, 0x08, 0x47, 0x78, 0xb5, 0xf0, 0xb0, 0xb3, 
-	0xa8, 0x01, 0xf0, 0x0f, 0xfd, 0xc9, 0x49, 0x61, 
-	0x68, 0x0f, 0x68, 0x4d, 0x68, 0x8c, 0x03, 0x20, 
-	0x05, 0x2a, 0x0d, 0x12, 0x43, 0x10, 0x04, 0x00, 
-	0x0c, 0x00, 0x4b, 0x5d, 0x8e, 0x9a, 0x2a, 0x00, 
-	0xd1, 0x16, 0x89, 0xda, 0x42, 0x90, 0xd0, 0x01, 
-	0x22, 0x01, 0xe0, 0x00, 0x22, 0x00, 0x89, 0x9e, 
-	0x42, 0xb7, 0xd0, 0x01, 0x26, 0x01, 0xe0, 0x00, 
-	0x26, 0x00, 0x43, 0x32, 0xd0, 0x08, 0x81, 0x9f, 
-	0x81, 0xd8, 0x20, 0x00, 0x85, 0x58, 0x20, 0x0d, 
-	0x85, 0x18, 0x20, 0x01, 0x02, 0x40, 0x86, 0x98, 
-	0x68, 0xce, 0x69, 0x08, 0x90, 0x00, 0x1c, 0x38, 
-	0x1c, 0x29, 0x1c, 0x32, 0xf0, 0x00, 0xfa, 0x72, 
-	0x1c, 0x20, 0xf0, 0x00, 0xfb, 0x8d, 0xa0, 0x4b, 
-	0x22, 0x00, 0x21, 0x11, 0xf0, 0x04, 0xff, 0xc2, 
-	0x22, 0x0a, 0x21, 0x11, 0x98, 0x1b, 0xf0, 0x05, 
-	0xf8, 0x1f, 0x22, 0x14, 0x21, 0x11, 0x1c, 0x38, 
-	0xf0, 0x05, 0xf8, 0x1a, 0x22, 0x1e, 0x21, 0x11, 
-	0x1c, 0x28, 0xf0, 0x05, 0xf8, 0x15, 0x22, 0x28, 
-	0x21, 0x11, 0x1c, 0x20, 0xf0, 0x05, 0xf8, 0x10, 
-	0x22, 0x32, 0x21, 0x11, 0x1c, 0x30, 0xf0, 0x05, 
-	0xf8, 0x0b, 0x22, 0x3c, 0x21, 0x11, 0x98, 0x00, 
-	0xf0, 0x05, 0xf8, 0x06, 0xa0, 0x3b, 0x22, 0x00, 
-	0x21, 0x13, 0xf0, 0x04, 0xff, 0x9f, 0x22, 0x0a, 
-	0x21, 0x13, 0x4f, 0x35, 0x8d, 0x78, 0xf0, 0x04, 
-	0xff, 0xfb, 0xa0, 0x38, 0x22, 0x14, 0x21, 0x13, 
-	0xf0, 0x04, 0xff, 0x94, 0x22, 0x1e, 0x21, 0x13, 
-	0x8d, 0xf8, 0xf0, 0x04, 0xff, 0xf1, 0xa0, 0x35, 
-	0x22, 0x00, 0x21, 0x14, 0xf0, 0x04, 0xff, 0x8a, 
-	0x22, 0x0a, 0x21, 0x14, 0x8e, 0xb8, 0xf0, 0x04, 
-	0xff, 0xe7, 0xa0, 0x32, 0x22, 0x14, 0x21, 0x14, 
-	0xf0, 0x04, 0xff, 0x80, 0x22, 0x1e, 0x21, 0x14, 
-	0x8e, 0xf8, 0xf0, 0x04, 0xff, 0xdd, 0xa0, 0x2f, 
-	0x22, 0x28, 0x21, 0x14, 0xf0, 0x04, 0xff, 0x76, 
-	0x22, 0x32, 0x21, 0x14, 0x48, 0x2e, 0x6f, 0xc0, 
-	0xf0, 0x04, 0xff, 0xd2, 0xa0, 0x2d, 0x22, 0x00, 
-	0x21, 0x15, 0xf0, 0x04, 0xff, 0x6b, 0x22, 0x0a, 
-	0x21, 0x15, 0x8d, 0x38, 0xf0, 0x04, 0xff, 0xc8, 
-	0xa0, 0x2b, 0x22, 0x14, 0x21, 0x15, 0xf0, 0x04, 
-	0xff, 0x61, 0x22, 0x1e, 0x21, 0x15, 0x8d, 0xb8, 
-	0xf0, 0x04, 0xff, 0xbe, 0xa0, 0x29, 0x22, 0x00, 
-	0x21, 0x10, 0xf0, 0x04, 0xff, 0x57, 0xf0, 0x0f, 
-	0xfe, 0xf1, 0x22, 0x0a, 0x21, 0x10, 0xf0, 0x04, 
-	0xff, 0xb3, 0xa0, 0x26, 0x22, 0x14, 0x21, 0x10, 
-	0xf0, 0x04, 0xff, 0x4c, 0x22, 0x1e, 0x21, 0x10, 
-	0x27, 0x33, 0x06, 0x7f, 0x6d, 0x78, 0xf0, 0x04, 
-	0xff, 0xa7, 0xa0, 0x22, 0x22, 0x28, 0x21, 0x10, 
-	0xf0, 0x04, 0xff, 0x40, 0xf0, 0x0f, 0xfe, 0xda, 
-	0x6d, 0x79, 0x1a, 0x08, 0x22, 0x32, 0x21, 0x10, 
-	0xf0, 0x04, 0xff, 0x9a, 0xb0, 0x33, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xcc, 0x00, 0x0c, 0x00, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x73, 0x74, 0x61, 0x74, 
-	0x73, 0x3a, 0x00, 0x00, 0x72, 0x78, 0x6c, 0x65, 
-	0x6e, 0x3a, 0x00, 0x00, 0x74, 0x78, 0x6c, 0x65, 
-	0x6e, 0x3a, 0x00, 0x00, 0x72, 0x78, 0x62, 0x75, 
-	0x66, 0x66, 0x3a, 0x00, 0x74, 0x78, 0x62, 0x75, 
-	0x66, 0x66, 0x3a, 0x00, 0x69, 0x66, 0x5f, 0x75, 
-	0x73, 0x65, 0x64, 0x3a, 0x00, 0x00, 0x00, 0x00, 
-	0x2c, 0x00, 0x1f, 0x80, 0x72, 0x78, 0x73, 0x74, 
-	0x61, 0x74, 0x65, 0x3a, 0x00, 0x00, 0x00, 0x00, 
-	0x74, 0x78, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3a, 
-	0x00, 0x00, 0x00, 0x00, 0x65, 0x6e, 0x64, 0x63, 
-	0x75, 0x72, 0x3a, 0x00, 0x76, 0x69, 0x64, 0x62, 
-	0x75, 0x66, 0x3a, 0x00, 0x6f, 0x73, 0x64, 0x3a, 
-	0x00, 0x00, 0x00, 0x00, 0xb5, 0xf0, 0x25, 0x00, 
-	0x20, 0x00, 0x49, 0x19, 0x81, 0xc8, 0x81, 0x88, 
-	0x4e, 0x18, 0x4c, 0x19, 0x4f, 0x19, 0x68, 0x30, 
-	0x68, 0x00, 0x00, 0x40, 0x0a, 0x40, 0x02, 0x40, 
-	0x21, 0x19, 0x06, 0x89, 0x6a, 0x89, 0x4b, 0x16, 
-	0x40, 0x19, 0x0a, 0x49, 0x43, 0x08, 0x49, 0x15, 
-	0x64, 0x08, 0xf0, 0x01, 0xfc, 0x57, 0xf0, 0x02, 
-	0xf9, 0x6b, 0x68, 0x38, 0x30, 0x01, 0x60, 0x38, 
-	0x48, 0x11, 0x88, 0x01, 0x31, 0x01, 0x80, 0x01, 
-	0x20, 0x0c, 0x68, 0x21, 0xf0, 0x17, 0xf8, 0x9a, 
-	0x29, 0x00, 0xd1, 0x01, 0xf7, 0xff, 0xfe, 0xd6, 
-	0x20, 0x32, 0x68, 0x21, 0xf0, 0x17, 0xf8, 0x92, 
-	0x42, 0x85, 0xd0, 0xd8, 0x1c, 0x05, 0xf0, 0x00, 
-	0xfe, 0x39, 0x20, 0x00, 0x60, 0x38, 0xe7, 0xd2, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x5e, 0x38, 
-	0x2e, 0x08, 0x05, 0xb0, 0x2e, 0x08, 0x01, 0x88, 
-	0x00, 0x03, 0xfe, 0x00, 0x2c, 0x00, 0x1f, 0x80, 
-	0x2c, 0x00, 0x1f, 0xc8, 0xb5, 0xf0, 0x27, 0x00, 
-	0xb0, 0x94, 0x46, 0x68, 0x4c, 0x2f, 0xcc, 0x6e, 
-	0xc0, 0x6e, 0xcc, 0x6e, 0xc0, 0x6e, 0x23, 0x28, 
-	0x22, 0x41, 0x00, 0xd2, 0x21, 0x00, 0x20, 0x01, 
-	0xf0, 0x08, 0xfa, 0x30, 0x22, 0xff, 0x21, 0x64, 
-	0x20, 0x01, 0x32, 0xf5, 0xf0, 0x08, 0xfa, 0xf2, 
-	0x20, 0x00, 0x46, 0x69, 0x5c, 0x09, 0x40, 0x41, 
-	0x23, 0x35, 0x40, 0x59, 0xaa, 0x0a, 0x54, 0x11, 
-	0x30, 0x01, 0x28, 0x25, 0xdb, 0xf5, 0x24, 0x00, 
-	0xa9, 0x0a, 0x54, 0x0c, 0x22, 0x00, 0x20, 0x01, 
-	0x1c, 0x23, 0xf0, 0x08, 0xfd, 0x50, 0x4e, 0x1e, 
-	0x4d, 0x1e, 0x4c, 0x1f, 0xf0, 0x03, 0xff, 0x80, 
-	0xf0, 0x03, 0xff, 0x7e, 0x28, 0x28, 0xd9, 0x10, 
-	0x42, 0xb0, 0xd3, 0x0e, 0x69, 0xe9, 0x08, 0xc9, 
-	0xd3, 0x0b, 0x4b, 0x1a, 0x18, 0xc1, 0x20, 0x1e, 
-	0xf0, 0x17, 0xf8, 0x40, 0x21, 0x64, 0x1d, 0xc2, 
-	0x32, 0xff, 0x32, 0xee, 0x20, 0x01, 0xf0, 0x08, 
-	0xfa, 0xc5, 0xf0, 0x01, 0xfb, 0xe7, 0xf0, 0x02, 
-	0xf8, 0xfb, 0xf0, 0x03, 0xff, 0x65, 0x1c, 0x01, 
-	0x20, 0x7d, 0x00, 0xc0, 0xf0, 0x17, 0xf8, 0x2e, 
-	0x1c, 0x01, 0x48, 0x0f, 0x88, 0x02, 0x32, 0x01, 
-	0x80, 0x02, 0x42, 0xb9, 0xd0, 0xd6, 0x2f, 0x04, 
-	0xd3, 0x06, 0x20, 0x01, 0xf0, 0x08, 0xf9, 0xce, 
-	0xb0, 0x14, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x0f, 0xf0, 0x00, 0xfd, 0xc7, 0x20, 0x00, 
-	0x60, 0x20, 0xe7, 0xc7, 0x2e, 0x02, 0x5e, 0x00, 
-	0x00, 0x00, 0x0b, 0xb8, 0x72, 0x00, 0x01, 0x00, 
-	0x2e, 0x08, 0x01, 0x88, 0xff, 0xff, 0xf4, 0x48, 
-	0x2c, 0x00, 0x1f, 0xc8, 0xb5, 0x80, 0x27, 0x00, 
-	0x48, 0x07, 0x81, 0x07, 0xf0, 0x03, 0xfd, 0x5e, 
-	0xf7, 0xff, 0xff, 0x88, 0xf0, 0x00, 0xf8, 0xce, 
-	0xf0, 0x05, 0xfe, 0xfe, 0xf7, 0xff, 0xff, 0x3e, 
-	0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0xf0, 0x4d, 0x29, 
-	0x68, 0x01, 0x31, 0x03, 0x10, 0x89, 0x1e, 0xcb, 
-	0x68, 0x41, 0x10, 0x89, 0x68, 0x82, 0x10, 0x92, 
-	0x00, 0x89, 0x30, 0x0c, 0x18, 0x0c, 0x21, 0x03, 
-	0x05, 0x89, 0x27, 0x35, 0x06, 0x7f, 0x60, 0x39, 
-	0x49, 0x21, 0x68, 0x0e, 0x08, 0xb6, 0x00, 0xb6, 
-	0x60, 0x0e, 0x21, 0x00, 0x2b, 0x00, 0xd9, 0x04, 
-	0xc8, 0x40, 0xc5, 0x40, 0x31, 0x01, 0x42, 0x99, 
-	0xd3, 0xfa, 0x23, 0x00, 0x49, 0x1b, 0x65, 0x8b, 
-	0x20, 0x00, 0x2a, 0x00, 0xd9, 0x04, 0xcc, 0x20, 
-	0x64, 0x8d, 0x30, 0x01, 0x42, 0x90, 0xd3, 0xfa, 
-	0x48, 0x17, 0x60, 0x03, 0x60, 0x3b, 0x66, 0x8b, 
-	0x60, 0x3b, 0x22, 0x01, 0x64, 0xca, 0x21, 0x00, 
-	0x4a, 0x14, 0x68, 0x03, 0x2b, 0x00, 0xd1, 0x05, 
-	0x33, 0x01, 0x2b, 0x64, 0xdb, 0xfc, 0x31, 0x01, 
-	0x42, 0x91, 0xdb, 0xf6, 0x48, 0x10, 0x68, 0x01, 
-	0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 0x49, 0x0f, 
-	0x20, 0x33, 0x06, 0x40, 0x65, 0x41, 0x49, 0x0e, 
-	0x65, 0x81, 0x49, 0x0e, 0x66, 0x81, 0x39, 0x04, 
-	0x66, 0x41, 0x21, 0x03, 0x67, 0x01, 0x21, 0x00, 
-	0x20, 0x0d, 0xf0, 0x0f, 0xf9, 0xc9, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xcc, 0x00, 0x00, 0x00, 
-	0x66, 0x00, 0x00, 0x70, 0x6a, 0x00, 0x00, 0x80, 
-	0xcc, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x27, 0x10, 
-	0x6a, 0x00, 0x00, 0x10, 0xcc, 0x00, 0x0f, 0x84, 
-	0xcc, 0x00, 0x0f, 0x88, 0x98, 0x00, 0x0f, 0x88, 
-	0xb5, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x08, 
-	0xf0, 0x0f, 0xfe, 0x04, 0x48, 0x08, 0x21, 0x40, 
-	0xf0, 0x0f, 0xfa, 0xd4, 0x20, 0x01, 0x21, 0x35, 
-	0x06, 0x49, 0x61, 0x08, 0x20, 0x02, 0x43, 0xc0, 
-	0x49, 0x04, 0x63, 0x08, 0x20, 0x00, 0x21, 0x39, 
-	0x06, 0x49, 0x62, 0xc8, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x01, 0xcc, 0x90, 0x72, 0x00, 0x01, 0x00, 
-	0xb5, 0x00, 0x1c, 0x01, 0x48, 0x0f, 0xd0, 0x10, 
-	0x29, 0x01, 0xd0, 0x12, 0x29, 0x02, 0xd0, 0x14, 
-	0x29, 0x03, 0xd1, 0x01, 0x49, 0x0c, 0x60, 0x01, 
-	0x68, 0x01, 0x68, 0x40, 0x43, 0x08, 0x22, 0x00, 
-	0x21, 0x1e, 0xf0, 0x0f, 0xfe, 0x43, 0xbc, 0x08, 
-	0x47, 0x18, 0x21, 0x01, 0x04, 0x49, 0x60, 0x01, 
-	0xe7, 0xf2, 0x21, 0x21, 0x03, 0x09, 0x60, 0x01, 
-	0xe7, 0xee, 0x21, 0x41, 0x03, 0x09, 0x60, 0x01, 
-	0xe7, 0xea, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x94, 
-	0x00, 0x08, 0x10, 0x08, 0xb5, 0x00, 0x1c, 0x01, 
-	0x48, 0x0b, 0xd0, 0x0e, 0x29, 0x01, 0xd0, 0x0f, 
-	0x29, 0x02, 0xd1, 0x01, 0x21, 0x04, 0x60, 0x41, 
-	0x68, 0x01, 0x68, 0x40, 0x43, 0x08, 0x22, 0x00, 
-	0x21, 0x1e, 0xf0, 0x0f, 0xfe, 0x1f, 0xbc, 0x08, 
-	0x47, 0x18, 0x21, 0x01, 0x60, 0x41, 0xe7, 0xf3, 
-	0x21, 0x02, 0x60, 0x41, 0xe7, 0xf0, 0x00, 0x00, 
-	0x2e, 0x08, 0x01, 0x94, 0xb5, 0x80, 0x4b, 0x09, 
-	0x22, 0x0a, 0x21, 0x0a, 0x20, 0x0b, 0xf0, 0x10, 
-	0xf8, 0x53, 0x20, 0x0b, 0xf0, 0x10, 0xf9, 0x75, 
-	0x4f, 0x05, 0x60, 0x38, 0x00, 0x80, 0xf0, 0x03, 
-	0xff, 0x45, 0x60, 0x78, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xc0, 
-	0x2e, 0x08, 0x01, 0xd0, 0xb5, 0xb0, 0x25, 0x00, 
-	0x1c, 0x0c, 0x1c, 0x07, 0x2a, 0x08, 0xd2, 0x30, 
-	0xa3, 0x01, 0x5c, 0x9b, 0x00, 0x5b, 0x44, 0x9f, 
-	0x2c, 0x29, 0x29, 0x03, 0x29, 0x29, 0x03, 0x29, 
-	0x20, 0x00, 0xf0, 0x00, 0xf8, 0x4d, 0x23, 0x2d, 
-	0x01, 0x1b, 0x42, 0x9f, 0xd0, 0x13, 0x23, 0x0b, 
-	0x01, 0x9b, 0x42, 0x9f, 0xd0, 0x0f, 0x23, 0xff, 
-	0x33, 0xe1, 0x42, 0x9f, 0xd0, 0x0b, 0x23, 0xff, 
-	0x33, 0x61, 0x42, 0x9f, 0xd0, 0x07, 0x23, 0x21, 
-	0x01, 0x1b, 0x42, 0x9f, 0xd0, 0x03, 0x23, 0x11, 
-	0x01, 0x5b, 0x42, 0x9f, 0xd1, 0x08, 0x23, 0x09, 
-	0x01, 0x9b, 0x42, 0x9c, 0xd0, 0x09, 0x08, 0x5b, 
-	0x42, 0x9c, 0xd0, 0x06, 0x2c, 0xf0, 0xd0, 0x04, 
-	0x25, 0x01, 0xe0, 0x02, 0x20, 0x01, 0xf0, 0x00, 
-	0xf8, 0x27, 0x4f, 0x12, 0x6c, 0x78, 0x42, 0x85, 
-	0xd0, 0x1c, 0x1d, 0xfb, 0x33, 0x35, 0x2d, 0x00, 
-	0xd0, 0x12, 0x1f, 0xda, 0x3a, 0x0d, 0x21, 0x03, 
-	0x1d, 0x10, 0xb4, 0x07, 0x22, 0x0b, 0xb4, 0x04, 
-	0x1c, 0x19, 0x23, 0x00, 0x22, 0x00, 0x20, 0x00, 
-	0xf0, 0x0a, 0xfc, 0x4c, 0x6a, 0xb8, 0x1c, 0x29, 
-	0xb0, 0x04, 0xf0, 0x0b, 0xfd, 0x9b, 0xe0, 0x04, 
-	0x21, 0x00, 0x6a, 0xb8, 0x1c, 0x1a, 0xf0, 0x0a, 
-	0xff, 0x51, 0x64, 0x7d, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x94, 
-	0xb5, 0xf0, 0x1c, 0x07, 0xb0, 0x81, 0x4d, 0x56, 
-	0x1d, 0xee, 0x36, 0x19, 0x79, 0x30, 0x42, 0x87, 
-	0xd1, 0x03, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x24, 0x00, 0x6c, 0x68, 0x28, 0x00, 
-	0xd0, 0x05, 0x64, 0x6c, 0x4a, 0x4f, 0x21, 0x00, 
-	0x6a, 0xa8, 0xf0, 0x0a, 0xff, 0x33, 0x71, 0x37, 
-	0x21, 0x00, 0x20, 0x0e, 0xf0, 0x0f, 0xf8, 0xc4, 
-	0x20, 0x00, 0xf0, 0x0c, 0xfb, 0xc5, 0x20, 0x1f, 
-	0xf0, 0x09, 0xfc, 0x5a, 0x26, 0x03, 0x02, 0x76, 
-	0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, 0x20, 0x1f, 
-	0x1c, 0x33, 0xf0, 0x09, 0xfa, 0xd1, 0x20, 0x1e, 
-	0xf0, 0x09, 0xfd, 0x18, 0x22, 0x01, 0x02, 0xd2, 
-	0x21, 0x02, 0x20, 0x1e, 0x1c, 0x33, 0xf0, 0x09, 
-	0xfa, 0xc7, 0x1c, 0x39, 0x27, 0x1c, 0x48, 0x3e, 
-	0x26, 0x0c, 0x29, 0x06, 0xd2, 0x07, 0xa3, 0x02, 
-	0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x03, 0x12, 0x03, 0x21, 0x12, 0x30, 0x48, 0x39, 
-	0x21, 0x40, 0xf0, 0x0f, 0xf9, 0xc3, 0xab, 0x00, 
-	0x70, 0x1c, 0x20, 0x08, 0x70, 0x58, 0x70, 0x9f, 
-	0x70, 0xdc, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x0f, 
-	0xfc, 0xe5, 0xe0, 0x2b, 0x21, 0x1f, 0x43, 0xc9, 
-	0xf0, 0x0f, 0xf9, 0xb4, 0xab, 0x00, 0x70, 0x1c, 
-	0x70, 0x5c, 0x70, 0x9e, 0x70, 0xdc, 0x22, 0x00, 
-	0x21, 0x00, 0x20, 0x00, 0xf0, 0x0f, 0xfc, 0xd6, 
-	0xe0, 0x1c, 0x21, 0x40, 0xf0, 0x0f, 0xf9, 0xa6, 
-	0xab, 0x00, 0x70, 0x1c, 0x20, 0x10, 0x70, 0x58, 
-	0x70, 0x9f, 0x70, 0xdc, 0x22, 0x00, 0x21, 0x00, 
-	0x20, 0x08, 0xf0, 0x0f, 0xfc, 0xc7, 0xe0, 0x0d, 
-	0x21, 0x1f, 0x43, 0xc9, 0xf0, 0x0f, 0xf9, 0x96, 
-	0xab, 0x00, 0x70, 0x1c, 0x70, 0x5c, 0x70, 0x9e, 
-	0x70, 0xdc, 0x22, 0x00, 0x21, 0x00, 0x20, 0x08, 
-	0xf0, 0x0f, 0xfc, 0xb8, 0x20, 0x01, 0x21, 0x35, 
-	0x06, 0x49, 0x61, 0x08, 0x20, 0x02, 0x43, 0xc0, 
-	0x49, 0x19, 0x63, 0x08, 0x20, 0x39, 0x06, 0x40, 
-	0x62, 0xc4, 0xcd, 0x03, 0x43, 0x08, 0x22, 0x00, 
-	0x21, 0x1e, 0xf0, 0x0f, 0xfd, 0x0f, 0x48, 0x15, 
-	0xf0, 0x0c, 0xfa, 0xd0, 0x20, 0x00, 0xf0, 0x0c, 
-	0xfb, 0x41, 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x68, 
-	0x20, 0x00, 0xf0, 0x03, 0xfb, 0x3f, 0x20, 0x01, 
-	0xf0, 0x0c, 0xfb, 0x46, 0x4a, 0x0e, 0xb4, 0x04, 
-	0x1c, 0x13, 0x3a, 0x01, 0x49, 0x0d, 0x1e, 0xc8, 
-	0xf7, 0xfe, 0xfb, 0x4e, 0x21, 0x00, 0x20, 0x0d, 
-	0xb0, 0x01, 0xf0, 0x0f, 0xf8, 0x35, 0xb0, 0x01, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x01, 0x94, 0x2e, 0x08, 0x01, 0xd0, 
-	0x2e, 0x02, 0x12, 0xfc, 0x2e, 0x01, 0xcc, 0x90, 
-	0x72, 0x00, 0x01, 0x00, 0x00, 0x80, 0x10, 0x80, 
-	0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xfe, 
-	0xb5, 0xb0, 0x1c, 0x07, 0x4c, 0x10, 0x6a, 0x20, 
-	0x42, 0x87, 0xd0, 0x19, 0x20, 0x00, 0x2f, 0x03, 
-	0xd1, 0x02, 0x21, 0x01, 0x61, 0x61, 0xe0, 0x00, 
-	0x61, 0x60, 0x21, 0x02, 0x4d, 0x0b, 0x60, 0x29, 
-	0x71, 0x28, 0x71, 0x68, 0x22, 0x01, 0xb4, 0x04, 
-	0x7a, 0x23, 0x7c, 0x22, 0x7b, 0x21, 0x20, 0x00, 
-	0xf0, 0x0f, 0xfb, 0x02, 0x69, 0x61, 0x1c, 0x28, 
-	0xb0, 0x01, 0xf0, 0x10, 0xfb, 0xa9, 0x62, 0x27, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x01, 0x94, 0x2e, 0x08, 0x01, 0xac, 
-	0xb5, 0x00, 0x22, 0x02, 0x49, 0x09, 0x60, 0x0a, 
-	0x22, 0x00, 0x71, 0x0a, 0x71, 0x4a, 0x39, 0x48, 
-	0x28, 0x00, 0xd0, 0x08, 0x28, 0x01, 0xd1, 0x00, 
-	0x72, 0x08, 0x6a, 0x08, 0x62, 0x0a, 0xf7, 0xff, 
-	0xff, 0xc7, 0xbc, 0x08, 0x47, 0x18, 0x72, 0x0a, 
-	0xe7, 0xf7, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xdc, 
-	0xb5, 0x80, 0x06, 0x00, 0x0e, 0x00, 0x4f, 0x0b, 
-	0xd0, 0x02, 0x20, 0x00, 0x73, 0x38, 0xe0, 0x01, 
-	0x20, 0x01, 0x73, 0x38, 0x22, 0x01, 0xb4, 0x04, 
-	0x7a, 0x3b, 0x7c, 0x3a, 0x7b, 0x39, 0x20, 0x00, 
-	0xf0, 0x0f, 0xfa, 0xca, 0x69, 0x79, 0xb0, 0x01, 
-	0x48, 0x03, 0xf0, 0x10, 0xfb, 0x71, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x01, 0x94, 
-	0x2e, 0x08, 0x01, 0xac, 0xb5, 0x80, 0x06, 0x00, 
-	0x0e, 0x00, 0x1c, 0x01, 0x4f, 0x08, 0x74, 0x39, 
-	0x22, 0x01, 0xb4, 0x04, 0x7a, 0x3b, 0x7b, 0x39, 
-	0x1c, 0x02, 0x20, 0x00, 0xf0, 0x0f, 0xfa, 0xb0, 
-	0x69, 0x79, 0xb0, 0x01, 0x48, 0x03, 0xf0, 0x10, 
-	0xfb, 0x57, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x01, 0x94, 0x2e, 0x08, 0x01, 0xac, 
-	0xb4, 0xb0, 0x21, 0x00, 0x48, 0x08, 0x60, 0x01, 
-	0x20, 0x00, 0x4c, 0x08, 0x4f, 0x08, 0x4b, 0x09, 
-	0x4a, 0x09, 0x00, 0x85, 0x51, 0x61, 0x54, 0x39, 
-	0x54, 0x19, 0x54, 0x11, 0x30, 0x01, 0x28, 0x20, 
-	0xdb, 0xf7, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x01, 0xe4, 0x2e, 0x08, 0x43, 0x88, 
-	0x2e, 0x08, 0x44, 0x08, 0x2e, 0x08, 0x44, 0x48, 
-	0x2e, 0x08, 0x44, 0x28, 0x06, 0x00, 0x0e, 0x00, 
-	0x21, 0x01, 0x40, 0x81, 0x43, 0xca, 0x49, 0x05, 
-	0x68, 0x0b, 0x40, 0x1a, 0x60, 0x0a, 0x21, 0x00, 
-	0x00, 0x82, 0x4b, 0x03, 0x50, 0x99, 0x4a, 0x03, 
-	0x54, 0x11, 0x47, 0x70, 0x2e, 0x08, 0x01, 0xe4, 
-	0x2e, 0x08, 0x43, 0x88, 0x2e, 0x08, 0x44, 0x08, 
-	0xb5, 0xf0, 0xb0, 0x84, 0x4f, 0x36, 0x68, 0x38, 
-	0x1d, 0xc1, 0x31, 0x0d, 0x20, 0x00, 0xf0, 0x23, 
-	0xfb, 0xc1, 0x1c, 0x04, 0x68, 0x38, 0x1d, 0xc1, 
-	0x31, 0x05, 0x20, 0x00, 0xf0, 0x23, 0xfb, 0xba, 
-	0x1c, 0x05, 0x68, 0x38, 0x1d, 0xc1, 0x31, 0x09, 
-	0x20, 0x00, 0xf0, 0x23, 0xfb, 0xb3, 0x43, 0x2c, 
-	0x1c, 0x20, 0x4c, 0x2c, 0x68, 0x21, 0x43, 0x08, 
-	0x27, 0x00, 0x60, 0x20, 0x1c, 0x05, 0xd0, 0x4a, 
-	0x48, 0x29, 0x90, 0x03, 0x48, 0x29, 0x90, 0x02, 
-	0x4a, 0x29, 0x92, 0x01, 0x4e, 0x29, 0x08, 0x68, 
-	0xd3, 0x3c, 0x98, 0x03, 0x5d, 0xc0, 0x28, 0x00, 
-	0xd0, 0x32, 0x98, 0x02, 0x5d, 0xc0, 0x28, 0x00, 
-	0xd0, 0x2a, 0x46, 0x68, 0x1c, 0x39, 0xf0, 0x10, 
-	0xff, 0x69, 0xa8, 0x00, 0x78, 0x00, 0x28, 0x01, 
-	0xd1, 0x1b, 0x68, 0x60, 0x30, 0x01, 0x60, 0x60, 
-	0x5d, 0xf0, 0x28, 0x00, 0xd1, 0x06, 0x20, 0xff, 
-	0x55, 0xf0, 0x21, 0x00, 0x00, 0xb8, 0x9a, 0x01, 
-	0x50, 0x11, 0xe0, 0x1f, 0x20, 0x02, 0x1c, 0x39, 
-	0xf0, 0x00, 0xf8, 0x8e, 0x28, 0x00, 0xd1, 0x19, 
-	0x21, 0x00, 0x55, 0xf1, 0x20, 0x01, 0x40, 0xb8, 
-	0x43, 0xc0, 0x68, 0x21, 0x40, 0x08, 0x60, 0x20, 
-	0xe0, 0x10, 0x20, 0x01, 0x40, 0xb8, 0x43, 0xc0, 
-	0x68, 0x21, 0x40, 0x08, 0x60, 0x20, 0xe0, 0x09, 
-	0x68, 0x60, 0x30, 0x01, 0x60, 0x60, 0xe0, 0x05, 
-	0x20, 0x01, 0x40, 0xb8, 0x43, 0xc0, 0x68, 0x21, 
-	0x40, 0x08, 0x60, 0x20, 0x1c, 0x78, 0x06, 0x07, 
-	0x0e, 0x3f, 0x08, 0x6d, 0xd1, 0xbb, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x5e, 0x0c, 0x2e, 0x08, 0x01, 0xe4, 
-	0x2e, 0x08, 0x44, 0x28, 0x2e, 0x08, 0x44, 0x48, 
-	0x2e, 0x08, 0x43, 0x88, 0x2e, 0x08, 0x44, 0x08, 
-	0xb5, 0xf0, 0x27, 0x00, 0xb0, 0x85, 0x4c, 0x26, 
-	0x68, 0x25, 0x2d, 0x00, 0xd0, 0x44, 0x4e, 0x25, 
-	0x48, 0x25, 0x90, 0x04, 0x49, 0x25, 0x91, 0x03, 
-	0x4a, 0x25, 0x92, 0x02, 0x48, 0x25, 0x90, 0x01, 
-	0x08, 0x68, 0xd3, 0x34, 0x5d, 0xf0, 0x28, 0x00, 
-	0xd0, 0x2b, 0x98, 0x04, 0x5d, 0xc0, 0x28, 0x00, 
-	0xd0, 0x2d, 0x46, 0x68, 0x1c, 0x39, 0xf0, 0x10, 
-	0xff, 0x05, 0xa8, 0x00, 0x78, 0x00, 0x28, 0x01, 
-	0xd1, 0x18, 0x68, 0x60, 0x30, 0x01, 0x60, 0x60, 
-	0x00, 0xb8, 0x99, 0x03, 0x58, 0x09, 0x69, 0x09, 
-	0x9a, 0x02, 0x50, 0x11, 0x20, 0x02, 0x1c, 0x39, 
-	0xf0, 0x00, 0xf8, 0x2e, 0x28, 0x00, 0xd1, 0x16, 
-	0x21, 0x00, 0x98, 0x01, 0x55, 0xc1, 0x20, 0x01, 
-	0x40, 0xb8, 0x43, 0xc0, 0x68, 0x21, 0x40, 0x08, 
-	0x60, 0x20, 0xe0, 0x0c, 0x20, 0x01, 0x40, 0xb8, 
-	0x43, 0xc0, 0x68, 0x21, 0x40, 0x08, 0x60, 0x20, 
-	0xe0, 0x05, 0x20, 0x01, 0x40, 0xb8, 0x43, 0xc0, 
-	0x68, 0x21, 0x40, 0x08, 0x60, 0x20, 0x1c, 0x78, 
-	0x06, 0x07, 0x0e, 0x3f, 0x08, 0x6d, 0xd1, 0xc3, 
-	0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x01, 0xe4, 0x2e, 0x08, 0x44, 0x28, 
-	0x2e, 0x08, 0x44, 0x48, 0x2e, 0x08, 0x5e, 0x5c, 
-	0x2e, 0x08, 0x43, 0x88, 0x2e, 0x08, 0x44, 0x08, 
-	0xb4, 0xf0, 0x06, 0x03, 0x0e, 0x1b, 0xb0, 0x82, 
-	0x93, 0x00, 0x06, 0x0c, 0x0e, 0x24, 0x00, 0xa2, 
-	0xb0, 0x81, 0x48, 0x33, 0x58, 0x80, 0x90, 0x00, 
-	0x28, 0x00, 0xd1, 0x03, 0x20, 0xb0, 0xb0, 0x03, 
-	0xbc, 0xf0, 0x47, 0x70, 0x48, 0x2f, 0x68, 0x00, 
-	0x18, 0x17, 0x00, 0xe0, 0x1b, 0x00, 0x00, 0x80, 
-	0x49, 0x2d, 0x68, 0x09, 0x18, 0x41, 0x9b, 0x01, 
-	0x48, 0x2c, 0x4d, 0x2d, 0x95, 0x02, 0x2b, 0x01, 
-	0xd0, 0x2a, 0x2b, 0x02, 0xd1, 0x47, 0x4d, 0x2b, 
-	0x58, 0xab, 0x2b, 0x00, 0xd1, 0x03, 0x20, 0xff, 
-	0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 0x60, 0x4b, 
-	0x23, 0x00, 0x50, 0xab, 0x22, 0x00, 0x5c, 0x83, 
-	0x42, 0xa3, 0xd1, 0x07, 0x00, 0x93, 0x9d, 0x02, 
-	0x58, 0xeb, 0x78, 0x5e, 0x1c, 0x5d, 0x23, 0x80, 
-	0x43, 0x9e, 0x70, 0x2e, 0x32, 0x01, 0x06, 0x12, 
-	0x0e, 0x12, 0x2a, 0x20, 0xdb, 0xef, 0x88, 0x08, 
-	0x4b, 0x1d, 0x40, 0x18, 0x80, 0x08, 0x98, 0x00, 
-	0x9b, 0x01, 0x70, 0xc3, 0x68, 0x38, 0x23, 0x01, 
-	0x03, 0x5b, 0x43, 0x18, 0x60, 0x38, 0xe0, 0x1a, 
-	0x68, 0x3a, 0x4b, 0x18, 0x40, 0x1a, 0x60, 0x3a, 
-	0x9a, 0x00, 0x9b, 0x01, 0x70, 0xd3, 0x23, 0x00, 
-	0x60, 0x8b, 0x70, 0xcb, 0x60, 0xcb, 0x21, 0x00, 
-	0x5c, 0x42, 0x42, 0xa2, 0xd1, 0x06, 0x00, 0x8a, 
-	0x9d, 0x02, 0x58, 0xaa, 0x78, 0x57, 0x23, 0x80, 
-	0x43, 0x3b, 0x70, 0x53, 0x31, 0x01, 0x06, 0x09, 
-	0x0e, 0x09, 0x29, 0x20, 0xdb, 0xf0, 0x20, 0x00, 
-	0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 0x20, 0xbc, 
-	0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5d, 0xcc, 
-	0x2e, 0x08, 0x5d, 0xc4, 0x2e, 0x08, 0x5f, 0xa4, 
-	0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x43, 0x88, 
-	0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xdf, 0xff, 
-	0xb4, 0xf0, 0x78, 0x43, 0x00, 0x9e, 0x49, 0x32, 
-	0x59, 0x8c, 0x88, 0x42, 0x68, 0x87, 0x68, 0x40, 
-	0x1d, 0xf9, 0x31, 0xb9, 0x1a, 0x09, 0x42, 0x91, 
-	0xda, 0x3d, 0x25, 0x00, 0x1c, 0x18, 0x00, 0xdb, 
-	0x1a, 0x18, 0x00, 0x80, 0x4b, 0x2b, 0x68, 0x1b, 
-	0x18, 0xc0, 0x78, 0x80, 0x06, 0xc0, 0x0e, 0xc0, 
-	0x28, 0x12, 0xd1, 0x02, 0x29, 0x0e, 0xda, 0x00, 
-	0x25, 0x01, 0x2a, 0x00, 0xdd, 0x2b, 0x42, 0x8a, 
-	0xdd, 0x05, 0x68, 0x3f, 0x2f, 0x00, 0xd1, 0x02, 
-	0x20, 0xba, 0xbc, 0xf0, 0x47, 0x70, 0x1a, 0x52, 
-	0x79, 0xb9, 0x23, 0xc0, 0x1a, 0x59, 0x79, 0xfb, 
-	0x1d, 0x38, 0x08, 0x5b, 0xd3, 0x01, 0x22, 0x00, 
-	0xe0, 0x16, 0x2d, 0x00, 0xd0, 0x14, 0x42, 0x91, 
-	0xdb, 0x01, 0x31, 0x01, 0xe0, 0x10, 0x1c, 0x4b, 
-	0x42, 0x93, 0xd1, 0x0d, 0x78, 0x85, 0x2d, 0x09, 
-	0xdd, 0x06, 0x79, 0x05, 0x78, 0x80, 0x35, 0x09, 
-	0x42, 0x85, 0xd0, 0x05, 0x1c, 0x19, 0xe0, 0x03, 
-	0x78, 0x80, 0x28, 0x09, 0xd1, 0x00, 0x1c, 0x19, 
-	0x25, 0x00, 0x2a, 0x00, 0xdc, 0xd3, 0x69, 0x21, 
-	0x20, 0x00, 0x1c, 0x0a, 0x42, 0xb9, 0xd0, 0xd4, 
-	0x68, 0x0b, 0x42, 0xbb, 0xd0, 0x08, 0x68, 0x09, 
-	0x29, 0x00, 0xd1, 0x02, 0x20, 0xba, 0xbc, 0xf0, 
-	0x47, 0x70, 0x68, 0x0b, 0x42, 0xbb, 0xd1, 0xf6, 
-	0x4b, 0x07, 0x51, 0x9a, 0x60, 0x08, 0x69, 0xa2, 
-	0x69, 0x23, 0x60, 0x13, 0x61, 0xa1, 0x61, 0x27, 
-	0x61, 0x67, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5d, 0xc4, 
-	0x2e, 0x08, 0x43, 0x88, 0xb5, 0xf0, 0x06, 0x07, 
-	0x0e, 0x3f, 0x04, 0x0c, 0x0c, 0x24, 0x06, 0x15, 
-	0x0e, 0x2d, 0x00, 0xf8, 0x49, 0x2c, 0x68, 0x09, 
-	0x18, 0x40, 0x00, 0xb9, 0x4a, 0x2b, 0x68, 0x12, 
-	0x18, 0x8a, 0x00, 0xf9, 0x1b, 0xc9, 0x00, 0x89, 
-	0x4b, 0x29, 0x68, 0x1b, 0x18, 0xc9, 0x68, 0x16, 
-	0x23, 0x01, 0x03, 0x5b, 0x43, 0x9e, 0x60, 0x16, 
-	0x68, 0x06, 0x23, 0x03, 0x03, 0x9b, 0x43, 0x9e, 
-	0x60, 0x06, 0x4b, 0x24, 0x42, 0x9c, 0xd0, 0x36, 
-	0x68, 0x06, 0x23, 0x21, 0x43, 0x9e, 0x60, 0x06, 
-	0x68, 0x16, 0x23, 0x07, 0x03, 0x5b, 0x40, 0x33, 
-	0x60, 0x13, 0x23, 0x07, 0x03, 0x5b, 0x43, 0x9c, 
-	0x1c, 0x23, 0x68, 0x14, 0x43, 0x23, 0x60, 0x13, 
-	0x22, 0x00, 0x75, 0x0a, 0x88, 0x0c, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x9c, 0x80, 0x0c, 0x07, 0xab, 
-	0x0f, 0x9b, 0x2b, 0x01, 0xd1, 0x04, 0x88, 0x0c, 
-	0x23, 0x10, 0x43, 0x23, 0x80, 0x0b, 0xe0, 0x03, 
-	0x88, 0x0c, 0x23, 0x10, 0x43, 0x9c, 0x80, 0x0c, 
-	0x68, 0x01, 0x23, 0x40, 0x43, 0xdb, 0x40, 0x19, 
-	0x60, 0x01, 0x00, 0xf9, 0x4b, 0x0e, 0x68, 0x1b, 
-	0x18, 0xc9, 0x60, 0x4a, 0x68, 0x01, 0x4b, 0x0d, 
-	0x43, 0x19, 0x60, 0x01, 0x68, 0x01, 0x60, 0x01, 
-	0x21, 0x0f, 0x60, 0x41, 0xe0, 0x04, 0x1c, 0x38, 
-	0xf0, 0x0d, 0xff, 0x1a, 0x28, 0x00, 0xd1, 0x00, 
-	0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x5d, 0xd0, 0x2e, 0x08, 0x5d, 0xcc, 
-	0x2e, 0x08, 0x5d, 0xc4, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x5d, 0xd4, 0x00, 0x00, 0x20, 0xa0, 
-	0xb5, 0xf0, 0x06, 0x09, 0x0e, 0x09, 0x1c, 0x07, 
-	0xb0, 0x8a, 0x48, 0x58, 0x29, 0x00, 0xd1, 0x0a, 
-	0x4d, 0x57, 0x69, 0x01, 0x91, 0x04, 0x49, 0x57, 
-	0x91, 0x03, 0x69, 0x41, 0x91, 0x02, 0x6a, 0x00, 
-	0x1e, 0x43, 0x93, 0x01, 0xe0, 0x0b, 0x29, 0x20, 
-	0xd1, 0x15, 0x4d, 0x53, 0x69, 0x81, 0x91, 0x04, 
-	0x49, 0x52, 0x91, 0x03, 0x69, 0xc1, 0x91, 0x02, 
-	0x6a, 0x40, 0x1e, 0x43, 0x93, 0x01, 0x24, 0x00, 
-	0x4b, 0x4f, 0x93, 0x09, 0x4a, 0x4f, 0x92, 0x08, 
-	0x4b, 0x4f, 0x93, 0x07, 0x4e, 0x4f, 0x96, 0x06, 
-	0x4a, 0x4f, 0x92, 0x05, 0xe0, 0x7a, 0x20, 0xb3, 
-	0xb0, 0x0a, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x98, 0x04, 0x00, 0x80, 0x19, 0x40, 0x23, 0x01, 
-	0x02, 0x9b, 0x18, 0xc0, 0x68, 0x01, 0x98, 0x04, 
-	0x00, 0x80, 0x58, 0x28, 0x9a, 0x04, 0x18, 0xaa, 
-	0x00, 0x5b, 0x18, 0xd2, 0x78, 0x12, 0x92, 0x00, 
-	0x22, 0x00, 0x9b, 0x04, 0x18, 0xee, 0x23, 0x01, 
-	0x02, 0xdb, 0x18, 0xf3, 0x70, 0x1a, 0x9a, 0x04, 
-	0x32, 0x01, 0x92, 0x04, 0x9b, 0x01, 0x40, 0x1a, 
-	0x92, 0x04, 0x29, 0x00, 0xd0, 0x56, 0xb0, 0x82, 
-	0x91, 0x01, 0x21, 0x01, 0x9a, 0x02, 0x2a, 0x80, 
-	0xd1, 0x19, 0x22, 0x00, 0x9b, 0x01, 0x40, 0x0b, 
-	0xd0, 0x10, 0x9b, 0x0b, 0x5c, 0x9b, 0x2b, 0xff, 
-	0xd0, 0x0c, 0x9b, 0x0b, 0x5c, 0x9b, 0x93, 0x00, 
-	0x00, 0x91, 0x9a, 0x0a, 0x58, 0x52, 0x00, 0xa1, 
-	0x19, 0xc9, 0x61, 0x0a, 0x1c, 0x61, 0x06, 0x0c, 
-	0x0e, 0x24, 0xe0, 0x1c, 0x00, 0x49, 0x32, 0x01, 
-	0x2a, 0x10, 0xd3, 0xe7, 0xe0, 0x17, 0x22, 0x00, 
-	0x9b, 0x01, 0x40, 0x0b, 0xd0, 0x0f, 0x9b, 0x09, 
-	0x5c, 0x9b, 0x2b, 0xff, 0xd0, 0x0b, 0x93, 0x00, 
-	0x00, 0x93, 0x9e, 0x08, 0x58, 0xf6, 0x00, 0xa3, 
-	0x19, 0xdb, 0x61, 0x1e, 0x28, 0x00, 0xd0, 0x02, 
-	0x1c, 0x63, 0x06, 0x1c, 0x0e, 0x24, 0x00, 0x49, 
-	0x32, 0x01, 0x2a, 0x20, 0xd3, 0xe8, 0x2c, 0x00, 
-	0xd0, 0x1b, 0x9b, 0x00, 0x70, 0x7b, 0x60, 0x78, 
-	0x9b, 0x00, 0x00, 0x99, 0x9a, 0x07, 0x58, 0x52, 
-	0x69, 0x51, 0xe0, 0x07, 0x68, 0x09, 0x29, 0x00, 
-	0xd1, 0x04, 0x20, 0xba, 0xb0, 0x0c, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x42, 0x88, 0xd3, 0xf5, 
-	0x1d, 0xcb, 0x33, 0xb9, 0x42, 0x83, 0xd3, 0xf1, 
-	0x60, 0xb9, 0x61, 0x51, 0x1c, 0x38, 0xf0, 0x0d, 
-	0xff, 0x24, 0xb0, 0x02, 0x98, 0x04, 0x99, 0x02, 
-	0x42, 0x88, 0xd0, 0x01, 0x2c, 0x00, 0xd0, 0x83, 
-	0x70, 0x3c, 0x98, 0x04, 0x99, 0x03, 0x60, 0x08, 
-	0x20, 0x00, 0xb0, 0x0a, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x9e, 0x00, 0x04, 0x80, 
-	0x2e, 0x08, 0x60, 0x90, 0x9e, 0x00, 0x04, 0x90, 
-	0x2e, 0x08, 0x69, 0x90, 0x9e, 0x00, 0x04, 0x98, 
-	0x2e, 0x08, 0x5f, 0xc4, 0x2e, 0x08, 0x5f, 0x64, 
-	0x2e, 0x08, 0x5f, 0xa4, 0x2e, 0x08, 0x5e, 0xe4, 
-	0x2e, 0x08, 0x5e, 0x5c, 0xb5, 0x00, 0x20, 0xff, 
-	0x49, 0x03, 0x60, 0x08, 0x20, 0x01, 0x05, 0x00, 
-	0xf0, 0x1a, 0xf9, 0x9e, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x01, 0xe4, 0xb5, 0xf0, 0x06, 0x07, 
-	0x0e, 0x3f, 0x06, 0x0c, 0x0e, 0x24, 0x20, 0x10, 
-	0x2f, 0x1f, 0xdc, 0x2c, 0x2c, 0x1f, 0xdc, 0x2a, 
-	0x1c, 0x39, 0x43, 0x21, 0x08, 0x49, 0xd2, 0x26, 
-	0x49, 0x14, 0x1c, 0x38, 0xf0, 0x1a, 0xf9, 0x9a, 
-	0x26, 0x01, 0x1c, 0x35, 0x40, 0xbd, 0x1c, 0x30, 
-	0x40, 0xa0, 0x1c, 0x04, 0x43, 0x28, 0xf0, 0x1a, 
-	0xf9, 0x84, 0xf0, 0x1a, 0xf9, 0x87, 0x43, 0xa8, 
-	0xf0, 0x1a, 0xf9, 0x88, 0xf0, 0x1a, 0xf9, 0x82, 
-	0x43, 0xa0, 0xf0, 0x1a, 0xf9, 0x83, 0x1c, 0x38, 
-	0xf0, 0x10, 0xf8, 0x66, 0x1c, 0x04, 0xd1, 0x07, 
-	0x21, 0x03, 0x05, 0x09, 0x20, 0x00, 0x1c, 0x3a, 
-	0x1c, 0x33, 0xf0, 0x10, 0xff, 0x17, 0x1c, 0x04, 
-	0xf7, 0xff, 0xfc, 0x8e, 0x1c, 0x20, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x00, 0x2d, 0x43, 
-	0xb5, 0xf0, 0x06, 0x04, 0x0e, 0x24, 0x04, 0x0d, 
-	0x0c, 0x2d, 0x06, 0x16, 0x0e, 0x36, 0x9f, 0x05, 
-	0x06, 0x38, 0x0e, 0x00, 0x22, 0x00, 0x21, 0x00, 
-	0xb4, 0x07, 0x21, 0x10, 0x1c, 0x1a, 0xb4, 0x06, 
-	0x23, 0x10, 0x1c, 0x20, 0x1c, 0x29, 0x1c, 0x32, 
-	0xf0, 0x00, 0xf8, 0x54, 0xb0, 0x05, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x06, 0x04, 
-	0x0e, 0x24, 0x04, 0x0d, 0x0c, 0x2d, 0x06, 0x16, 
-	0x0e, 0x36, 0x9f, 0x05, 0x06, 0x38, 0x0e, 0x00, 
-	0x22, 0x00, 0x21, 0x00, 0xb4, 0x07, 0x21, 0x18, 
-	0x1c, 0x1a, 0xb4, 0x06, 0x23, 0x11, 0x1c, 0x20, 
-	0x1c, 0x29, 0x1c, 0x32, 0xf0, 0x00, 0xf8, 0x3a, 
-	0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xf0, 0x06, 0x04, 0x0e, 0x24, 0x04, 0x0d, 
-	0x0c, 0x2d, 0x06, 0x16, 0x0e, 0x36, 0x9f, 0x05, 
-	0x06, 0x38, 0x0e, 0x00, 0x22, 0x00, 0x21, 0x00, 
-	0xb4, 0x07, 0x21, 0x20, 0x1c, 0x1a, 0xb4, 0x06, 
-	0x23, 0x51, 0x1c, 0x20, 0x1c, 0x29, 0x1c, 0x32, 
-	0xf0, 0x00, 0xf8, 0x20, 0xb0, 0x05, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x06, 0x03, 
-	0x0e, 0x1b, 0x04, 0x0d, 0x0c, 0x2d, 0x06, 0x16, 
-	0x0e, 0x36, 0x9c, 0x09, 0x9f, 0x0a, 0x06, 0x20, 
-	0x0e, 0x00, 0x22, 0x00, 0x1c, 0x39, 0xb4, 0x07, 
-	0x21, 0x10, 0x9a, 0x06, 0xb4, 0x06, 0x1c, 0x18, 
-	0x23, 0x62, 0x1c, 0x29, 0x1c, 0x32, 0xf0, 0x00, 
-	0xf8, 0x05, 0xb0, 0x05, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x9e, 0x09, 
-	0x9f, 0x0b, 0x06, 0x04, 0x0e, 0x24, 0x04, 0x09, 
-	0x0c, 0x09, 0xb0, 0x88, 0x91, 0x00, 0x06, 0x15, 
-	0x0e, 0x2d, 0x06, 0x18, 0x0e, 0x00, 0x90, 0x01, 
-	0x06, 0x32, 0x0e, 0x12, 0x92, 0x02, 0x06, 0x38, 
-	0x0e, 0x00, 0x90, 0x03, 0xb0, 0x82, 0xf0, 0x1a, 
-	0xf8, 0xe9, 0x0d, 0x40, 0xd2, 0x09, 0x20, 0xff, 
-	0x90, 0x00, 0xf0, 0x1a, 0xf8, 0xe3, 0x23, 0x01, 
-	0x05, 0x1b, 0x43, 0x18, 0xf0, 0x1a, 0xf8, 0xe2, 
-	0xe0, 0x01, 0x20, 0x00, 0x90, 0x00, 0x98, 0x03, 
-	0x08, 0x40, 0xd3, 0x02, 0x22, 0x12, 0x92, 0x01, 
-	0xe0, 0x01, 0x22, 0x11, 0x92, 0x01, 0x22, 0x01, 
-	0x1c, 0x11, 0x40, 0xa9, 0x4b, 0x5f, 0x1c, 0x0f, 
-	0x68, 0x18, 0x40, 0x07, 0xd0, 0x01, 0x27, 0x11, 
-	0xe0, 0xa2, 0x27, 0x00, 0x43, 0x08, 0x60, 0x18, 
-	0x23, 0x1c, 0x98, 0x05, 0x40, 0x18, 0x28, 0x1c, 
-	0xd1, 0x06, 0x21, 0x01, 0x20, 0x7d, 0x01, 0x00, 
-	0xf0, 0x10, 0xfb, 0xc4, 0x1c, 0x06, 0xe0, 0x0d, 
-	0x98, 0x05, 0x08, 0x40, 0xd3, 0x05, 0x21, 0x01, 
-	0x20, 0xc8, 0xf0, 0x10, 0xfb, 0xbb, 0x1c, 0x06, 
-	0xe0, 0x04, 0x21, 0x01, 0x20, 0x3c, 0xf0, 0x10, 
-	0xfb, 0xb5, 0x1c, 0x06, 0x20, 0x34, 0xf0, 0x03, 
-	0xf9, 0x6d, 0x00, 0xaa, 0x92, 0x09, 0x49, 0x4c, 
-	0x91, 0x08, 0x50, 0x88, 0x00, 0xa1, 0x91, 0x07, 
-	0x48, 0x4a, 0x90, 0x06, 0x58, 0x40, 0x28, 0x00, 
-	0xd1, 0x05, 0x00, 0xb0, 0xf0, 0x03, 0xf9, 0x5e, 
-	0x99, 0x07, 0x9a, 0x06, 0x50, 0x50, 0x98, 0x09, 
-	0x99, 0x08, 0x58, 0x08, 0x28, 0x00, 0xd0, 0x04, 
-	0x98, 0x06, 0x99, 0x07, 0x58, 0x40, 0x28, 0x00, 
-	0xd1, 0x01, 0x27, 0x13, 0xe0, 0x64, 0x99, 0x07, 
-	0x4a, 0x3f, 0x58, 0x51, 0x29, 0x00, 0xd1, 0x3a, 
-	0x9a, 0x01, 0xb4, 0x04, 0x23, 0x40, 0x1c, 0x31, 
-	0x1c, 0x22, 0xf0, 0x10, 0xfc, 0x13, 0xb0, 0x01, 
-	0x1c, 0x07, 0xd1, 0x17, 0x23, 0x03, 0x02, 0x5b, 
-	0x22, 0x01, 0x02, 0xd2, 0x21, 0x01, 0x1c, 0x20, 
-	0xf0, 0x08, 0xfd, 0x56, 0x22, 0x00, 0xb4, 0x04, 
-	0x22, 0x02, 0x99, 0x03, 0x9b, 0x02, 0x1c, 0x20, 
-	0xf0, 0x08, 0xfb, 0x8a, 0xb0, 0x01, 0x1c, 0x07, 
-	0xd1, 0x04, 0x22, 0x01, 0x48, 0x2f, 0x55, 0x02, 
-	0x48, 0x2f, 0x55, 0x02, 0x2f, 0x00, 0xd1, 0x16, 
-	0x98, 0x16, 0x28, 0x00, 0xd0, 0x13, 0x21, 0x02, 
-	0x98, 0x16, 0xf0, 0x10, 0xfb, 0x63, 0x1c, 0x07, 
-	0x00, 0x80, 0xf0, 0x03, 0xf9, 0x1b, 0x99, 0x07, 
-	0x4a, 0x28, 0x50, 0x50, 0x28, 0x00, 0xd0, 0x05, 
-	0x1c, 0x39, 0x1c, 0x22, 0xf0, 0x10, 0xfb, 0x77, 
-	0x1c, 0x07, 0xe0, 0x00, 0x27, 0x13, 0x2f, 0x00, 
-	0xd1, 0x22, 0x98, 0x03, 0x09, 0x80, 0xd3, 0x06, 
-	0x20, 0x5c, 0xf0, 0x03, 0xf9, 0x07, 0x28, 0x00, 
-	0xd1, 0x02, 0x27, 0x13, 0xe0, 0x00, 0x20, 0x00, 
-	0x1c, 0x02, 0x98, 0x05, 0x99, 0x17, 0xb4, 0x07, 
-	0x1c, 0x2a, 0xb4, 0x04, 0x98, 0x0d, 0x99, 0x0c, 
-	0x58, 0x08, 0x99, 0x18, 0x9a, 0x08, 0x9b, 0x07, 
-	0xf0, 0x00, 0xf9, 0x1c, 0xb0, 0x04, 0x2f, 0x00, 
-	0xd1, 0x06, 0x98, 0x09, 0x99, 0x08, 0x58, 0x08, 
-	0x1c, 0x21, 0xf0, 0x0c, 0xfd, 0xf7, 0x1c, 0x07, 
-	0x2f, 0x00, 0xd0, 0x03, 0x1c, 0x20, 0x1c, 0x29, 
-	0xf0, 0x00, 0xf8, 0x20, 0x98, 0x00, 0x28, 0x00, 
-	0xd0, 0x05, 0xf0, 0x1a, 0xf8, 0x1b, 0x4b, 0x0c, 
-	0x40, 0x18, 0xf0, 0x1a, 0xf8, 0x1b, 0x1c, 0x38, 
-	0xb0, 0x0a, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xec, 
-	0x2e, 0x08, 0x01, 0xf0, 0x2e, 0x08, 0x02, 0x70, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x44, 0x48, 
-	0x2e, 0x08, 0x44, 0x28, 0x2e, 0x08, 0x02, 0xf0, 
-	0xff, 0xef, 0xff, 0xff, 0xb5, 0xf0, 0x06, 0x07, 
-	0x0e, 0x3f, 0x06, 0x0d, 0x0e, 0x2d, 0xb0, 0x83, 
-	0xf0, 0x19, 0xff, 0xf8, 0x0d, 0x40, 0xd2, 0x09, 
-	0x20, 0xff, 0x90, 0x00, 0xf0, 0x19, 0xff, 0xf2, 
-	0x23, 0x01, 0x05, 0x1b, 0x43, 0x18, 0xf0, 0x19, 
-	0xff, 0xf1, 0xe0, 0x01, 0x20, 0x00, 0x90, 0x00, 
-	0x24, 0x00, 0x20, 0x01, 0x40, 0xa8, 0x1c, 0x02, 
-	0x49, 0x3f, 0x1c, 0x13, 0x68, 0x08, 0x40, 0x03, 
-	0xd0, 0x69, 0x43, 0xd2, 0x40, 0x10, 0x00, 0xae, 
-	0x60, 0x08, 0x4d, 0x3c, 0x59, 0xa8, 0x28, 0x00, 
-	0xd0, 0x62, 0x78, 0x81, 0x91, 0x02, 0x08, 0x49, 
-	0xd3, 0x02, 0x23, 0x12, 0x93, 0x01, 0xe0, 0x01, 
-	0x23, 0x11, 0x93, 0x01, 0x1c, 0x39, 0xf0, 0x0c, 
-	0xfe, 0x11, 0x1c, 0x04, 0x59, 0xa8, 0x6b, 0x00, 
-	0x28, 0x00, 0xd0, 0x01, 0xf0, 0x03, 0xf8, 0xac, 
-	0x59, 0xa8, 0x6a, 0xc0, 0x28, 0x00, 0xd0, 0x01, 
-	0xf0, 0x03, 0xf8, 0xa6, 0x59, 0xa8, 0xf0, 0x03, 
-	0xf8, 0xa3, 0x20, 0x00, 0x51, 0xa8, 0x00, 0xbd, 
-	0x48, 0x2b, 0x59, 0x40, 0x78, 0x80, 0x28, 0x00, 
-	0xd1, 0x40, 0x1c, 0x39, 0xf0, 0x10, 0xf9, 0x36, 
-	0x2c, 0x00, 0xd1, 0x2a, 0x98, 0x02, 0x09, 0x80, 
-	0xd3, 0x0a, 0x21, 0x00, 0x1c, 0x3a, 0x48, 0x25, 
-	0xf0, 0x10, 0xfa, 0xd1, 0x28, 0x00, 0xd0, 0x03, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x22, 0x00, 0xb4, 0x04, 0x22, 0x02, 0x9b, 0x02, 
-	0x1c, 0x38, 0x49, 0x1e, 0xf0, 0x08, 0xfa, 0xb8, 
-	0xb0, 0x01, 0x1c, 0x04, 0xd1, 0x11, 0x9a, 0x01, 
-	0xb4, 0x04, 0x26, 0x00, 0x21, 0x00, 0x1c, 0x3a, 
-	0x1c, 0x33, 0x48, 0x18, 0xf0, 0x10, 0xfb, 0x22, 
-	0x1c, 0x04, 0xb0, 0x01, 0x48, 0x16, 0x55, 0xc6, 
-	0x48, 0x16, 0x55, 0xc6, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfa, 0xc1, 0x4f, 0x15, 0x59, 0x78, 0xf0, 0x03, 
-	0xf8, 0x67, 0x26, 0x00, 0x51, 0x7e, 0x37, 0x80, 
-	0x59, 0x78, 0x28, 0x00, 0xd0, 0x04, 0xf0, 0x03, 
-	0xf8, 0x5f, 0x51, 0x7e, 0xe0, 0x02, 0xe0, 0x00, 
-	0xe0, 0x00, 0x24, 0x12, 0x98, 0x00, 0x28, 0x00, 
-	0xd0, 0x05, 0xf0, 0x19, 0xff, 0x6f, 0x4b, 0x0b, 
-	0x40, 0x18, 0xf0, 0x19, 0xff, 0x6f, 0x1c, 0x20, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x01, 0xec, 0x2e, 0x08, 0x01, 0xf0, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x44, 0x48, 0x2e, 0x08, 0x44, 0x28, 
-	0x2e, 0x08, 0x02, 0x70, 0xff, 0xef, 0xff, 0xff, 
-	0xb5, 0xb0, 0x06, 0x00, 0x0e, 0x00, 0x00, 0x80, 
-	0x1c, 0x0c, 0x1c, 0x17, 0xb0, 0xad, 0x49, 0x1c, 
-	0x58, 0x08, 0x90, 0x04, 0x78, 0x81, 0x23, 0x04, 
-	0x40, 0x19, 0x25, 0x00, 0x29, 0x00, 0xd0, 0x0b, 
-	0xa9, 0x25, 0xf0, 0x0d, 0xf9, 0xd3, 0xab, 0x00, 
-	0x80, 0x5d, 0xa8, 0x25, 0x90, 0x24, 0x46, 0x68, 
-	0x21, 0x00, 0xf0, 0x0d, 0xf9, 0xf2, 0xe0, 0x0c, 
-	0x78, 0x00, 0x0a, 0x00, 0xd3, 0x04, 0x20, 0x01, 
-	0x03, 0x00, 0xab, 0x00, 0x80, 0x58, 0xe0, 0x03, 
-	0x20, 0x01, 0x02, 0x80, 0xab, 0x00, 0x80, 0x58, 
-	0x20, 0x00, 0x28, 0x00, 0xd1, 0x0e, 0xa8, 0x00, 
-	0x88, 0x40, 0x60, 0x38, 0xf0, 0x02, 0xff, 0xea, 
-	0x60, 0x20, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x13, 
-	0xe0, 0x06, 0x1c, 0x01, 0x46, 0x68, 0xf0, 0x0d, 
-	0xf9, 0xd4, 0xe0, 0x01, 0x60, 0x25, 0x60, 0x3d, 
-	0xb0, 0x2d, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x01, 0xf0, 0xb4, 0xf0, 0x06, 0x12, 
-	0x0e, 0x12, 0x06, 0x1b, 0x0e, 0x1b, 0x9c, 0x06, 
-	0x9f, 0x07, 0x9d, 0x05, 0x9e, 0x04, 0x06, 0x36, 
-	0x0e, 0x36, 0x06, 0x2d, 0xd0, 0x02, 0x25, 0x80, 
-	0x70, 0x05, 0xe0, 0x01, 0x25, 0x00, 0x70, 0x05, 
-	0x25, 0x00, 0x70, 0x45, 0x80, 0x85, 0x72, 0x05, 
-	0x70, 0xc6, 0x70, 0x83, 0x62, 0xc4, 0x63, 0x07, 
-	0x27, 0x00, 0x23, 0x00, 0x2a, 0x00, 0xdd, 0x10, 
-	0x5c, 0xcc, 0x19, 0xc5, 0x73, 0x2c, 0x18, 0xcc, 
-	0x78, 0x66, 0x1c, 0x7c, 0x06, 0x25, 0x0e, 0x2d, 
-	0x1c, 0x3c, 0x18, 0x24, 0x77, 0x26, 0x33, 0x02, 
-	0x06, 0x1b, 0x0e, 0x1b, 0x1c, 0x2f, 0x42, 0x93, 
-	0xdb, 0xee, 0xbc, 0xf0, 0x47, 0x70, 0xb5, 0xf0, 
-	0xb0, 0xac, 0x21, 0x00, 0xa8, 0x07, 0xf0, 0x0d, 
-	0xf8, 0x59, 0xa8, 0x07, 0x78, 0x00, 0x90, 0x06, 
-	0x28, 0x00, 0xd0, 0x4b, 0x24, 0x00, 0x98, 0x06, 
-	0x28, 0x00, 0xdd, 0x43, 0xa8, 0x07, 0xf0, 0x0d, 
-	0xfc, 0x20, 0x00, 0xa1, 0xa8, 0x07, 0x18, 0x08, 
-	0x69, 0x07, 0x78, 0xfe, 0xad, 0x07, 0x88, 0x6d, 
-	0x78, 0xb8, 0x09, 0xc0, 0xd3, 0x12, 0xa8, 0x07, 
-	0xa9, 0x01, 0xf0, 0x10, 0xfe, 0x6f, 0x78, 0xb8, 
-	0x08, 0x40, 0xd3, 0x05, 0x46, 0x6a, 0x1c, 0x38, 
-	0xa9, 0x01, 0xf0, 0x10, 0xfe, 0x9c, 0xe0, 0x08, 
-	0x46, 0x6a, 0x1c, 0x38, 0xa9, 0x01, 0xf0, 0x10, 
-	0xfe, 0xd9, 0xe0, 0x02, 0x20, 0x40, 0xab, 0x00, 
-	0x70, 0x18, 0xa8, 0x00, 0x78, 0x00, 0x09, 0xc0, 
-	0xd3, 0x16, 0x1c, 0x28, 0xf7, 0xfd, 0xfe, 0x3a, 
-	0x1c, 0x07, 0xd0, 0x11, 0xa8, 0x07, 0x1c, 0x39, 
-	0xf0, 0x0d, 0xfa, 0x92, 0x28, 0x00, 0xd1, 0x09, 
-	0x1c, 0x30, 0x1c, 0x29, 0x1c, 0x3a, 0xf7, 0xfd, 
-	0xfe, 0x89, 0x28, 0x00, 0xd0, 0x04, 0xf7, 0xfd, 
-	0xfe, 0x7b, 0xe0, 0x01, 0xf7, 0xfd, 0xfe, 0x78, 
-	0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, 0x98, 0x06, 
-	0x42, 0x84, 0xdb, 0xbb, 0xa8, 0x07, 0xf0, 0x0d, 
-	0xf8, 0xfb, 0xe7, 0xaa, 0xf7, 0xff, 0xfa, 0x58, 
-	0xb0, 0x2c, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xf0, 0xb0, 0xad, 0x21, 0x00, 0xa8, 0x08, 
-	0xf0, 0x0c, 0xff, 0xfc, 0x22, 0x05, 0x21, 0x16, 
-	0x1c, 0x04, 0xf0, 0x03, 0xfd, 0x76, 0x2c, 0xb2, 
-	0xd1, 0x03, 0x21, 0x00, 0xa8, 0x08, 0xf0, 0x0c, 
-	0xff, 0xab, 0xa8, 0x08, 0x78, 0x00, 0x90, 0x06, 
-	0x28, 0x00, 0xd0, 0x73, 0x25, 0x00, 0x98, 0x06, 
-	0x28, 0x00, 0xdd, 0x57, 0xa8, 0x08, 0xf0, 0x0d, 
-	0xfb, 0xb8, 0x00, 0xa9, 0xa8, 0x08, 0x18, 0x08, 
-	0x69, 0x07, 0x78, 0xf8, 0x90, 0x07, 0xae, 0x08, 
-	0x88, 0x76, 0x78, 0xb8, 0x09, 0xc0, 0xd3, 0x12, 
-	0xa8, 0x08, 0xa9, 0x01, 0xf0, 0x10, 0xfe, 0x06, 
-	0x78, 0xb8, 0x08, 0x40, 0xd3, 0x05, 0x46, 0x6a, 
-	0x1c, 0x38, 0xa9, 0x01, 0xf0, 0x10, 0xfe, 0x33, 
-	0xe0, 0x08, 0x46, 0x6a, 0x1c, 0x38, 0xa9, 0x01, 
-	0xf0, 0x10, 0xfe, 0x70, 0xe0, 0x02, 0x20, 0x40, 
-	0xab, 0x00, 0x70, 0x18, 0xa8, 0x00, 0x78, 0x00, 
-	0x09, 0xc0, 0xd3, 0x29, 0x78, 0xb8, 0x09, 0x80, 
-	0xd3, 0x0f, 0xa8, 0x08, 0xa9, 0x01, 0xf0, 0x10, 
-	0xff, 0xcd, 0x1c, 0x04, 0xa8, 0x00, 0x78, 0x00, 
-	0x08, 0x80, 0xd2, 0x02, 0x78, 0xb8, 0x08, 0x80, 
-	0xd3, 0x1a, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0xd4, 
-	0xe0, 0x16, 0x1c, 0x30, 0xf7, 0xfd, 0xfd, 0xbe, 
-	0x1c, 0x07, 0xd0, 0x11, 0xa8, 0x08, 0x1c, 0x39, 
-	0xf0, 0x0d, 0xfa, 0x16, 0x28, 0x00, 0xd1, 0x09, 
-	0x98, 0x07, 0x1c, 0x31, 0x1c, 0x3a, 0xf7, 0xfd, 
-	0xfe, 0x0d, 0x28, 0x00, 0xd0, 0x04, 0xf7, 0xfd, 
-	0xfd, 0xff, 0xe0, 0x01, 0xf7, 0xfd, 0xfd, 0xfc, 
-	0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, 0x98, 0x06, 
-	0x42, 0x85, 0xdb, 0xa7, 0x98, 0x06, 0x28, 0x00, 
-	0xd0, 0x08, 0xa8, 0x08, 0xf0, 0x0d, 0xf8, 0x7c, 
-	0x2c, 0xb2, 0xd1, 0x03, 0x21, 0x00, 0xa8, 0x08, 
-	0xf0, 0x0c, 0xff, 0x3e, 0xf7, 0xff, 0xf9, 0x58, 
-	0x21, 0x00, 0xa8, 0x08, 0xf7, 0xff, 0xfb, 0x88, 
-	0x1c, 0x04, 0xa8, 0x08, 0x78, 0x00, 0x90, 0x06, 
-	0x28, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0xd1, 0x89, 
-	0xf7, 0xff, 0xf9, 0xc6, 0xb0, 0x2d, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x26, 0x00, 
-	0x48, 0x28, 0x71, 0x06, 0x70, 0x06, 0x20, 0x00, 
-	0x4f, 0x27, 0x4a, 0x28, 0x49, 0x28, 0x00, 0x43, 
-	0x52, 0xd6, 0x52, 0xfe, 0x00, 0x83, 0x50, 0xce, 
-	0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x28, 0x1d, 
-	0xdb, 0xf5, 0x28, 0x20, 0xda, 0x08, 0x00, 0x43, 
-	0x52, 0xd6, 0x00, 0x83, 0x50, 0xce, 0x30, 0x01, 
-	0x06, 0x00, 0x0e, 0x00, 0x28, 0x20, 0xdb, 0xf6, 
-	0x20, 0x01, 0x02, 0x80, 0xf0, 0x19, 0xfd, 0xcd, 
-	0xf0, 0x19, 0xfd, 0xd0, 0x4b, 0x1b, 0x40, 0x18, 
-	0xf0, 0x19, 0xfd, 0xd0, 0x49, 0x1a, 0x20, 0x0a, 
-	0xf0, 0x19, 0xfd, 0xd0, 0x21, 0x00, 0x4f, 0x19, 
-	0x20, 0xff, 0x4a, 0x19, 0x00, 0x4b, 0x18, 0x5b, 
-	0x01, 0x1b, 0x52, 0xd7, 0x18, 0x9b, 0x70, 0x98, 
-	0x70, 0xde, 0x71, 0x1e, 0x1d, 0xdc, 0x34, 0x19, 
-	0x73, 0x26, 0x71, 0x5e, 0x1c, 0x1d, 0x23, 0x06, 
-	0x73, 0x63, 0x23, 0x00, 0x00, 0xdc, 0x19, 0x2c, 
-	0x81, 0xa6, 0x81, 0xe6, 0x33, 0x01, 0x06, 0x1b, 
-	0x0e, 0x1b, 0x60, 0xa6, 0x2b, 0x04, 0xdb, 0xf5, 
-	0x31, 0x01, 0x06, 0x09, 0x0e, 0x09, 0x29, 0x08, 
-	0xdb, 0xe0, 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xb8, 
-	0x2e, 0x08, 0x49, 0xb0, 0x2e, 0x08, 0x49, 0x70, 
-	0x2e, 0x08, 0x45, 0xe8, 0xff, 0xff, 0xfb, 0xff, 
-	0x2e, 0x00, 0x31, 0x7d, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x44, 0x68, 0xb5, 0xf0, 0x06, 0x00, 
-	0x0e, 0x00, 0xb0, 0x83, 0x90, 0x00, 0x04, 0x09, 
-	0x0c, 0x09, 0x91, 0x01, 0x06, 0x10, 0x0e, 0x00, 
-	0x04, 0x1c, 0x0c, 0x24, 0x27, 0x00, 0x49, 0x5a, 
-	0x00, 0x7b, 0x19, 0xdb, 0x01, 0x1b, 0x5a, 0xcd, 
-	0x4b, 0x58, 0x42, 0x9d, 0xd1, 0x01, 0x1c, 0x3a, 
-	0xe0, 0x04, 0x1c, 0x7b, 0x06, 0x1f, 0x0e, 0x3f, 
-	0x2f, 0x08, 0xdb, 0xf1, 0x2f, 0x08, 0xd1, 0x05, 
-	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0x46, 0x4f, 0x50, 
-	0x97, 0x02, 0x5b, 0xbb, 0x2b, 0x00, 0xd0, 0x05, 
-	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x23, 0x01, 0x9f, 0x02, 
-	0x53, 0xbb, 0x00, 0x53, 0x18, 0x9a, 0x01, 0x12, 
-	0x18, 0x57, 0x80, 0x38, 0x20, 0x14, 0xf0, 0x02, 
-	0xfe, 0x19, 0x1c, 0x01, 0x62, 0xb8, 0x20, 0x00, 
-	0x29, 0x00, 0xd1, 0x08, 0x49, 0x41, 0x80, 0x39, 
-	0x9f, 0x02, 0x53, 0xb8, 0x43, 0xc0, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x0d, 
-	0x21, 0xff, 0x02, 0x09, 0x40, 0x21, 0x12, 0x08, 
-	0x28, 0x09, 0xd2, 0x1f, 0xa3, 0x01, 0x5c, 0x1b, 
-	0x00, 0x5b, 0x44, 0x9f, 0x1b, 0x04, 0x06, 0x09, 
-	0x0c, 0x0f, 0x12, 0x15, 0x18, 0x00, 0x24, 0xb8, 
-	0xe0, 0x16, 0x24, 0xff, 0x34, 0x71, 0xe0, 0x13, 
-	0x24, 0x01, 0x02, 0xa4, 0xe0, 0x10, 0x24, 0x01, 
-	0x02, 0xe4, 0xe0, 0x0d, 0x24, 0x01, 0x03, 0x24, 
-	0xe0, 0x0a, 0x24, 0x01, 0x03, 0x64, 0xe0, 0x07, 
-	0x24, 0x01, 0x03, 0xa4, 0xe0, 0x04, 0x24, 0x01, 
-	0x03, 0xe4, 0xe0, 0x01, 0x24, 0x01, 0x02, 0xa4, 
-	0x80, 0xac, 0x88, 0xa8, 0x00, 0x80, 0xf0, 0x02, 
-	0xfd, 0xdd, 0x60, 0x28, 0x28, 0x00, 0xd1, 0x0d, 
-	0x48, 0x24, 0x80, 0x38, 0x20, 0x00, 0x9f, 0x02, 
-	0x53, 0xb8, 0x1c, 0x28, 0xf0, 0x02, 0xfd, 0xf4, 
-	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x98, 0x00, 0x70, 0xb8, 
-	0x26, 0x00, 0x88, 0x38, 0x00, 0x80, 0x49, 0x1d, 
-	0x50, 0x0e, 0x20, 0x00, 0x1c, 0x01, 0x43, 0x61, 
-	0x68, 0x2a, 0x18, 0x8a, 0x00, 0xc1, 0x19, 0xc9, 
-	0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x60, 0x8a, 
-	0x28, 0x04, 0xdb, 0xf3, 0x20, 0xb8, 0x1c, 0x21, 
-	0xf0, 0x15, 0xfd, 0x94, 0x1d, 0xfc, 0x34, 0x19, 
-	0x73, 0x20, 0x72, 0x2e, 0x78, 0xb8, 0x23, 0x01, 
-	0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0xf0, 0x08, 
-	0xf9, 0xc7, 0x22, 0x00, 0xb4, 0x04, 0x78, 0xb8, 
-	0x23, 0x05, 0x22, 0x02, 0x99, 0x02, 0xf0, 0x07, 
-	0xff, 0xfb, 0x22, 0x04, 0x7b, 0x21, 0xb0, 0x01, 
-	0xb4, 0x06, 0x78, 0xb9, 0x22, 0x0a, 0x20, 0x85, 
-	0x6a, 0xbb, 0xf0, 0x08, 0xfa, 0x43, 0x1c, 0x30, 
-	0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x44, 0x68, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x49, 0x70, 0x2e, 0x08, 0x45, 0xe8, 
-	0xb5, 0xf0, 0xb0, 0x82, 0x46, 0x68, 0xf0, 0x08, 
-	0xff, 0xd7, 0x21, 0x00, 0x4f, 0x24, 0x4b, 0x25, 
-	0x93, 0x01, 0x4a, 0x25, 0x00, 0x48, 0x18, 0x40, 
-	0x01, 0x00, 0x19, 0xc0, 0x78, 0x84, 0x9d, 0x00, 
-	0x40, 0xe5, 0x07, 0xeb, 0x0f, 0xdb, 0x2b, 0x01, 
-	0xd1, 0x31, 0x6a, 0x83, 0x7a, 0x1c, 0x2c, 0xa4, 
-	0xd0, 0x01, 0x2c, 0xa5, 0xd1, 0x2b, 0x1d, 0xc4, 
-	0x34, 0x19, 0xe0, 0x0e, 0x79, 0x05, 0x73, 0x65, 
-	0x88, 0xde, 0x79, 0x05, 0x00, 0xed, 0x18, 0x2d, 
-	0x81, 0xae, 0x79, 0x05, 0x35, 0x01, 0x07, 0xad, 
-	0x0f, 0xad, 0x71, 0x05, 0x78, 0x15, 0x35, 0x01, 
-	0x70, 0x15, 0x7a, 0x9d, 0x7b, 0x66, 0x42, 0xb5, 
-	0xd0, 0x02, 0x79, 0x45, 0x2d, 0x00, 0xd0, 0xe9, 
-	0x7a, 0x1b, 0x2b, 0xa5, 0xd1, 0x0f, 0x79, 0x43, 
-	0x07, 0xdc, 0x0f, 0xe4, 0x2c, 0x01, 0xd0, 0x0a, 
-	0x1c, 0x1c, 0x23, 0x01, 0x43, 0x23, 0x71, 0x43, 
-	0x88, 0x00, 0x00, 0x80, 0x9b, 0x01, 0x18, 0xc0, 
-	0x68, 0x03, 0x33, 0x01, 0x60, 0x03, 0x1c, 0x48, 
-	0x06, 0x01, 0x0e, 0x09, 0x29, 0x08, 0xdb, 0xbd, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x44, 0x68, 0x2e, 0x08, 0x45, 0xe8, 
-	0x2e, 0x08, 0x03, 0xb8, 0xb5, 0xf0, 0x04, 0x05, 
-	0x0c, 0x2d, 0x20, 0x00, 0x4c, 0x31, 0x00, 0x42, 
-	0x18, 0x12, 0x01, 0x12, 0x5a, 0xa2, 0x42, 0xaa, 
-	0xd1, 0x01, 0x1c, 0x01, 0xe0, 0x04, 0x30, 0x01, 
-	0x06, 0x00, 0x0e, 0x00, 0x28, 0x08, 0xdb, 0xf2, 
-	0x28, 0x08, 0xd1, 0x04, 0x20, 0x00, 0x43, 0xc0, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x48, 
-	0x18, 0x40, 0x01, 0x00, 0x19, 0x07, 0x78, 0xb8, 
-	0x49, 0x25, 0xf0, 0x08, 0xfa, 0x0f, 0x79, 0x78, 
-	0x23, 0x02, 0x43, 0x18, 0x71, 0x78, 0x78, 0xbe, 
-	0x20, 0xff, 0x70, 0xb8, 0x21, 0x00, 0x1d, 0xf8, 
-	0x30, 0x19, 0x73, 0x01, 0x21, 0x06, 0x73, 0x41, 
-	0x78, 0xf8, 0x79, 0x39, 0x42, 0x88, 0xd1, 0x11, 
-	0x79, 0x78, 0x07, 0xc0, 0x0f, 0xc0, 0x28, 0x01, 
-	0xd0, 0x0c, 0x20, 0x00, 0x70, 0xf8, 0x71, 0x38, 
-	0x71, 0x78, 0x48, 0x17, 0x80, 0x38, 0x6a, 0xb8, 
-	0x68, 0x00, 0xf0, 0x02, 0xfd, 0x15, 0x6a, 0xb8, 
-	0xf0, 0x02, 0xfd, 0x12, 0x4f, 0x12, 0x00, 0x68, 
-	0x49, 0x12, 0x52, 0x0f, 0x00, 0x71, 0x4a, 0x12, 
-	0x52, 0x57, 0x21, 0x00, 0x4a, 0x11, 0x52, 0x11, 
-	0x1c, 0x30, 0x1c, 0x29, 0xf0, 0x03, 0xf8, 0x12, 
-	0x20, 0x00, 0x00, 0x41, 0x18, 0x09, 0x01, 0x09, 
-	0x5a, 0x61, 0x42, 0xb9, 0xd1, 0x04, 0x30, 0x01, 
-	0x06, 0x00, 0x0e, 0x00, 0x28, 0x08, 0xdb, 0xf4, 
-	0x28, 0x08, 0xd1, 0x03, 0x21, 0x00, 0x48, 0x08, 
-	0x71, 0x01, 0x70, 0x01, 0x20, 0x00, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x44, 0x68, 
-	0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0x30, 
-	0x2e, 0x08, 0x48, 0xf8, 0x2e, 0x08, 0x49, 0x70, 
-	0x2e, 0x08, 0x03, 0xb8, 0xb5, 0x80, 0x1c, 0x07, 
-	0x30, 0x28, 0xf0, 0x02, 0xfc, 0xbb, 0x49, 0x07, 
-	0x64, 0x88, 0x65, 0x08, 0x65, 0x48, 0x19, 0xc0, 
-	0x64, 0xc8, 0x20, 0x00, 0x64, 0x08, 0x64, 0x4f, 
-	0x49, 0x03, 0x84, 0x08, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xc0, 
-	0x2c, 0x00, 0x01, 0x00, 0xb5, 0x80, 0x1c, 0x07, 
-	0x30, 0x28, 0xf0, 0x02, 0xfc, 0xa3, 0x49, 0x06, 
-	0x66, 0x08, 0x66, 0x88, 0x66, 0xc8, 0x19, 0xc0, 
-	0x66, 0x48, 0x20, 0x00, 0x65, 0x88, 0x65, 0xcf, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x03, 0xc0, 0xb4, 0x80, 0x04, 0x09, 
-	0x0c, 0x09, 0x88, 0x02, 0x42, 0x8a, 0xd0, 0x18, 
-	0x4a, 0x0d, 0x8f, 0x13, 0x2b, 0x01, 0xd0, 0x04, 
-	0x23, 0x01, 0x87, 0x13, 0x8f, 0x17, 0x2f, 0x01, 
-	0xd1, 0xfb, 0x88, 0x03, 0x42, 0x8b, 0xd0, 0x03, 
-	0x80, 0x01, 0x88, 0x03, 0x42, 0x8b, 0xd1, 0xfb, 
-	0x8f, 0x11, 0x1c, 0x10, 0x29, 0x00, 0xd0, 0x04, 
-	0x21, 0x00, 0x87, 0x01, 0x8f, 0x02, 0x2a, 0x00, 
-	0xd1, 0xfb, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, 
-	0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0x80, 0x48, 0x1f, 
-	0x8f, 0x40, 0x28, 0x00, 0xd1, 0x37, 0x4f, 0x1e, 
-	0x88, 0x38, 0x12, 0x00, 0x4a, 0x1d, 0x28, 0x06, 
-	0xd0, 0x1e, 0xdc, 0x08, 0x28, 0x06, 0xd2, 0x26, 
-	0xa3, 0x01, 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 
-	0x2a, 0x12, 0x12, 0x0d, 0x22, 0x12, 0x28, 0x07, 
-	0xd0, 0x15, 0x28, 0x09, 0xd0, 0x0b, 0x28, 0x0b, 
-	0xd0, 0x14, 0x28, 0x80, 0xd1, 0x17, 0xf0, 0x00, 
-	0xf9, 0x1f, 0xe0, 0x18, 0x88, 0x79, 0x88, 0x38, 
-	0xf0, 0x00, 0xf8, 0x24, 0xe0, 0x13, 0x88, 0x79, 
-	0x88, 0x38, 0xf0, 0x00, 0xf8, 0xbd, 0xe0, 0x0e, 
-	0xf0, 0x00, 0xf9, 0x6a, 0xe0, 0x0b, 0xf0, 0x00, 
-	0xf9, 0xd5, 0xe0, 0x08, 0x88, 0x79, 0x88, 0x38, 
-	0xf0, 0x00, 0xfc, 0x9c, 0xe0, 0x03, 0x48, 0x08, 
-	0x8e, 0x81, 0x31, 0x01, 0x86, 0x81, 0x21, 0x00, 
-	0x1c, 0x38, 0xf7, 0xff, 0xff, 0x9f, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x1f, 0xc0, 
-	0x2c, 0x00, 0x00, 0xfc, 0x2c, 0x00, 0x01, 0x00, 
-	0x2e, 0x08, 0x04, 0x00, 0xb5, 0xf0, 0x04, 0x04, 
-	0x0c, 0x24, 0x04, 0x0d, 0x0c, 0x2d, 0x1c, 0x17, 
-	0x2d, 0x10, 0xdd, 0x03, 0x20, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xf0, 0x19, 0xfb, 0x92, 
-	0x1c, 0x68, 0x10, 0x40, 0x00, 0x40, 0x04, 0x01, 
-	0x0c, 0x09, 0x1c, 0x88, 0x00, 0x40, 0x1d, 0x02, 
-	0x48, 0x1c, 0x6c, 0x03, 0x18, 0x9d, 0x6c, 0x46, 
-	0x4b, 0x1b, 0x42, 0xb5, 0xdd, 0x0a, 0x88, 0x19, 
-	0x1c, 0x18, 0x23, 0x20, 0x43, 0x19, 0x80, 0x01, 
-	0xf0, 0x19, 0xfb, 0xb2, 0x20, 0x01, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x64, 0x05, 0x35, 0x28, 
-	0x42, 0xb5, 0xdd, 0x04, 0x88, 0x1e, 0x1c, 0x1d, 
-	0x23, 0x10, 0x43, 0x33, 0x80, 0x2b, 0x6d, 0x03, 
-	0x80, 0x9c, 0x6d, 0x04, 0x80, 0xe2, 0x23, 0x00, 
-	0x29, 0x00, 0xdd, 0x08, 0x88, 0x3d, 0x00, 0x5c, 
-	0x6d, 0x06, 0x19, 0xa4, 0x81, 0x25, 0x33, 0x01, 
-	0x37, 0x02, 0x42, 0x8b, 0xdb, 0xf6, 0x6d, 0x01, 
-	0x18, 0x8a, 0x6c, 0xc3, 0x42, 0x9a, 0xd9, 0x00, 
-	0x6c, 0x82, 0x60, 0x0a, 0x65, 0x02, 0xf0, 0x19, 
-	0xfb, 0x8b, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xc0, 
-	0x2c, 0x00, 0x00, 0xf8, 0xb4, 0xf0, 0x04, 0x04, 
-	0x0c, 0x24, 0x04, 0x08, 0x0c, 0x00, 0x28, 0x10, 
-	0xdd, 0x02, 0x20, 0x02, 0xbc, 0xf0, 0x47, 0x70, 
-	0x30, 0x01, 0x4f, 0x1c, 0x40, 0x07, 0x1c, 0xb8, 
-	0x00, 0x40, 0x1d, 0x01, 0x48, 0x1a, 0x6d, 0x83, 
-	0x18, 0x5d, 0x6d, 0xc6, 0x4b, 0x19, 0x42, 0xb5, 
-	0xdd, 0x07, 0x88, 0x19, 0x1c, 0x18, 0x23, 0x02, 
-	0x43, 0x19, 0x80, 0x01, 0x20, 0x01, 0xbc, 0xf0, 
-	0x47, 0x70, 0x65, 0x85, 0x35, 0x28, 0x42, 0xb5, 
-	0xdd, 0x04, 0x88, 0x1e, 0x1c, 0x1d, 0x23, 0x01, 
-	0x43, 0x33, 0x80, 0x2b, 0x6e, 0x83, 0x80, 0x9c, 
-	0x6e, 0x84, 0x80, 0xe1, 0x23, 0x00, 0x2f, 0x00, 
-	0xdd, 0x08, 0x88, 0x15, 0x00, 0x5c, 0x6e, 0x86, 
-	0x19, 0xa4, 0x81, 0x25, 0x32, 0x02, 0x33, 0x01, 
-	0x42, 0xbb, 0xdb, 0xf6, 0x6e, 0x82, 0x18, 0x51, 
-	0x6e, 0x43, 0x42, 0x99, 0xd3, 0x00, 0x6e, 0x01, 
-	0x60, 0x11, 0x66, 0x81, 0x20, 0x00, 0xbc, 0xf0, 
-	0x47, 0x70, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 
-	0x2e, 0x08, 0x03, 0xc0, 0x2c, 0x00, 0x00, 0xf8, 
-	0xb5, 0xb0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x0d, 
-	0x0c, 0x2d, 0x1c, 0x17, 0xf0, 0x19, 0xfa, 0xfa, 
-	0x1c, 0x20, 0x1c, 0x29, 0x1c, 0x3a, 0xf7, 0xff, 
-	0xff, 0xa9, 0x1c, 0x07, 0xf0, 0x19, 0xfb, 0x28, 
-	0x1c, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0xb4, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x09, 
-	0x0c, 0x09, 0x29, 0x08, 0xdd, 0x02, 0x20, 0x02, 
-	0xbc, 0xf0, 0x47, 0x70, 0x00, 0x88, 0x1d, 0xc7, 
-	0x37, 0x01, 0x48, 0x19, 0x6d, 0x83, 0x19, 0xdd, 
-	0x6d, 0xc6, 0x4b, 0x18, 0x42, 0xb5, 0xdd, 0x07, 
-	0x88, 0x19, 0x1c, 0x18, 0x23, 0x02, 0x43, 0x19, 
-	0x80, 0x01, 0x20, 0x01, 0xbc, 0xf0, 0x47, 0x70, 
-	0x65, 0x85, 0x35, 0x28, 0x42, 0xb5, 0xdd, 0x04, 
-	0x88, 0x1e, 0x1c, 0x1d, 0x23, 0x01, 0x43, 0x33, 
-	0x80, 0x2b, 0x6e, 0x83, 0x80, 0x9c, 0x6e, 0x84, 
-	0x80, 0xe7, 0x23, 0x00, 0x6e, 0x84, 0x29, 0x00, 
-	0xdd, 0x06, 0xca, 0x40, 0x00, 0x9d, 0x19, 0x2d, 
-	0x60, 0xae, 0x33, 0x01, 0x42, 0x8b, 0xdb, 0xf8, 
-	0x6e, 0x81, 0x19, 0xca, 0x6e, 0x43, 0x42, 0x9a, 
-	0xd3, 0x00, 0x6e, 0x02, 0x60, 0x0a, 0x66, 0x82, 
-	0x20, 0x00, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x03, 0xc0, 0x2c, 0x00, 0x00, 0xf8, 
-	0xb5, 0x80, 0x48, 0x28, 0x88, 0x00, 0x06, 0x00, 
-	0x0e, 0x00, 0x4f, 0x27, 0x28, 0x01, 0xd0, 0x13, 
-	0x28, 0x02, 0xd0, 0x1a, 0x28, 0x03, 0xd1, 0x0c, 
-	0x68, 0x38, 0x88, 0x41, 0x29, 0x0e, 0xdb, 0x02, 
-	0x88, 0x41, 0x29, 0x0f, 0xdd, 0x2f, 0x88, 0x01, 
-	0x04, 0x09, 0x88, 0x40, 0x43, 0x08, 0xf0, 0x0b, 
-	0xf9, 0x81, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x68, 0x38, 0x88, 0x82, 0x88, 0x41, 0x88, 0x00, 
-	0xf0, 0x0e, 0xf8, 0x60, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x68, 0x38, 0x88, 0x81, 0x04, 0x09, 
-	0x88, 0xc2, 0x43, 0x11, 0x88, 0x02, 0x04, 0x12, 
-	0x88, 0x40, 0x43, 0x10, 0xf0, 0x0d, 0xfd, 0x04, 
-	0x68, 0x38, 0x88, 0x41, 0x29, 0x0e, 0xd1, 0x08, 
-	0x88, 0x81, 0x04, 0x09, 0x88, 0xc0, 0x43, 0x08, 
-	0xf0, 0x0a, 0xff, 0xfe, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0x01, 0xf0, 0x0a, 0xff, 0xf8, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x88, 0x41, 
-	0x48, 0x08, 0x29, 0x0e, 0xd1, 0x02, 0x21, 0x00, 
-	0x60, 0x01, 0xe0, 0x01, 0x21, 0x01, 0x60, 0x01, 
-	0x68, 0x00, 0xf0, 0x00, 0xfb, 0xe1, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x00, 0xfc, 
-	0x2e, 0x08, 0x03, 0xc0, 0x2e, 0x08, 0x04, 0xf4, 
-	0xb5, 0x90, 0x48, 0x31, 0x88, 0x00, 0x06, 0x04, 
-	0x0e, 0x24, 0x48, 0x30, 0x22, 0x03, 0x21, 0x02, 
-	0x4f, 0x2f, 0x2c, 0x08, 0xd2, 0x4f, 0xa3, 0x02, 
-	0x5d, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x04, 0x4b, 0x10, 0x16, 0x1c, 0x28, 0x34, 0x3f, 
-	0x68, 0x39, 0x88, 0x49, 0x06, 0x09, 0x0e, 0x09, 
-	0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, 0xf0, 0x03, 
-	0xfa, 0xa7, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x03, 0xf7, 0xfd, 0xff, 0xe1, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x02, 0xf7, 0xfd, 
-	0xff, 0xdb, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x88, 0x00, 0x4b, 0x1e, 0x28, 0x00, 0xd0, 0x03, 
-	0x60, 0x1a, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x60, 0x19, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x88, 0x00, 0x4b, 0x19, 0x28, 0x00, 0xd0, 0x03, 
-	0x60, 0x1a, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x60, 0x19, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0xf0, 0x02, 0xfe, 0x72, 0x68, 0x39, 0x88, 0x4a, 
-	0x1d, 0x08, 0x88, 0x09, 0xf7, 0xfe, 0xf8, 0x52, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x68, 0x38, 
-	0x88, 0x81, 0x04, 0x09, 0x88, 0xc2, 0x18, 0x8a, 
-	0x88, 0x01, 0x04, 0x09, 0x88, 0x40, 0x50, 0x0a, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x1d, 0xf8, 
-	0x30, 0x39, 0x8e, 0x81, 0x31, 0x01, 0x86, 0x81, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2c, 0x00, 0x00, 0xfc, 0x2c, 0x00, 0x01, 0x00, 
-	0x2e, 0x08, 0x03, 0xc0, 0x6e, 0x00, 0x13, 0x00, 
-	0x6e, 0x00, 0x12, 0x00, 0xb5, 0x90, 0xb0, 0x86, 
-	0x48, 0x80, 0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, 
-	0x4c, 0x7f, 0x4f, 0x80, 0x28, 0x0b, 0xd2, 0x61, 
-	0xa3, 0x01, 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 
-	0x05, 0x0f, 0x17, 0x3a, 0x5e, 0x86, 0x90, 0xbd, 
-	0xc5, 0xd3, 0xd8, 0x00, 0xf0, 0x0b, 0xfb, 0x38, 
-	0x90, 0x05, 0x14, 0x00, 0x68, 0x39, 0x80, 0x08, 
-	0x98, 0x05, 0x68, 0x39, 0x80, 0x48, 0xe0, 0xe0, 
-	0x20, 0x1e, 0xa9, 0x05, 0xf0, 0x0b, 0xfa, 0x3a, 
-	0x98, 0x05, 0x68, 0x39, 0x80, 0x08, 0xe0, 0xd8, 
-	0x1c, 0x20, 0xf0, 0x0d, 0xfe, 0x31, 0x20, 0x00, 
-	0x00, 0x81, 0x58, 0x61, 0x00, 0x42, 0x68, 0x3b, 
-	0x52, 0x99, 0x30, 0x01, 0x28, 0x04, 0xdd, 0xf7, 
-	0x20, 0x07, 0x00, 0x81, 0x58, 0x61, 0x00, 0x42, 
-	0x68, 0x3b, 0x18, 0xd2, 0x3a, 0x40, 0x87, 0x91, 
-	0x30, 0x01, 0x28, 0x0b, 0xdd, 0xf5, 0x20, 0x0d, 
-	0x00, 0x81, 0x58, 0x61, 0x00, 0x42, 0x68, 0x3b, 
-	0x18, 0xd2, 0x3a, 0x40, 0x87, 0x51, 0x30, 0x01, 
-	0x28, 0x12, 0xdd, 0xf5, 0xe0, 0xb5, 0x20, 0x13, 
-	0x00, 0x81, 0x58, 0x61, 0x00, 0x42, 0x68, 0x3b, 
-	0x18, 0xd2, 0x3a, 0x40, 0x83, 0x51, 0x30, 0x01, 
-	0x28, 0x15, 0xdd, 0xf5, 0x20, 0x00, 0x00, 0x81, 
-	0x19, 0x09, 0x6d, 0x89, 0x00, 0x42, 0x68, 0x3b, 
-	0x18, 0xd2, 0x80, 0xd1, 0x30, 0x01, 0x28, 0x0a, 
-	0xdd, 0xf5, 0x20, 0x00, 0x00, 0x81, 0x19, 0x09, 
-	0x31, 0x80, 0x68, 0x49, 0x00, 0x42, 0x68, 0x3b, 
-	0x18, 0xd2, 0x83, 0x91, 0x30, 0x01, 0x28, 0x01, 
-	0xdd, 0xf4, 0xe0, 0x92, 0xe0, 0x8c, 0x20, 0x02, 
-	0x00, 0x81, 0x19, 0x09, 0x31, 0x80, 0x68, 0x49, 
-	0x00, 0x42, 0x68, 0x3b, 0x18, 0xd2, 0x3a, 0x40, 
-	0x87, 0x91, 0x30, 0x01, 0x28, 0x05, 0xdd, 0xf3, 
-	0x20, 0x09, 0x00, 0x81, 0x19, 0x09, 0x31, 0x80, 
-	0x68, 0x49, 0x00, 0x42, 0x68, 0x3b, 0x18, 0xd2, 
-	0x3a, 0x40, 0x86, 0xd1, 0x30, 0x01, 0x28, 0x0f, 
-	0xdd, 0xf3, 0x20, 0x11, 0x00, 0x81, 0x19, 0x09, 
-	0x31, 0x80, 0x68, 0x49, 0x00, 0x42, 0x68, 0x3b, 
-	0x18, 0xd2, 0x3a, 0x40, 0x86, 0x91, 0x30, 0x01, 
-	0x28, 0x13, 0xdd, 0xf3, 0xe0, 0x69, 0x22, 0x00, 
-	0x21, 0x00, 0x20, 0x01, 0x02, 0xc0, 0xf7, 0xff, 
-	0xfe, 0x47, 0x6f, 0xb8, 0x49, 0x36, 0x80, 0x08, 
-	0xe0, 0x5f, 0xa8, 0x02, 0xf0, 0x10, 0xfc, 0x18, 
-	0x98, 0x02, 0x0c, 0x00, 0x68, 0x39, 0x80, 0x08, 
-	0x98, 0x02, 0x68, 0x39, 0x80, 0x48, 0x98, 0x03, 
-	0x0c, 0x00, 0x68, 0x39, 0x80, 0x88, 0x98, 0x03, 
-	0x68, 0x39, 0x80, 0xc8, 0x98, 0x04, 0x0c, 0x00, 
-	0x68, 0x39, 0x81, 0x08, 0x98, 0x04, 0x68, 0x39, 
-	0x81, 0x48, 0x20, 0x00, 0x68, 0x39, 0x81, 0x88, 
-	0x68, 0x38, 0x89, 0x81, 0x23, 0x01, 0x03, 0xdb, 
-	0x43, 0x19, 0x81, 0x81, 0x48, 0x25, 0x68, 0x39, 
-	0x81, 0xc8, 0x48, 0x25, 0x68, 0x01, 0x14, 0x09, 
-	0x68, 0x3a, 0x82, 0x11, 0x68, 0x00, 0x68, 0x39, 
-	0x82, 0x48, 0xe0, 0x32, 0x20, 0x19, 0x06, 0x80, 
-	0x6b, 0x80, 0x06, 0x00, 0x0e, 0x00, 0x68, 0x39, 
-	0x80, 0x08, 0xe0, 0x2a, 0x68, 0x38, 0x88, 0x01, 
-	0x04, 0x09, 0x88, 0x40, 0x18, 0x08, 0x68, 0x00, 
-	0x90, 0x05, 0x14, 0x00, 0x68, 0x39, 0x80, 0x08, 
-	0x98, 0x05, 0x68, 0x39, 0x80, 0x48, 0xe0, 0x1c, 
-	0x48, 0x16, 0x68, 0x00, 0x68, 0x39, 0x80, 0x08, 
-	0xe0, 0x17, 0x46, 0x69, 0xa8, 0x01, 0xf0, 0x08, 
-	0xfb, 0xb9, 0x98, 0x01, 0x68, 0x39, 0x80, 0x08, 
-	0x98, 0x01, 0x0c, 0x00, 0x68, 0x39, 0x80, 0x48, 
-	0x98, 0x00, 0x68, 0x39, 0x80, 0x88, 0x98, 0x00, 
-	0x0c, 0x00, 0x68, 0x39, 0x80, 0xc8, 0xe0, 0x04, 
-	0x1d, 0xf8, 0x30, 0x39, 0x8e, 0x81, 0x31, 0x01, 
-	0x86, 0x81, 0xb0, 0x06, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x00, 0xfc, 
-	0x2e, 0x08, 0x46, 0x68, 0x2e, 0x08, 0x03, 0xc0, 
-	0x2c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x26, 0x1a, 
-	0x2e, 0x08, 0x05, 0x68, 0x2e, 0x08, 0x00, 0x58, 
-	0xb5, 0xf0, 0x4f, 0x6e, 0x25, 0x00, 0x6f, 0xf8, 
-	0x28, 0x00, 0xd0, 0x08, 0xf0, 0x06, 0xff, 0x4a, 
-	0x28, 0x00, 0xd0, 0x00, 0x67, 0xfd, 0x20, 0x01, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x6c, 0x38, 
-	0x28, 0x00, 0xd1, 0x03, 0x1c, 0x28, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x6d, 0x38, 0x6d, 0x7c, 
-	0x42, 0xa0, 0xd1, 0x03, 0x1c, 0x28, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x88, 0xa0, 0x06, 0x00, 
-	0x0e, 0x00, 0x28, 0x15, 0xd2, 0x56, 0xa3, 0x02, 
-	0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x0b, 0x12, 0x1c, 0x16, 0x22, 0x53, 0x26, 0x31, 
-	0x3c, 0x47, 0x57, 0x61, 0x68, 0x6d, 0x71, 0x75, 
-	0x7d, 0x84, 0x83, 0x83, 0x87, 0x00, 0x89, 0xe3, 
-	0x89, 0xa2, 0x89, 0x61, 0x89, 0x20, 0xf0, 0x06, 
-	0xfa, 0xc5, 0xe0, 0x70, 0x89, 0x20, 0xf0, 0x06, 
-	0xfa, 0xa9, 0xe0, 0x6c, 0x89, 0xa2, 0x89, 0x61, 
-	0x89, 0x20, 0xf0, 0x06, 0xfb, 0x83, 0xe0, 0x66, 
-	0x89, 0xa2, 0x89, 0x61, 0x89, 0x20, 0xf0, 0x06, 
-	0xfb, 0x2b, 0xe0, 0x60, 0x89, 0x20, 0xf0, 0x06, 
-	0xfb, 0xc1, 0xe0, 0x5c, 0x8a, 0x62, 0x8a, 0x21, 
-	0xb4, 0x06, 0x89, 0xe3, 0x89, 0xa2, 0x89, 0x61, 
-	0x89, 0x20, 0xf0, 0x06, 0xfc, 0x45, 0xb0, 0x02, 
-	0xe0, 0x51, 0x8a, 0x62, 0x8a, 0x21, 0xb4, 0x06, 
-	0x89, 0xe3, 0x89, 0xa2, 0x89, 0x61, 0x89, 0x20, 
-	0xf0, 0x06, 0xfc, 0x8c, 0xb0, 0x02, 0xe0, 0x46, 
-	0x89, 0xa3, 0x89, 0x62, 0x89, 0x20, 0x49, 0x3c, 
-	0xf0, 0x06, 0xfd, 0xcd, 0x21, 0x00, 0x48, 0x3a, 
-	0xf7, 0xff, 0xfc, 0x58, 0xe0, 0x3b, 0x89, 0xe0, 
-	0x04, 0x03, 0x14, 0x1b, 0x89, 0xa0, 0x04, 0x02, 
-	0x14, 0x12, 0x89, 0x61, 0x89, 0x20, 0xf0, 0x06, 
-	0xfd, 0xed, 0xe0, 0x30, 0xe0, 0x4c, 0x89, 0x20, 
-	0xf0, 0x06, 0xfb, 0xa0, 0xe0, 0x2b, 0x89, 0xe0, 
-	0x04, 0x00, 0x8a, 0x21, 0x18, 0x43, 0x89, 0xa2, 
-	0x89, 0x61, 0x89, 0x20, 0xf0, 0x06, 0xfe, 0x40, 
-	0xe0, 0x21, 0x89, 0xe3, 0x89, 0xa2, 0x89, 0x61, 
-	0x89, 0x20, 0xf0, 0x06, 0xfe, 0x71, 0xe0, 0x1a, 
-	0x89, 0x61, 0x89, 0x20, 0xf0, 0x06, 0xfb, 0xc2, 
-	0xe0, 0x15, 0x89, 0x20, 0xf0, 0x06, 0xfb, 0xdc, 
-	0xe0, 0x11, 0x89, 0x20, 0xf0, 0x06, 0xfb, 0xec, 
-	0xe0, 0x0d, 0x20, 0x01, 0x67, 0xf8, 0x89, 0xa2, 
-	0x89, 0x61, 0x89, 0x20, 0xf0, 0x06, 0xff, 0x04, 
-	0xe0, 0x05, 0x89, 0xe3, 0x89, 0xa2, 0x89, 0x61, 
-	0x89, 0x20, 0xf0, 0x06, 0xff, 0x67, 0xe0, 0x1b, 
-	0xf0, 0x06, 0xff, 0xfe, 0xe0, 0x18, 0x89, 0x20, 
-	0xb0, 0x82, 0x90, 0x01, 0x89, 0x61, 0x91, 0x00, 
-	0x89, 0xa5, 0x89, 0xe0, 0x1b, 0x40, 0x24, 0x00, 
-	0x1c, 0x46, 0x2e, 0x00, 0xdd, 0x0b, 0x00, 0xa0, 
-	0x4b, 0x12, 0x18, 0xc0, 0x19, 0x2a, 0x68, 0x03, 
-	0x98, 0x01, 0x99, 0x00, 0xf0, 0x06, 0xfe, 0x04, 
-	0x34, 0x01, 0x42, 0xb4, 0xdb, 0xf3, 0xb0, 0x02, 
-	0x6d, 0x78, 0x88, 0xc0, 0x6c, 0x39, 0x1a, 0x08, 
-	0x64, 0x38, 0x6c, 0x79, 0x1a, 0x08, 0x28, 0x28, 
-	0xdb, 0x05, 0x48, 0x09, 0x88, 0x01, 0x23, 0x10, 
-	0x43, 0xdb, 0x40, 0x19, 0x80, 0x01, 0x6d, 0x78, 
-	0x68, 0x00, 0x65, 0x78, 0x20, 0x01, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x03, 0xc0, 
-	0x2c, 0x00, 0x01, 0x20, 0x2c, 0x00, 0x1a, 0x00, 
-	0x2c, 0x00, 0x00, 0xf8, 0xb5, 0x90, 0x4f, 0x66, 
-	0x6e, 0xf8, 0x6e, 0xb9, 0x42, 0x81, 0xd0, 0x57, 
-	0x88, 0x81, 0x0a, 0x0a, 0x2a, 0x0a, 0xd2, 0x5a, 
-	0xa3, 0x01, 0x5c, 0x9b, 0x00, 0x5b, 0x44, 0x9f, 
-	0x93, 0x04, 0x50, 0x93, 0x93, 0x57, 0x93, 0x93, 
-	0x7c, 0x82, 0x06, 0x09, 0x0e, 0x09, 0x24, 0x00, 
-	0x29, 0x0c, 0xd2, 0x4c, 0xa3, 0x01, 0x5c, 0x5b, 
-	0x00, 0x5b, 0x44, 0x9f, 0x1d, 0x09, 0x13, 0x3c, 
-	0x85, 0x85, 0x85, 0x85, 0x85, 0x39, 0x85, 0x05, 
-	0x89, 0x00, 0xf0, 0x03, 0xf8, 0xc1, 0xe0, 0x7b, 
-	0x22, 0x00, 0xb4, 0x04, 0x89, 0x01, 0x1c, 0x23, 
-	0x4a, 0x52, 0x1e, 0x50, 0xf7, 0xfc, 0xfd, 0x5c, 
-	0xb0, 0x01, 0xe0, 0x71, 0x22, 0x00, 0xb4, 0x04, 
-	0x89, 0x02, 0x1c, 0x23, 0x49, 0x4d, 0x1e, 0x48, 
-	0xf7, 0xfc, 0xfd, 0x52, 0xb0, 0x01, 0xe0, 0x67, 
-	0x8a, 0x02, 0xb4, 0x04, 0x89, 0xc3, 0x89, 0x82, 
-	0x89, 0x41, 0x89, 0x00, 0xf7, 0xfc, 0xfd, 0x48, 
-	0x6e, 0xf8, 0x89, 0x01, 0xb0, 0x01, 0x29, 0x00, 
-	0xd1, 0x5a, 0x89, 0x41, 0x29, 0x00, 0xd1, 0x57, 
-	0x89, 0x81, 0x29, 0x00, 0xd1, 0x54, 0x89, 0xc1, 
-	0x29, 0x00, 0xd1, 0x51, 0x8a, 0x00, 0x28, 0x00, 
-	0xd1, 0x4e, 0xf7, 0xfd, 0xfa, 0x85, 0xe0, 0x62, 
-	0xf7, 0xfc, 0xfc, 0xc6, 0xe0, 0x5f, 0x21, 0x18, 
-	0x20, 0x14, 0xf7, 0xfe, 0xfd, 0xaf, 0xe0, 0x5a, 
-	0xe0, 0x6a, 0x06, 0x09, 0xd1, 0x40, 0x89, 0x00, 
-	0xf7, 0xfc, 0xfe, 0x7c, 0xe0, 0x53, 0xe0, 0x52, 
-	0x06, 0x09, 0x0e, 0x09, 0x29, 0x06, 0xd2, 0x4e, 
-	0xa3, 0x01, 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 
-	0x02, 0x06, 0x0a, 0x0e, 0x12, 0x16, 0x89, 0x00, 
-	0xf7, 0xfe, 0xf8, 0x6a, 0xe0, 0x43, 0x89, 0x00, 
-	0xf7, 0xfe, 0xf8, 0x8c, 0xe0, 0x3f, 0x89, 0x00, 
-	0xf7, 0xfe, 0xf9, 0x1a, 0xe0, 0x3b, 0x89, 0x00, 
-	0xf7, 0xfe, 0xf9, 0xfe, 0xe0, 0x37, 0x89, 0x00, 
-	0xf7, 0xfe, 0xfa, 0x30, 0xe0, 0x33, 0x89, 0x00, 
-	0x06, 0x00, 0x0e, 0x00, 0xf7, 0xfe, 0xfa, 0x0c, 
-	0xe0, 0x2d, 0x06, 0x08, 0xd1, 0x14, 0x6f, 0xb8, 
-	0x30, 0x01, 0x67, 0xb8, 0xe0, 0x27, 0x06, 0x09, 
-	0x0e, 0x09, 0x29, 0x08, 0xd2, 0x23, 0xa3, 0x02, 
-	0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x04, 0x0d, 0x09, 0x10, 0x13, 0x17, 0x1a, 0x1d, 
-	0x89, 0x00, 0xf0, 0x01, 0xf9, 0x7f, 0xe0, 0x16, 
-	0xe0, 0x15, 0x89, 0x00, 0xf0, 0x01, 0xf9, 0xa6, 
-	0xe0, 0x11, 0xf0, 0x01, 0xf9, 0xf1, 0xe0, 0x0e, 
-	0xf0, 0x01, 0xfa, 0x48, 0xe0, 0x0b, 0x89, 0x00, 
-	0xf0, 0x01, 0xfa, 0xcc, 0xe0, 0x07, 0xf0, 0x01, 
-	0xfb, 0x05, 0xe0, 0x04, 0xf0, 0x01, 0xfb, 0x1e, 
-	0xe0, 0x01, 0xf0, 0x01, 0xfa, 0x7b, 0x6e, 0xf8, 
-	0x88, 0xc0, 0x6d, 0xb9, 0x1a, 0x08, 0x65, 0xb8, 
-	0x6d, 0xf9, 0x1a, 0x08, 0x28, 0x28, 0xdb, 0x04, 
-	0x48, 0x07, 0x88, 0x01, 0x08, 0x49, 0x00, 0x49, 
-	0x80, 0x01, 0x6e, 0xf8, 0x68, 0x00, 0x66, 0xf8, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x03, 0xc0, 0x00, 0x00, 0xff, 0xff, 
-	0x2c, 0x00, 0x00, 0xf8, 0xb5, 0x80, 0x06, 0x00, 
-	0x0e, 0x00, 0x1c, 0x17, 0x28, 0x03, 0xd0, 0x0b, 
-	0x28, 0x07, 0xd0, 0x0e, 0x28, 0x08, 0xd1, 0x03, 
-	0x88, 0x38, 0xf0, 0x02, 0xfa, 0x39, 0x80, 0x78, 
-	0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x21, 0x18, 0x20, 0x14, 0xf7, 0xfe, 0xfd, 0x22, 
-	0xe7, 0xf6, 0x88, 0x79, 0x88, 0x38, 0x1d, 0x3a, 
-	0xf0, 0x02, 0xf8, 0xaa, 0x49, 0x01, 0x68, 0x09, 
-	0x80, 0x08, 0xe7, 0xed, 0x2e, 0x08, 0x03, 0xc0, 
-	0x48, 0x0d, 0x6f, 0xc0, 0x28, 0x00, 0xd1, 0x0c, 
-	0x49, 0x0c, 0x60, 0x08, 0x48, 0x0c, 0x8e, 0x83, 
-	0x49, 0x0c, 0x22, 0x01, 0x2b, 0x00, 0xd0, 0x05, 
-	0x8d, 0x03, 0x86, 0x8b, 0x8d, 0x43, 0x86, 0xcb, 
-	0x87, 0x82, 0x47, 0x70, 0x8e, 0xc3, 0x2b, 0x00, 
-	0xd0, 0xfb, 0x8d, 0x83, 0x86, 0x8b, 0x8d, 0xc3, 
-	0x86, 0xcb, 0x87, 0x82, 0x47, 0x70, 0x00, 0x00, 
-	0x2c, 0x00, 0x1f, 0x80, 0x2e, 0x08, 0x04, 0x40, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x00, 0xc0, 
-	0xb5, 0x00, 0xf0, 0x00, 0xfa, 0x71, 0xf7, 0xfd, 
-	0xf8, 0x37, 0xf7, 0xfc, 0xfe, 0xdd, 0xf7, 0xfd, 
-	0xf9, 0x37, 0xf0, 0x03, 0xf8, 0x71, 0xf7, 0xff, 
-	0xff, 0xcf, 0x48, 0x09, 0x8e, 0x80, 0x28, 0x00, 
-	0xd1, 0x0b, 0x48, 0x08, 0x6f, 0xc0, 0x28, 0x00, 
-	0xd1, 0x01, 0xf0, 0x03, 0xfd, 0xe3, 0xf7, 0xff, 
-	0xfd, 0xe7, 0x28, 0x00, 0xd1, 0x01, 0xf7, 0xff, 
-	0xfe, 0xc9, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x1f, 0x80, 
-	0xb4, 0x80, 0x02, 0x4f, 0x4b, 0x07, 0x40, 0x3b, 
-	0x43, 0x1a, 0x23, 0x19, 0x06, 0x9b, 0x62, 0x9a, 
-	0x0a, 0x49, 0x02, 0x49, 0x08, 0x49, 0x07, 0xc0, 
-	0x43, 0x08, 0x49, 0x03, 0x68, 0x09, 0x60, 0x08, 
-	0xbc, 0x80, 0x47, 0x70, 0x00, 0x03, 0xfe, 0x00, 
-	0x2e, 0x08, 0x5e, 0x38, 0xb4, 0x90, 0x4b, 0x0c, 
-	0x68, 0x1f, 0x68, 0x3f, 0x0f, 0xff, 0x60, 0x07, 
-	0x68, 0x18, 0x68, 0x00, 0x00, 0x40, 0x0a, 0x47, 
-	0x02, 0x7f, 0x20, 0x19, 0x06, 0x80, 0x6a, 0x84, 
-	0x4b, 0x06, 0x40, 0x23, 0x0a, 0x5b, 0x43, 0x3b, 
-	0x60, 0x0b, 0x6a, 0x80, 0x05, 0xc0, 0x0d, 0xc0, 
-	0x60, 0x10, 0xbc, 0x90, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x5e, 0x38, 0x00, 0x03, 0xfe, 0x00, 
-	0xb5, 0x00, 0x49, 0x1d, 0x62, 0xc8, 0x28, 0x00, 
-	0xd0, 0x11, 0x28, 0x01, 0xd0, 0x1b, 0x28, 0x02, 
-	0xd0, 0x25, 0x28, 0x03, 0xd1, 0x09, 0x48, 0x19, 
-	0x68, 0x01, 0x08, 0x49, 0x00, 0x49, 0x60, 0x01, 
-	0x22, 0x01, 0x21, 0x01, 0x20, 0x00, 0xf0, 0x0b, 
-	0xf9, 0x8f, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x13, 
-	0x68, 0x01, 0x08, 0x49, 0x00, 0x49, 0x60, 0x01, 
-	0x48, 0x11, 0x68, 0x01, 0x04, 0x03, 0x43, 0x19, 
-	0x60, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x0d, 
-	0x68, 0x01, 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 
-	0x48, 0x0b, 0x68, 0x01, 0x4b, 0x0b, 0x40, 0x19, 
-	0x60, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x07, 
-	0x68, 0x01, 0x08, 0x49, 0x00, 0x49, 0x60, 0x01, 
-	0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 0xf0, 0x0b, 
-	0xf9, 0x6b, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x04, 0xc4, 0x6a, 0x00, 0x00, 0x18, 
-	0x6c, 0x00, 0x00, 0x20, 0xff, 0xdf, 0xff, 0xff, 
-	0xb5, 0x90, 0x48, 0x11, 0x6c, 0xc1, 0x6c, 0x80, 
-	0x1a, 0x0f, 0x48, 0x10, 0xd5, 0x01, 0x69, 0x01, 
-	0x18, 0x7f, 0x69, 0x00, 0x10, 0x80, 0x4c, 0x0e, 
-	0x42, 0xb8, 0xda, 0x0b, 0x68, 0xe0, 0x28, 0x00, 
-	0xd1, 0x08, 0x48, 0x0c, 0x68, 0x01, 0x23, 0x02, 
-	0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, 0x20, 0x02, 
-	0xf0, 0x0a, 0xfd, 0x0c, 0x2f, 0x00, 0xd1, 0x04, 
-	0x20, 0x01, 0x61, 0xe0, 0x6b, 0xa0, 0x30, 0x01, 
-	0x63, 0xa0, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x04, 0x44, 
-	0x2e, 0x08, 0x04, 0xc4, 0x6c, 0x00, 0x00, 0x20, 
-	0xb5, 0x00, 0x20, 0x03, 0xf0, 0x0a, 0xfc, 0xf6, 
-	0x20, 0x1e, 0xf0, 0x07, 0xfc, 0xf3, 0x23, 0x03, 
-	0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, 
-	0x20, 0x1e, 0xf0, 0x07, 0xfa, 0xa1, 0x22, 0x00, 
-	0xb4, 0x04, 0x23, 0x02, 0x22, 0x02, 0x49, 0x07, 
-	0x20, 0x1e, 0xf0, 0x07, 0xf8, 0xd5, 0x23, 0x01, 
-	0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0x20, 0x1e, 
-	0xb0, 0x01, 0xf0, 0x07, 0xfa, 0x91, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 
-	0xb5, 0x00, 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x0d, 
-	0xf8, 0x6b, 0x20, 0x1f, 0xf0, 0x07, 0xfc, 0x04, 
-	0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 
-	0x21, 0x02, 0x20, 0x1f, 0xf0, 0x07, 0xfa, 0x7c, 
-	0x20, 0x00, 0xf0, 0x0a, 0xfb, 0x61, 0x22, 0x00, 
-	0xb4, 0x04, 0x23, 0x01, 0x22, 0x02, 0x49, 0x07, 
-	0x20, 0x1f, 0xf0, 0x07, 0xf8, 0xad, 0x23, 0x01, 
-	0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0x20, 0x1f, 
-	0xb0, 0x01, 0xf0, 0x07, 0xfa, 0x69, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe, 
-	0xb5, 0x80, 0x20, 0x0f, 0x02, 0x40, 0x4f, 0x0a, 
-	0x61, 0x38, 0x49, 0x0a, 0x6c, 0x89, 0x61, 0x79, 
-	0xf0, 0x01, 0xfe, 0x3c, 0x1d, 0xf9, 0x31, 0x79, 
-	0x61, 0x08, 0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, 
-	0x61, 0xf8, 0x62, 0x38, 0x64, 0xf8, 0x20, 0xff, 
-	0x72, 0x08, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x04, 0x44, 0x66, 0x00, 0x00, 0x80, 
-	0xb5, 0x80, 0x4f, 0x05, 0x69, 0x38, 0x28, 0x00, 
-	0xd0, 0x03, 0xf0, 0x01, 0xfe, 0x45, 0x20, 0x00, 
-	0x61, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x04, 0xc4, 0xb5, 0x00, 0x4a, 0x0d, 
-	0xb4, 0x04, 0x1f, 0x10, 0x1e, 0x51, 0x1c, 0x13, 
-	0xf7, 0xfc, 0xfb, 0x2a, 0x21, 0x33, 0x06, 0x49, 
-	0x6d, 0x88, 0x6d, 0x4a, 0x1a, 0x82, 0xb0, 0x01, 
-	0x48, 0x07, 0x62, 0x42, 0x6d, 0x49, 0x62, 0xc1, 
-	0x21, 0x00, 0x65, 0x81, 0x21, 0x01, 0x02, 0xc9, 
-	0x64, 0x41, 0x21, 0x01, 0x30, 0x60, 0x76, 0x01, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x04, 0x44, 0xb5, 0x00, 0x4a, 0x10, 
-	0xb4, 0x04, 0x1c, 0x13, 0x3a, 0x01, 0x49, 0x0f, 
-	0x1e, 0xc8, 0xf7, 0xfc, 0xfb, 0x09, 0x21, 0x33, 
-	0x06, 0x49, 0x6d, 0x88, 0x6d, 0x4a, 0x1a, 0x82, 
-	0xb0, 0x01, 0x48, 0x0b, 0x62, 0x42, 0x6d, 0x49, 
-	0x62, 0xc1, 0x21, 0x00, 0x65, 0x81, 0x21, 0x01, 
-	0x02, 0xc9, 0x64, 0x41, 0x21, 0x01, 0x30, 0x60, 
-	0x76, 0x01, 0x48, 0x06, 0x23, 0x02, 0x68, 0x01, 
-	0x43, 0x19, 0x60, 0x01, 0xbc, 0x08, 0x47, 0x18, 
-	0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xfe, 
-	0x2e, 0x08, 0x04, 0x44, 0x2e, 0x08, 0x00, 0x04, 
-	0x48, 0x03, 0x23, 0x02, 0x43, 0xdb, 0x68, 0x01, 
-	0x40, 0x19, 0x60, 0x01, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x00, 0x04, 0xb5, 0xf0, 0x20, 0x0f, 
-	0x02, 0x40, 0x4c, 0x11, 0x61, 0x20, 0x20, 0x00, 
-	0xf7, 0xfc, 0xfc, 0x1c, 0x48, 0x0f, 0xf7, 0xfc, 
-	0xfc, 0x19, 0x26, 0x00, 0x1d, 0xe0, 0x30, 0x59, 
-	0x77, 0x06, 0x25, 0xff, 0x1d, 0xe7, 0x37, 0x79, 
-	0x70, 0x3d, 0x20, 0x01, 0x63, 0x78, 0x60, 0xe6, 
-	0x69, 0x78, 0x28, 0x00, 0xd1, 0x04, 0x20, 0x41, 
-	0x01, 0x40, 0xf0, 0x01, 0xfd, 0xab, 0x61, 0x78, 
-	0x69, 0x78, 0x28, 0x00, 0xd0, 0x01, 0x76, 0x3e, 
-	0x70, 0x3d, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x04, 0x44, 0x00, 0x00, 0x1f, 0xff, 
-	0xb5, 0x00, 0x20, 0x00, 0xf7, 0xfd, 0xff, 0xbc, 
-	0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, 0x4a, 0x06, 
-	0x21, 0x00, 0x20, 0x00, 0xf7, 0xfc, 0xfa, 0xa8, 
-	0x21, 0x00, 0x20, 0x0d, 0xb0, 0x01, 0xf0, 0x0c, 
-	0xff, 0x8f, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x00, 0x00, 0xff, 0xff, 0xb5, 0x80, 0x22, 0x00, 
-	0xb4, 0x04, 0x27, 0x00, 0x1c, 0x3b, 0x4a, 0x17, 
-	0x21, 0x00, 0x20, 0x00, 0xf7, 0xfc, 0xfa, 0x94, 
-	0x22, 0x00, 0xb0, 0x01, 0xb4, 0x04, 0x1c, 0x3b, 
-	0x4a, 0x12, 0x49, 0x13, 0x20, 0x00, 0xf7, 0xfc, 
-	0xfa, 0x8b, 0x21, 0x33, 0x06, 0x49, 0x6d, 0x88, 
-	0x6d, 0x4a, 0x1a, 0x82, 0xb0, 0x01, 0x48, 0x0f, 
-	0x62, 0x42, 0x6d, 0x49, 0x63, 0x01, 0x21, 0x01, 
-	0x02, 0xc9, 0x64, 0x81, 0x21, 0x01, 0x65, 0x87, 
-	0x30, 0x60, 0x76, 0x01, 0x77, 0x07, 0x22, 0x00, 
-	0x21, 0x00, 0x20, 0x00, 0xf7, 0xff, 0xfe, 0x28, 
-	0x20, 0x00, 0xf7, 0xff, 0xfe, 0x59, 0x21, 0x00, 
-	0x20, 0x0d, 0xf0, 0x0c, 0xff, 0x59, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xff, 0xff, 
-	0x00, 0x00, 0x1f, 0xfe, 0x2e, 0x08, 0x04, 0x44, 
-	0xb5, 0xf0, 0x06, 0x05, 0x0e, 0x2d, 0x20, 0x0f, 
-	0x02, 0x40, 0x4f, 0x2f, 0x26, 0x33, 0x06, 0x76, 
-	0x61, 0x38, 0x6d, 0xb0, 0x6d, 0x71, 0x1a, 0x40, 
-	0x62, 0x78, 0x62, 0xb8, 0x20, 0x00, 0x1d, 0xfc, 
-	0x34, 0x79, 0x60, 0xe0, 0x2d, 0x00, 0xd0, 0x02, 
-	0x20, 0xff, 0xf7, 0xfd, 0xff, 0x59, 0x22, 0x00, 
-	0xb4, 0x04, 0x23, 0x00, 0x21, 0x00, 0x20, 0x00, 
-	0xf7, 0xfc, 0xfa, 0x46, 0x22, 0x01, 0x21, 0x01, 
-	0x20, 0x00, 0xb0, 0x01, 0xf0, 0x0a, 0xff, 0xcc, 
-	0x21, 0x00, 0x20, 0x00, 0xf0, 0x0b, 0xf8, 0x8c, 
-	0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, 0x4a, 0x1d, 
-	0x20, 0x00, 0x1e, 0x51, 0xf7, 0xfc, 0xfa, 0x34, 
-	0x20, 0x01, 0x63, 0x60, 0x69, 0x60, 0xb0, 0x01, 
-	0x28, 0x00, 0xd1, 0x04, 0x20, 0x41, 0x01, 0x40, 
-	0xf0, 0x01, 0xfd, 0x14, 0x61, 0x60, 0x69, 0x60, 
-	0x28, 0x00, 0xd0, 0x03, 0x20, 0x00, 0x76, 0x20, 
-	0x20, 0xff, 0x70, 0x20, 0x6d, 0x70, 0x63, 0x38, 
-	0x20, 0x01, 0x02, 0xc0, 0x64, 0xb8, 0x20, 0x00, 
-	0x26, 0x01, 0x65, 0xb8, 0x1d, 0xf9, 0x31, 0x59, 
-	0x76, 0x0e, 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 
-	0xf7, 0xff, 0xfd, 0xc6, 0x21, 0x00, 0x20, 0x0d, 
-	0xf0, 0x0c, 0xfe, 0xfa, 0x20, 0x00, 0x60, 0xf8, 
-	0x2d, 0x00, 0xd1, 0x02, 0xf7, 0xff, 0xfd, 0xf0, 
-	0x61, 0xe6, 0x20, 0x00, 0x60, 0xb8, 0x66, 0x38, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x04, 0x44, 0x00, 0x00, 0x1f, 0xff, 
-	0xb5, 0xb0, 0x4f, 0x45, 0x25, 0x00, 0x6d, 0x38, 
-	0x4c, 0x44, 0x28, 0x05, 0xd2, 0x14, 0xa3, 0x02, 
-	0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x10, 0x03, 0x2e, 0x65, 0x73, 0x00, 0x4d, 0x40, 
-	0x68, 0x28, 0x08, 0x41, 0xd2, 0x08, 0x08, 0xc0, 
-	0xd3, 0x09, 0xf7, 0xff, 0xfe, 0xb3, 0x23, 0x04, 
-	0x43, 0xdb, 0x68, 0x28, 0x40, 0x18, 0x60, 0x28, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x6d, 0x78, 
-	0x28, 0x00, 0xd0, 0xf9, 0x28, 0x01, 0xd0, 0x01, 
-	0x28, 0x05, 0xd1, 0x06, 0xf0, 0x00, 0xf8, 0x6c, 
-	0x8e, 0xa0, 0x28, 0x00, 0xd1, 0xf0, 0xf0, 0x00, 
-	0xf9, 0x29, 0x6d, 0x78, 0x28, 0x04, 0xd0, 0x01, 
-	0x28, 0x05, 0xd1, 0xe9, 0x8e, 0xa0, 0x28, 0x00, 
-	0xd1, 0xe6, 0xf0, 0x00, 0xfa, 0x4b, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x8e, 0xe0, 0x28, 0x00, 
-	0xd1, 0xde, 0x8d, 0xa0, 0x06, 0x00, 0x0e, 0x00, 
-	0x28, 0x06, 0xd1, 0x15, 0x48, 0x27, 0x78, 0x00, 
-	0x28, 0x00, 0xd0, 0x06, 0x6d, 0x78, 0x28, 0x01, 
-	0xd0, 0x01, 0x28, 0x05, 0xd1, 0x01, 0xf0, 0x00, 
-	0xfc, 0xcd, 0x6d, 0x78, 0x28, 0x04, 0xd0, 0x01, 
-	0x28, 0x05, 0xd1, 0x01, 0xf0, 0x00, 0xfc, 0x2e, 
-	0x85, 0xa5, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x8d, 0xa0, 0x28, 0x00, 0xd1, 0xc0, 0x6d, 0x78, 
-	0x28, 0x01, 0xd0, 0x08, 0x28, 0x04, 0xd0, 0x0b, 
-	0x28, 0x05, 0xd1, 0xb9, 0xf0, 0x00, 0xfd, 0xe4, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0xf0, 0x00, 
-	0xfd, 0xb9, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0xf0, 0x00, 0xfd, 0x88, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x8e, 0xe0, 0x28, 0x00, 0xd1, 0xa7, 
-	0x20, 0x06, 0x85, 0xa0, 0x85, 0xe5, 0x20, 0x09, 
-	0x02, 0x40, 0x86, 0xe0, 0x20, 0x04, 0x65, 0x38, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x8e, 0xe0, 
-	0x28, 0x00, 0xd1, 0x99, 0x8d, 0xa0, 0x06, 0x00, 
-	0x0e, 0x00, 0x28, 0x06, 0xd1, 0x94, 0x85, 0xa5, 
-	0x65, 0x3d, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x04, 0x44, 0x2c, 0x00, 0x1f, 0xc0, 
-	0x2e, 0x08, 0x00, 0x04, 0x2e, 0x08, 0x04, 0xc4, 
-	0xb5, 0xb0, 0x48, 0x46, 0x6c, 0xc1, 0x4c, 0x46, 
-	0x64, 0x21, 0x69, 0x60, 0x1a, 0x09, 0x1d, 0xe7, 
-	0x37, 0x79, 0x63, 0xf9, 0x29, 0x00, 0xda, 0x02, 
-	0x69, 0x22, 0x18, 0x89, 0x63, 0xf9, 0x23, 0xff, 
-	0x6b, 0xf9, 0x33, 0x01, 0x42, 0x99, 0xdb, 0x73, 
-	0x22, 0x01, 0x03, 0x12, 0x42, 0x91, 0xdd, 0x00, 
-	0x63, 0xfa, 0x6b, 0xf9, 0x08, 0x89, 0x00, 0x89, 
-	0x63, 0xf9, 0x7a, 0x3a, 0x2a, 0x00, 0xd0, 0x05, 
-	0x23, 0xff, 0x03, 0x5b, 0x1a, 0xc2, 0x61, 0xe2, 
-	0x22, 0x00, 0x72, 0x3a, 0x18, 0x42, 0x49, 0x35, 
-	0x25, 0x12, 0x42, 0x8a, 0xdd, 0x2c, 0x1a, 0x08, 
-	0x64, 0x38, 0xf0, 0x18, 0xfb, 0x5f, 0x4b, 0x32, 
-	0x40, 0x18, 0xf0, 0x18, 0xfb, 0x5f, 0x22, 0x00, 
-	0x49, 0x30, 0xb4, 0x06, 0x69, 0x60, 0x69, 0x39, 
-	0x18, 0x41, 0x23, 0xff, 0x03, 0x5b, 0x1a, 0xc9, 
-	0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 0x6c, 0x3a, 
-	0x1c, 0x2b, 0xf0, 0x0f, 0xf8, 0x67, 0x22, 0x00, 
-	0xb0, 0x02, 0x49, 0x28, 0xb4, 0x06, 0x6b, 0xf8, 
-	0x6c, 0x39, 0x1a, 0x42, 0x69, 0x39, 0x1c, 0x2b, 
-	0x48, 0x25, 0xf0, 0x0f, 0xf8, 0x5b, 0xb0, 0x02, 
-	0xf0, 0x18, 0xfb, 0x3c, 0x23, 0x01, 0x04, 0x9b, 
-	0x43, 0x18, 0xf0, 0x18, 0xfb, 0x3b, 0xe0, 0x1d, 
-	0xf0, 0x18, 0xfb, 0x34, 0x4b, 0x1c, 0x40, 0x18, 
-	0xf0, 0x18, 0xfb, 0x34, 0x22, 0x00, 0x49, 0x1b, 
-	0xb4, 0x06, 0x69, 0x60, 0x69, 0x39, 0x18, 0x41, 
-	0x23, 0xff, 0x03, 0x5b, 0x1a, 0xc9, 0x23, 0x0d, 
-	0x06, 0x9b, 0x1a, 0xc0, 0x6b, 0xfa, 0x1c, 0x2b, 
-	0xf0, 0x0f, 0xf8, 0x3c, 0xb0, 0x02, 0xf0, 0x18, 
-	0xfb, 0x1d, 0x23, 0x01, 0x04, 0x9b, 0x43, 0x18, 
-	0xf0, 0x18, 0xfb, 0x1c, 0x69, 0x60, 0x6b, 0xf9, 
-	0x18, 0x40, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc1, 
-	0x61, 0x60, 0x4b, 0x0e, 0x42, 0x99, 0xd3, 0x02, 
-	0x69, 0x21, 0x1a, 0x40, 0x61, 0x60, 0x23, 0xff, 
-	0x03, 0x5b, 0x69, 0x60, 0x1a, 0xc0, 0xe0, 0x00, 
-	0xe0, 0x00, 0x62, 0x20, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x66, 0x00, 0x00, 0x80, 
-	0x2e, 0x08, 0x04, 0x44, 0x00, 0x1f, 0xfe, 0x00, 
-	0xff, 0xfb, 0xff, 0xff, 0x9e, 0x00, 0x08, 0x00, 
-	0xcc, 0x1f, 0xe0, 0x00, 0xcc, 0x1f, 0xfe, 0x00, 
-	0x21, 0x00, 0x23, 0xff, 0x68, 0x02, 0x33, 0xc1, 
-	0x42, 0x9a, 0xd0, 0x01, 0x1c, 0x08, 0x47, 0x70, 
-	0x79, 0xc2, 0x0a, 0x12, 0xd2, 0x01, 0x1c, 0x08, 
-	0x47, 0x70, 0x7a, 0x41, 0x23, 0x0e, 0x40, 0x19, 
-	0x07, 0x49, 0x7a, 0x82, 0x05, 0x92, 0x43, 0x11, 
-	0x7a, 0xc2, 0x23, 0xfe, 0x40, 0x1a, 0x03, 0x92, 
-	0x43, 0x11, 0x7b, 0x02, 0x01, 0xd2, 0x43, 0x11, 
-	0x7b, 0x40, 0x40, 0x18, 0x08, 0x40, 0x43, 0x08, 
-	0x49, 0x01, 0x67, 0x08, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x04, 0x44, 0xb5, 0xf0, 0xb0, 0x86, 
-	0x4c, 0x8c, 0x6c, 0xe0, 0x1d, 0xe7, 0x37, 0x79, 
-	0x1d, 0xfd, 0x35, 0x39, 0x28, 0x00, 0xd0, 0x04, 
-	0x28, 0x01, 0xd0, 0x3a, 0x28, 0x02, 0xd1, 0x73, 
-	0xe0, 0x74, 0x69, 0xe0, 0x6a, 0x21, 0x1a, 0x09, 
-	0x63, 0xf9, 0x1c, 0x0a, 0xd5, 0x02, 0x69, 0x21, 
-	0x18, 0x51, 0x63, 0xf9, 0x6b, 0xf9, 0x29, 0x04, 
-	0xdb, 0x67, 0x69, 0x3e, 0x5c, 0x31, 0x06, 0x0a, 
-	0x65, 0x7a, 0x92, 0x05, 0x1c, 0x41, 0x69, 0x20, 
-	0x90, 0x04, 0xf0, 0x14, 0xfb, 0x29, 0x61, 0xe1, 
-	0x5c, 0x70, 0x04, 0x00, 0x9a, 0x05, 0x18, 0x82, 
-	0x65, 0x7a, 0x92, 0x03, 0x98, 0x04, 0x31, 0x01, 
-	0xf0, 0x14, 0xfb, 0x1e, 0x61, 0xe1, 0x5c, 0x70, 
-	0x02, 0x00, 0x9a, 0x03, 0x18, 0x80, 0x65, 0x78, 
-	0x90, 0x02, 0x98, 0x04, 0x31, 0x01, 0xf0, 0x14, 
-	0xfb, 0x13, 0x61, 0xe1, 0x5c, 0x70, 0x9a, 0x02, 
-	0x18, 0x80, 0x65, 0x78, 0x98, 0x04, 0x31, 0x01, 
-	0xf0, 0x14, 0xfb, 0x0a, 0x20, 0x01, 0x64, 0xe0, 
-	0x61, 0xe1, 0x6a, 0x20, 0x69, 0xe1, 0x1a, 0x40, 
-	0x63, 0xf8, 0x1c, 0x01, 0xd4, 0x05, 0x48, 0x67, 
-	0x69, 0x06, 0x30, 0x80, 0x69, 0x02, 0x92, 0x01, 
-	0xe0, 0x03, 0x69, 0x20, 0x18, 0x08, 0x63, 0xf8, 
-	0xe7, 0xf5, 0x6b, 0xf8, 0x90, 0x00, 0x28, 0x02, 
-	0xdb, 0x22, 0x6d, 0x78, 0x09, 0x01, 0x01, 0x09, 
-	0x23, 0xff, 0x33, 0xc1, 0x42, 0x99, 0xd1, 0x31, 
-	0x9a, 0x01, 0x69, 0xe0, 0x5c, 0x11, 0x02, 0x09, 
-	0x83, 0x29, 0x1c, 0x41, 0x1c, 0x30, 0xf0, 0x14, 
-	0xfa, 0xe3, 0x61, 0xe1, 0x69, 0x38, 0x5c, 0x40, 
-	0x8b, 0x2a, 0x18, 0x80, 0x83, 0x28, 0x8b, 0x28, 
-	0x30, 0x06, 0x83, 0x28, 0x19, 0x88, 0x1f, 0x41, 
-	0x1c, 0x30, 0xf0, 0x14, 0xfa, 0xd5, 0x61, 0xe1, 
-	0x21, 0xff, 0x71, 0x39, 0x20, 0x02, 0x64, 0xe0, 
-	0x6c, 0xe0, 0x28, 0x02, 0xd1, 0x00, 0xe0, 0x01, 
-	0xe0, 0x94, 0xe0, 0x93, 0x6a, 0x20, 0x69, 0xe1, 
-	0x1a, 0x40, 0x63, 0xf8, 0x1c, 0x01, 0xd5, 0x02, 
-	0x69, 0x20, 0x18, 0x08, 0x63, 0xf8, 0x79, 0x38, 
-	0x28, 0x00, 0xd0, 0x13, 0x20, 0x01, 0x02, 0xc0, 
-	0x83, 0xa8, 0xe0, 0x11, 0x02, 0x01, 0x65, 0x79, 
-	0x9a, 0x01, 0x69, 0xe0, 0x5c, 0x12, 0x18, 0x51, 
-	0x65, 0x79, 0x1c, 0x41, 0x1c, 0x30, 0xf0, 0x14, 
-	0xfa, 0xaf, 0x61, 0xe1, 0x98, 0x00, 0x38, 0x01, 
-	0x63, 0xf8, 0xe7, 0xb2, 0x48, 0x3c, 0x83, 0xa8, 
-	0x8b, 0x28, 0x6b, 0xf9, 0x42, 0x88, 0xda, 0x01, 
-	0x63, 0xf8, 0xe0, 0x02, 0x8b, 0xa8, 0x42, 0x81, 
-	0xdb, 0x68, 0x8b, 0xa8, 0x6b, 0xf9, 0x42, 0x81, 
-	0xdd, 0x00, 0x63, 0xf8, 0x48, 0x35, 0x21, 0x00, 
-	0x66, 0x78, 0x80, 0x01, 0x30, 0x02, 0x21, 0xff, 
-	0x31, 0xc1, 0x66, 0x78, 0x80, 0x01, 0x48, 0x32, 
-	0x66, 0x78, 0x79, 0x39, 0x29, 0x00, 0xd0, 0x21, 
-	0x21, 0x00, 0x71, 0x39, 0x69, 0x3b, 0x69, 0x20, 
-	0x18, 0x1a, 0xb4, 0x04, 0x69, 0xe0, 0x18, 0x18, 
-	0x6b, 0xfa, 0x49, 0x2a, 0xf0, 0x00, 0xfe, 0xf4, 
-	0x6b, 0xf8, 0x38, 0x06, 0x6e, 0x79, 0x80, 0x08, 
-	0x31, 0x02, 0x66, 0x79, 0xb0, 0x01, 0x48, 0x25, 
-	0xf7, 0xff, 0xff, 0x02, 0x8b, 0x28, 0x6b, 0xf9, 
-	0x1a, 0x40, 0x83, 0x28, 0x69, 0xe0, 0x6b, 0xf9, 
-	0x18, 0x41, 0x69, 0x20, 0xf0, 0x14, 0xfa, 0x6c, 
-	0x61, 0xe1, 0xe0, 0x26, 0x6b, 0xf9, 0x31, 0x03, 
-	0x80, 0x01, 0x48, 0x1e, 0x21, 0x01, 0x03, 0xc9, 
-	0x66, 0x78, 0x80, 0x01, 0x30, 0x02, 0x21, 0xff, 
-	0x66, 0x78, 0x80, 0x01, 0x48, 0x1a, 0x66, 0x78, 
-	0x69, 0x3b, 0x69, 0x20, 0x18, 0x1a, 0xb4, 0x04, 
-	0x69, 0xe0, 0x18, 0x18, 0x6b, 0xfa, 0x49, 0x17, 
-	0xf0, 0x00, 0xfe, 0xc6, 0x8b, 0x28, 0x6b, 0xf9, 
-	0x1a, 0x40, 0x83, 0x28, 0x69, 0xe0, 0x6b, 0xfe, 
-	0x19, 0x81, 0x69, 0x20, 0xb0, 0x01, 0xf0, 0x14, 
-	0xfa, 0x47, 0x1d, 0xf0, 0x30, 0x02, 0x61, 0xe1, 
-	0x63, 0xf8, 0x8b, 0x28, 0x28, 0x00, 0xd1, 0x01, 
-	0x21, 0x00, 0x64, 0xe0, 0x21, 0x10, 0x48, 0x0c, 
-	0x85, 0x01, 0x6b, 0xf9, 0x85, 0x41, 0x21, 0x01, 
-	0x02, 0x49, 0x86, 0x81, 0xb0, 0x06, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x44, 
-	0x00, 0x00, 0x07, 0xf7, 0x2c, 0x00, 0x02, 0x00, 
-	0x2c, 0x00, 0x02, 0x04, 0x2c, 0x00, 0x02, 0x06, 
-	0x2c, 0x00, 0x02, 0x0a, 0x2c, 0x00, 0x02, 0x09, 
-	0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0xf0, 0x20, 0x33, 
-	0x06, 0x40, 0x6e, 0x40, 0xb0, 0x81, 0x4f, 0x77, 
-	0x63, 0xb8, 0x6a, 0xf9, 0x1a, 0x40, 0x1d, 0xfc, 
-	0x34, 0x79, 0x63, 0xe0, 0x28, 0x00, 0xda, 0x02, 
-	0x6a, 0x79, 0x18, 0x40, 0x63, 0xe0, 0x6b, 0xe0, 
-	0x4b, 0x71, 0x42, 0x98, 0xdc, 0x03, 0xb0, 0x01, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x6d, 0xb9, 
-	0x48, 0x6e, 0x1d, 0xc5, 0x35, 0x59, 0x29, 0x00, 
-	0xd1, 0x16, 0x7e, 0x01, 0x29, 0x00, 0xd1, 0x13, 
-	0x21, 0x01, 0x75, 0x01, 0x21, 0x05, 0x84, 0x29, 
-	0x23, 0x0d, 0x06, 0x9b, 0x6c, 0x79, 0x1a, 0xca, 
-	0x68, 0x52, 0x31, 0x08, 0x23, 0x05, 0x02, 0x5b, 
-	0x64, 0x79, 0x66, 0xba, 0x42, 0x99, 0xdb, 0x06, 
-	0x21, 0x01, 0x02, 0xc9, 0x64, 0x79, 0xe0, 0x02, 
-	0x21, 0x00, 0x75, 0x01, 0x84, 0x29, 0x8c, 0x29, 
-	0x1c, 0x4a, 0x6a, 0xfb, 0x1a, 0x9a, 0x07, 0x92, 
-	0x0f, 0x92, 0x18, 0x51, 0x84, 0x29, 0x7e, 0x01, 
-	0x29, 0x00, 0xd0, 0x03, 0x21, 0x00, 0x66, 0x39, 
-	0x66, 0x79, 0x76, 0x01, 0x6c, 0x79, 0x4a, 0x58, 
-	0x69, 0x52, 0x42, 0x91, 0xd0, 0x26, 0x6e, 0x7a, 
-	0x2a, 0x00, 0xd1, 0x10, 0x23, 0x0d, 0x06, 0x9b, 
-	0x1a, 0xc9, 0x68, 0x09, 0x66, 0x79, 0x1c, 0x0a, 
-	0x6e, 0x3b, 0x18, 0x59, 0x66, 0x39, 0x4b, 0x51, 
-	0x42, 0x99, 0xdb, 0x04, 0x32, 0x01, 0x31, 0x01, 
-	0x40, 0x19, 0x66, 0x39, 0x66, 0x7a, 0x6e, 0x79, 
-	0x6d, 0xba, 0x1a, 0x89, 0x65, 0x21, 0x91, 0x00, 
-	0x8c, 0x2b, 0x4e, 0x4b, 0x1a, 0xf3, 0x42, 0x8b, 
-	0xd3, 0x04, 0x63, 0xe1, 0x21, 0x00, 0x65, 0xb9, 
-	0x66, 0x79, 0xe0, 0x0a, 0x18, 0xd1, 0x63, 0xe3, 
-	0x65, 0xb9, 0xe0, 0x06, 0x8c, 0x29, 0x4a, 0x44, 
-	0x1a, 0x51, 0x63, 0xe1, 0x6d, 0xba, 0x18, 0x51, 
-	0x65, 0xb9, 0x49, 0x42, 0x66, 0x61, 0x8c, 0x2a, 
-	0x6b, 0xe1, 0x18, 0x89, 0x31, 0x03, 0x83, 0xa9, 
-	0x22, 0x00, 0x6e, 0x61, 0x80, 0x0a, 0x31, 0x02, 
-	0x22, 0xff, 0x32, 0xe1, 0x66, 0x61, 0x80, 0x0a, 
-	0x31, 0x02, 0x66, 0x61, 0x8b, 0xaa, 0x80, 0x0a, 
-	0x31, 0x02, 0x66, 0x61, 0x7d, 0x00, 0x28, 0x00, 
-	0xd0, 0x1d, 0x4a, 0x37, 0x80, 0x0a, 0x1c, 0x88, 
-	0x66, 0x60, 0x8c, 0x29, 0x02, 0x09, 0x6e, 0xba, 
-	0x0f, 0x52, 0x23, 0x06, 0x40, 0x1a, 0x43, 0x11, 
-	0x23, 0x21, 0x43, 0x19, 0x80, 0x01, 0x30, 0x02, 
-	0x66, 0x60, 0x6e, 0xb9, 0x0b, 0x89, 0x23, 0x01, 
-	0x43, 0x19, 0x80, 0x01, 0x30, 0x02, 0x66, 0x60, 
-	0x6e, 0xb9, 0x00, 0x49, 0x43, 0x19, 0x80, 0x01, 
-	0x30, 0x02, 0x66, 0x60, 0xe0, 0x0b, 0x20, 0x01, 
-	0x03, 0xc0, 0x80, 0x08, 0x31, 0x02, 0x66, 0x61, 
-	0x8c, 0x28, 0x02, 0x00, 0x23, 0xff, 0x43, 0x18, 
-	0x80, 0x08, 0x31, 0x02, 0x66, 0x61, 0x48, 0x23, 
-	0x6e, 0x61, 0x80, 0x08, 0x31, 0x02, 0x66, 0x61, 
-	0x80, 0x08, 0x31, 0x02, 0x22, 0x33, 0x06, 0x52, 
-	0x66, 0x61, 0x00, 0x53, 0x6d, 0x90, 0x18, 0xc2, 
-	0xb4, 0x04, 0x08, 0x5a, 0x6d, 0x50, 0x18, 0xc6, 
-	0x8c, 0x28, 0x4b, 0x1b, 0x18, 0xc1, 0x00, 0x53, 
-	0x6a, 0xf8, 0x18, 0xc0, 0x6b, 0xe2, 0x1c, 0x33, 
-	0xf0, 0x00, 0xfd, 0xbe, 0x6a, 0xf8, 0x6b, 0xe1, 
-	0x18, 0x40, 0x22, 0x33, 0x06, 0x52, 0x62, 0xf8, 
-	0x6d, 0x92, 0xb0, 0x01, 0x42, 0x90, 0xdb, 0x02, 
-	0x6a, 0x79, 0x1a, 0x40, 0x62, 0xf8, 0x21, 0xff, 
-	0x31, 0x11, 0x48, 0x10, 0x85, 0x01, 0x8b, 0xa9, 
-	0x31, 0x06, 0x85, 0x41, 0x21, 0x01, 0x02, 0x49, 
-	0x86, 0x81, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x44, 
-	0x00, 0x00, 0x0f, 0xee, 0x2e, 0x08, 0x04, 0xa4, 
-	0xcc, 0x00, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xff, 
-	0x00, 0x00, 0x07, 0xf7, 0x2c, 0x00, 0x02, 0x00, 
-	0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0xff, 0xff, 
-	0x2c, 0x00, 0x02, 0x09, 0x2c, 0x00, 0x1f, 0xc0, 
-	0xb5, 0xb0, 0x1c, 0x07, 0xb0, 0x83, 0x4d, 0x20, 
-	0x6b, 0x28, 0xf7, 0xff, 0xfa, 0x51, 0x48, 0x1f, 
-	0x6c, 0xc1, 0x6c, 0x80, 0x1a, 0x08, 0xd5, 0x03, 
-	0x1f, 0xe9, 0x39, 0x79, 0x69, 0x09, 0x18, 0x40, 
-	0x6e, 0xa9, 0x29, 0x00, 0xd0, 0x22, 0x29, 0x10, 
-	0xd0, 0x20, 0x29, 0x20, 0xd0, 0x24, 0x29, 0x30, 
-	0xd1, 0x04, 0x24, 0x2d, 0x43, 0x44, 0xd5, 0x00, 
-	0x34, 0x3f, 0x11, 0xa4, 0x46, 0x6a, 0xa8, 0x01, 
-	0xa9, 0x02, 0xf7, 0xff, 0xfa, 0x17, 0x1b, 0x38, 
-	0x99, 0x02, 0x1a, 0x08, 0x22, 0x7d, 0x01, 0x52, 
-	0x42, 0x90, 0xdc, 0x01, 0x42, 0x90, 0xda, 0x05, 
-	0x1a, 0x09, 0x91, 0x02, 0x22, 0x00, 0x20, 0x00, 
-	0xf7, 0xff, 0xf9, 0xf2, 0xb0, 0x03, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x01, 0x04, 0x1a, 0x24, 
-	0xd5, 0x00, 0x34, 0x1f, 0x11, 0x64, 0xe7, 0xe1, 
-	0x21, 0x4b, 0x43, 0x41, 0x20, 0x93, 0xf0, 0x14, 
-	0xf8, 0xd7, 0x1c, 0x04, 0xe7, 0xda, 0x00, 0x00, 
-	0x2e, 0x08, 0x04, 0xc4, 0x66, 0x00, 0x00, 0x80, 
-	0xb5, 0x90, 0x1c, 0x07, 0xb0, 0x83, 0x4c, 0x18, 
-	0x6f, 0x60, 0x30, 0x01, 0x46, 0x6a, 0x67, 0x60, 
-	0xa8, 0x01, 0xa9, 0x02, 0xf7, 0xff, 0xf9, 0xe6, 
-	0x4b, 0x14, 0x18, 0xf9, 0x98, 0x02, 0x1a, 0x40, 
-	0x4b, 0x13, 0x42, 0x98, 0xdc, 0x04, 0x42, 0xd8, 
-	0xdb, 0x02, 0x69, 0xe0, 0x28, 0x01, 0xd1, 0x07, 
-	0x91, 0x02, 0x20, 0x00, 0x90, 0x01, 0x22, 0x00, 
-	0xf7, 0xff, 0xf9, 0xbe, 0x20, 0x01, 0x61, 0xe0, 
-	0x69, 0xe0, 0x28, 0x00, 0xd0, 0x0b, 0x6b, 0x20, 
-	0xf7, 0xff, 0xf9, 0xea, 0x6f, 0x60, 0x67, 0xa0, 
-	0x48, 0x08, 0x60, 0x07, 0x6f, 0xe0, 0x30, 0x01, 
-	0x67, 0xe0, 0x20, 0x00, 0x61, 0xe0, 0xb0, 0x03, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x04, 0xc4, 0xff, 0xff, 0xec, 0x78, 
-	0x00, 0x02, 0xbf, 0x20, 0x2e, 0x08, 0x05, 0x44, 
-	0xb4, 0xf0, 0x1c, 0x1c, 0x23, 0x00, 0x9f, 0x04, 
-	0x60, 0x3b, 0x79, 0x85, 0x23, 0xc0, 0x40, 0x1d, 
-	0x4b, 0x33, 0x2d, 0x80, 0xd1, 0x16, 0x25, 0x02, 
-	0x60, 0x9d, 0x79, 0xc5, 0x0a, 0x2b, 0xd3, 0x06, 
-	0x7a, 0x45, 0x23, 0xe0, 0x40, 0x2b, 0x2b, 0x20, 
-	0xd1, 0x01, 0x23, 0x09, 0x60, 0x3b, 0x7a, 0x03, 
-	0x33, 0x09, 0x60, 0x13, 0x79, 0x02, 0x02, 0x12, 
-	0x79, 0x45, 0x43, 0x2a, 0x32, 0x06, 0x1a, 0xd2, 
-	0x60, 0x22, 0xe0, 0x25, 0x25, 0x06, 0x26, 0x01, 
-	0x60, 0x9e, 0x79, 0x83, 0x2b, 0xff, 0xd1, 0x03, 
-	0x35, 0x01, 0x5d, 0x43, 0x2b, 0xff, 0xd0, 0xfb, 
-	0x5d, 0x46, 0x23, 0xc0, 0x40, 0x33, 0x2b, 0x40, 
-	0xd1, 0x00, 0x35, 0x02, 0x5d, 0x46, 0x09, 0x33, 
-	0x07, 0x9b, 0xd0, 0x08, 0x60, 0x3d, 0x5d, 0x46, 
-	0x09, 0x73, 0xd3, 0x02, 0x1d, 0xeb, 0x33, 0x03, 
-	0xe0, 0x02, 0x1d, 0x6b, 0xe0, 0x00, 0x1c, 0x6b, 
-	0x60, 0x13, 0x79, 0x02, 0x02, 0x12, 0x79, 0x45, 
-	0x43, 0x2a, 0x32, 0x06, 0x1a, 0xd2, 0x60, 0x22, 
-	0x68, 0x3a, 0x2a, 0x00, 0xd0, 0x20, 0x5c, 0x82, 
-	0x23, 0x0e, 0x40, 0x1a, 0x07, 0x52, 0x60, 0x0a, 
-	0x68, 0x3b, 0x18, 0xc3, 0x78, 0x5b, 0x05, 0x9b, 
-	0x43, 0x1a, 0x60, 0x0a, 0x68, 0x3b, 0x18, 0xc3, 
-	0x78, 0x9c, 0x23, 0xfe, 0x40, 0x23, 0x03, 0x9b, 
-	0x43, 0x1a, 0x60, 0x0a, 0x68, 0x3b, 0x18, 0xc3, 
-	0x78, 0xdb, 0x01, 0xdb, 0x43, 0x1a, 0x60, 0x0a, 
-	0x68, 0x3b, 0x18, 0xc0, 0x79, 0x00, 0x23, 0xfe, 
-	0x40, 0x18, 0x08, 0x40, 0x43, 0x10, 0x60, 0x08, 
-	0x20, 0x00, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x04, 0x44, 0xb5, 0xb0, 0xb0, 0x83, 
-	0x48, 0x43, 0x49, 0x44, 0x8d, 0xc9, 0x4c, 0x44, 
-	0x63, 0xe1, 0x29, 0x06, 0xda, 0x03, 0xb0, 0x03, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0x01, 
-	0x09, 0x09, 0x01, 0x09, 0x23, 0xff, 0x33, 0xe1, 
-	0x42, 0x99, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x46, 0x6a, 0xb4, 0x04, 
-	0xaa, 0x03, 0xab, 0x02, 0x49, 0x39, 0xf7, 0xff, 
-	0xff, 0x6f, 0xb0, 0x01, 0x28, 0x00, 0xd0, 0x03, 
-	0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x98, 0x02, 0x99, 0x01, 0x18, 0x40, 0x6b, 0xe1, 
-	0x42, 0x88, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x98, 0x00, 0x4f, 0x30, 
-	0x28, 0x00, 0xd0, 0x2e, 0x6e, 0x38, 0x6d, 0xb9, 
-	0x18, 0x40, 0x23, 0x01, 0x06, 0x1b, 0x66, 0x38, 
-	0x42, 0x98, 0xdb, 0x04, 0x43, 0xdb, 0x18, 0xc0, 
-	0x66, 0x38, 0x1e, 0x48, 0x65, 0xb8, 0x23, 0x0d, 
-	0x06, 0x9b, 0x6d, 0xb8, 0x6c, 0xb9, 0x1a, 0xc9, 
-	0x60, 0x08, 0x6e, 0xe0, 0x6c, 0xb9, 0x1a, 0xc9, 
-	0x60, 0x48, 0x20, 0x00, 0x65, 0xb8, 0x6c, 0xb8, 
-	0x30, 0x08, 0x23, 0x05, 0x02, 0x5b, 0x64, 0xb8, 
-	0x42, 0x98, 0xd1, 0x02, 0x20, 0x01, 0x02, 0xc0, 
-	0x64, 0xb8, 0x6c, 0xb8, 0x49, 0x1d, 0x61, 0x48, 
-	0x6d, 0x78, 0x28, 0x04, 0xd1, 0x05, 0x68, 0xe0, 
-	0x28, 0x00, 0xd1, 0x02, 0x6e, 0xe0, 0xf7, 0xff, 
-	0xfe, 0xef, 0x24, 0x33, 0x06, 0x64, 0x00, 0x63, 
-	0x6d, 0xa0, 0x18, 0xc2, 0xb4, 0x04, 0x6d, 0x60, 
-	0x18, 0xc5, 0x6e, 0x60, 0x18, 0xc1, 0x98, 0x03, 
-	0x4b, 0x0d, 0x18, 0xc0, 0x9a, 0x02, 0x1c, 0x2b, 
-	0xf0, 0x00, 0xfc, 0x52, 0xb0, 0x01, 0x6d, 0xb8, 
-	0x99, 0x01, 0x18, 0x40, 0x65, 0xb8, 0x48, 0x0e, 
-	0x68, 0x02, 0x18, 0x51, 0x60, 0x01, 0x6e, 0x60, 
-	0x6d, 0xa1, 0x42, 0x88, 0xdb, 0x04, 0x48, 0x0a, 
-	0x68, 0x01, 0x6a, 0x7a, 0x1a, 0x89, 0x60, 0x01, 
-	0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2c, 0x00, 0x12, 0x00, 0x2c, 0x00, 0x1f, 0xc0, 
-	0x2e, 0x08, 0x04, 0xc4, 0x2e, 0x08, 0x05, 0x30, 
-	0x2e, 0x08, 0x04, 0x44, 0xcc, 0x00, 0x0f, 0x00, 
-	0x66, 0x00, 0x00, 0x64, 0xb5, 0xf0, 0xb0, 0x83, 
-	0x4e, 0x65, 0x25, 0x00, 0x4f, 0x65, 0x6a, 0xf8, 
-	0xf7, 0xff, 0xf8, 0xc2, 0x48, 0x64, 0x8d, 0xc0, 
-	0x63, 0xf8, 0x28, 0x0a, 0xda, 0x03, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0x34, 
-	0x09, 0x60, 0x01, 0x40, 0x23, 0xff, 0x33, 0xc1, 
-	0x42, 0x98, 0xd0, 0x07, 0x23, 0xff, 0x33, 0xbe, 
-	0x42, 0x9c, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x46, 0x6a, 0xb4, 0x04, 
-	0xaa, 0x03, 0xab, 0x02, 0x49, 0x57, 0x1c, 0x30, 
-	0xf7, 0xff, 0xfe, 0xce, 0xb0, 0x01, 0x28, 0x00, 
-	0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x98, 0x02, 0x99, 0x01, 0x18, 0x41, 
-	0x6b, 0xfa, 0x42, 0x91, 0xd0, 0x03, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x01, 
-	0x1c, 0x22, 0x4c, 0x4d, 0x23, 0xff, 0x33, 0xbe, 
-	0x42, 0x9a, 0xd1, 0x3c, 0x5c, 0x30, 0x28, 0xa0, 
-	0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x68, 0xe0, 0x28, 0x00, 0xd1, 0x1b, 
-	0x20, 0x02, 0x63, 0x78, 0x60, 0xe1, 0x21, 0x00, 
-	0x20, 0x00, 0xf0, 0x09, 0xfd, 0x8d, 0x20, 0x00, 
-	0xf7, 0xfb, 0xfd, 0xd4, 0x98, 0x02, 0x4b, 0x3c, 
-	0x18, 0xc0, 0x79, 0x40, 0x23, 0x30, 0x40, 0x18, 
-	0x66, 0xb8, 0xd0, 0x16, 0x28, 0x10, 0xd0, 0x14, 
-	0x28, 0x20, 0xd0, 0x17, 0x28, 0x30, 0xd1, 0x03, 
-	0x21, 0x20, 0x20, 0x1e, 0xf0, 0x0a, 0xf8, 0xa7, 
-	0x98, 0x00, 0x28, 0x00, 0xd0, 0x2b, 0x6d, 0x60, 
-	0x28, 0x05, 0xd1, 0x28, 0x68, 0xf8, 0x28, 0x00, 
-	0xd1, 0x25, 0x6f, 0x38, 0xf7, 0xff, 0xfe, 0x00, 
-	0xe0, 0x21, 0x21, 0x02, 0x20, 0x1e, 0xf0, 0x0a, 
-	0xf8, 0x96, 0xe7, 0xed, 0x21, 0x08, 0x20, 0x1e, 
-	0xf0, 0x0a, 0xf8, 0x91, 0xe7, 0xe8, 0x68, 0xe0, 
-	0x28, 0x00, 0xd0, 0x08, 0x20, 0x00, 0x63, 0x79, 
-	0x21, 0x00, 0x60, 0xe0, 0xf0, 0x09, 0xfd, 0x58, 
-	0x20, 0x02, 0xf0, 0x09, 0xfd, 0xab, 0x98, 0x00, 
-	0x28, 0x00, 0xd0, 0x08, 0x6d, 0x60, 0x28, 0x05, 
-	0xd1, 0x05, 0x68, 0xf8, 0x28, 0x00, 0xd1, 0x02, 
-	0x6f, 0x38, 0xf7, 0xff, 0xfe, 0x25, 0x68, 0xe0, 
-	0x28, 0x00, 0xd0, 0x01, 0x98, 0x02, 0x1d, 0xc5, 
-	0x6b, 0xf8, 0x1b, 0x42, 0x63, 0xfa, 0x7e, 0x39, 
-	0x69, 0x78, 0x18, 0x41, 0x4b, 0x16, 0x18, 0xe8, 
-	0xf7, 0xfb, 0xfb, 0x3a, 0x7e, 0x38, 0x6b, 0xf9, 
-	0x18, 0x40, 0x07, 0x81, 0x0f, 0x89, 0x76, 0x39, 
-	0x1a, 0x44, 0x20, 0x01, 0x06, 0x00, 0x49, 0x15, 
-	0x60, 0x08, 0xf0, 0x17, 0xfe, 0x57, 0x4b, 0x14, 
-	0x40, 0x18, 0xf0, 0x17, 0xfe, 0x57, 0x22, 0x04, 
-	0x49, 0x10, 0xb4, 0x06, 0x23, 0x12, 0x21, 0x1e, 
-	0x69, 0x78, 0x1c, 0x22, 0xf0, 0x0e, 0xfb, 0x66, 
-	0xb0, 0x02, 0xf0, 0x17, 0xfe, 0x47, 0x23, 0x01, 
-	0x04, 0x9b, 0x43, 0x18, 0xf0, 0x17, 0xfe, 0x46, 
-	0x69, 0x78, 0x59, 0x01, 0x60, 0x01, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2c, 0x00, 0x12, 0x00, 0x2e, 0x08, 0x04, 0xc4, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x05, 0x34, 
-	0x2e, 0x08, 0x04, 0x44, 0x9e, 0x00, 0x08, 0x00, 
-	0xff, 0xfb, 0xff, 0xff, 0x20, 0x33, 0x06, 0x40, 
-	0x6e, 0x81, 0x6e, 0x40, 0x1a, 0x09, 0x48, 0x0f, 
-	0x63, 0xc1, 0x29, 0x00, 0xdc, 0x04, 0x1f, 0xc2, 
-	0x3a, 0x79, 0x6a, 0x52, 0x18, 0x89, 0x63, 0xc1, 
-	0x6b, 0xc1, 0x08, 0x89, 0x00, 0x89, 0x23, 0x01, 
-	0x02, 0xdb, 0x63, 0xc1, 0x42, 0x99, 0xdd, 0x0b, 
-	0x4a, 0x07, 0x42, 0x91, 0xdd, 0x00, 0x63, 0xc2, 
-	0x4a, 0x06, 0x49, 0x07, 0x85, 0x8a, 0x6b, 0xc0, 
-	0x85, 0xc8, 0x20, 0x09, 0x02, 0x40, 0x86, 0xc8, 
-	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xc4, 
-	0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x02, 0x06, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x48, 0x0f, 0x78, 0x01, 
-	0x29, 0x00, 0xd0, 0x1a, 0x49, 0x0e, 0x6c, 0x8a, 
-	0x6c, 0xc9, 0x1a, 0x51, 0x63, 0xc1, 0x1c, 0x0a, 
-	0x29, 0x00, 0xdc, 0x04, 0x1f, 0xc1, 0x39, 0x79, 
-	0x69, 0x09, 0x18, 0x51, 0x63, 0xc1, 0x23, 0x01, 
-	0x03, 0x1b, 0x6b, 0xc1, 0x42, 0x99, 0xdb, 0x08, 
-	0x22, 0xff, 0x32, 0x07, 0x49, 0x05, 0x85, 0x8a, 
-	0x6b, 0xc0, 0x85, 0xc8, 0x20, 0x09, 0x02, 0x40, 
-	0x86, 0xc8, 0x47, 0x70, 0x2e, 0x08, 0x04, 0xc4, 
-	0x66, 0x00, 0x00, 0x80, 0x2c, 0x00, 0x1f, 0xc0, 
-	0xb4, 0x80, 0x20, 0x00, 0x49, 0x1e, 0x6c, 0x8a, 
-	0x6c, 0xc9, 0x1a, 0x52, 0x49, 0x1d, 0x2a, 0x00, 
-	0xdc, 0x01, 0x69, 0x0b, 0x18, 0xd2, 0x23, 0x01, 
-	0x02, 0xdb, 0x42, 0x9a, 0xdd, 0x00, 0x08, 0xd8, 
-	0x22, 0x33, 0x06, 0x52, 0x6e, 0x93, 0x6e, 0x52, 
-	0x1a, 0x9a, 0x2a, 0x00, 0xdc, 0x01, 0x6a, 0x4b, 
-	0x18, 0xd2, 0x08, 0x92, 0x00, 0x92, 0x4b, 0x14, 
-	0x68, 0xdb, 0x2b, 0x00, 0xd0, 0x06, 0x23, 0x01, 
-	0x03, 0x1b, 0x6a, 0x4f, 0x18, 0xfb, 0x6a, 0x89, 
-	0x1a, 0x59, 0xe0, 0x01, 0x21, 0x01, 0x03, 0x09, 
-	0x42, 0x8a, 0xdd, 0x04, 0x04, 0x00, 0x0c, 0x00, 
-	0x23, 0x01, 0x02, 0x5b, 0x43, 0x18, 0x28, 0x00, 
-	0xd0, 0x0b, 0x4b, 0x0a, 0x42, 0x9a, 0xdd, 0x00, 
-	0x1c, 0x1a, 0x21, 0x06, 0x43, 0x01, 0x48, 0x08, 
-	0x85, 0x81, 0x85, 0xc2, 0x21, 0x09, 0x02, 0x49, 
-	0x86, 0xc1, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, 
-	0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x04, 0x44, 
-	0x2e, 0x08, 0x04, 0xc4, 0x00, 0x00, 0xff, 0xff, 
-	0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0x90, 0x04, 0x00, 
-	0x0c, 0x00, 0x4f, 0x13, 0x6d, 0x39, 0x29, 0x00, 
-	0xd1, 0x10, 0x24, 0x01, 0x28, 0x01, 0xd0, 0x10, 
-	0x28, 0x04, 0xd0, 0x15, 0x28, 0x05, 0xd1, 0x09, 
-	0xf7, 0xff, 0xf8, 0x48, 0xf7, 0xfe, 0xff, 0xfc, 
-	0x20, 0x00, 0x66, 0xf8, 0x67, 0x38, 0x20, 0x05, 
-	0x65, 0x78, 0x65, 0x3c, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0xf7, 0xfe, 0xff, 0xf1, 0x65, 0x3c, 
-	0x65, 0x7c, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0xf7, 0xff, 0xf8, 0x34, 0x20, 0x04, 0x65, 0x78, 
-	0x65, 0x3c, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x04, 0x44, 0xb5, 0x90, 0x04, 0x00, 
-	0x0c, 0x00, 0x4f, 0x23, 0x6d, 0x39, 0x29, 0x00, 
-	0xd0, 0x0e, 0x29, 0x02, 0xd1, 0x09, 0x6d, 0x78, 
-	0x28, 0x01, 0xd0, 0x34, 0x28, 0x04, 0xd0, 0x27, 
-	0x28, 0x05, 0xd1, 0x02, 0x20, 0xff, 0xf7, 0xff, 
-	0xf8, 0xc7, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x24, 0x02, 0x28, 0x01, 0xd0, 0x0c, 0x28, 0x04, 
-	0xd0, 0x12, 0x28, 0x05, 0xd1, 0xf5, 0x20, 0x00, 
-	0xf7, 0xff, 0xf8, 0xba, 0x20, 0x05, 0x65, 0x78, 
-	0x65, 0x3c, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0xf7, 0xff, 0xf8, 0x38, 0x20, 0x01, 0x65, 0x78, 
-	0x65, 0x3c, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0xf7, 0xff, 0xf8, 0x70, 0x20, 0x04, 0x65, 0x78, 
-	0x65, 0x3c, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x21, 0x00, 0x20, 0x0e, 0xf0, 0x0b, 0xff, 0xf0, 
-	0x21, 0x00, 0x20, 0x0d, 0xf0, 0x0b, 0xff, 0xec, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x02, 
-	0xf0, 0x09, 0xfc, 0x4c, 0x20, 0xff, 0x49, 0x03, 
-	0x70, 0x08, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x04, 0x44, 0x2e, 0x08, 0x04, 0xc4, 
-	0xb5, 0xf0, 0x4f, 0x2b, 0x24, 0x00, 0x6d, 0x38, 
-	0x28, 0x01, 0xd0, 0x1e, 0x28, 0x02, 0xd1, 0x19, 
-	0x26, 0x03, 0x6d, 0x78, 0x1d, 0xfd, 0x35, 0x79, 
-	0x28, 0x01, 0xd0, 0x34, 0x28, 0x04, 0xd0, 0x3f, 
-	0x28, 0x05, 0xd1, 0x0f, 0x20, 0x02, 0x63, 0x6c, 
-	0xf0, 0x09, 0xfc, 0x2c, 0x20, 0x00, 0xf7, 0xfb, 
-	0xfc, 0x1d, 0xf7, 0xff, 0xf8, 0x21, 0x65, 0x3e, 
-	0x20, 0x00, 0x65, 0x78, 0xf7, 0xfe, 0xfe, 0xb8, 
-	0x20, 0x01, 0x61, 0xe8, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x6d, 0x78, 0x28, 0x01, 0xd0, 0x0c, 
-	0x28, 0x04, 0xd0, 0x11, 0x28, 0x05, 0xd1, 0xf5, 
-	0xf7, 0xfe, 0xff, 0x82, 0xf7, 0xfe, 0xff, 0xd8, 
-	0x65, 0x3c, 0x65, 0x7c, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0xf7, 0xfe, 0xff, 0x79, 0x65, 0x3c, 
-	0x65, 0x7c, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0xf7, 0xfe, 0xff, 0xca, 0x65, 0x3c, 0x65, 0x7c, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x63, 0x6c, 
-	0x20, 0x02, 0x60, 0xfc, 0xf0, 0x09, 0xfb, 0xfa, 
-	0x20, 0x00, 0xf7, 0xfb, 0xfb, 0xeb, 0x65, 0x7c, 
-	0x65, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0xf7, 0xfe, 0xff, 0xea, 0x65, 0x7c, 0x65, 0x3e, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x04, 0x44, 0xb5, 0x90, 0x4c, 0x1b, 
-	0x68, 0xe0, 0x28, 0x03, 0xd0, 0x1f, 0x1f, 0xe7, 
-	0x3f, 0x79, 0x6d, 0x38, 0x28, 0x02, 0xd1, 0x1a, 
-	0x6d, 0x78, 0x28, 0x01, 0xd0, 0x1a, 0x28, 0x04, 
-	0xd0, 0x20, 0x28, 0x05, 0xd1, 0x13, 0x4a, 0x14, 
-	0x49, 0x14, 0x48, 0x15, 0xf7, 0xfe, 0xfe, 0x4a, 
-	0x21, 0x00, 0x20, 0x0e, 0xf0, 0x0b, 0xff, 0x68, 
-	0x20, 0x01, 0xf0, 0x09, 0xfb, 0xcb, 0x20, 0x03, 
-	0x60, 0xe0, 0x68, 0xf8, 0x28, 0x00, 0xd0, 0x02, 
-	0x20, 0x01, 0xf0, 0x09, 0xfb, 0xc3, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, 0xf0, 0x09, 
-	0xfb, 0xbd, 0x20, 0x00, 0x70, 0x20, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 0x20, 0x0b, 
-	0xf0, 0x0b, 0xff, 0x4e, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xc4, 
-	0x2e, 0x08, 0x05, 0x50, 0x2e, 0x08, 0x05, 0x48, 
-	0x2e, 0x08, 0x05, 0x4c, 0xb5, 0xf0, 0x4c, 0x21, 
-	0x6d, 0x20, 0x28, 0x02, 0xd1, 0x24, 0x26, 0xff, 
-	0x6d, 0x60, 0x1d, 0xe7, 0x37, 0x79, 0x28, 0x01, 
-	0xd0, 0x1d, 0x28, 0x04, 0xd0, 0x1f, 0x28, 0x05, 
-	0xd1, 0x1a, 0x20, 0x01, 0xf0, 0x09, 0xfb, 0x96, 
-	0x25, 0x00, 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x04, 
-	0x21, 0x00, 0x20, 0x00, 0xf0, 0x09, 0xfb, 0x38, 
-	0x60, 0xe5, 0x70, 0x3e, 0x68, 0xf8, 0x28, 0x03, 
-	0xd1, 0x14, 0x48, 0x13, 0x22, 0x00, 0x68, 0x41, 
-	0x20, 0x00, 0xf7, 0xfe, 0xfd, 0xe5, 0x6b, 0x38, 
-	0xf7, 0xfe, 0xfe, 0x16, 0xe0, 0x0f, 0x70, 0x3e, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 
-	0x20, 0x0d, 0xf0, 0x0b, 0xff, 0x11, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, 0x61, 0xf8, 
-	0x6b, 0x38, 0xf7, 0xfe, 0xfe, 0x05, 0x20, 0x02, 
-	0x60, 0xfd, 0xf0, 0x09, 0xfb, 0x6b, 0x21, 0x00, 
-	0x20, 0x0d, 0xf0, 0x0b, 0xff, 0x01, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x44, 
-	0x2e, 0x08, 0x05, 0x44, 0xb5, 0xb0, 0x04, 0x07, 
-	0x0c, 0x3f, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01, 
-	0x2f, 0x3f, 0xdd, 0x00, 0x27, 0x3f, 0x48, 0x17, 
-	0x6d, 0x01, 0x29, 0x02, 0xd1, 0x13, 0x6d, 0x40, 
-	0x25, 0x02, 0x4c, 0x15, 0x28, 0x04, 0xd0, 0x11, 
-	0x28, 0x05, 0xd1, 0x0c, 0x21, 0x00, 0x20, 0x0e, 
-	0xf0, 0x0b, 0xfe, 0xe2, 0x21, 0x00, 0x20, 0x0d, 
-	0xf0, 0x0b, 0xfe, 0xde, 0x20, 0x22, 0x1c, 0x39, 
-	0xf0, 0x0b, 0xfe, 0xda, 0x60, 0xe5, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 0x20, 0x0e, 
-	0xf0, 0x0b, 0xfe, 0xd2, 0x21, 0x00, 0x20, 0x0d, 
-	0xf0, 0x0b, 0xfe, 0xce, 0x20, 0x22, 0x1c, 0x39, 
-	0xf0, 0x0b, 0xfe, 0xca, 0x20, 0x00, 0xf7, 0xfe, 
-	0xfd, 0xc3, 0x60, 0xe5, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x44, 
-	0x2e, 0x08, 0x04, 0xc4, 0xb5, 0x00, 0x48, 0x0b, 
-	0x6d, 0x01, 0x29, 0x02, 0xd1, 0x10, 0x6d, 0x40, 
-	0x28, 0x04, 0xd0, 0x01, 0x28, 0x05, 0xd1, 0x0b, 
-	0x21, 0x00, 0x20, 0x16, 0xf0, 0x0b, 0xfe, 0xb0, 
-	0x20, 0x00, 0xf7, 0xfe, 0xfd, 0xa9, 0x21, 0x00, 
-	0x48, 0x03, 0x70, 0x01, 0x21, 0x01, 0x60, 0xc1, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x44, 
-	0x2e, 0x08, 0x04, 0xc4, 0xb5, 0x00, 0x48, 0x0b, 
-	0x6d, 0x01, 0x29, 0x02, 0xd1, 0x10, 0x6d, 0x40, 
-	0x28, 0x04, 0xd0, 0x01, 0x28, 0x05, 0xd1, 0x0b, 
-	0x21, 0x00, 0x20, 0x1a, 0xf0, 0x0b, 0xfe, 0x94, 
-	0x20, 0x00, 0xf7, 0xfe, 0xfd, 0x8d, 0x21, 0x00, 
-	0x48, 0x03, 0x70, 0x01, 0x21, 0x01, 0x60, 0xc1, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x44, 
-	0x2e, 0x08, 0x04, 0xc4, 0x48, 0x03, 0x6d, 0x00, 
-	0x28, 0x00, 0xd1, 0x00, 0x47, 0x70, 0x20, 0xff, 
-	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x44, 
-	0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x4d, 0x52, 
-	0x6d, 0x29, 0x48, 0x52, 0x26, 0x00, 0x29, 0x01, 
-	0xd0, 0x4c, 0x29, 0x02, 0xd1, 0x6e, 0x6d, 0x69, 
-	0x29, 0x01, 0xd0, 0x20, 0x29, 0x04, 0xd0, 0x2e, 
-	0x29, 0x05, 0xd1, 0x3e, 0x6c, 0xc1, 0x6c, 0x80, 
-	0x1a, 0x08, 0xd5, 0x01, 0x69, 0x29, 0x18, 0x40, 
-	0x21, 0x64, 0x43, 0x41, 0x69, 0x28, 0xf0, 0x13, 
-	0xfc, 0x1b, 0x70, 0x20, 0x20, 0x33, 0x06, 0x40, 
-	0x6e, 0x41, 0x6e, 0x80, 0x1a, 0x08, 0xd5, 0x01, 
-	0x6a, 0x69, 0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 
-	0x6a, 0x68, 0xf0, 0x13, 0xfc, 0x0d, 0x70, 0x38, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x6c, 0xc1, 
-	0x6c, 0x80, 0x1a, 0x08, 0xd5, 0x01, 0x69, 0x29, 
-	0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 0x69, 0x28, 
-	0xf0, 0x13, 0xfb, 0xfe, 0x70, 0x20, 0x70, 0x3e, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x33, 
-	0x06, 0x40, 0x6e, 0x41, 0x6e, 0x80, 0x1a, 0x08, 
-	0xd5, 0x01, 0x6a, 0x69, 0x18, 0x40, 0x21, 0x64, 
-	0x43, 0x41, 0x6a, 0x68, 0xf0, 0x13, 0xfb, 0xec, 
-	0x70, 0x38, 0x70, 0x26, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x70, 0x26, 0x70, 0x3e, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x6d, 0x69, 0x29, 0x01, 
-	0xd0, 0x21, 0x29, 0x04, 0xd0, 0x2f, 0x29, 0x05, 
-	0xd1, 0x3f, 0x69, 0x69, 0x6c, 0xc0, 0x1a, 0x40, 
-	0xd5, 0x01, 0x69, 0x29, 0x18, 0x40, 0x21, 0x64, 
-	0x43, 0x41, 0x69, 0x28, 0xf0, 0x13, 0xfb, 0xd0, 
-	0x70, 0x20, 0x21, 0x33, 0x06, 0x49, 0x6a, 0xe8, 
-	0x6e, 0x49, 0x1a, 0x08, 0xd5, 0x01, 0x6a, 0x69, 
-	0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 0x6a, 0x68, 
-	0xf0, 0x13, 0xfb, 0xc2, 0x70, 0x38, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xe0, 0x26, 0x69, 0x69, 
-	0x6c, 0xc0, 0x1a, 0x40, 0xd5, 0x01, 0x69, 0x29, 
-	0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 0x69, 0x28, 
-	0xf0, 0x13, 0xfb, 0xb2, 0x70, 0x20, 0x70, 0x3e, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x33, 
-	0x06, 0x49, 0x6a, 0xe8, 0x6e, 0x49, 0x1a, 0x08, 
-	0xd5, 0x01, 0x6a, 0x69, 0x18, 0x40, 0x21, 0x64, 
-	0x43, 0x41, 0x6a, 0x68, 0xf0, 0x13, 0xfb, 0xa0, 
-	0x70, 0x38, 0x70, 0x26, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x70, 0x26, 0x70, 0x3e, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x70, 0x26, 0x70, 0x3e, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x04, 0x44, 0x66, 0x00, 0x00, 0x80, 
-	0xb5, 0xf0, 0x1c, 0x17, 0x9e, 0x05, 0x1a, 0xf2, 
-	0x1c, 0x0d, 0x21, 0x00, 0x1c, 0x1c, 0x42, 0xba, 
-	0xda, 0x03, 0x1c, 0x08, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x42, 0xa0, 0xd3, 0x01, 0x42, 0xb0, 
-	0xd9, 0x03, 0x1c, 0x08, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x19, 0xc1, 0x42, 0xb1, 0xd9, 0x0c, 
-	0x1a, 0x32, 0x4e, 0x0a, 0x64, 0x32, 0x1c, 0x29, 
-	0xf7, 0xfa, 0xff, 0xc2, 0x6c, 0x30, 0x1a, 0x3a, 
-	0x18, 0x29, 0x1c, 0x20, 0xf7, 0xfa, 0xff, 0xbc, 
-	0xe0, 0x03, 0x1c, 0x29, 0x1c, 0x3a, 0xf7, 0xfa, 
-	0xff, 0xb7, 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xc4, 
-	0xb5, 0xf0, 0x1c, 0x17, 0x9e, 0x05, 0x1a, 0xf2, 
-	0x1c, 0x05, 0x20, 0x00, 0x1c, 0x1c, 0x42, 0xba, 
-	0xdb, 0x18, 0x42, 0xa1, 0xd3, 0x16, 0x42, 0xb1, 
-	0xd2, 0x14, 0x19, 0xc8, 0x42, 0xb0, 0xd9, 0x0c, 
-	0x1a, 0x72, 0x4e, 0x0a, 0x64, 0x32, 0x1c, 0x28, 
-	0xf7, 0xfa, 0xff, 0x9a, 0x6c, 0x30, 0x1a, 0x3a, 
-	0x18, 0x28, 0x1c, 0x21, 0xf7, 0xfa, 0xff, 0x94, 
-	0xe0, 0x03, 0x1c, 0x28, 0x1c, 0x3a, 0xf7, 0xfa, 
-	0xff, 0x8f, 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xc4, 
-	0x47, 0x70, 0xb5, 0x00, 0xb0, 0x82, 0x46, 0x6a, 
-	0x49, 0x06, 0xa8, 0x01, 0xf7, 0xfe, 0xfc, 0x4e, 
-	0x21, 0x00, 0x20, 0x0b, 0xf0, 0x0b, 0xfd, 0x6c, 
-	0x20, 0x03, 0x49, 0x03, 0x61, 0x08, 0xb0, 0x02, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0x58, 
-	0x2e, 0x08, 0x05, 0x44, 0xb5, 0x80, 0x4f, 0x0b, 
-	0x22, 0x00, 0x20, 0x00, 0x69, 0x79, 0xf7, 0xfe, 
-	0xfc, 0x23, 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x0b, 
-	0xfd, 0x57, 0x21, 0x01, 0x1f, 0xf8, 0x38, 0x79, 
-	0x61, 0xc1, 0x6b, 0x00, 0xf7, 0xfe, 0xfc, 0x4c, 
-	0x20, 0x00, 0x61, 0x38, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0x44, 
-	0xb5, 0x80, 0x4f, 0x06, 0x68, 0x38, 0x1d, 0xc1, 
-	0x31, 0xb5, 0x20, 0x2f, 0x02, 0x80, 0xf0, 0x13, 
-	0xfa, 0xfb, 0x60, 0x39, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x02, 0x5c, 0x9c, 
-	0x48, 0x05, 0x8f, 0xc1, 0x29, 0x00, 0xd0, 0x05, 
-	0x21, 0x00, 0x87, 0xc1, 0x48, 0x03, 0x69, 0x01, 
-	0x31, 0x01, 0x61, 0x01, 0x47, 0x70, 0x00, 0x00, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x05, 0x5c, 
-	0x20, 0x00, 0x49, 0x03, 0x60, 0x08, 0x48, 0x03, 
-	0x69, 0x41, 0x31, 0x01, 0x61, 0x41, 0x47, 0x70, 
-	0x2e, 0x08, 0x47, 0x50, 0x2e, 0x08, 0x05, 0x5c, 
-	0xb5, 0x00, 0xb0, 0x88, 0x46, 0x68, 0xf0, 0x0e, 
-	0xf8, 0xfd, 0x48, 0x07, 0x69, 0x81, 0x31, 0x01, 
-	0x23, 0x01, 0x22, 0x06, 0x61, 0x81, 0x21, 0x47, 
-	0x02, 0x49, 0x05, 0x48, 0xf0, 0x0d, 0xff, 0xea, 
-	0xb0, 0x08, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x05, 0x5c, 0xb5, 0x80, 0x1c, 0x07, 
-	0x20, 0xff, 0x30, 0xcd, 0xb0, 0x85, 0x90, 0x00, 
-	0x20, 0x01, 0x02, 0x40, 0x90, 0x02, 0x48, 0x0e, 
-	0x90, 0x04, 0x20, 0x0e, 0xab, 0x03, 0x80, 0x18, 
-	0x46, 0x68, 0xf0, 0x0e, 0xf9, 0x0f, 0x2f, 0x00, 
-	0xd0, 0x0d, 0x20, 0x33, 0x06, 0x40, 0x6d, 0x40, 
-	0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc7, 0x98, 0x02, 
-	0x1e, 0x79, 0xf0, 0x00, 0xfb, 0x21, 0x98, 0x02, 
-	0x1a, 0x38, 0x49, 0x04, 0x60, 0x88, 0xb0, 0x05, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x1c, 0x00, 0x00, 0x2e, 0x08, 0x05, 0x5c, 
-	0xb5, 0x00, 0x22, 0x01, 0x21, 0x01, 0x20, 0x00, 
-	0xf0, 0x09, 0xfd, 0x76, 0x48, 0x04, 0x68, 0x00, 
-	0x78, 0x01, 0x23, 0x06, 0x43, 0x19, 0x70, 0x01, 
-	0xf0, 0x00, 0xf9, 0xe4, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x5e, 0x58, 0xb5, 0xf0, 0x48, 0x53, 
-	0x4e, 0x53, 0x80, 0x30, 0x27, 0x00, 0x4c, 0x53, 
-	0x86, 0xe7, 0x86, 0xa7, 0x48, 0x52, 0x60, 0x07, 
-	0xf0, 0x05, 0xfc, 0x76, 0x48, 0x51, 0xf0, 0x0e, 
-	0xfd, 0x23, 0xf7, 0xfa, 0xfe, 0x71, 0x21, 0xff, 
-	0x48, 0x4f, 0x60, 0x01, 0x68, 0x01, 0x29, 0x00, 
-	0xd0, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0x01, 
-	0x4a, 0x4c, 0x60, 0xd1, 0x60, 0x07, 0xf7, 0xfc, 
-	0xfa, 0xf7, 0x20, 0x01, 0xf7, 0xff, 0xff, 0xa2, 
-	0x21, 0x00, 0x20, 0x00, 0xf0, 0x09, 0xf8, 0xb4, 
-	0xf0, 0x01, 0xfa, 0xac, 0x48, 0x46, 0x60, 0x07, 
-	0x25, 0x02, 0x48, 0x46, 0x60, 0x05, 0x20, 0x03, 
-	0x49, 0x45, 0x60, 0x08, 0x49, 0x45, 0x60, 0x08, 
-	0x49, 0x45, 0x60, 0x0d, 0x49, 0x45, 0x60, 0x08, 
-	0x48, 0x45, 0x60, 0x07, 0x48, 0x45, 0x65, 0x87, 
-	0xf0, 0x00, 0xf9, 0x84, 0xf0, 0x0e, 0xfd, 0x90, 
-	0x20, 0x00, 0xf0, 0x0c, 0xfa, 0xcd, 0x28, 0x00, 
-	0xd1, 0x60, 0x48, 0x41, 0xf0, 0x08, 0xff, 0x06, 
-	0x20, 0x00, 0xf0, 0x08, 0xff, 0x77, 0x87, 0xe7, 
-	0x87, 0xa7, 0x22, 0x01, 0xb4, 0x04, 0x22, 0x03, 
-	0x21, 0x01, 0x20, 0x00, 0x1c, 0x2b, 0xf0, 0x0b, 
-	0xff, 0x73, 0x20, 0x02, 0xb0, 0x01, 0xf7, 0xfc, 
-	0xfc, 0x53, 0xf7, 0xff, 0xff, 0x95, 0x20, 0x7d, 
-	0x00, 0xc0, 0xf7, 0xfd, 0xfd, 0xab, 0x20, 0x7d, 
-	0x00, 0xc0, 0xf7, 0xfd, 0xfd, 0xbf, 0xf0, 0x04, 
-	0xfb, 0x8d, 0xf0, 0x04, 0xfb, 0xcb, 0xf7, 0xfb, 
-	0xf8, 0xe5, 0x21, 0x18, 0x20, 0x14, 0xf7, 0xfc, 
-	0xff, 0xf5, 0xf7, 0xfd, 0xfb, 0xa3, 0xf7, 0xfb, 
-	0xfc, 0x11, 0x20, 0xff, 0xf7, 0xfa, 0xff, 0x2c, 
-	0x05, 0xa8, 0xf0, 0x17, 0xf9, 0x8a, 0x49, 0x29, 
-	0x20, 0x17, 0xf0, 0x17, 0xf9, 0x93, 0x49, 0x28, 
-	0x20, 0x08, 0xf0, 0x17, 0xf9, 0x8f, 0xf0, 0x17, 
-	0xf9, 0x85, 0x4b, 0x26, 0x40, 0x18, 0xf0, 0x17, 
-	0xf9, 0x85, 0x01, 0xe8, 0xf0, 0x17, 0xf9, 0x79, 
-	0x48, 0x23, 0x23, 0x01, 0x22, 0x08, 0x21, 0x81, 
-	0x01, 0x09, 0x60, 0x07, 0xf0, 0x0b, 0xfe, 0x84, 
-	0xf0, 0x01, 0xfa, 0xd2, 0x49, 0x1f, 0x20, 0x04, 
-	0xf0, 0x17, 0xf9, 0x78, 0xf0, 0x17, 0xf9, 0x6e, 
-	0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x17, 
-	0xf9, 0x6d, 0x20, 0x10, 0xf0, 0x17, 0xf9, 0x61, 
-	0x87, 0x67, 0x21, 0x00, 0x1c, 0x30, 0xf7, 0xfd, 
-	0xfd, 0x91, 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 
-	0x2c, 0x00, 0x00, 0xfc, 0x2c, 0x00, 0x1f, 0xc0, 
-	0x2e, 0x08, 0x04, 0x94, 0x07, 0x77, 0x77, 0x20, 
-	0x72, 0x00, 0x02, 0x00, 0x2e, 0x08, 0x05, 0x5c, 
-	0x6e, 0x00, 0x10, 0x00, 0x6e, 0x00, 0x11, 0x00, 
-	0x6e, 0x00, 0x14, 0x00, 0x6e, 0x00, 0x15, 0x00, 
-	0x6e, 0x00, 0x16, 0x00, 0x6e, 0x00, 0x17, 0x00, 
-	0x6e, 0x00, 0x18, 0x00, 0xcc, 0x00, 0x0f, 0x80, 
-	0x00, 0x80, 0x10, 0x80, 0x2e, 0x00, 0x56, 0x25, 
-	0x2e, 0x00, 0x56, 0x45, 0xff, 0xff, 0xfe, 0xff, 
-	0x2e, 0x08, 0x47, 0x50, 0x2e, 0x00, 0x56, 0x05, 
-	0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0xf0, 0x17, 
-	0xf9, 0x69, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01, 
-	0x4b, 0x0e, 0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f, 
-	0x3f, 0x01, 0x04, 0x3f, 0x4b, 0x0c, 0x18, 0xff, 
-	0x21, 0x03, 0x48, 0x0c, 0x60, 0x01, 0x60, 0x47, 
-	0x21, 0x01, 0x60, 0x01, 0x20, 0x01, 0x1c, 0x21, 
-	0xf0, 0x17, 0xf9, 0x20, 0xf0, 0x17, 0xf9, 0x16, 
-	0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x17, 
-	0xf9, 0x15, 0xf0, 0x17, 0xf9, 0x81, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xfd, 0xe8, 
-	0x00, 0x00, 0x9e, 0x34, 0x6e, 0x00, 0x03, 0x00, 
-	0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0xf0, 0x17, 
-	0xf9, 0x3d, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01, 
-	0x4b, 0x0e, 0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f, 
-	0x3f, 0x01, 0x04, 0x3f, 0x21, 0x03, 0x37, 0xff, 
-	0x37, 0x96, 0x48, 0x0b, 0x60, 0x01, 0x60, 0x47, 
-	0x21, 0x01, 0x60, 0x01, 0x20, 0x01, 0x1c, 0x21, 
-	0xf0, 0x17, 0xf8, 0xf4, 0xf0, 0x17, 0xf8, 0xea, 
-	0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x17, 
-	0xf8, 0xe9, 0xf0, 0x17, 0xf9, 0x55, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xfd, 0xe8, 
-	0x6e, 0x00, 0x03, 0x00, 0xb5, 0x00, 0xf0, 0x17, 
-	0xf9, 0x15, 0x20, 0x03, 0x49, 0x05, 0x60, 0x08, 
-	0xf0, 0x17, 0xf8, 0xd4, 0x23, 0x02, 0x43, 0x18, 
-	0xf0, 0x17, 0xf8, 0xd4, 0xf0, 0x17, 0xf9, 0x40, 
-	0xbc, 0x08, 0x47, 0x18, 0x6e, 0x00, 0x03, 0x00, 
-	0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0xf0, 0x17, 
-	0xf9, 0x01, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01, 
-	0x4b, 0x0e, 0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f, 
-	0x3f, 0x01, 0x04, 0x3f, 0x4b, 0x0c, 0x18, 0xff, 
-	0x21, 0x03, 0x48, 0x0c, 0x60, 0x01, 0x60, 0x47, 
-	0x21, 0x01, 0x60, 0x01, 0x20, 0x05, 0x1c, 0x21, 
-	0xf0, 0x17, 0xf8, 0xb8, 0xf0, 0x17, 0xf8, 0xae, 
-	0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x17, 
-	0xf8, 0xad, 0xf0, 0x17, 0xf9, 0x19, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xfd, 0xe8, 
-	0x00, 0x00, 0x9e, 0x34, 0x6e, 0x00, 0x04, 0x00, 
-	0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0xf0, 0x17, 
-	0xf8, 0xd5, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01, 
-	0x4b, 0x0e, 0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f, 
-	0x3f, 0x01, 0x04, 0x3f, 0x21, 0x03, 0x37, 0xff, 
-	0x37, 0x96, 0x48, 0x0b, 0x60, 0x01, 0x60, 0x47, 
-	0x21, 0x01, 0x60, 0x01, 0x20, 0x05, 0x1c, 0x21, 
-	0xf0, 0x17, 0xf8, 0x8c, 0xf0, 0x17, 0xf8, 0x82, 
-	0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x17, 
-	0xf8, 0x81, 0xf0, 0x17, 0xf8, 0xed, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xfd, 0xe8, 
-	0x6e, 0x00, 0x04, 0x00, 0xb5, 0x00, 0xf0, 0x17, 
-	0xf8, 0xad, 0x20, 0x03, 0x49, 0x05, 0x60, 0x08, 
-	0xf0, 0x17, 0xf8, 0x6c, 0x23, 0x20, 0x43, 0x18, 
-	0xf0, 0x17, 0xf8, 0x6c, 0xf0, 0x17, 0xf8, 0xd8, 
-	0xbc, 0x08, 0x47, 0x18, 0x6e, 0x00, 0x04, 0x00, 
-	0xb5, 0x00, 0x48, 0x0b, 0x68, 0x41, 0x31, 0x14, 
-	0x60, 0x41, 0x68, 0x81, 0x31, 0x01, 0x60, 0x81, 
-	0x48, 0x08, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 
-	0x28, 0x01, 0xd1, 0x01, 0xf7, 0xfe, 0xfa, 0x58, 
-	0xbc, 0x08, 0x47, 0x18, 0x48, 0x04, 0x21, 0x10, 
-	0xf0, 0x09, 0xfc, 0x82, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x05, 0xa8, 0x2e, 0x08, 0x04, 0xf8, 
-	0x2e, 0x08, 0x05, 0xa8, 0xb5, 0x00, 0xf0, 0x17, 
-	0xf8, 0x7d, 0x21, 0x00, 0x48, 0x08, 0x60, 0x41, 
-	0x60, 0x81, 0x49, 0x08, 0x20, 0x07, 0xf0, 0x17, 
-	0xf8, 0x41, 0xf0, 0x17, 0xf8, 0x37, 0x23, 0x80, 
-	0x43, 0xdb, 0x40, 0x18, 0xf0, 0x17, 0xf8, 0x36, 
-	0xf0, 0x17, 0xf8, 0xa2, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x05, 0xa8, 0x2e, 0x00, 0x5a, 0x45, 
-	0x48, 0x01, 0x68, 0x40, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x05, 0xa8, 0xb5, 0x90, 0x49, 0x0d, 
-	0x1c, 0x0f, 0x48, 0x0d, 0x24, 0x1e, 0x22, 0x10, 
-	0x1c, 0x23, 0xf0, 0x09, 0xfd, 0x83, 0x22, 0x02, 
-	0x21, 0x10, 0x1c, 0x38, 0x1c, 0x23, 0xf0, 0x05, 
-	0xff, 0xeb, 0x49, 0x08, 0x20, 0x10, 0xf0, 0x17, 
-	0xf8, 0x19, 0xf0, 0x17, 0xf8, 0x0f, 0x4b, 0x06, 
-	0x40, 0x18, 0xf0, 0x17, 0xf8, 0x0f, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x47, 0x60, 
-	0x2e, 0x08, 0x05, 0xa8, 0x2e, 0x00, 0x5b, 0x09, 
-	0xff, 0xfe, 0xff, 0xff, 0xb5, 0x00, 0xb0, 0x86, 
-	0x46, 0x68, 0x49, 0x0c, 0xc9, 0x0c, 0xc0, 0x0c, 
-	0xc9, 0x0c, 0xc0, 0x0c, 0xc9, 0x0c, 0xc0, 0x0c, 
-	0x48, 0x09, 0xab, 0x00, 0xcb, 0x0e, 0xb0, 0x03, 
-	0xf0, 0x09, 0xfd, 0x88, 0xb0, 0x03, 0x48, 0x07, 
-	0x68, 0x01, 0x08, 0x4a, 0xd3, 0x04, 0x08, 0x49, 
-	0x00, 0x49, 0x23, 0x04, 0x43, 0x19, 0x60, 0x01, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x47, 0x60, 
-	0x2e, 0x08, 0x05, 0xa8, 0x2e, 0x08, 0x00, 0x04, 
-	0xb5, 0x80, 0x29, 0x0c, 0xd2, 0x00, 0x21, 0x0c, 
-	0x31, 0x07, 0x08, 0xc9, 0x00, 0xc9, 0x27, 0x00, 
-	0x68, 0x02, 0x42, 0x82, 0xd0, 0x03, 0x68, 0x93, 
-	0x42, 0x8b, 0xd3, 0x0d, 0x1c, 0x17, 0x2f, 0x00, 
-	0xd0, 0x1e, 0x68, 0xb8, 0x1a, 0x42, 0x2a, 0x0c, 
-	0xd2, 0x00, 0x1c, 0x01, 0x1a, 0x42, 0xd1, 0x05, 
-	0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x76, 0xe0, 0x0c, 
-	0x68, 0x12, 0xe7, 0xea, 0x1d, 0xca, 0x32, 0x01, 
-	0x1a, 0x80, 0x60, 0xb8, 0x19, 0xc0, 0x1d, 0xc7, 
-	0x37, 0x01, 0x20, 0x00, 0x60, 0x38, 0x60, 0x78, 
-	0x60, 0xb9, 0x68, 0xb8, 0x60, 0x38, 0x1d, 0xf8, 
-	0x30, 0x01, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xb0, 0x1f, 0xcc, 0x3c, 0x01, 0x68, 0x21, 
-	0x19, 0x0a, 0x60, 0xa1, 0x68, 0x07, 0x32, 0x08, 
-	0x42, 0x87, 0xd1, 0x06, 0x68, 0x41, 0x1c, 0x20, 
-	0xf0, 0x00, 0xf8, 0x48, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x42, 0x97, 0xd1, 0x0f, 0x68, 0x7d, 
-	0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x46, 0x68, 0xa0, 
-	0x68, 0xb9, 0x18, 0x40, 0x30, 0x08, 0x60, 0xa0, 
-	0x1c, 0x20, 0x1c, 0x29, 0xf0, 0x00, 0xf8, 0x36, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xbb, 
-	0x19, 0xdb, 0x33, 0x08, 0x42, 0xa3, 0xd1, 0x13, 
-	0x68, 0xb8, 0x18, 0x40, 0x30, 0x08, 0x60, 0xb8, 
-	0x19, 0xc0, 0x68, 0x3c, 0x30, 0x08, 0x42, 0xa0, 
-	0xd1, 0xdc, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x29, 
-	0x68, 0xb8, 0x68, 0xa1, 0x18, 0x40, 0x30, 0x08, 
-	0x60, 0xb8, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x42, 0xbc, 0xd2, 0x06, 0x68, 0x79, 0x1c, 0x20, 
-	0xf0, 0x00, 0xf8, 0x14, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x68, 0x3f, 0xe7, 0xc0, 0xb5, 0x00, 
-	0x31, 0x10, 0x32, 0x01, 0x1c, 0x0b, 0x1a, 0x51, 
-	0x39, 0x08, 0x60, 0x99, 0x60, 0x00, 0x1c, 0x01, 
-	0x60, 0x40, 0x1c, 0x18, 0xf0, 0x00, 0xf8, 0x02, 
-	0xbc, 0x08, 0x47, 0x18, 0x68, 0x0a, 0x60, 0x02, 
-	0x60, 0x08, 0x68, 0x02, 0x60, 0x50, 0x60, 0x41, 
-	0x47, 0x70, 0xc8, 0x06, 0x38, 0x08, 0x60, 0x11, 
-	0xc8, 0x03, 0x60, 0x41, 0x47, 0x70, 0xb5, 0x00, 
-	0x1c, 0x0a, 0x1c, 0x01, 0x48, 0x02, 0xf7, 0xff, 
-	0xff, 0xde, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x05, 0xcc, 0xb5, 0x90, 0x1c, 0x07, 
-	0xf0, 0x16, 0xff, 0x38, 0x23, 0x11, 0x05, 0x1b, 
-	0x1c, 0x04, 0x43, 0x18, 0xf0, 0x16, 0xff, 0x36, 
-	0x1c, 0x39, 0x48, 0x05, 0xf7, 0xff, 0xff, 0x50, 
-	0x1c, 0x07, 0x1c, 0x20, 0xf0, 0x16, 0xff, 0x2e, 
-	0x1c, 0x38, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x05, 0xcc, 0xb5, 0x00, 0x1c, 0x01, 
-	0x48, 0x02, 0xf7, 0xff, 0xff, 0x41, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xcc, 
-	0xb5, 0x90, 0x1c, 0x07, 0xd0, 0x0e, 0xf0, 0x16, 
-	0xff, 0x15, 0x23, 0x11, 0x05, 0x1b, 0x1c, 0x04, 
-	0x43, 0x18, 0xf0, 0x16, 0xff, 0x13, 0x1c, 0x39, 
-	0x48, 0x04, 0xf7, 0xff, 0xff, 0x61, 0x1c, 0x20, 
-	0xf0, 0x16, 0xff, 0x0c, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xcc, 
-	0xb5, 0x00, 0x4a, 0x04, 0xc2, 0x03, 0x1c, 0x0a, 
-	0x1c, 0x01, 0x48, 0x03, 0xf7, 0xff, 0xff, 0x97, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xb4, 
-	0x2e, 0x08, 0x05, 0xc4, 0xb5, 0x00, 0x1c, 0x01, 
-	0x48, 0x02, 0xf7, 0xff, 0xff, 0x11, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xc4, 
-	0xb5, 0x00, 0x49, 0x08, 0x68, 0x0a, 0x42, 0x90, 
-	0xd3, 0x02, 0x68, 0x49, 0x42, 0x88, 0xd9, 0x03, 
-	0xf7, 0xff, 0xff, 0xc6, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x01, 0x48, 0x03, 0xf7, 0xff, 0xff, 0x30, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xb4, 
-	0x2e, 0x08, 0x05, 0xc4, 0xb5, 0x00, 0x4a, 0x05, 
-	0x60, 0x90, 0x60, 0xd1, 0x1c, 0x0a, 0x1c, 0x01, 
-	0x48, 0x03, 0xf7, 0xff, 0xff, 0x68, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xb4, 
-	0x2e, 0x08, 0x05, 0xd4, 0xb5, 0x00, 0x1c, 0x01, 
-	0x48, 0x02, 0xf7, 0xff, 0xfe, 0xe1, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xd4, 
-	0xb5, 0x00, 0x49, 0x08, 0x68, 0x8a, 0x42, 0x90, 
-	0xd3, 0x02, 0x68, 0xc9, 0x42, 0x88, 0xd9, 0x03, 
-	0xf7, 0xff, 0xff, 0x96, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x01, 0x48, 0x03, 0xf7, 0xff, 0xff, 0x00, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xb4, 
-	0x2e, 0x08, 0x05, 0xd4, 0xb5, 0xf0, 0x06, 0x07, 
-	0x0e, 0x3f, 0x04, 0x09, 0x0c, 0x09, 0xb0, 0x81, 
-	0x91, 0x00, 0x06, 0x16, 0x0e, 0x36, 0x00, 0xbd, 
-	0x4c, 0x15, 0x59, 0x60, 0x28, 0x00, 0xd1, 0x15, 
-	0xf7, 0xfb, 0xf9, 0x10, 0x22, 0x00, 0xb4, 0x04, 
-	0x23, 0x00, 0x22, 0x02, 0x99, 0x01, 0x1c, 0x38, 
-	0xf0, 0x05, 0xf9, 0xaa, 0x23, 0x01, 0x02, 0x9b, 
-	0x00, 0x5a, 0x21, 0x01, 0x1c, 0x38, 0xb0, 0x01, 
-	0xf0, 0x05, 0xfb, 0x66, 0x20, 0x03, 0x00, 0x71, 
-	0x4a, 0x0a, 0x52, 0x50, 0x59, 0x60, 0x30, 0x01, 
-	0x51, 0x60, 0x48, 0x09, 0x23, 0x14, 0x5e, 0xc1, 
-	0x29, 0x00, 0xd1, 0x02, 0x49, 0x07, 0x4a, 0x08, 
-	0x65, 0xd1, 0x8a, 0x81, 0x31, 0x01, 0x82, 0x81, 
-	0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x02, 0x5c, 0x10, 0x2e, 0x08, 0x49, 0x70, 
-	0x2e, 0x08, 0x07, 0x5c, 0x2e, 0x02, 0x5a, 0x20, 
-	0xa0, 0x00, 0x0d, 0x00, 0xb5, 0xb0, 0x06, 0x07, 
-	0x0e, 0x3f, 0x06, 0x0d, 0x0e, 0x2d, 0x00, 0xb9, 
-	0x48, 0x1b, 0x58, 0x42, 0x3a, 0x01, 0x50, 0x42, 
-	0x24, 0x00, 0x2a, 0x00, 0xd1, 0x1f, 0x23, 0x01, 
-	0x02, 0x9b, 0x00, 0x5a, 0x21, 0x02, 0x1c, 0x38, 
-	0xf0, 0x05, 0xfb, 0x32, 0x22, 0x00, 0xb4, 0x04, 
-	0x1c, 0x38, 0x1c, 0x23, 0x49, 0x13, 0xf0, 0x05, 
-	0xf9, 0x67, 0x00, 0x69, 0xb0, 0x01, 0x48, 0x12, 
-	0x52, 0x44, 0x48, 0x10, 0x4a, 0x11, 0x52, 0x50, 
-	0x00, 0x79, 0x4a, 0x11, 0x52, 0x50, 0x00, 0x6a, 
-	0x19, 0x52, 0x00, 0x92, 0x4b, 0x0f, 0x18, 0xd1, 
-	0x81, 0x0c, 0x52, 0x98, 0x80, 0x48, 0x48, 0x0e, 
-	0x8a, 0x81, 0x39, 0x01, 0x82, 0x81, 0x23, 0x14, 
-	0x5e, 0xc0, 0x28, 0x00, 0xd1, 0x03, 0x20, 0xd7, 
-	0x00, 0xc0, 0x49, 0x0a, 0x65, 0xc8, 0x1c, 0x20, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x02, 0x5c, 0x10, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x49, 0x70, 0x2e, 0x08, 0x49, 0x30, 
-	0x2e, 0x08, 0x48, 0xf8, 0x2e, 0x08, 0x47, 0x78, 
-	0x2e, 0x08, 0x07, 0x5c, 0xa0, 0x00, 0x0d, 0x00, 
-	0xb5, 0xf0, 0x04, 0x06, 0x0c, 0x36, 0x04, 0x0c, 
-	0x0c, 0x24, 0x1c, 0x17, 0xb0, 0x8a, 0x46, 0x69, 
-	0x1c, 0x30, 0x1c, 0x22, 0xf0, 0x00, 0xf8, 0xb0, 
-	0x23, 0x01, 0x1c, 0x05, 0x42, 0xd8, 0xd1, 0x03, 
-	0xb0, 0x0a, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x4b, 0x4e, 0x42, 0x9c, 0xd1, 0x06, 0xa8, 0x00, 
-	0x88, 0x00, 0x1c, 0x31, 0x1c, 0x2a, 0xf7, 0xff, 
-	0xff, 0x55, 0xe0, 0x7f, 0x20, 0x20, 0x40, 0x20, 
-	0x28, 0x20, 0xd1, 0x1f, 0x06, 0x2a, 0x0e, 0x12, 
-	0xa8, 0x00, 0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, 
-	0x1c, 0x31, 0x1c, 0x23, 0xf7, 0xfd, 0xf8, 0x5a, 
-	0x28, 0x00, 0xd0, 0x6f, 0x48, 0x42, 0x00, 0x69, 
-	0x4a, 0x42, 0x52, 0x50, 0xa9, 0x00, 0x88, 0x09, 
-	0x00, 0x49, 0x4a, 0x41, 0x52, 0x50, 0xa8, 0x00, 
-	0x88, 0x00, 0x1c, 0x29, 0xf0, 0x00, 0xf9, 0xce, 
-	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x0a, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x21, 0x00, 
-	0xaa, 0x01, 0x88, 0x3b, 0x0a, 0x1b, 0x70, 0x13, 
-	0x88, 0x3b, 0x93, 0x09, 0x32, 0x01, 0x06, 0x1b, 
-	0xd0, 0x02, 0x1c, 0x48, 0x06, 0x00, 0x0e, 0x00, 
-	0x9b, 0x09, 0x70, 0x13, 0x31, 0x01, 0x32, 0x01, 
-	0x37, 0x02, 0x29, 0x0e, 0xdb, 0xed, 0x21, 0x00, 
-	0x23, 0x00, 0x70, 0x13, 0x31, 0x01, 0x32, 0x01, 
-	0x29, 0x04, 0xdb, 0xfa, 0x21, 0x0c, 0x40, 0x21, 
-	0x29, 0x0c, 0xd1, 0x03, 0x04, 0x21, 0x0c, 0x09, 
-	0x24, 0x01, 0x43, 0x0c, 0x28, 0x06, 0xdc, 0x0e, 
-	0x06, 0x22, 0x0e, 0x12, 0xb4, 0x04, 0x06, 0x2a, 
-	0x0e, 0x12, 0xa8, 0x01, 0x88, 0x00, 0x06, 0x00, 
-	0x0e, 0x00, 0x1c, 0x31, 0xab, 0x02, 0xf7, 0xfc, 
-	0xfc, 0x37, 0xb0, 0x01, 0xe0, 0x1e, 0x28, 0x0a, 
-	0xdc, 0x0e, 0x06, 0x22, 0x0e, 0x12, 0xb4, 0x04, 
-	0x06, 0x2a, 0x0e, 0x12, 0xa8, 0x01, 0x88, 0x00, 
-	0x06, 0x00, 0x0e, 0x00, 0x1c, 0x31, 0xab, 0x02, 
-	0xf7, 0xfc, 0xfc, 0x40, 0xb0, 0x01, 0xe0, 0x0d, 
-	0x06, 0x22, 0x0e, 0x12, 0xb4, 0x04, 0x06, 0x2a, 
-	0x0e, 0x12, 0xa8, 0x01, 0x88, 0x00, 0x06, 0x00, 
-	0x0e, 0x00, 0x1c, 0x31, 0xab, 0x02, 0xf7, 0xfc, 
-	0xfc, 0x4b, 0xb0, 0x01, 0x28, 0x00, 0xd0, 0x05, 
-	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x0a, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xe7, 0xff, 0xa8, 0x00, 
-	0x88, 0x00, 0x00, 0x6a, 0x19, 0x52, 0x00, 0x92, 
-	0x49, 0x0a, 0x52, 0x88, 0x18, 0x50, 0x80, 0x46, 
-	0x80, 0x84, 0x49, 0x05, 0x80, 0xc1, 0x21, 0x01, 
-	0x81, 0x01, 0x1c, 0x28, 0xb0, 0x0a, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xb9, 0x6a, 
-	0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0x30, 
-	0x2e, 0x08, 0x48, 0xf8, 0x2e, 0x08, 0x47, 0x78, 
-	0xb4, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x17, 
-	0x0c, 0x3f, 0xb0, 0x82, 0x48, 0x58, 0x22, 0x00, 
-	0x4d, 0x58, 0x95, 0x01, 0x1c, 0x06, 0x00, 0x53, 
-	0x9d, 0x01, 0x5a, 0xed, 0x42, 0xb5, 0xd1, 0x02, 
-	0x04, 0x10, 0x0c, 0x00, 0xe0, 0x02, 0x32, 0x01, 
-	0x2a, 0x20, 0xdb, 0xf4, 0x42, 0xb0, 0xd1, 0x04, 
-	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, 0xbc, 0xf0, 
-	0x47, 0x70, 0x80, 0x0e, 0x4a, 0x4e, 0x92, 0x00, 
-	0x4d, 0x4e, 0x4a, 0x4f, 0x4b, 0x4f, 0x42, 0x9f, 
-	0xd1, 0x32, 0x23, 0x00, 0x00, 0x5f, 0x5b, 0xd7, 
-	0x42, 0xa7, 0xd1, 0x0a, 0x00, 0x5f, 0x5b, 0xef, 
-	0x2f, 0x03, 0xd1, 0x01, 0x80, 0x0b, 0xe0, 0x07, 
-	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, 0xbc, 0xf0, 
-	0x47, 0x70, 0x33, 0x01, 0x2b, 0x1c, 0xdb, 0xed, 
-	0x88, 0x0f, 0x4b, 0x3f, 0x42, 0x9f, 0xd1, 0x0a, 
-	0x27, 0x00, 0x00, 0x7b, 0x5a, 0xd6, 0x4b, 0x3c, 
-	0x42, 0x9e, 0xd1, 0x01, 0x80, 0x0f, 0xe0, 0x02, 
-	0x37, 0x01, 0x2f, 0x1c, 0xdb, 0xf5, 0x88, 0x0f, 
-	0x4b, 0x37, 0x42, 0x9f, 0xd1, 0x04, 0x20, 0x00, 
-	0x43, 0xc0, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 
-	0x23, 0x03, 0x00, 0x47, 0x9e, 0x00, 0x53, 0xf3, 
-	0x88, 0x0f, 0x00, 0x7f, 0x53, 0xeb, 0xe0, 0x54, 
-	0x23, 0x20, 0x40, 0x3b, 0x2b, 0x20, 0xd1, 0x1e, 
-	0x23, 0x00, 0x00, 0x5f, 0x5b, 0xd7, 0x42, 0xa7, 
-	0xd1, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, 
-	0xbc, 0xf0, 0x47, 0x70, 0x33, 0x01, 0x2b, 0x1c, 
-	0xdb, 0xf3, 0x27, 0x00, 0x00, 0x7b, 0x5a, 0xd5, 
-	0x42, 0xb5, 0xd1, 0x01, 0x80, 0x0f, 0xe0, 0x02, 
-	0x37, 0x01, 0x2f, 0x1c, 0xdb, 0xf6, 0x88, 0x0f, 
-	0x42, 0xb7, 0xd1, 0x36, 0x20, 0x00, 0x43, 0xc0, 
-	0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 0x23, 0x00, 
-	0x00, 0x5f, 0x5b, 0xd7, 0x42, 0xa7, 0xd1, 0x0a, 
-	0x00, 0x5f, 0x5b, 0xef, 0x2f, 0x02, 0xd1, 0x01, 
-	0x80, 0x0b, 0xe0, 0x07, 0x20, 0x00, 0x43, 0xc0, 
-	0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 0x33, 0x01, 
-	0x2b, 0x1c, 0xdb, 0xed, 0x88, 0x0f, 0x4b, 0x14, 
-	0x42, 0x9f, 0xd1, 0x0a, 0x27, 0x00, 0x00, 0x7b, 
-	0x5a, 0xd6, 0x4b, 0x11, 0x42, 0x9e, 0xd1, 0x01, 
-	0x80, 0x0f, 0xe0, 0x02, 0x37, 0x01, 0x2f, 0x1c, 
-	0xdb, 0xf5, 0x88, 0x0f, 0x4b, 0x0c, 0x42, 0x9f, 
-	0xd1, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, 
-	0xbc, 0xf0, 0x47, 0x70, 0x23, 0x02, 0x00, 0x47, 
-	0x9e, 0x00, 0x53, 0xf3, 0x88, 0x0f, 0x00, 0x7f, 
-	0x53, 0xeb, 0x00, 0x43, 0x9d, 0x01, 0x52, 0xec, 
-	0x88, 0x09, 0x00, 0x49, 0x52, 0x54, 0x04, 0x00, 
-	0x14, 0x00, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 
-	0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0x30, 
-	0x2e, 0x08, 0x49, 0x70, 0x2e, 0x08, 0x49, 0xb0, 
-	0x2e, 0x08, 0x48, 0xf8, 0x00, 0x00, 0xb9, 0x6a, 
-	0xb5, 0xf0, 0x04, 0x07, 0x0c, 0x3f, 0xb0, 0x81, 
-	0x4a, 0x34, 0x92, 0x00, 0x1c, 0x11, 0x42, 0x97, 
-	0xd0, 0x01, 0x2f, 0x20, 0xdb, 0x05, 0x20, 0x00, 
-	0x43, 0xc0, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x7c, 0x4a, 0x2e, 0x5b, 0x10, 
-	0x42, 0x88, 0xd1, 0x05, 0x20, 0x00, 0x43, 0xc0, 
-	0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x49, 0x28, 0x53, 0x11, 0x23, 0x00, 0x49, 0x29, 
-	0x00, 0x5e, 0x5b, 0x8e, 0x42, 0x86, 0xd1, 0x02, 
-	0x04, 0x1d, 0x0c, 0x2d, 0xe0, 0x02, 0x33, 0x01, 
-	0x2b, 0x1c, 0xdb, 0xf5, 0x23, 0x00, 0x00, 0x5e, 
-	0x5b, 0x96, 0x42, 0x86, 0xd1, 0x03, 0x04, 0x1a, 
-	0x0c, 0x12, 0x92, 0x00, 0xe0, 0x02, 0x33, 0x01, 
-	0x2b, 0x20, 0xdb, 0xf4, 0x9a, 0x00, 0x4e, 0x1b, 
-	0x42, 0xb2, 0xd1, 0x0d, 0x22, 0x00, 0x00, 0x53, 
-	0x5a, 0xcb, 0x42, 0x83, 0xd1, 0x05, 0x23, 0x00, 
-	0x00, 0x50, 0x4a, 0x19, 0x52, 0x13, 0x52, 0x0e, 
-	0xe0, 0x02, 0x32, 0x01, 0x2a, 0x1c, 0xdb, 0xf2, 
-	0x4e, 0x16, 0x5b, 0x30, 0x28, 0x02, 0xd1, 0x05, 
-	0x23, 0x00, 0x53, 0x33, 0x1c, 0x28, 0x1c, 0x39, 
-	0xf0, 0x00, 0xf8, 0x38, 0x5b, 0x30, 0x28, 0x01, 
-	0xd1, 0x0a, 0x1c, 0x38, 0xf7, 0xfc, 0xff, 0xce, 
-	0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, 0x43, 0xc0, 
-	0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x5b, 0x30, 0x28, 0x03, 0xd1, 0x03, 0x1c, 0x28, 
-	0x1c, 0x39, 0xf7, 0xff, 0xfd, 0xcb, 0x04, 0x38, 
-	0x14, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x49, 0x30, 0x2e, 0x08, 0x48, 0xf8, 
-	0x2e, 0x08, 0x49, 0xb0, 0x2e, 0x08, 0x49, 0x70, 
-	0x04, 0x01, 0x0c, 0x09, 0x20, 0x02, 0x00, 0x4b, 
-	0x18, 0x5b, 0x00, 0x9b, 0x4a, 0x03, 0x18, 0x99, 
-	0x81, 0x08, 0x48, 0x03, 0x52, 0xd0, 0x80, 0x48, 
-	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x47, 0x78, 
-	0x00, 0x00, 0xff, 0xff, 0xb5, 0x80, 0x04, 0x0f, 
-	0x0c, 0x3f, 0x06, 0x39, 0x0e, 0x09, 0x06, 0x00, 
-	0x0e, 0x00, 0xf7, 0xfc, 0xfc, 0x03, 0x20, 0x00, 
-	0x00, 0x7b, 0x19, 0xdb, 0x00, 0x9b, 0x4a, 0x04, 
-	0x18, 0x99, 0x81, 0x08, 0x48, 0x03, 0x52, 0xd0, 
-	0x80, 0x48, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x47, 0x78, 0x00, 0x00, 0xff, 0xff, 
-	0xb5, 0x80, 0x04, 0x09, 0x0c, 0x09, 0x78, 0x42, 
-	0x02, 0x12, 0x78, 0x83, 0x43, 0x1a, 0x05, 0x12, 
-	0x0d, 0x12, 0x27, 0x00, 0x43, 0xff, 0x32, 0x03, 
-	0x42, 0x8a, 0xd0, 0x03, 0x1c, 0x38, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0xf0, 0x05, 0xfd, 0xec, 
-	0x28, 0x00, 0xd0, 0x03, 0x1c, 0x38, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x9c, 0x09, 
-	0x04, 0x00, 0x0c, 0x00, 0xb0, 0x81, 0x90, 0x00, 
-	0x06, 0x09, 0x0e, 0x09, 0x06, 0x12, 0x0e, 0x12, 
-	0xb0, 0x88, 0x4f, 0x16, 0x68, 0xb8, 0x28, 0x0c, 
-	0xdb, 0x06, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x09, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x00, 0x23, 0x00, 0x00, 0x45, 0x46, 0x6e, 
-	0x53, 0x73, 0x30, 0x01, 0x04, 0x00, 0x14, 0x00, 
-	0x28, 0x10, 0xdb, 0xf7, 0x02, 0x08, 0x43, 0x10, 
-	0xab, 0x00, 0x80, 0x18, 0x46, 0x6a, 0x21, 0x04, 
-	0x98, 0x08, 0xf7, 0xff, 0xfd, 0x95, 0x28, 0x00, 
-	0xda, 0x01, 0xb0, 0x09, 0xe7, 0xe4, 0x00, 0x81, 
-	0x4a, 0x05, 0x50, 0x54, 0x9b, 0x0c, 0x4a, 0x05, 
-	0x50, 0x53, 0x68, 0xb9, 0x31, 0x01, 0x60, 0xb9, 
-	0xb0, 0x09, 0xe7, 0xd9, 0x2e, 0x08, 0x07, 0x74, 
-	0x2e, 0x08, 0x4a, 0x68, 0x2e, 0x08, 0x49, 0xe8, 
-	0xb5, 0x80, 0x04, 0x07, 0x14, 0x3f, 0xd5, 0x04, 
-	0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0xf4, 
-	0x20, 0x00, 0x00, 0xb9, 0x4a, 0x05, 0x50, 0x50, 
-	0x4a, 0x05, 0x50, 0x50, 0x49, 0x05, 0x68, 0x8a, 
-	0x3a, 0x01, 0x60, 0x8a, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x49, 0xe8, 
-	0x2e, 0x08, 0x4a, 0x68, 0x2e, 0x08, 0x07, 0x74, 
-	0xb5, 0x90, 0x27, 0x00, 0x4c, 0x08, 0x00, 0xb8, 
-	0x58, 0x20, 0x28, 0x00, 0xd0, 0x02, 0x1c, 0x38, 
-	0xf7, 0xff, 0xff, 0xd6, 0x37, 0x01, 0x2f, 0x20, 
-	0xdb, 0xf5, 0x20, 0x00, 0x49, 0x03, 0x60, 0xc8, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x49, 0xe8, 0x2e, 0x08, 0x07, 0x74, 
-	0xb5, 0x00, 0xf7, 0xff, 0xff, 0xe5, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0xf0, 0x04, 0x00, 0x14, 0x00, 
-	0xb0, 0x83, 0x90, 0x00, 0x1c, 0x0f, 0x04, 0x11, 
-	0x0c, 0x09, 0x24, 0x00, 0x1c, 0x38, 0x1c, 0x1d, 
-	0x1c, 0x0e, 0xb0, 0x81, 0xf7, 0xff, 0xff, 0x58, 
-	0x1c, 0x01, 0x20, 0x00, 0x29, 0x00, 0xd0, 0x03, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x78, 0xf9, 0x02, 0x09, 0x79, 0x3a, 0x43, 0x11, 
-	0x04, 0x09, 0x0c, 0x09, 0x88, 0x2a, 0x42, 0x91, 
-	0xd0, 0x03, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x7a, 0x39, 0x02, 0x09, 0x7a, 0x7a, 
-	0x43, 0x11, 0x04, 0xc9, 0x0c, 0xc9, 0x91, 0x00, 
-	0x7a, 0xb9, 0x02, 0x09, 0x7a, 0xfa, 0x43, 0x11, 
-	0x05, 0x0b, 0x0d, 0x1b, 0x1d, 0xf9, 0x31, 0x05, 
-	0x27, 0x00, 0x1d, 0xd8, 0x30, 0x09, 0x1a, 0x32, 
-	0x2b, 0x00, 0xdd, 0x0a, 0x78, 0x08, 0x28, 0x09, 
-	0xd1, 0x00, 0x37, 0x01, 0x78, 0x48, 0x1c, 0x85, 
-	0x1b, 0x5b, 0x18, 0x40, 0x1c, 0x81, 0x2b, 0x00, 
-	0xdc, 0xf4, 0x2a, 0x00, 0xdd, 0x36, 0x48, 0x26, 
-	0x88, 0x06, 0x96, 0x03, 0x88, 0x85, 0x95, 0x02, 
-	0x78, 0xc8, 0x02, 0x00, 0x79, 0x0b, 0x43, 0x18, 
-	0x05, 0x00, 0x0d, 0x00, 0x78, 0x0b, 0x2b, 0x01, 
-	0xd0, 0x01, 0x2b, 0x02, 0xd1, 0x06, 0x78, 0x4d, 
-	0x02, 0x2d, 0x78, 0x8e, 0x43, 0x35, 0x04, 0xed, 
-	0x0c, 0xed, 0x9e, 0x03, 0x2b, 0x04, 0xd0, 0x01, 
-	0x2b, 0x03, 0xd1, 0x09, 0x78, 0x4b, 0x02, 0x1b, 
-	0x78, 0x8d, 0x43, 0x2b, 0x04, 0xdb, 0x0c, 0xdb, 
-	0x9d, 0x02, 0x42, 0xab, 0xd1, 0x00, 0x24, 0x01, 
-	0x1d, 0x43, 0x1a, 0xd2, 0x31, 0x05, 0x28, 0x00, 
-	0xdd, 0x0a, 0x78, 0x0b, 0x2b, 0x09, 0xd1, 0x00, 
-	0x37, 0x01, 0x78, 0x4b, 0x1c, 0x9d, 0x1b, 0x40, 
-	0x18, 0x59, 0x31, 0x02, 0x28, 0x00, 0xdc, 0xf4, 
-	0x2a, 0x00, 0xdc, 0xcd, 0x2c, 0x00, 0xd0, 0x09, 
-	0xf7, 0xff, 0xff, 0x62, 0x99, 0x00, 0x48, 0x09, 
-	0x80, 0x01, 0x2f, 0x00, 0xd1, 0x07, 0xf7, 0xfa, 
-	0xf8, 0x45, 0xe0, 0x04, 0x98, 0x01, 0xf7, 0xff, 
-	0xff, 0x37, 0xf0, 0x00, 0xf8, 0x23, 0x20, 0x00, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x07, 0x74, 0x2e, 0x08, 0x00, 0x08, 
-	0xb4, 0x90, 0x04, 0x02, 0x0c, 0x12, 0x04, 0x0f, 
-	0x0c, 0x3f, 0x4b, 0x07, 0x68, 0xd8, 0x28, 0x80, 
-	0xda, 0x08, 0x2a, 0x00, 0xd0, 0x06, 0x00, 0x41, 
-	0x4c, 0x04, 0x52, 0x67, 0x4f, 0x04, 0x52, 0x7a, 
-	0x30, 0x01, 0x60, 0xd8, 0xbc, 0x90, 0x47, 0x70, 
-	0x2e, 0x08, 0x07, 0x74, 0x2e, 0x08, 0x4a, 0xe8, 
-	0x2e, 0x08, 0x4b, 0xe8, 0xb5, 0x90, 0x4f, 0x13, 
-	0x24, 0x00, 0x43, 0xe4, 0x68, 0xf8, 0x28, 0x00, 
-	0xd1, 0x03, 0x1c, 0x20, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x40, 0x49, 0x0e, 0x18, 0x41, 
-	0x1e, 0x8a, 0xb4, 0x04, 0x49, 0x0d, 0x18, 0x40, 
-	0x38, 0x40, 0x8f, 0xc0, 0x4b, 0x0c, 0x22, 0xff, 
-	0x21, 0x02, 0xf7, 0xff, 0xfe, 0xbb, 0xb0, 0x01, 
-	0x28, 0x00, 0xda, 0x03, 0x1c, 0x20, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x68, 0xf8, 0x38, 0x01, 
-	0x60, 0xf8, 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x07, 0x74, 
-	0x2e, 0x08, 0x4b, 0xe8, 0x2e, 0x08, 0x4a, 0xe8, 
-	0x2e, 0x00, 0x64, 0x57, 0xb5, 0xf0, 0x04, 0x05, 
-	0x14, 0x2d, 0x1c, 0x0f, 0x04, 0x11, 0x0c, 0x09, 
-	0x1c, 0x0e, 0x4c, 0x28, 0x23, 0x02, 0x69, 0x20, 
-	0x42, 0xd8, 0xd0, 0x04, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfe, 0x77, 0x28, 0x00, 0xd0, 0x06, 0x1c, 0x28, 
-	0xf7, 0xff, 0xfe, 0xce, 0x20, 0x00, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x79, 0xb8, 0x69, 0x21, 
-	0x42, 0x88, 0xd1, 0x09, 0x20, 0x01, 0x43, 0xc0, 
-	0x61, 0x20, 0x1c, 0x28, 0xf7, 0xff, 0xfe, 0xc0, 
-	0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x23, 0x01, 0x42, 0xd9, 0xd1, 0x02, 0x61, 0x20, 
-	0x20, 0x00, 0x60, 0xe0, 0x37, 0x08, 0x1f, 0xf4, 
-	0x3c, 0x05, 0x2c, 0x00, 0xdd, 0x11, 0x78, 0x38, 
-	0x02, 0x00, 0x78, 0x79, 0x43, 0x08, 0x04, 0x00, 
-	0x0c, 0x00, 0x78, 0xb9, 0x02, 0x09, 0x78, 0xfa, 
-	0x43, 0x11, 0x04, 0xc9, 0x0c, 0xc9, 0xf7, 0xff, 
-	0xff, 0x77, 0x37, 0x04, 0x3c, 0x04, 0x2c, 0x00, 
-	0xdc, 0xed, 0xf7, 0xff, 0xff, 0x8b, 0xf7, 0xff, 
-	0xff, 0x89, 0xf7, 0xff, 0xff, 0x87, 0xf7, 0xff, 
-	0xff, 0x85, 0xf7, 0xff, 0xff, 0x83, 0xf7, 0xff, 
-	0xff, 0x81, 0xf7, 0xff, 0xff, 0x7f, 0xf7, 0xff, 
-	0xff, 0x7d, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x07, 0x74, 
-	0xb5, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x0d, 
-	0x0c, 0x2d, 0x26, 0x00, 0x43, 0xf6, 0x4f, 0x0f, 
-	0x62, 0x3e, 0x61, 0xfe, 0x61, 0xbe, 0xf7, 0xff, 
-	0xfe, 0x9b, 0x2d, 0x00, 0xd0, 0x13, 0x2c, 0x00, 
-	0xd0, 0x11, 0x0c, 0xf0, 0x42, 0x85, 0xd0, 0x0e, 
-	0x42, 0x84, 0xd0, 0x0c, 0x80, 0x3c, 0x80, 0xbd, 
-	0x20, 0x00, 0x61, 0x3e, 0x22, 0x00, 0x61, 0x78, 
-	0xb4, 0x04, 0x4b, 0x05, 0x22, 0xff, 0x21, 0x00, 
-	0xf7, 0xff, 0xfe, 0x28, 0xb0, 0x01, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x07, 0x74, 
-	0x2e, 0x00, 0x66, 0x19, 0x56, 0x47, 0x41, 0x38, 
-	0x78, 0x31, 0x36, 0x00, 0xb5, 0x00, 0xb0, 0x81, 
-	0x48, 0x05, 0x69, 0xc0, 0x68, 0x80, 0x46, 0x6b, 
-	0x22, 0x00, 0x21, 0x00, 0xf0, 0x0d, 0xfe, 0x7a, 
-	0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x55, 0x10, 0xb5, 0xf0, 0x27, 0x00, 
-	0xb0, 0x85, 0x97, 0x00, 0x26, 0x10, 0x96, 0x01, 
-	0x25, 0x05, 0x01, 0xed, 0x95, 0x02, 0x20, 0xff, 
-	0x30, 0xd1, 0x90, 0x03, 0x97, 0x04, 0x22, 0x00, 
-	0x21, 0x00, 0xb4, 0x06, 0x4c, 0x0d, 0x69, 0xe0, 
-	0x68, 0x81, 0x1c, 0x08, 0xaa, 0x02, 0x1c, 0x3b, 
-	0xf0, 0x0e, 0xf8, 0xe2, 0xb0, 0x02, 0x97, 0x00, 
-	0x20, 0xff, 0x30, 0xd1, 0x90, 0x01, 0x95, 0x02, 
-	0x96, 0x03, 0x97, 0x04, 0x69, 0xe0, 0x68, 0x80, 
-	0x46, 0x69, 0xf0, 0x0e, 0xf8, 0x13, 0xf7, 0xff, 
-	0xff, 0xc9, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x10, 
-	0xb5, 0x90, 0x20, 0x07, 0xb0, 0x85, 0xf0, 0x03, 
-	0xfb, 0xfd, 0x24, 0xff, 0x34, 0xe1, 0x22, 0x05, 
-	0x01, 0xd2, 0x21, 0x00, 0x20, 0x07, 0x1c, 0x23, 
-	0xf0, 0x03, 0xfc, 0x0c, 0x27, 0x00, 0x22, 0x00, 
-	0x21, 0x02, 0x20, 0x07, 0x1c, 0x3b, 0xf0, 0x03, 
-	0xff, 0xcf, 0x22, 0x01, 0x21, 0x01, 0x20, 0x07, 
-	0x1c, 0x3b, 0xf0, 0x03, 0xff, 0x67, 0x22, 0x32, 
-	0x21, 0x32, 0x20, 0x07, 0xf0, 0x03, 0xfc, 0xc2, 
-	0x97, 0x00, 0x97, 0x01, 0x20, 0x05, 0x01, 0xc0, 
-	0x90, 0x02, 0x94, 0x03, 0x97, 0x04, 0x48, 0x06, 
-	0x69, 0xc0, 0x68, 0x80, 0x46, 0x69, 0xf0, 0x0d, 
-	0xff, 0xdd, 0xf7, 0xff, 0xff, 0x93, 0xb0, 0x05, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x55, 0x10, 0xb4, 0x80, 0x01, 0x00, 
-	0x4b, 0x2a, 0x18, 0xc0, 0x4b, 0x2a, 0x69, 0xdb, 
-	0x69, 0x9f, 0x00, 0x8b, 0x18, 0x59, 0x02, 0x09, 
-	0x18, 0x89, 0x18, 0x79, 0x78, 0x02, 0x70, 0x0a, 
-	0x78, 0x42, 0x1d, 0xcb, 0x33, 0x39, 0x74, 0x1a, 
-	0x78, 0x82, 0x1d, 0xcb, 0x33, 0x99, 0x70, 0x1a, 
-	0x78, 0xc2, 0x1d, 0xcb, 0x33, 0xd9, 0x74, 0x1a, 
-	0x79, 0x02, 0x1d, 0xcb, 0x33, 0xff, 0x33, 0x3a, 
-	0x70, 0x1a, 0x79, 0x42, 0x1d, 0xcb, 0x33, 0xff, 
-	0x33, 0x7a, 0x74, 0x1a, 0x79, 0x82, 0x1d, 0xcb, 
-	0x33, 0xff, 0x33, 0xda, 0x70, 0x1a, 0x79, 0xc2, 
-	0x23, 0x11, 0x01, 0x5b, 0x18, 0xcb, 0x74, 0x1a, 
-	0x7a, 0x02, 0x23, 0x05, 0x01, 0xdb, 0x18, 0xcb, 
-	0x70, 0x1a, 0x7a, 0x42, 0x23, 0x0b, 0x01, 0x9b, 
-	0x18, 0xcb, 0x74, 0x1a, 0x7a, 0x82, 0x23, 0x19, 
-	0x01, 0x5b, 0x18, 0xcb, 0x70, 0x1a, 0x7a, 0xc2, 
-	0x23, 0x1b, 0x01, 0x5b, 0x18, 0xcb, 0x74, 0x1a, 
-	0x7b, 0x02, 0x23, 0x0f, 0x01, 0x9b, 0x18, 0xcb, 
-	0x70, 0x1a, 0x7b, 0x42, 0x23, 0x01, 0x02, 0x9b, 
-	0x18, 0xcb, 0x74, 0x1a, 0x7b, 0x82, 0x23, 0x23, 
-	0x01, 0x5b, 0x18, 0xcb, 0x70, 0x1a, 0x7b, 0xc0, 
-	0x23, 0x25, 0x01, 0x5b, 0x18, 0xc9, 0x74, 0x08, 
-	0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x07, 0x98, 
-	0x2e, 0x08, 0x55, 0x10, 0xb5, 0xb0, 0x23, 0x00, 
-	0x1c, 0x07, 0x56, 0xc0, 0x1c, 0x14, 0x1c, 0x0d, 
-	0x28, 0x00, 0xd0, 0x0f, 0x20, 0x50, 0x1c, 0x21, 
-	0xf0, 0x12, 0xf9, 0x96, 0x19, 0x41, 0x23, 0x00, 
-	0x56, 0xf8, 0x1c, 0x22, 0xf7, 0xff, 0xff, 0x92, 
-	0x23, 0x00, 0x37, 0x01, 0x56, 0xf8, 0x34, 0x01, 
-	0x28, 0x00, 0xd1, 0xef, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x90, 0x06, 0x00, 0x0e, 0x00, 
-	0x04, 0x09, 0x14, 0x09, 0x04, 0x17, 0x14, 0x3f, 
-	0x09, 0x03, 0xb0, 0x81, 0x4a, 0x08, 0x5c, 0xd4, 
-	0xab, 0x00, 0x70, 0x1c, 0x07, 0x00, 0x0f, 0x00, 
-	0x5c, 0x10, 0x70, 0x58, 0x20, 0x00, 0x70, 0x98, 
-	0x46, 0x68, 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0xce, 
-	0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x17, 0xb0, 0xb5, 0x90, 0x04, 0x00, 
-	0x0c, 0x00, 0x04, 0x09, 0x14, 0x09, 0x04, 0x17, 
-	0x14, 0x3f, 0x0b, 0x03, 0xb0, 0x82, 0x4a, 0x0f, 
-	0x5c, 0xd4, 0xab, 0x00, 0x70, 0x1c, 0x0a, 0x03, 
-	0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xd4, 0xab, 0x00, 
-	0x70, 0x5c, 0x09, 0x03, 0x07, 0x1b, 0x0f, 0x1b, 
-	0x5c, 0xd4, 0xab, 0x00, 0x70, 0x9c, 0x07, 0x00, 
-	0x0f, 0x00, 0x5c, 0x10, 0x70, 0xd8, 0x20, 0x00, 
-	0x71, 0x18, 0x46, 0x68, 0x1c, 0x3a, 0xf7, 0xff, 
-	0xff, 0xa5, 0xb0, 0x02, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x17, 0xb0, 
-	0xb5, 0x90, 0x04, 0x0f, 0x14, 0x3f, 0x04, 0x12, 
-	0x14, 0x12, 0x0f, 0x03, 0xb0, 0x83, 0x49, 0x1b, 
-	0x5c, 0xcc, 0xab, 0x00, 0x70, 0x1c, 0x0e, 0x03, 
-	0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xcc, 0xab, 0x00, 
-	0x70, 0x5c, 0x0d, 0x03, 0x07, 0x1b, 0x0f, 0x1b, 
-	0x5c, 0xcc, 0xab, 0x00, 0x70, 0x9c, 0x0c, 0x03, 
-	0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xcc, 0xab, 0x00, 
-	0x70, 0xdc, 0x0b, 0x03, 0x07, 0x1b, 0x0f, 0x1b, 
-	0x5c, 0xcc, 0xab, 0x01, 0x70, 0x1c, 0x0a, 0x03, 
-	0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xcc, 0xab, 0x01, 
-	0x70, 0x5c, 0x09, 0x03, 0x07, 0x1b, 0x0f, 0x1b, 
-	0x5c, 0xcc, 0xab, 0x01, 0x70, 0x9c, 0x07, 0x00, 
-	0x0f, 0x00, 0x5c, 0x08, 0x70, 0xd8, 0x20, 0x00, 
-	0x71, 0x18, 0x46, 0x68, 0x1c, 0x39, 0xf7, 0xff, 
-	0xff, 0x65, 0xb0, 0x03, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x17, 0xb0, 
-	0xb5, 0xf0, 0x1c, 0x04, 0x04, 0x10, 0x14, 0x00, 
-	0xb0, 0x81, 0x90, 0x00, 0x04, 0x1e, 0x14, 0x36, 
-	0x22, 0x3c, 0x1c, 0x20, 0x1c, 0x0f, 0xb0, 0x85, 
-	0xf0, 0x12, 0xf9, 0x2a, 0xa3, 0x72, 0xcb, 0x0c, 
-	0xf0, 0x12, 0xf9, 0x36, 0xf0, 0x12, 0xf9, 0x38, 
-	0x4d, 0x71, 0x5c, 0x28, 0xab, 0x02, 0x70, 0x18, 
-	0x22, 0x38, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12, 
-	0xf9, 0x1b, 0xa3, 0x6b, 0xcb, 0x0c, 0xf0, 0x12, 
-	0xf9, 0x27, 0xf0, 0x12, 0xf9, 0x29, 0x5c, 0x28, 
-	0xab, 0x02, 0x70, 0x58, 0x22, 0x34, 0x1c, 0x20, 
-	0x1c, 0x39, 0xf0, 0x12, 0xf9, 0x0d, 0xa3, 0x64, 
-	0xcb, 0x0c, 0xf0, 0x12, 0xf9, 0x19, 0xf0, 0x12, 
-	0xf9, 0x1b, 0x5c, 0x28, 0xab, 0x02, 0x70, 0x98, 
-	0x22, 0x30, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12, 
-	0xf8, 0xff, 0xa3, 0x5d, 0xcb, 0x0c, 0xf0, 0x12, 
-	0xf9, 0x0b, 0xf0, 0x12, 0xf9, 0x0d, 0x5c, 0x28, 
-	0xab, 0x02, 0x70, 0xd8, 0x22, 0x2c, 0x1c, 0x20, 
-	0x1c, 0x39, 0xf0, 0x12, 0xf8, 0xf1, 0xa3, 0x56, 
-	0xcb, 0x0c, 0xf0, 0x12, 0xf8, 0xfd, 0xf0, 0x12, 
-	0xf8, 0xff, 0x5c, 0x28, 0xab, 0x03, 0x70, 0x18, 
-	0x22, 0x28, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12, 
-	0xf8, 0xe3, 0xa3, 0x4f, 0xcb, 0x0c, 0xf0, 0x12, 
-	0xf8, 0xef, 0xf0, 0x12, 0xf8, 0xf1, 0x5c, 0x28, 
-	0xab, 0x03, 0x70, 0x58, 0x22, 0x24, 0x1c, 0x20, 
-	0x1c, 0x39, 0xf0, 0x12, 0xf8, 0xd5, 0xa3, 0x48, 
-	0xcb, 0x0c, 0xf0, 0x12, 0xf8, 0xe1, 0xf0, 0x12, 
-	0xf8, 0xe3, 0x5c, 0x28, 0xab, 0x03, 0x70, 0x98, 
-	0x22, 0x20, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12, 
-	0xf8, 0xc7, 0xa3, 0x41, 0xcb, 0x0c, 0xf0, 0x12, 
-	0xf8, 0xd3, 0xf0, 0x12, 0xf8, 0xd5, 0x5c, 0x28, 
-	0xab, 0x03, 0x70, 0xd8, 0x22, 0x1c, 0x1c, 0x20, 
-	0x1c, 0x39, 0xf0, 0x12, 0xf8, 0xb9, 0xa3, 0x3a, 
-	0xcb, 0x0c, 0xf0, 0x12, 0xf8, 0xc5, 0xf0, 0x12, 
-	0xf8, 0xc7, 0x5c, 0x28, 0xab, 0x00, 0x70, 0x18, 
-	0x22, 0x18, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12, 
-	0xf8, 0xab, 0xa3, 0x33, 0xcb, 0x0c, 0xf0, 0x12, 
-	0xf8, 0xb7, 0xf0, 0x12, 0xf8, 0xb9, 0x5c, 0x28, 
-	0xab, 0x00, 0x70, 0x58, 0x22, 0x14, 0x1c, 0x20, 
-	0x1c, 0x39, 0xf0, 0x12, 0xf8, 0x9d, 0xa3, 0x2c, 
-	0xcb, 0x0c, 0xf0, 0x12, 0xf8, 0xa9, 0xf0, 0x12, 
-	0xf8, 0xab, 0x5c, 0x28, 0xab, 0x00, 0x70, 0x98, 
-	0x22, 0x10, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12, 
-	0xf8, 0x8f, 0xa3, 0x25, 0xcb, 0x0c, 0xf0, 0x12, 
-	0xf8, 0x9b, 0xf0, 0x12, 0xf8, 0x9d, 0x5c, 0x28, 
-	0xab, 0x00, 0x70, 0xd8, 0x22, 0x0c, 0x1c, 0x20, 
-	0x1c, 0x39, 0xf0, 0x12, 0xf8, 0x81, 0xa3, 0x1e, 
-	0xcb, 0x0c, 0xf0, 0x12, 0xf8, 0x8d, 0xf0, 0x12, 
-	0xf8, 0x8f, 0x5c, 0x28, 0xab, 0x01, 0x70, 0x18, 
-	0x22, 0x08, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12, 
-	0xf8, 0x73, 0xa3, 0x17, 0xcb, 0x0c, 0xf0, 0x12, 
-	0xf8, 0x7f, 0xf0, 0x12, 0xf8, 0x81, 0x5c, 0x28, 
-	0xab, 0x01, 0x70, 0x58, 0x22, 0x04, 0x1c, 0x20, 
-	0x1c, 0x39, 0xf0, 0x12, 0xf8, 0x65, 0xa3, 0x10, 
-	0xcb, 0x0c, 0xf0, 0x12, 0xf8, 0x71, 0xf0, 0x12, 
-	0xf8, 0x73, 0x5c, 0x28, 0xab, 0x01, 0x70, 0x98, 
-	0xa3, 0x0b, 0xcb, 0x0c, 0x1c, 0x20, 0x1c, 0x39, 
-	0xf0, 0x12, 0xf8, 0x66, 0xf0, 0x12, 0xf8, 0x68, 
-	0x5c, 0x28, 0xab, 0x01, 0x70, 0xd8, 0x20, 0x00, 
-	0x73, 0x18, 0x46, 0x68, 0x99, 0x05, 0x1c, 0x32, 
-	0x33, 0x0c, 0xf7, 0xff, 0xfe, 0x6f, 0xb0, 0x06, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 
-	0x2e, 0x08, 0x17, 0xb0, 0x21, 0x00, 0xb0, 0x81, 
-	0x91, 0x00, 0xe0, 0x02, 0x99, 0x00, 0x31, 0x01, 
-	0x91, 0x00, 0x99, 0x00, 0x42, 0x81, 0xdb, 0xf9, 
-	0xb0, 0x01, 0x47, 0x70, 0xb5, 0xf0, 0x06, 0x06, 
-	0x0e, 0x36, 0x25, 0x02, 0x48, 0x0d, 0x60, 0x05, 
-	0x27, 0x07, 0x4c, 0x0d, 0x60, 0x25, 0x20, 0x01, 
-	0x40, 0xb8, 0x40, 0x30, 0xd0, 0x01, 0x20, 0x03, 
-	0xe0, 0x00, 0x20, 0x02, 0x49, 0x09, 0x60, 0x08, 
-	0x20, 0x0a, 0xf7, 0xff, 0xff, 0xdf, 0x20, 0x03, 
-	0x60, 0x20, 0x20, 0x0c, 0xf7, 0xff, 0xff, 0xda, 
-	0x3f, 0x01, 0xd5, 0xeb, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x6e, 0x00, 0x14, 0x00, 
-	0x6e, 0x00, 0x13, 0x00, 0x6e, 0x00, 0x12, 0x00, 
-	0xb5, 0x80, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x0f, 
-	0x0e, 0x3f, 0x06, 0x00, 0x0e, 0x00, 0x23, 0x80, 
-	0x43, 0x18, 0xf7, 0xff, 0xff, 0xcf, 0x20, 0x14, 
-	0xf7, 0xff, 0xff, 0xc0, 0x1c, 0x38, 0xf7, 0xff, 
-	0xff, 0xc9, 0x20, 0x03, 0x49, 0x04, 0x60, 0x08, 
-	0x20, 0x00, 0x49, 0x04, 0x60, 0x08, 0x49, 0x04, 
-	0x60, 0x08, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x6e, 0x00, 0x14, 0x00, 0x6e, 0x00, 0x12, 0x00, 
-	0x6e, 0x00, 0x13, 0x00, 0xb5, 0x00, 0x21, 0x01, 
-	0x20, 0x02, 0xf7, 0xff, 0xff, 0xd9, 0x48, 0x10, 
-	0xf7, 0xff, 0xff, 0xa4, 0x21, 0x00, 0x20, 0x02, 
-	0xf7, 0xff, 0xff, 0xd2, 0x48, 0x0d, 0xf7, 0xff, 
-	0xff, 0x9d, 0x21, 0x44, 0x20, 0x00, 0xf7, 0xff, 
-	0xff, 0xcb, 0x21, 0x81, 0x20, 0x01, 0xf7, 0xff, 
-	0xff, 0xc7, 0x21, 0xf0, 0x20, 0x02, 0xf7, 0xff, 
-	0xff, 0xc3, 0x21, 0x45, 0x20, 0x03, 0xf7, 0xff, 
-	0xff, 0xbf, 0x21, 0x45, 0x20, 0x04, 0xf7, 0xff, 
-	0xff, 0xbb, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x00, 0x00, 0x4e, 0x20, 0x00, 0x00, 0xc3, 0x50, 
-	0xb5, 0x80, 0x06, 0x07, 0x0e, 0x3f, 0x06, 0x08, 
-	0x0e, 0x00, 0x28, 0x45, 0xdd, 0x00, 0x20, 0x45, 
-	0x1d, 0xc1, 0x31, 0x79, 0x20, 0x03, 0xf7, 0xff, 
-	0xff, 0xa7, 0x2f, 0x45, 0xdd, 0x00, 0x27, 0x45, 
-	0x20, 0x04, 0x1d, 0xf9, 0x31, 0x79, 0xf7, 0xff, 
-	0xff, 0x9f, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0x00, 0xf0, 0x15, 0xfe, 0xeb, 0x23, 0x01, 
-	0x03, 0x5b, 0x43, 0x18, 0xf0, 0x15, 0xfe, 0xea, 
-	0xf0, 0x15, 0xfe, 0xe4, 0x23, 0x01, 0x03, 0x9b, 
-	0x43, 0x18, 0xf0, 0x15, 0xfe, 0xe3, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x00, 0xf0, 0x15, 0xfe, 0xda, 
-	0x4b, 0x05, 0x40, 0x18, 0xf0, 0x15, 0xfe, 0xda, 
-	0xf0, 0x15, 0xfe, 0xd4, 0x4b, 0x03, 0x40, 0x18, 
-	0xf0, 0x15, 0xfe, 0xd4, 0xbc, 0x08, 0x47, 0x18, 
-	0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xdf, 0xff, 
-	0xb5, 0x80, 0x07, 0x01, 0x0f, 0x09, 0x29, 0x02, 
-	0xd2, 0x19, 0x00, 0x89, 0x4a, 0x0d, 0x58, 0x51, 
-	0x4f, 0x0d, 0x0c, 0x00, 0x60, 0x39, 0xd3, 0x05, 
-	0x23, 0x01, 0x02, 0x5b, 0x68, 0x08, 0x43, 0x18, 
-	0x60, 0x08, 0xe0, 0x03, 0x68, 0x08, 0x4b, 0x09, 
-	0x40, 0x18, 0x60, 0x08, 0xf7, 0xff, 0xff, 0xc4, 
-	0x68, 0x38, 0xf0, 0x0e, 0xfb, 0xb1, 0x20, 0x00, 
-	0x61, 0xb8, 0xf7, 0xff, 0xff, 0xce, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x3c, 
-	0x2e, 0x08, 0x17, 0xc0, 0xff, 0xff, 0xfd, 0xff, 
-	0xb5, 0x00, 0x4a, 0x09, 0x1f, 0x11, 0x20, 0x0e, 
-	0xf0, 0x0e, 0xfb, 0x58, 0x28, 0x00, 0xd1, 0x09, 
-	0x48, 0x06, 0xf0, 0x0e, 0xfb, 0x99, 0x49, 0x06, 
-	0x20, 0x0e, 0xf0, 0x15, 0xfe, 0x9b, 0xf7, 0xff, 
-	0xff, 0xb4, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x17, 0xd8, 0x2e, 0x08, 0x19, 0x00, 
-	0x2e, 0x00, 0x6e, 0x0b, 0xb5, 0x00, 0xf7, 0xff, 
-	0xff, 0x97, 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x15, 
-	0xfe, 0x89, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 
-	0x48, 0x04, 0x7d, 0x01, 0x29, 0x01, 0xd1, 0x02, 
-	0x69, 0x80, 0xf0, 0x00, 0xf8, 0x05, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x17, 0xc0, 
-	0xb5, 0x90, 0x1c, 0x07, 0x4c, 0x12, 0x68, 0x20, 
-	0x49, 0x12, 0x42, 0x88, 0xd1, 0x01, 0x0b, 0x38, 
-	0xd1, 0x1a, 0xf7, 0xff, 0xff, 0x79, 0x60, 0x67, 
-	0x69, 0x21, 0x1c, 0x38, 0x29, 0x00, 0xd1, 0x11, 
-	0x68, 0xe1, 0x1c, 0x4a, 0x68, 0xe1, 0x60, 0xe2, 
-	0x00, 0x89, 0x4a, 0x0b, 0x50, 0x50, 0x68, 0xe0, 
-	0x28, 0x64, 0xd1, 0x01, 0x20, 0x00, 0x60, 0xe0, 
-	0x68, 0xe0, 0x68, 0xa1, 0x42, 0x88, 0xd1, 0x01, 
-	0x20, 0x01, 0x61, 0x20, 0xf7, 0xff, 0xff, 0x71, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x17, 0xc0, 0x2e, 0x08, 0x19, 0x00, 
-	0x2e, 0x08, 0x4c, 0xe8, 0xb5, 0x90, 0x1c, 0x07, 
-	0xf7, 0xff, 0xff, 0x52, 0x48, 0x10, 0x69, 0x01, 
-	0x24, 0x00, 0x29, 0x00, 0xd1, 0x03, 0x68, 0x81, 
-	0x68, 0xc2, 0x42, 0x91, 0xd0, 0x12, 0x68, 0x81, 
-	0x1c, 0x4a, 0x68, 0x81, 0x60, 0x82, 0x00, 0x89, 
-	0x4a, 0x0a, 0x58, 0x51, 0x60, 0x39, 0x68, 0x81, 
-	0x29, 0x64, 0xd1, 0x00, 0x60, 0x84, 0x61, 0x04, 
-	0xf7, 0xff, 0xff, 0x4b, 0x20, 0x01, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xff, 0x45, 
-	0x1c, 0x20, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x17, 0xc0, 0x2e, 0x08, 0x4c, 0xe8, 
-	0xb5, 0x80, 0xb0, 0x81, 0x4f, 0x0e, 0x8e, 0xb8, 
-	0x28, 0x00, 0xd1, 0x04, 0x46, 0x68, 0xf7, 0xff, 
-	0xff, 0xcd, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x00, 
-	0x43, 0xc0, 0xb0, 0x01, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x98, 0x00, 0x49, 0x07, 0x60, 0x08, 
-	0x20, 0x08, 0x85, 0x38, 0x20, 0x04, 0x85, 0x78, 
-	0x20, 0x0f, 0x02, 0x40, 0x86, 0xb8, 0x20, 0x01, 
-	0xb0, 0x01, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x1e, 0x00, 
-	0x06, 0x00, 0x16, 0x00, 0x28, 0x30, 0xdb, 0x03, 
-	0x28, 0x39, 0xdc, 0x01, 0x20, 0x01, 0x47, 0x70, 
-	0x20, 0x00, 0x47, 0x70, 0xb5, 0xff, 0x26, 0x00, 
-	0x1c, 0x07, 0x20, 0x00, 0x1c, 0x14, 0x22, 0x30, 
-	0x9d, 0x09, 0x54, 0x3a, 0x30, 0x01, 0x28, 0x1f, 
-	0xdb, 0xfb, 0x20, 0x00, 0x77, 0xf8, 0x29, 0x00, 
-	0xda, 0x02, 0x2d, 0x00, 0xd1, 0x00, 0x42, 0x49, 
-	0x25, 0x1e, 0x29, 0x00, 0xd0, 0x14, 0x1c, 0x20, 
-	0xf0, 0x11, 0xfe, 0x78, 0x31, 0x30, 0x55, 0x79, 
-	0x57, 0x79, 0x29, 0x39, 0xdd, 0x07, 0x31, 0x07, 
-	0x55, 0x79, 0x9b, 0x03, 0x2b, 0x00, 0xd0, 0x02, 
-	0x5d, 0x79, 0x31, 0x20, 0x55, 0x79, 0x1c, 0x01, 
-	0x3d, 0x01, 0x36, 0x01, 0x28, 0x00, 0xd1, 0xea, 
-	0x2e, 0x00, 0xd1, 0x00, 0x26, 0x01, 0x1c, 0x30, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xff, 0x9e, 0x09, 0x20, 0x01, 0x1c, 0x0f, 
-	0x21, 0x00, 0xb0, 0x94, 0x91, 0x12, 0x91, 0x11, 
-	0x91, 0x10, 0x91, 0x0f, 0x91, 0x0e, 0x25, 0x00, 
-	0x42, 0x41, 0x91, 0x0d, 0x21, 0x00, 0x91, 0x0c, 
-	0x1c, 0x14, 0x92, 0x00, 0x23, 0x00, 0x56, 0xe1, 
-	0x29, 0x2b, 0xd0, 0x10, 0xdc, 0x07, 0x29, 0x20, 
-	0xd0, 0x15, 0x29, 0x23, 0xd1, 0x17, 0x21, 0x01, 
-	0x91, 0x0f, 0x18, 0x64, 0xe0, 0x14, 0x29, 0x2d, 
-	0xd0, 0x09, 0x29, 0x30, 0xd1, 0x0f, 0x21, 0x01, 
-	0x91, 0x0e, 0x18, 0x64, 0xe0, 0x0c, 0x21, 0x01, 
-	0x91, 0x12, 0x18, 0x64, 0xe0, 0x08, 0x21, 0x01, 
-	0x91, 0x11, 0x18, 0x64, 0xe0, 0x04, 0x21, 0x01, 
-	0x91, 0x10, 0x18, 0x64, 0xe0, 0x00, 0x20, 0x00, 
-	0x28, 0x00, 0xd1, 0xdb, 0x23, 0x00, 0x56, 0xe0, 
-	0xf7, 0xff, 0xff, 0x8a, 0x28, 0x00, 0xd0, 0x15, 
-	0x25, 0x00, 0x23, 0x00, 0x56, 0xe0, 0xf7, 0xff, 
-	0xff, 0x83, 0x28, 0x00, 0xd0, 0x19, 0x00, 0xa8, 
-	0x19, 0x40, 0x00, 0x40, 0x23, 0x00, 0x56, 0xe1, 
-	0x18, 0x08, 0x34, 0x01, 0x1f, 0xc5, 0x3d, 0x29, 
-	0x56, 0xe0, 0xf7, 0xff, 0xff, 0x75, 0x28, 0x00, 
-	0xd1, 0xf1, 0xe0, 0x0a, 0x23, 0x00, 0x56, 0xe0, 
-	0x28, 0x2a, 0xd1, 0x06, 0x9b, 0x17, 0xcb, 0x20, 
-	0x93, 0x17, 0x68, 0x30, 0x30, 0x01, 0x60, 0x30, 
-	0x34, 0x01, 0x23, 0x00, 0x56, 0xe0, 0x28, 0x2e, 
-	0xd1, 0x16, 0x20, 0x00, 0x90, 0x0d, 0x34, 0x01, 
-	0x56, 0xe0, 0xf7, 0xff, 0xff, 0x5d, 0x28, 0x00, 
-	0xd0, 0x0e, 0x98, 0x0d, 0x00, 0x83, 0x18, 0x18, 
-	0x00, 0x40, 0x23, 0x00, 0x56, 0xe1, 0x18, 0x08, 
-	0x38, 0x30, 0x90, 0x0d, 0x34, 0x01, 0x56, 0xe0, 
-	0xf7, 0xff, 0xff, 0x4e, 0x28, 0x00, 0xd1, 0xf0, 
-	0x23, 0x00, 0x56, 0xe0, 0x28, 0x68, 0xd0, 0x01, 
-	0x28, 0x6c, 0xd1, 0x02, 0x90, 0x0c, 0x34, 0x01, 
-	0xe0, 0x04, 0x28, 0x46, 0xd0, 0x01, 0x28, 0x4e, 
-	0xd1, 0x00, 0x34, 0x01, 0x23, 0x00, 0x56, 0xe0, 
-	0x21, 0x25, 0x34, 0x01, 0x28, 0x67, 0xd0, 0x12, 
-	0xdc, 0x1d, 0x28, 0x63, 0xd0, 0x54, 0xdc, 0x08, 
-	0x28, 0x25, 0xd0, 0x73, 0x28, 0x45, 0xd0, 0x0a, 
-	0x28, 0x47, 0xd0, 0x08, 0x28, 0x58, 0xd1, 0x6e, 
-	0xe0, 0x53, 0x28, 0x64, 0xd0, 0x6c, 0x28, 0x65, 
-	0xd0, 0x01, 0x28, 0x66, 0xd1, 0x67, 0x98, 0x0c, 
-	0x28, 0x6c, 0xd1, 0x66, 0x68, 0x30, 0x30, 0x03, 
-	0x60, 0x30, 0x22, 0x08, 0x99, 0x17, 0xa8, 0x09, 
-	0xf0, 0x11, 0xfd, 0xe0, 0xe0, 0xe5, 0x28, 0x70, 
-	0xd0, 0x3d, 0xdc, 0x36, 0x28, 0x69, 0xd0, 0x57, 
-	0x28, 0x6e, 0xd0, 0x57, 0x28, 0x6f, 0xd1, 0x52, 
-	0x68, 0x30, 0x30, 0x01, 0x60, 0x30, 0x9b, 0x17, 
-	0x68, 0x19, 0x91, 0x13, 0x98, 0x0c, 0x28, 0x68, 
-	0xd1, 0x09, 0x99, 0x13, 0x04, 0x09, 0x0c, 0x09, 
-	0x91, 0x13, 0x0c, 0x08, 0xd3, 0x03, 0x99, 0x13, 
-	0x4b, 0xeb, 0x43, 0x19, 0x91, 0x13, 0x22, 0x01, 
-	0xb4, 0x04, 0x23, 0x00, 0x22, 0x08, 0x99, 0x14, 
-	0xa8, 0x02, 0xf7, 0xff, 0xfe, 0xff, 0xb0, 0x01, 
-	0x99, 0x0f, 0x1c, 0x06, 0x29, 0x00, 0xd0, 0x03, 
-	0x99, 0x13, 0x29, 0x00, 0xd0, 0x00, 0x3e, 0x01, 
-	0x99, 0x12, 0x29, 0x00, 0xd0, 0x55, 0x20, 0x2b, 
-	0x68, 0x39, 0x70, 0x08, 0x31, 0x01, 0x60, 0x39, 
-	0x2d, 0x00, 0xd0, 0x73, 0x3d, 0x01, 0xe0, 0xe7, 
-	0xe0, 0x3f, 0x28, 0x73, 0xd0, 0x6f, 0x28, 0x75, 
-	0xd0, 0x6e, 0x28, 0x78, 0xd1, 0x1b, 0x23, 0x01, 
-	0x93, 0x0b, 0x68, 0x30, 0x30, 0x01, 0x60, 0x30, 
-	0x23, 0x1f, 0x1f, 0xe0, 0x38, 0x19, 0x56, 0xc0, 
-	0x28, 0x58, 0xd1, 0x01, 0x23, 0x00, 0x93, 0x0b, 
-	0x9b, 0x17, 0x68, 0x19, 0x98, 0x0c, 0x28, 0x68, 
-	0xd1, 0x05, 0x04, 0x09, 0x0c, 0x09, 0x0c, 0x08, 
-	0xd3, 0x01, 0x4b, 0xcd, 0x43, 0x19, 0x22, 0x01, 
-	0xb4, 0x04, 0xe0, 0x04, 0xe0, 0x16, 0xe1, 0x88, 
-	0xe0, 0x28, 0xe0, 0x7e, 0xe0, 0x91, 0x22, 0x10, 
-	0x9b, 0x0c, 0xa8, 0x02, 0xf7, 0xff, 0xfe, 0xbe, 
-	0xb0, 0x01, 0x99, 0x12, 0x1c, 0x06, 0x29, 0x00, 
-	0xd0, 0x52, 0x20, 0x2b, 0x68, 0x39, 0x70, 0x08, 
-	0x31, 0x01, 0x60, 0x39, 0x2d, 0x00, 0xd0, 0x57, 
-	0x3d, 0x01, 0xe1, 0x0a, 0x68, 0x38, 0x70, 0x01, 
-	0x30, 0x01, 0x23, 0x00, 0x60, 0x38, 0x70, 0x03, 
-	0xe1, 0x70, 0x68, 0x30, 0x30, 0x01, 0x60, 0x30, 
-	0x98, 0x17, 0x68, 0x01, 0x68, 0x38, 0x70, 0x01, 
-	0x30, 0x01, 0x23, 0x00, 0x60, 0x38, 0x70, 0x03, 
-	0xe1, 0x64, 0xe0, 0x74, 0x68, 0x30, 0x30, 0x01, 
-	0x60, 0x30, 0x98, 0x17, 0x68, 0x01, 0x91, 0x13, 
-	0x98, 0x0c, 0x28, 0x68, 0xd1, 0x09, 0x99, 0x13, 
-	0x04, 0x09, 0x0c, 0x09, 0x91, 0x13, 0x0c, 0x08, 
-	0xd3, 0x03, 0x99, 0x13, 0x4b, 0xac, 0x43, 0x19, 
-	0x91, 0x13, 0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, 
-	0x22, 0x0a, 0x99, 0x14, 0xa8, 0x02, 0xf7, 0xff, 
-	0xfe, 0x81, 0xb0, 0x01, 0x1c, 0x06, 0x20, 0x2d, 
-	0x99, 0x12, 0x29, 0x00, 0xd0, 0x15, 0x99, 0x13, 
-	0x29, 0x00, 0xe0, 0x02, 0xe0, 0x87, 0xe0, 0x5a, 
-	0xe0, 0x97, 0xda, 0x04, 0x68, 0x39, 0x70, 0x08, 
-	0x31, 0x01, 0x60, 0x39, 0xe0, 0x04, 0x20, 0x2b, 
-	0x68, 0x39, 0x70, 0x08, 0x31, 0x01, 0x60, 0x39, 
-	0x2d, 0x00, 0xd0, 0x65, 0x3d, 0x01, 0xe0, 0x76, 
-	0xe0, 0xb4, 0x99, 0x10, 0x29, 0x00, 0xd0, 0x11, 
-	0x99, 0x13, 0x29, 0x00, 0xda, 0x05, 0x68, 0x39, 
-	0x70, 0x08, 0x31, 0x01, 0x60, 0x39, 0xe0, 0x05, 
-	0xe0, 0xb3, 0x21, 0x20, 0x68, 0x38, 0x70, 0x01, 
-	0x30, 0x01, 0x60, 0x38, 0x2d, 0x00, 0xd0, 0x4f, 
-	0x3d, 0x01, 0xe0, 0x60, 0x99, 0x13, 0x29, 0x00, 
-	0xda, 0x5d, 0x68, 0x39, 0x70, 0x08, 0x31, 0x01, 
-	0x60, 0x39, 0x2d, 0x00, 0xd0, 0x44, 0x3d, 0x01, 
-	0xe0, 0xab, 0x68, 0x30, 0x30, 0x02, 0x60, 0x30, 
-	0x22, 0x08, 0x99, 0x17, 0xa8, 0x09, 0xf0, 0x11, 
-	0xfc, 0xf9, 0x68, 0x38, 0xa1, 0x85, 0x22, 0x10, 
-	0xf0, 0x11, 0xfc, 0xf4, 0x68, 0x38, 0xf0, 0x11, 
-	0xfd, 0x35, 0x68, 0x39, 0x18, 0x40, 0x60, 0x38, 
-	0xe0, 0xf8, 0x68, 0x30, 0x30, 0x01, 0x60, 0x30, 
-	0x98, 0x17, 0x68, 0x00, 0x68, 0x39, 0x9a, 0x14, 
-	0x1a, 0x89, 0x60, 0x01, 0xe0, 0xee, 0x99, 0x10, 
-	0x29, 0x00, 0xd0, 0x21, 0x21, 0x20, 0x68, 0x38, 
-	0x70, 0x01, 0x30, 0x01, 0x60, 0x38, 0x2d, 0x00, 
-	0xd0, 0x1a, 0x3d, 0x01, 0xe0, 0x81, 0x68, 0x30, 
-	0x30, 0x01, 0x60, 0x30, 0x98, 0x17, 0xf0, 0x11, 
-	0xfd, 0x15, 0x1c, 0x06, 0x98, 0x0d, 0x28, 0x00, 
-	0xdd, 0x03, 0x98, 0x0d, 0x42, 0xb0, 0xda, 0x00, 
-	0x9e, 0x0d, 0x2d, 0x00, 0xd0, 0x09, 0x21, 0x20, 
-	0x68, 0x38, 0x1c, 0x2a, 0xf0, 0x11, 0xfd, 0x28, 
-	0x23, 0x00, 0x68, 0x38, 0x55, 0x43, 0xe0, 0x03, 
-	0xe0, 0x67, 0x23, 0x00, 0x68, 0x38, 0x55, 0x83, 
-	0x2d, 0x00, 0xd0, 0x0d, 0x42, 0xae, 0xda, 0x0b, 
-	0x99, 0x11, 0x29, 0x00, 0xd1, 0x08, 0x68, 0x38, 
-	0x19, 0x40, 0x1b, 0x80, 0x99, 0x17, 0x1c, 0x32, 
-	0xf0, 0x11, 0xfd, 0x2c, 0xe0, 0x0a, 0xe0, 0x54, 
-	0x2d, 0x00, 0xd0, 0x02, 0x42, 0xae, 0xdb, 0x00, 
-	0x36, 0x01, 0x99, 0x17, 0x68, 0x38, 0x1c, 0x32, 
-	0xf0, 0x11, 0xfd, 0x20, 0x68, 0x38, 0xf0, 0x11, 
-	0xfc, 0xe1, 0x68, 0x39, 0x18, 0x40, 0x60, 0x38, 
-	0xe0, 0xa4, 0x68, 0x30, 0x30, 0x01, 0x60, 0x30, 
-	0x98, 0x17, 0x99, 0x0c, 0x29, 0x68, 0xd1, 0x02, 
-	0x23, 0x01, 0x03, 0xdb, 0x40, 0x18, 0x22, 0x01, 
-	0xb4, 0x04, 0x98, 0x18, 0x68, 0x01, 0x23, 0x00, 
-	0x22, 0x0a, 0xa8, 0x02, 0xf7, 0xff, 0xfd, 0xca, 
-	0xb0, 0x01, 0x99, 0x12, 0x1c, 0x06, 0x29, 0x00, 
-	0xd0, 0x08, 0x20, 0x2b, 0x68, 0x39, 0x70, 0x08, 
-	0x31, 0x01, 0x60, 0x39, 0x2d, 0x00, 0xd0, 0x24, 
-	0x3d, 0x01, 0xe0, 0x22, 0x99, 0x10, 0x29, 0x00, 
-	0xd0, 0x1f, 0x21, 0x20, 0x68, 0x38, 0x70, 0x01, 
-	0x30, 0x01, 0x60, 0x38, 0x2d, 0x00, 0xd0, 0x18, 
-	0x3d, 0x01, 0xe0, 0x16, 0x99, 0x10, 0x29, 0x00, 
-	0xd0, 0x07, 0x21, 0x20, 0x68, 0x38, 0x70, 0x01, 
-	0x30, 0x01, 0x60, 0x38, 0x2d, 0x00, 0xd0, 0x00, 
-	0x3d, 0x01, 0x99, 0x0f, 0x29, 0x00, 0xd0, 0x08, 
-	0x21, 0x30, 0x68, 0x38, 0x70, 0x01, 0x30, 0x01, 
-	0x21, 0x78, 0x60, 0x38, 0x70, 0x01, 0x30, 0x01, 
-	0x60, 0x38, 0x2d, 0x00, 0xd0, 0x48, 0x42, 0xb5, 
-	0xdd, 0x46, 0x99, 0x11, 0x29, 0x00, 0xd0, 0x02, 
-	0x99, 0x0e, 0x29, 0x00, 0xd0, 0x2a, 0x99, 0x0e, 
-	0x29, 0x00, 0xd0, 0x0c, 0x20, 0x00, 0x1b, 0xa9, 
-	0x29, 0x00, 0xdd, 0x14, 0x22, 0x30, 0x68, 0x3b, 
-	0x70, 0x1a, 0x33, 0x01, 0x60, 0x3b, 0x30, 0x01, 
-	0x42, 0x81, 0xdc, 0xf8, 0xe0, 0x0b, 0x20, 0x00, 
-	0x1b, 0xa9, 0x29, 0x00, 0xdd, 0x07, 0x23, 0x20, 
-	0x68, 0x3a, 0x70, 0x13, 0x32, 0x01, 0x60, 0x3a, 
-	0x30, 0x01, 0x42, 0x81, 0xdc, 0xf8, 0x21, 0x20, 
-	0x1b, 0x89, 0xa8, 0x01, 0x18, 0x08, 0x1e, 0x41, 
-	0x68, 0x38, 0xf0, 0x11, 0xfc, 0xd3, 0x68, 0x38, 
-	0xf0, 0x11, 0xfc, 0x68, 0x68, 0x39, 0x18, 0x40, 
-	0x60, 0x38, 0xe0, 0x2b, 0x68, 0x38, 0xf0, 0x11, 
-	0xfc, 0x61, 0x68, 0x39, 0x18, 0x40, 0x60, 0x38, 
-	0x20, 0x00, 0x1b, 0xa9, 0x29, 0x00, 0xdd, 0x07, 
-	0x23, 0x20, 0x68, 0x3a, 0x70, 0x13, 0x32, 0x01, 
-	0x60, 0x3a, 0x30, 0x01, 0x42, 0x81, 0xdc, 0xf8, 
-	0x23, 0x00, 0x68, 0x38, 0x70, 0x03, 0xe0, 0x15, 
-	0x21, 0x20, 0x1b, 0x89, 0xa8, 0x01, 0x18, 0x08, 
-	0x1e, 0x41, 0x68, 0x38, 0xf0, 0x11, 0xfc, 0xae, 
-	0x68, 0x38, 0xf0, 0x11, 0xfc, 0x43, 0x68, 0x39, 
-	0x18, 0x40, 0x23, 0x00, 0x60, 0x38, 0x70, 0x03, 
-	0xe0, 0x04, 0x68, 0x38, 0x70, 0x01, 0x30, 0x01, 
-	0x60, 0x38, 0x9c, 0x00, 0x1c, 0x20, 0xb0, 0x14, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0xff, 0xff, 0x00, 0x00, 0x28, 0x46, 0x50, 0x20, 
-	0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 
-	0x65, 0x64, 0x29, 0x00, 0xb5, 0x87, 0x23, 0x00, 
-	0x98, 0x01, 0x9f, 0x00, 0x56, 0xc0, 0x28, 0x00, 
-	0xd0, 0x2f, 0xe0, 0x05, 0x30, 0x01, 0x90, 0x01, 
-	0x98, 0x00, 0x70, 0x01, 0x30, 0x01, 0x90, 0x00, 
-	0x23, 0x00, 0x98, 0x01, 0x56, 0xc1, 0x29, 0x25, 
-	0xd0, 0x01, 0x29, 0x00, 0xd1, 0xf2, 0x23, 0x00, 
-	0x99, 0x01, 0x56, 0xc9, 0x29, 0x00, 0xd0, 0x17, 
-	0x23, 0x01, 0x56, 0xc0, 0x28, 0x00, 0xd0, 0x13, 
-	0x20, 0x00, 0xb0, 0x81, 0x90, 0x00, 0x46, 0x6a, 
-	0xb4, 0x04, 0x98, 0x03, 0x1c, 0x42, 0x9b, 0x04, 
-	0x1c, 0x38, 0xa9, 0x02, 0xf7, 0xff, 0xfd, 0x30, 
-	0xb0, 0x01, 0x90, 0x02, 0x98, 0x00, 0x00, 0x80, 
-	0x99, 0x03, 0x18, 0x40, 0x90, 0x03, 0xb0, 0x01, 
-	0x23, 0x00, 0x98, 0x01, 0x56, 0xc0, 0x28, 0x00, 
-	0xd1, 0xd6, 0x20, 0x00, 0x99, 0x00, 0x70, 0x08, 
-	0x31, 0x01, 0x91, 0x00, 0x1c, 0x38, 0xf0, 0x11, 
-	0xfb, 0xe9, 0xb0, 0x03, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0xb4, 0x0f, 0xb5, 0x00, 0x98, 0x01, 
-	0x99, 0x02, 0xaa, 0x03, 0xf7, 0xff, 0xff, 0xb6, 
-	0xbc, 0x08, 0xb0, 0x04, 0x47, 0x18, 0xb4, 0x0f, 
-	0xb5, 0x00, 0xb0, 0xb8, 0x46, 0x68, 0x99, 0x39, 
-	0xaa, 0x3a, 0xf7, 0xff, 0xff, 0xab, 0x46, 0x68, 
-	0xf0, 0x11, 0xfb, 0xd0, 0x1c, 0x01, 0x46, 0x68, 
-	0xf7, 0xf9, 0xfb, 0x7e, 0xb0, 0x38, 0xbc, 0x08, 
-	0xb0, 0x04, 0x47, 0x18, 0x21, 0x00, 0xb0, 0x81, 
-	0x91, 0x00, 0xe0, 0x02, 0x99, 0x00, 0x31, 0x01, 
-	0x91, 0x00, 0x99, 0x00, 0x42, 0x81, 0xd3, 0xf9, 
-	0xb0, 0x01, 0x47, 0x70, 0xb5, 0xf0, 0x06, 0x0d, 
-	0x0e, 0x2d, 0xb0, 0x83, 0x49, 0x23, 0x68, 0x09, 
-	0x91, 0x01, 0x26, 0x09, 0x1d, 0xc4, 0x34, 0x19, 
-	0xab, 0x02, 0x70, 0x1d, 0x20, 0xff, 0x3b, 0x04, 
-	0x70, 0x18, 0x22, 0x01, 0xb4, 0x04, 0x7b, 0x20, 
-	0xa9, 0x03, 0xab, 0x02, 0xf7, 0xfa, 0xf8, 0x0c, 
-	0xb0, 0x01, 0xaf, 0x01, 0x78, 0x3f, 0xab, 0x02, 
-	0x70, 0x1d, 0x20, 0xff, 0x3b, 0x04, 0x70, 0x18, 
-	0x22, 0x01, 0xb4, 0x04, 0x7b, 0x20, 0xa9, 0x03, 
-	0xab, 0x02, 0xf7, 0xf9, 0xff, 0xfd, 0xb0, 0x01, 
-	0xa9, 0x01, 0x78, 0x09, 0x91, 0x00, 0xab, 0x02, 
-	0x70, 0x1d, 0x20, 0xff, 0x3b, 0x04, 0x70, 0x18, 
-	0x22, 0x01, 0xb4, 0x04, 0x7b, 0x20, 0xa9, 0x03, 
-	0xab, 0x02, 0xf7, 0xf9, 0xff, 0xed, 0xb0, 0x01, 
-	0xa8, 0x01, 0x78, 0x00, 0x99, 0x00, 0x42, 0x8f, 
-	0xd1, 0x06, 0x42, 0x87, 0xd1, 0x04, 0x1c, 0x38, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x1e, 0x70, 0x06, 0x06, 0x0e, 0x36, 0xd1, 0xc3, 
-	0x20, 0xff, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x02, 0x5e, 0x28, 
-	0xb5, 0xf0, 0x06, 0x0c, 0x0e, 0x24, 0x06, 0x16, 
-	0x0e, 0x36, 0x25, 0x0a, 0xb0, 0x82, 0xab, 0x00, 
-	0x70, 0x1c, 0x70, 0x5e, 0x1c, 0x07, 0x30, 0x20, 
-	0x90, 0x01, 0x98, 0x01, 0x7b, 0x00, 0x46, 0x69, 
-	0x22, 0x02, 0xf7, 0xf9, 0xff, 0x66, 0x1c, 0x38, 
-	0x1c, 0x21, 0xf7, 0xff, 0xff, 0x9b, 0x1c, 0x01, 
-	0x2c, 0x00, 0xd0, 0x05, 0x2c, 0x09, 0xd0, 0x03, 
-	0x2c, 0x1f, 0xd1, 0x03, 0x20, 0x7f, 0xe0, 0x02, 
-	0x20, 0x5e, 0xe0, 0x00, 0x20, 0xff, 0x40, 0x71, 
-	0x40, 0x08, 0xd1, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x1e, 0x68, 0x06, 0x05, 
-	0x0e, 0x2d, 0xd1, 0xde, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x1c, 0x07, 
-	0x2a, 0x00, 0xd0, 0x01, 0x24, 0x09, 0xe0, 0x00, 
-	0x24, 0x00, 0x00, 0x90, 0x19, 0xc0, 0x6c, 0x02, 
-	0x42, 0x8a, 0xd0, 0x15, 0x64, 0x01, 0x20, 0x03, 
-	0x4a, 0x19, 0x29, 0x01, 0xd0, 0x13, 0x29, 0x02, 
-	0xd0, 0x1f, 0x29, 0x03, 0xd1, 0x0c, 0x60, 0x10, 
-	0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, 0xff, 0x66, 
-	0x23, 0xf3, 0x40, 0x18, 0x22, 0x08, 0x43, 0x02, 
-	0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, 0xff, 0xac, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x60, 0x10, 
-	0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, 0xff, 0x56, 
-	0x22, 0xf3, 0x40, 0x02, 0x1c, 0x38, 0x1c, 0x21, 
-	0xf7, 0xff, 0xff, 0x9e, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, 
-	0xff, 0x49, 0x23, 0xf3, 0x40, 0x18, 0x22, 0x04, 
-	0x43, 0x02, 0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, 
-	0xff, 0x8f, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x6e, 0x00, 0x11, 0x00, 0xb5, 0xf0, 0x1c, 0x0c, 
-	0x68, 0x41, 0x68, 0x09, 0x68, 0x80, 0x1c, 0x1f, 
-	0x28, 0x00, 0xd0, 0x01, 0x6b, 0x8b, 0xe0, 0x00, 
-	0x23, 0x00, 0x6b, 0x0e, 0x43, 0x32, 0x6b, 0xcd, 
-	0x43, 0x2a, 0x43, 0x1a, 0x43, 0x1e, 0x1c, 0x15, 
-	0x1c, 0x02, 0x1c, 0x08, 0x21, 0x01, 0xf7, 0xff, 
-	0xff, 0xa5, 0x20, 0x00, 0x2f, 0x00, 0xdd, 0x07, 
-	0x88, 0x29, 0x54, 0x21, 0x88, 0x31, 0x54, 0x21, 
-	0x30, 0x01, 0x35, 0x02, 0x42, 0xb8, 0xdb, 0xf7, 
-	0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xff, 0x68, 0x41, 0x68, 0x0c, 0x68, 0x80, 
-	0x1c, 0x1f, 0x28, 0x00, 0xd0, 0x01, 0x6b, 0xa6, 
-	0xe0, 0x00, 0x26, 0x00, 0x6b, 0x21, 0x43, 0x11, 
-	0x6b, 0xe2, 0x43, 0x11, 0x43, 0x31, 0x1c, 0x02, 
-	0x1c, 0x0d, 0x21, 0x01, 0x1c, 0x20, 0xf7, 0xff, 
-	0xff, 0x81, 0x20, 0x00, 0x2f, 0x00, 0xdd, 0x09, 
-	0x99, 0x01, 0x5c, 0x09, 0x80, 0x29, 0x6b, 0x21, 
-	0x19, 0x89, 0x88, 0x09, 0x30, 0x01, 0x35, 0x02, 
-	0x42, 0xb8, 0xdb, 0xf5, 0x1c, 0x38, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xb0, 
-	0x68, 0x42, 0x68, 0x17, 0x68, 0x82, 0x2a, 0x00, 
-	0xd0, 0x01, 0x6b, 0xbc, 0xe0, 0x00, 0x24, 0x00, 
-	0x08, 0x48, 0xd3, 0x0a, 0x23, 0xfe, 0x40, 0x19, 
-	0x6b, 0x38, 0x43, 0x08, 0x6b, 0x79, 0x43, 0x08, 
-	0x6b, 0xf9, 0x43, 0x08, 0x43, 0x20, 0x1c, 0x05, 
-	0xe0, 0x05, 0x6b, 0x38, 0x43, 0x08, 0x6b, 0xf9, 
-	0x43, 0x08, 0x43, 0x20, 0x1c, 0x05, 0x21, 0x02, 
-	0x1c, 0x38, 0xf7, 0xff, 0xff, 0x4f, 0x6b, 0x38, 
-	0x43, 0x20, 0x88, 0x29, 0x88, 0x01, 0x88, 0x00, 
-	0x06, 0x00, 0x0e, 0x00, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0xb0, 0x06, 0x15, 0x0e, 0x2d, 
-	0x68, 0x42, 0x68, 0x13, 0x68, 0x82, 0x2a, 0x00, 
-	0xd0, 0x01, 0x6b, 0x98, 0xe0, 0x00, 0x20, 0x00, 
-	0x07, 0xcc, 0x0f, 0xe4, 0xd0, 0x08, 0x6b, 0x1f, 
-	0x43, 0x39, 0x6b, 0x5f, 0x43, 0x39, 0x6b, 0xdf, 
-	0x43, 0x39, 0x43, 0x01, 0x1c, 0x0f, 0xe0, 0x05, 
-	0x6b, 0x1f, 0x43, 0x39, 0x6b, 0xdf, 0x43, 0x39, 
-	0x43, 0x01, 0x1c, 0x0f, 0x21, 0x02, 0x1c, 0x18, 
-	0xf7, 0xff, 0xff, 0x24, 0x80, 0x3d, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x47, 0x70, 0xb5, 0x80, 
-	0x68, 0x41, 0x68, 0x0a, 0x68, 0x81, 0x29, 0x00, 
-	0xd0, 0x01, 0x21, 0x09, 0xe0, 0x00, 0x21, 0x00, 
-	0x27, 0x00, 0x69, 0x80, 0x28, 0x06, 0xd1, 0x03, 
-	0x20, 0x01, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x10, 0x6c, 0xd2, 0xf0, 0x11, 0xf9, 0xa8, 
-	0x08, 0x40, 0xd3, 0x00, 0x27, 0x01, 0x1c, 0x38, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 
-	0x68, 0x42, 0x68, 0x17, 0x68, 0x80, 0x28, 0x00, 
-	0xd0, 0x01, 0x24, 0x09, 0xe0, 0x00, 0x24, 0x00, 
-	0x29, 0x00, 0xd0, 0x16, 0x29, 0x01, 0xd0, 0x21, 
-	0x29, 0x02, 0xd1, 0x0e, 0x22, 0x80, 0x6c, 0xbb, 
-	0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, 0xf9, 0x8e, 
-	0x48, 0x1e, 0xf7, 0xff, 0xfe, 0x5f, 0x22, 0x00, 
-	0x6c, 0xbb, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, 
-	0xf9, 0x85, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x6c, 0xfa, 0x1c, 0x38, 0x1c, 0x21, 
-	0xf0, 0x11, 0xf9, 0x7a, 0x22, 0x9f, 0x40, 0x02, 
-	0x6c, 0xbb, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, 
-	0xf9, 0x75, 0xe7, 0xee, 0x6c, 0xfa, 0x1c, 0x38, 
-	0x1c, 0x21, 0xf0, 0x11, 0xf9, 0x6d, 0x22, 0x20, 
-	0x43, 0x02, 0x6c, 0xbb, 0x1c, 0x38, 0x1c, 0x21, 
-	0xf0, 0x11, 0xf9, 0x68, 0x25, 0x00, 0x6c, 0xfa, 
-	0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, 0xf9, 0x60, 
-	0x1c, 0x06, 0x09, 0x80, 0xd2, 0x05, 0x20, 0x14, 
-	0xf7, 0xff, 0xfe, 0x30, 0x35, 0x01, 0x2d, 0x0a, 
-	0xdb, 0xf1, 0x22, 0x40, 0x43, 0x32, 0x6c, 0xbb, 
-	0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, 0xf9, 0x52, 
-	0xe7, 0xcb, 0x00, 0x00, 0x00, 0x01, 0x86, 0xa0, 
-	0xb5, 0x80, 0x49, 0x0f, 0x4f, 0x0f, 0x8e, 0xfa, 
-	0x20, 0x00, 0x43, 0xc0, 0x2a, 0x00, 0xd1, 0x13, 
-	0x8d, 0xba, 0x06, 0x12, 0x0e, 0x12, 0x2a, 0x0c, 
-	0xd1, 0x0e, 0x8d, 0xf8, 0x28, 0x00, 0xd0, 0x09, 
-	0x8d, 0xf8, 0x1e, 0x82, 0xb4, 0x04, 0x78, 0x4a, 
-	0x1c, 0x8b, 0x78, 0x09, 0x48, 0x06, 0xf0, 0x00, 
-	0xfd, 0x5f, 0xb0, 0x01, 0x20, 0x00, 0x85, 0xb8, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2c, 0x00, 0x12, 0x00, 0x2c, 0x00, 0x1f, 0xc0, 
-	0x2e, 0x08, 0x4e, 0x78, 0x48, 0x08, 0x8d, 0x81, 
-	0x29, 0x00, 0xd0, 0x02, 0x20, 0x00, 0x43, 0xc0, 
-	0x47, 0x70, 0x21, 0x0c, 0x85, 0x81, 0x21, 0x01, 
-	0x02, 0xc9, 0x85, 0xc1, 0x21, 0x09, 0x02, 0x49, 
-	0x86, 0xc1, 0x20, 0x00, 0x47, 0x70, 0x00, 0x00, 
-	0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0x90, 0x4f, 0x15, 
-	0x68, 0x38, 0x28, 0x00, 0xd0, 0x23, 0xf7, 0xff, 
-	0xff, 0xbf, 0x48, 0x13, 0x68, 0x00, 0x68, 0x79, 
-	0x1a, 0x41, 0x29, 0x02, 0xd3, 0x1b, 0x60, 0x78, 
-	0x4c, 0x10, 0x8e, 0xa0, 0x4f, 0x10, 0x28, 0x00, 
-	0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x00, 0xfc, 0xd0, 
-	0x8e, 0xa0, 0x28, 0x00, 0xd1, 0x04, 0x23, 0xc9, 
-	0x00, 0x9b, 0x18, 0xf8, 0xf0, 0x00, 0xfc, 0xc8, 
-	0x69, 0xb8, 0x28, 0x06, 0xd0, 0x05, 0x23, 0x03, 
-	0x02, 0x1b, 0x18, 0xf8, 0x6b, 0xc0, 0x28, 0x06, 
-	0xd1, 0x01, 0xf7, 0xff, 0xff, 0xc3, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x44, 
-	0x2e, 0x08, 0x05, 0xb0, 0x2c, 0x00, 0x1f, 0xc0, 
-	0x2e, 0x08, 0x4e, 0xc8, 0xb5, 0x00, 0x1c, 0x10, 
-	0x1c, 0x1a, 0x1c, 0x03, 0x1c, 0x08, 0x1c, 0x19, 
-	0xf7, 0xf9, 0xf9, 0x84, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0x90, 0x4f, 0x23, 0x24, 0x02, 0x48, 0x23, 
-	0x60, 0x04, 0x22, 0x50, 0x21, 0x00, 0x1c, 0x38, 
-	0xf0, 0x11, 0xf9, 0x8a, 0x20, 0x80, 0x1d, 0xf9, 
-	0x31, 0x19, 0x73, 0x08, 0x20, 0x03, 0x07, 0x00, 
-	0x63, 0x38, 0x02, 0xe0, 0x63, 0x78, 0x03, 0x20, 
-	0x63, 0xb8, 0x03, 0x60, 0x63, 0xf8, 0x48, 0x1a, 
-	0x64, 0xb8, 0x48, 0x1a, 0x64, 0xf8, 0x60, 0x3f, 
-	0x48, 0x19, 0x60, 0xf8, 0x60, 0x7c, 0x24, 0x00, 
-	0x60, 0xbc, 0x48, 0x18, 0x61, 0x78, 0x48, 0x18, 
-	0x61, 0xb8, 0x48, 0x18, 0x61, 0xf8, 0x48, 0x18, 
-	0x62, 0x38, 0x48, 0x18, 0x61, 0x38, 0x48, 0x18, 
-	0x62, 0x78, 0x48, 0x18, 0x62, 0xb8, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf8, 0xbc, 0x4f, 0x16, 0x28, 0x00, 
-	0xd0, 0x03, 0x60, 0x3c, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0x01, 0x06, 0x40, 0xf0, 0x15, 
-	0xf8, 0x1c, 0x48, 0x12, 0xf7, 0xff, 0xfd, 0x6a, 
-	0x20, 0x01, 0x60, 0x38, 0x48, 0x10, 0x68, 0x00, 
-	0x60, 0x78, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x4e, 0x78, 0x6e, 0x00, 0x11, 0x00, 
-	0x2e, 0x00, 0x76, 0x55, 0x2e, 0x00, 0x75, 0xb9, 
-	0x2e, 0x08, 0x4e, 0xc8, 0x2e, 0x00, 0x77, 0x41, 
-	0x2e, 0x00, 0x77, 0x8d, 0x2e, 0x00, 0x77, 0xdb, 
-	0x2e, 0x00, 0x78, 0x2f, 0x2e, 0x00, 0x7a, 0x39, 
-	0x2e, 0x00, 0x78, 0x7b, 0x2e, 0x00, 0x78, 0xb3, 
-	0x2e, 0x08, 0x1a, 0x44, 0x00, 0x06, 0x1a, 0x80, 
-	0x2e, 0x08, 0x05, 0xb0, 0xb5, 0x80, 0x22, 0x80, 
-	0x21, 0x1f, 0x6c, 0x83, 0x1c, 0x07, 0xf0, 0x11, 
-	0xf8, 0x69, 0x48, 0x3f, 0xf7, 0xff, 0xfd, 0x3a, 
-	0x22, 0x55, 0x21, 0x02, 0x6c, 0xbb, 0x1c, 0x38, 
-	0xf0, 0x11, 0xf8, 0x60, 0x21, 0x02, 0x6c, 0xfa, 
-	0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x59, 0x28, 0x55, 
-	0xd0, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x22, 0x33, 0x21, 0x05, 
-	0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x4e, 
-	0x22, 0x33, 0x21, 0x0e, 0x6c, 0xbb, 0x1c, 0x38, 
-	0xf0, 0x11, 0xf8, 0x48, 0x22, 0x21, 0x21, 0x17, 
-	0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x42, 
-	0x22, 0x00, 0x21, 0x01, 0x6c, 0xbb, 0x1c, 0x38, 
-	0xf0, 0x11, 0xf8, 0x3c, 0x22, 0x00, 0x21, 0x0a, 
-	0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x36, 
-	0x22, 0x01, 0x21, 0x02, 0x6c, 0xbb, 0x1c, 0x38, 
-	0xf0, 0x11, 0xf8, 0x30, 0x22, 0x01, 0x21, 0x0b, 
-	0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x2a, 
-	0x22, 0x00, 0x21, 0x03, 0x6c, 0xbb, 0x1c, 0x38, 
-	0xf0, 0x11, 0xf8, 0x24, 0x22, 0x00, 0x21, 0x0c, 
-	0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x1e, 
-	0x22, 0x00, 0x21, 0x04, 0x6c, 0xbb, 0x1c, 0x38, 
-	0xf0, 0x11, 0xf8, 0x18, 0x22, 0x01, 0x21, 0x0d, 
-	0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x12, 
-	0x22, 0x02, 0x21, 0x1e, 0x6c, 0xbb, 0x1c, 0x38, 
-	0xf0, 0x11, 0xf8, 0x0c, 0x22, 0x04, 0x21, 0x1c, 
-	0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x06, 
-	0x22, 0x03, 0x21, 0x1b, 0x6c, 0xbb, 0x1c, 0x38, 
-	0xf0, 0x11, 0xf8, 0x00, 0x22, 0x01, 0x21, 0x1f, 
-	0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x10, 0xff, 0xfa, 
-	0x22, 0x01, 0x21, 0x18, 0x6c, 0xbb, 0x1c, 0x38, 
-	0xf0, 0x10, 0xff, 0xf4, 0x21, 0x1a, 0x6c, 0xfa, 
-	0x1c, 0x38, 0xf0, 0x10, 0xff, 0xed, 0x20, 0x00, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x00, 0x00, 0xc3, 0x50, 0xb5, 0x90, 0x1c, 0x07, 
-	0xf7, 0xff, 0xff, 0x74, 0x28, 0x00, 0xda, 0x04, 
-	0x20, 0x00, 0x43, 0xc0, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x24, 0x00, 0x64, 0x3c, 0x64, 0x7c, 
-	0x1c, 0x38, 0xf0, 0x00, 0xfc, 0x2f, 0x1c, 0x20, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0xb5, 0x00, 0x1c, 0x13, 0x1c, 0x0a, 0x1c, 0x01, 
-	0x1c, 0x18, 0xf0, 0x00, 0xf8, 0xeb, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x90, 0x1c, 0x0b, 0x68, 0x54, 
-	0x69, 0x27, 0x1c, 0x11, 0x2f, 0x00, 0xd0, 0x07, 
-	0x68, 0x89, 0x1c, 0x02, 0x1c, 0x20, 0xf0, 0x10, 
-	0xff, 0xc5, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x00, 0x43, 0xc0, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x90, 0x69, 0x82, 0x68, 0x44, 
-	0xb0, 0x81, 0x42, 0x8a, 0xd1, 0x03, 0xb0, 0x01, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x22, 0xff, 
-	0xab, 0x00, 0x61, 0x81, 0x70, 0x1a, 0x22, 0x02, 
-	0x70, 0x5a, 0x22, 0x00, 0x70, 0x9a, 0x70, 0xd9, 
-	0x69, 0x27, 0x2f, 0x00, 0xd0, 0x05, 0x46, 0x6a, 
-	0x68, 0x81, 0x23, 0x04, 0x1c, 0x20, 0xf0, 0x10, 
-	0xff, 0xa1, 0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x00, 0x49, 0x04, 0x68, 0x09, 
-	0x31, 0x19, 0x61, 0x01, 0x21, 0x00, 0xf7, 0xff, 
-	0xff, 0xd8, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x05, 0xb0, 0xb5, 0xf0, 0x1c, 0x07, 
-	0x68, 0x40, 0x69, 0x40, 0x25, 0x00, 0xb0, 0x9e, 
-	0x28, 0x00, 0xd1, 0x08, 0x21, 0x02, 0x1c, 0x38, 
-	0xf7, 0xff, 0xff, 0xc7, 0x1c, 0x28, 0xb0, 0x1e, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x23, 0x11, 
-	0x01, 0x5b, 0x18, 0xfc, 0x70, 0x25, 0x23, 0xff, 
-	0x22, 0x00, 0x68, 0x7e, 0x69, 0x76, 0x1c, 0x38, 
-	0x1c, 0x21, 0x33, 0x01, 0xf0, 0x10, 0xff, 0x70, 
-	0x46, 0x68, 0x22, 0xff, 0x1c, 0x21, 0x32, 0x01, 
-	0xf0, 0x01, 0xfa, 0xea, 0x28, 0x00, 0xda, 0x11, 
-	0x23, 0x03, 0x02, 0x1b, 0x18, 0xf8, 0x6a, 0x01, 
-	0x31, 0x01, 0x62, 0x01, 0x29, 0x64, 0xdd, 0x03, 
-	0x21, 0x00, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0xa1, 
-	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x1e, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x46, 0x68, 0x1d, 0xc1, 
-	0x31, 0x6b, 0x23, 0x01, 0x9a, 0x16, 0x68, 0x7c, 
-	0x69, 0xa4, 0x1c, 0x38, 0xf0, 0x10, 0xff, 0x48, 
-	0x21, 0x02, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x8d, 
-	0x21, 0x01, 0x68, 0x7a, 0x6a, 0x92, 0x1c, 0x38, 
-	0xf0, 0x10, 0xff, 0x3a, 0x1c, 0x28, 0xb0, 0x1e, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 
-	0x21, 0x01, 0x68, 0x42, 0x69, 0xd2, 0xf0, 0x10, 
-	0xff, 0x2f, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 
-	0x1d, 0xc6, 0x36, 0x19, 0x1c, 0x07, 0xf7, 0xff, 
-	0xff, 0xf2, 0x0a, 0x00, 0xd2, 0x03, 0x20, 0x00, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x02, 
-	0x68, 0x7a, 0x69, 0xd2, 0x1c, 0x38, 0xf0, 0x10, 
-	0xff, 0x1b, 0x1c, 0x04, 0x21, 0x03, 0x68, 0x7a, 
-	0x69, 0xd2, 0x1c, 0x38, 0xf0, 0x10, 0xff, 0x14, 
-	0x02, 0x00, 0x43, 0x20, 0x04, 0x04, 0x0c, 0x24, 
-	0x69, 0xf8, 0x42, 0xa0, 0xda, 0x01, 0x04, 0x04, 
-	0x0c, 0x24, 0x25, 0x00, 0x2c, 0x00, 0xdd, 0x09, 
-	0x21, 0x00, 0x68, 0x7a, 0x69, 0xd2, 0x1c, 0x38, 
-	0xf0, 0x10, 0xff, 0x02, 0x55, 0x70, 0x35, 0x01, 
-	0x42, 0xa5, 0xdb, 0xf5, 0x1c, 0x21, 0xa0, 0x07, 
-	0xf0, 0x11, 0xf8, 0x22, 0x69, 0xb8, 0x28, 0x06, 
-	0xd1, 0x04, 0x68, 0xf8, 0x1c, 0x31, 0x1c, 0x22, 
-	0xf0, 0x00, 0xff, 0x40, 0x1c, 0x20, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x63, 0x69, 0x5f, 0x73, 
-	0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x72, 0x65, 0x63, 
-	0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x64, 0x61, 
-	0x74, 0x61, 0x20, 0x6c, 0x65, 0x6e, 0x3d, 0x25, 
-	0x64, 0x0a, 0x00, 0x00, 0xb5, 0xf0, 0x1c, 0x14, 
-	0x1c, 0x0d, 0x1c, 0x07, 0xf7, 0xff, 0xff, 0xab, 
-	0x22, 0x01, 0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b, 
-	0x1c, 0x38, 0xf0, 0x10, 0xfe, 0xd3, 0x1c, 0x38, 
-	0xf7, 0xff, 0xff, 0x99, 0x09, 0xc0, 0xd3, 0x23, 
-	0x06, 0x22, 0x0e, 0x12, 0x21, 0x02, 0x68, 0x7b, 
-	0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 0xfe, 0xc6, 
-	0x12, 0x22, 0x21, 0x03, 0x68, 0x7b, 0x6a, 0x1b, 
-	0x1c, 0x38, 0xf0, 0x10, 0xfe, 0xbf, 0x26, 0x00, 
-	0x2c, 0x00, 0xdd, 0x09, 0x5d, 0xaa, 0x21, 0x00, 
-	0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 
-	0xfe, 0xb5, 0x36, 0x01, 0x42, 0xa6, 0xdb, 0xf5, 
-	0x1c, 0x38, 0xf7, 0xff, 0xff, 0x78, 0x08, 0x80, 
-	0xd3, 0x02, 0xa0, 0x0b, 0xf0, 0x10, 0xff, 0xd0, 
-	0x22, 0x00, 0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b, 
-	0x1c, 0x38, 0xf0, 0x10, 0xfe, 0xa3, 0x1c, 0x38, 
-	0xf7, 0xff, 0xff, 0x69, 0x08, 0x80, 0xd3, 0x02, 
-	0xa0, 0x0b, 0xf0, 0x10, 0xff, 0xc1, 0x20, 0x00, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x63, 0x69, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 
-	0x77, 0x72, 0x69, 0x74, 0x65, 0x3a, 0x20, 0x77, 
-	0x72, 0x69, 0x74, 0x65, 0x20, 0x65, 0x72, 0x72, 
-	0x6f, 0x72, 0x20, 0x31, 0x0a, 0x00, 0x00, 0x00, 
-	0x63, 0x69, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 
-	0x77, 0x72, 0x69, 0x74, 0x65, 0x3a, 0x20, 0x77, 
-	0x72, 0x69, 0x74, 0x65, 0x20, 0x65, 0x72, 0x72, 
-	0x6f, 0x72, 0x20, 0x32, 0x0a, 0x00, 0x00, 0x00, 
-	0xb5, 0x00, 0x1c, 0x0a, 0x1d, 0xc1, 0x31, 0xff, 
-	0x31, 0x1a, 0xf7, 0xff, 0xff, 0x8f, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x80, 0x1c, 0x07, 0xa0, 0x0d, 
-	0xf0, 0x10, 0xff, 0x8e, 0x22, 0x08, 0x21, 0x01, 
-	0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 
-	0xfe, 0x61, 0x21, 0x03, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfe, 0xa8, 0x48, 0x0a, 0x68, 0x00, 0x30, 0x05, 
-	0x61, 0x38, 0x20, 0x00, 0x23, 0x03, 0x02, 0x1b, 
-	0x18, 0xf9, 0x62, 0x08, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x63, 0x69, 0x5f, 0x73, 
-	0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x72, 0x65, 0x73, 
-	0x65, 0x74, 0x0a, 0x00, 0x2e, 0x08, 0x05, 0xb0, 
-	0xb5, 0x90, 0x22, 0x00, 0x21, 0x01, 0x68, 0x43, 
-	0x6a, 0x1b, 0x1c, 0x07, 0xf0, 0x10, 0xfe, 0x3e, 
-	0x1c, 0x38, 0xf7, 0xff, 0xff, 0x04, 0x23, 0x40, 
-	0x40, 0x18, 0x4c, 0x14, 0xd1, 0x13, 0x68, 0x20, 
-	0x30, 0x05, 0x23, 0x03, 0x02, 0x1b, 0x61, 0x38, 
-	0x18, 0xf8, 0x6a, 0x01, 0x31, 0x01, 0x62, 0x01, 
-	0x29, 0x0a, 0xdd, 0x03, 0x21, 0x00, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfe, 0x73, 0x20, 0x00, 0x43, 0xc0, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x22, 0x04, 
-	0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38, 
-	0xf0, 0x10, 0xfe, 0x1c, 0x21, 0x04, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfe, 0x63, 0x68, 0x20, 0x30, 0x05, 
-	0x61, 0x38, 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xb0, 
-	0xb5, 0xf0, 0x26, 0xff, 0x36, 0x01, 0x61, 0xc6, 
-	0x1d, 0xc5, 0x35, 0x19, 0x1c, 0x07, 0xf7, 0xff, 
-	0xfe, 0xd6, 0x4c, 0x17, 0x28, 0x00, 0xd1, 0x0d, 
-	0xa0, 0x16, 0xf0, 0x10, 0xff, 0x25, 0x21, 0xfe, 
-	0x1c, 0x38, 0xf7, 0xff, 0xfe, 0x46, 0x68, 0x20, 
-	0x61, 0x78, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x78, 0x28, 0x02, 0x00, 
-	0x78, 0x69, 0x43, 0x01, 0x61, 0xf9, 0xa0, 0x19, 
-	0xf0, 0x10, 0xff, 0x12, 0x69, 0xf8, 0x42, 0xb0, 
-	0xdd, 0x00, 0x61, 0xfe, 0x22, 0x02, 0x21, 0x01, 
-	0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 
-	0xfd, 0xe1, 0x68, 0x20, 0x30, 0x05, 0x61, 0x38, 
-	0x21, 0x05, 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0x25, 
-	0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x05, 0xb0, 0x63, 0x69, 0x5f, 0x73, 
-	0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x6d, 0x6f, 0x64, 
-	0x75, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 
-	0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x74, 0x6f, 
-	0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x62, 0x75, 
-	0x66, 0x66, 0x65, 0x72, 0x20, 0x73, 0x69, 0x7a, 
-	0x65, 0x0a, 0x00, 0x00, 0x63, 0x69, 0x5f, 0x73, 
-	0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x6d, 0x6f, 0x64, 
-	0x75, 0x6c, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, 
-	0x65, 0x72, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 
-	0x3d, 0x20, 0x25, 0x30, 0x34, 0x78, 0x0a, 0x00, 
-	0xb5, 0xb0, 0x1c, 0x07, 0xf7, 0xff, 0xfe, 0x6f, 
-	0x23, 0x40, 0x40, 0x18, 0x25, 0x00, 0x43, 0xed, 
-	0x4c, 0x3d, 0x28, 0x00, 0xd1, 0x0c, 0xa0, 0x3d, 
-	0xf0, 0x10, 0xfe, 0xc2, 0x21, 0xff, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfd, 0xe3, 0x68, 0x20, 0x61, 0x78, 
-	0x1c, 0x28, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x22, 0x03, 0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b, 
-	0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x8b, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfe, 0x51, 0x09, 0xc0, 0xd2, 0x0c, 
-	0xa0, 0x3d, 0xf0, 0x10, 0xfe, 0xa9, 0x21, 0xff, 
-	0x1c, 0x38, 0xf7, 0xff, 0xfd, 0xca, 0x68, 0x20, 
-	0x61, 0x78, 0x1c, 0x28, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x22, 0x02, 0x21, 0x02, 0x68, 0x7b, 
-	0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x72, 
-	0x22, 0x00, 0x21, 0x03, 0x68, 0x7b, 0x6a, 0x1b, 
-	0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x6b, 0x69, 0xf8, 
-	0x12, 0x02, 0x21, 0x00, 0x68, 0x7b, 0x6a, 0x1b, 
-	0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x63, 0x69, 0xf8, 
-	0x06, 0x02, 0x0e, 0x12, 0x21, 0x00, 0x68, 0x7b, 
-	0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x5a, 
-	0xa0, 0x34, 0xf0, 0x10, 0xfe, 0x7d, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfe, 0x1d, 0x08, 0x80, 0xd3, 0x02, 
-	0xa0, 0x3e, 0xf0, 0x10, 0xfe, 0x75, 0x22, 0x00, 
-	0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38, 
-	0xf0, 0x10, 0xfd, 0x48, 0x68, 0xf8, 0x69, 0xf9, 
-	0xf0, 0x00, 0xfa, 0x3e, 0x48, 0x42, 0x68, 0xf9, 
-	0x4b, 0x42, 0x18, 0xc9, 0x61, 0x48, 0x68, 0xf8, 
-	0x18, 0xc0, 0x61, 0x07, 0x48, 0x40, 0x68, 0xf9, 
-	0x18, 0xc9, 0x61, 0x88, 0x68, 0xf8, 0x18, 0xc0, 
-	0x60, 0xc7, 0x69, 0xf9, 0xa0, 0x3d, 0xf0, 0x10, 
-	0xfe, 0x57, 0x68, 0x20, 0x61, 0x38, 0x21, 0x06, 
-	0x1c, 0x38, 0xf7, 0xff, 0xfd, 0x76, 0x20, 0x00, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x05, 0xb0, 0x63, 0x69, 0x5f, 0x73, 
-	0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x6d, 0x6f, 0x64, 
-	0x75, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 
-	0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x74, 0x6f, 
-	0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 
-	0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 
-	0x73, 0x69, 0x7a, 0x65, 0x0a, 0x00, 0x00, 0x00, 
-	0x63, 0x69, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x3a, 
-	0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 
-	0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 
-	0x79, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x63, 
-	0x65, 0x69, 0x76, 0x65, 0x20, 0x62, 0x75, 0x66, 
-	0x66, 0x65, 0x72, 0x20, 0x73, 0x69, 0x7a, 0x65, 
-	0x20, 0x32, 0x0a, 0x00, 0x63, 0x69, 0x5f, 0x73, 
-	0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x73, 0x65, 0x6e, 
-	0x64, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x65, 0x67, 
-	0x6f, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 
-	0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x73, 
-	0x69, 0x7a, 0x65, 0x20, 0x62, 0x61, 0x63, 0x6b, 
-	0x20, 0x74, 0x6f, 0x20, 0x6d, 0x6f, 0x64, 0x75, 
-	0x6c, 0x65, 0x0a, 0x00, 0x63, 0x69, 0x5f, 0x73, 
-	0x6c, 0x6f, 0x74, 0x5f, 0x6e, 0x65, 0x67, 0x6f, 
-	0x74, 0x69, 0x61, 0x74, 0x65, 0x3a, 0x20, 0x62, 
-	0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x73, 0x69, 
-	0x7a, 0x65, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 
-	0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x0a, 0x00, 
-	0x2e, 0x00, 0x7c, 0x55, 0x00, 0x01, 0x3b, 0x80, 
-	0x2e, 0x00, 0x7c, 0x67, 0x63, 0x69, 0x5f, 0x73, 
-	0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x62, 0x75, 0x66, 
-	0x66, 0x65, 0x72, 0x20, 0x73, 0x69, 0x7a, 0x65, 
-	0x20, 0x3d, 0x20, 0x25, 0x30, 0x34, 0x78, 0x0a, 
-	0x00, 0x00, 0x00, 0x00, 0xb5, 0x80, 0x1c, 0x07, 
-	0x20, 0xff, 0x30, 0x01, 0x61, 0xf8, 0x21, 0x00, 
-	0x1c, 0x38, 0xf7, 0xff, 0xfc, 0xea, 0x48, 0x05, 
-	0x68, 0x00, 0x61, 0x38, 0x48, 0x04, 0xf7, 0xfd, 
-	0xfc, 0xe5, 0x60, 0xf8, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xb0, 
-	0x00, 0x01, 0x3b, 0x9c, 0xb5, 0x00, 0x68, 0xc0, 
-	0xf7, 0xfd, 0xfc, 0xfa, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0x80, 0x1c, 0x1f, 0x06, 0x0b, 0x0e, 0x1b, 
-	0x69, 0x81, 0x29, 0x06, 0xd0, 0x04, 0x20, 0x00, 
-	0x43, 0xc0, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x78, 0x11, 0x29, 0xff, 0xd1, 0x05, 0xf7, 0xff, 
-	0xfc, 0xe4, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x68, 0xc0, 0x1c, 0x11, 0x1c, 0x3a, 
-	0xf0, 0x00, 0xfb, 0x9a, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x69, 0x00, 0x49, 0x04, 0x68, 0x09, 
-	0x1a, 0x40, 0x4b, 0x04, 0x42, 0x98, 0xd2, 0x01, 
-	0x20, 0x00, 0x47, 0x70, 0x20, 0x01, 0x47, 0x70, 
-	0x2e, 0x08, 0x05, 0xb0, 0x80, 0x00, 0x00, 0x00, 
-	0xb5, 0x90, 0x68, 0x44, 0x6a, 0x61, 0x1c, 0x07, 
-	0x29, 0x00, 0xd0, 0x03, 0x1c, 0x38, 0xf0, 0x10, 
-	0xfc, 0x51, 0xe0, 0x00, 0x20, 0x01, 0x08, 0x40, 
-	0xd2, 0x06, 0x21, 0x00, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfc, 0x98, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x69, 0xb8, 0x28, 0x00, 0xd1, 0xf9, 0x6a, 0xa2, 
-	0x2a, 0x00, 0xd0, 0x03, 0x21, 0x02, 0x1c, 0x38, 
-	0xf0, 0x10, 0xfc, 0x3e, 0x21, 0x01, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfc, 0x87, 0x20, 0x00, 0x23, 0x03, 
-	0x02, 0x1b, 0x18, 0xf9, 0x62, 0x08, 0x48, 0x03, 
-	0x68, 0x00, 0x30, 0x19, 0x61, 0x38, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xb0, 
-	0xb5, 0x90, 0x1c, 0x07, 0xf7, 0xff, 0xff, 0xcc, 
-	0x1c, 0x38, 0xf7, 0xff, 0xff, 0xba, 0x28, 0x00, 
-	0xd1, 0x03, 0x43, 0xc0, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x69, 0xb8, 0x4c, 0x23, 0x28, 0x05, 
-	0xd0, 0x30, 0xdc, 0x0b, 0x28, 0x01, 0xd0, 0x1e, 
-	0x28, 0x02, 0xd0, 0x23, 0x28, 0x03, 0xd0, 0x25, 
-	0x28, 0x04, 0xd1, 0x14, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfe, 0x03, 0xe0, 0x10, 0x28, 0x06, 0xd0, 0x25, 
-	0x28, 0xfe, 0xd0, 0x01, 0x28, 0xff, 0xd1, 0x0a, 
-	0x69, 0x78, 0x68, 0x21, 0x1a, 0x08, 0x23, 0xff, 
-	0x33, 0xf5, 0x42, 0x98, 0xd9, 0x03, 0x21, 0x00, 
-	0x1c, 0x38, 0xf7, 0xff, 0xfc, 0x4a, 0x20, 0x00, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x68, 0x20, 
-	0x30, 0x05, 0x61, 0x38, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfc, 0x6d, 0xe7, 0xf4, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfd, 0x84, 0xe7, 0xf0, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfd, 0xa7, 0xe7, 0xec, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfe, 0x3f, 0xe7, 0xe8, 0x68, 0xf8, 0xf0, 0x00, 
-	0xfc, 0x53, 0x28, 0x00, 0xd1, 0x02, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfc, 0xb1, 0x68, 0xf8, 0xf0, 0x00, 
-	0xfb, 0xd9, 0x68, 0x20, 0x30, 0x02, 0x61, 0x38, 
-	0xe7, 0xd9, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xb0, 
-	0xb5, 0xb0, 0x06, 0x15, 0x0e, 0x2d, 0x9f, 0x04, 
-	0x68, 0x42, 0x1c, 0x1c, 0x42, 0x8a, 0xdc, 0x04, 
-	0x20, 0x00, 0x43, 0xc0, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x68, 0xc0, 0x23, 0xc9, 0x00, 0x9b, 
-	0x43, 0x59, 0x18, 0x40, 0x1c, 0x29, 0x1c, 0x22, 
-	0x1c, 0x3b, 0xf7, 0xff, 0xff, 0x35, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x24, 0x00, 
-	0x1c, 0x07, 0x68, 0x40, 0x28, 0x00, 0xdd, 0x0a, 
-	0x21, 0xc9, 0x00, 0x89, 0x43, 0x61, 0x68, 0xf8, 
-	0x18, 0x40, 0xf7, 0xff, 0xff, 0x81, 0x68, 0x78, 
-	0x34, 0x01, 0x42, 0xa0, 0xdc, 0xf4, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x24, 0x00, 
-	0x1c, 0x07, 0x68, 0x40, 0x28, 0x00, 0xdd, 0x0f, 
-	0x21, 0xc9, 0x00, 0x89, 0x43, 0x61, 0x68, 0xf8, 
-	0x18, 0x40, 0x60, 0x84, 0x68, 0x3a, 0xc0, 0x84, 
-	0x68, 0xf8, 0x18, 0x40, 0xf7, 0xff, 0xfe, 0xee, 
-	0x68, 0x78, 0x34, 0x01, 0x42, 0xa0, 0xdc, 0xef, 
-	0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xf0, 0x25, 0x00, 0x1c, 0x07, 0x68, 0x40, 
-	0x1c, 0x0c, 0x28, 0x00, 0xdd, 0x0f, 0x26, 0x01, 
-	0x1c, 0x30, 0x40, 0xa8, 0x40, 0x20, 0xd0, 0x06, 
-	0x21, 0xc9, 0x00, 0x89, 0x43, 0x69, 0x68, 0xf8, 
-	0x18, 0x40, 0xf7, 0xff, 0xfb, 0xe6, 0x68, 0x78, 
-	0x35, 0x01, 0x42, 0xa8, 0xdc, 0xf0, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb4, 0xf0, 0x21, 0x00, 
-	0x78, 0x07, 0x22, 0x80, 0x43, 0xd2, 0x40, 0x3a, 
-	0x1c, 0x04, 0x0a, 0x3b, 0xd3, 0x0f, 0x27, 0x00, 
-	0x30, 0x01, 0x2a, 0x00, 0xdd, 0x0d, 0x1b, 0xd3, 
-	0x00, 0xdb, 0x78, 0x06, 0x1f, 0xdd, 0x3d, 0x01, 
-	0x40, 0xae, 0x43, 0x31, 0x30, 0x01, 0x37, 0x01, 
-	0x42, 0x97, 0xdb, 0xf4, 0xe0, 0x01, 0x30, 0x01, 
-	0x1c, 0x11, 0x1b, 0x00, 0x18, 0x40, 0xbc, 0xf0, 
-	0x47, 0x70, 0xb4, 0xb0, 0x22, 0x01, 0x28, 0x80, 
-	0xda, 0x02, 0x70, 0x08, 0xbc, 0xb0, 0x47, 0x70, 
-	0x27, 0x03, 0x25, 0xff, 0x00, 0xfc, 0x1c, 0x2b, 
-	0x40, 0xa3, 0x40, 0x03, 0xd0, 0x03, 0x1c, 0x03, 
-	0x41, 0x23, 0x54, 0x8b, 0x32, 0x01, 0x37, 0x01, 
-	0xd5, 0xf4, 0x20, 0x80, 0x43, 0x10, 0x70, 0x08, 
-	0xbc, 0xb0, 0x47, 0x70, 0xb5, 0xb0, 0x22, 0x00, 
-	0x78, 0x41, 0x1c, 0x47, 0x20, 0x80, 0x43, 0xc0, 
-	0x40, 0x08, 0x0a, 0x09, 0xd3, 0x0f, 0x21, 0x00, 
-	0x37, 0x01, 0x28, 0x00, 0xdd, 0x0d, 0x1a, 0x43, 
-	0x00, 0xdb, 0x78, 0x3d, 0x1f, 0xdc, 0x3c, 0x01, 
-	0x40, 0xa5, 0x43, 0x2a, 0x31, 0x01, 0x37, 0x01, 
-	0x42, 0x81, 0xdb, 0xf4, 0xe0, 0x01, 0x1c, 0x02, 
-	0x37, 0x01, 0x78, 0x3b, 0xa1, 0x03, 0xa0, 0x04, 
-	0xf0, 0x10, 0xfc, 0x42, 0x78, 0x38, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x63, 0x69, 0x3a, 0x00, 
-	0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 
-	0x3a, 0x20, 0x25, 0x73, 0x2c, 0x20, 0x6c, 0x65, 
-	0x6e, 0x3d, 0x25, 0x64, 0x2c, 0x20, 0x69, 0x64, 
-	0x3d, 0x25, 0x30, 0x32, 0x78, 0x0a, 0x00, 0x00, 
-	0xb5, 0xb0, 0x25, 0x00, 0x60, 0x01, 0x1c, 0x07, 
-	0x4b, 0x2f, 0x18, 0xc4, 0x72, 0x25, 0x72, 0x65, 
-	0x72, 0xa5, 0x72, 0xe5, 0x1c, 0x08, 0x21, 0x01, 
-	0x04, 0x09, 0xf0, 0x10, 0xfb, 0x01, 0x21, 0x01, 
-	0x02, 0x49, 0x42, 0x88, 0xdd, 0x01, 0x60, 0x79, 
-	0xe0, 0x00, 0x60, 0x78, 0x22, 0x01, 0x04, 0x12, 
-	0x21, 0x00, 0x1d, 0xf8, 0x30, 0x01, 0xf0, 0x10, 
-	0xfb, 0xa7, 0x20, 0x00, 0x43, 0xc1, 0x00, 0x82, 
-	0x19, 0xd2, 0x4b, 0x22, 0x18, 0xd3, 0x60, 0x9d, 
-	0x4b, 0x21, 0x18, 0xd3, 0x60, 0x9d, 0x23, 0x9d, 
-	0x02, 0x5b, 0x18, 0xd3, 0x60, 0x9d, 0x4b, 0x1f, 
-	0x18, 0xd2, 0x60, 0x95, 0x00, 0x42, 0x19, 0xd2, 
-	0x4b, 0x1d, 0x18, 0xd3, 0x81, 0x19, 0x4b, 0x1d, 
-	0x18, 0xd2, 0x81, 0x11, 0x30, 0x01, 0x28, 0x20, 
-	0xdb, 0xe5, 0x20, 0x00, 0x68, 0x79, 0x29, 0x00, 
-	0xdd, 0x11, 0x00, 0x41, 0x18, 0x09, 0x00, 0xc9, 
-	0x19, 0xc9, 0x23, 0x01, 0x04, 0x1b, 0x18, 0xc9, 
-	0x72, 0x0d, 0x60, 0xcd, 0x61, 0x0d, 0x61, 0x4d, 
-	0x76, 0x0d, 0x76, 0x4d, 0x61, 0xc8, 0x68, 0x79, 
-	0x30, 0x01, 0x42, 0x81, 0xdc, 0xed, 0x4b, 0x10, 
-	0x18, 0xf8, 0x22, 0x01, 0x02, 0xd2, 0x21, 0x00, 
-	0xf0, 0x10, 0xfb, 0x6e, 0x4b, 0x0d, 0x18, 0xf8, 
-	0x22, 0xff, 0x21, 0x00, 0x32, 0x01, 0xf0, 0x10, 
-	0xfb, 0x67, 0x60, 0xe5, 0x61, 0x25, 0x61, 0x65, 
-	0x61, 0xa5, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x00, 0x01, 0x3b, 0x80, 0x00, 0x01, 0x39, 0x00, 
-	0x00, 0x01, 0x39, 0x80, 0x00, 0x01, 0x3a, 0x80, 
-	0x00, 0x01, 0x3b, 0x00, 0x00, 0x01, 0x3b, 0x40, 
-	0x00, 0x01, 0x30, 0x08, 0x00, 0x01, 0x38, 0x08, 
-	0x21, 0x00, 0x70, 0x01, 0x60, 0x41, 0x60, 0x81, 
-	0x60, 0xc1, 0x74, 0x01, 0x74, 0x41, 0x47, 0x70, 
-	0xb4, 0x80, 0x21, 0x00, 0x68, 0x42, 0x2a, 0x00, 
-	0xdd, 0x18, 0x00, 0x4b, 0x18, 0x5b, 0x00, 0xdb, 
-	0x18, 0x1f, 0x23, 0x01, 0x04, 0x1b, 0x18, 0xfb, 
-	0x7a, 0x1b, 0x2b, 0x00, 0xd1, 0x0b, 0x22, 0x01, 
-	0x00, 0x4b, 0x18, 0x59, 0x00, 0xc9, 0x18, 0x08, 
-	0x04, 0x13, 0x18, 0xc1, 0x72, 0x0a, 0x4b, 0x05, 
-	0x18, 0xc0, 0xbc, 0x80, 0x47, 0x70, 0x31, 0x01, 
-	0x42, 0x8a, 0xdc, 0xe6, 0x20, 0x00, 0xbc, 0x80, 
-	0x47, 0x70, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 
-	0xb5, 0xb0, 0x06, 0x1d, 0x0e, 0x2d, 0x1c, 0x14, 
-	0x68, 0x0a, 0x21, 0x00, 0x1c, 0x07, 0xf0, 0x10, 
-	0xfb, 0x1b, 0x70, 0x3d, 0x2c, 0x00, 0xd0, 0x04, 
-	0x20, 0x80, 0x70, 0x78, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0x00, 0x70, 0x78, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x99, 0x01, 
-	0x1c, 0x1c, 0x1c, 0x15, 0x1c, 0x07, 0x29, 0x00, 
-	0xd1, 0x04, 0x20, 0x00, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x1c, 0x28, 0xf7, 0xff, 
-	0xff, 0xb7, 0x1c, 0x06, 0xd1, 0x01, 0x20, 0x00, 
-	0xe7, 0xf4, 0x69, 0x70, 0x68, 0x29, 0x43, 0x48, 
-	0x19, 0x01, 0x23, 0x01, 0x04, 0x1b, 0x42, 0x99, 
-	0xdd, 0x01, 0x20, 0x00, 0xe7, 0xea, 0x18, 0x2d, 
-	0x99, 0x01, 0x1d, 0xe8, 0x30, 0x01, 0x1c, 0x22, 
-	0xf0, 0x10, 0xfa, 0x84, 0x74, 0x34, 0x7a, 0x68, 
-	0x74, 0x70, 0x2f, 0x00, 0xd0, 0x04, 0x68, 0xb8, 
-	0x60, 0xb0, 0x60, 0xf7, 0x60, 0xbe, 0xe0, 0x02, 
-	0x20, 0x00, 0x60, 0xb0, 0x60, 0xf0, 0x1c, 0x30, 
-	0xe7, 0xd4, 0xb5, 0xff, 0x9c, 0x09, 0x06, 0x25, 
-	0x0e, 0x2d, 0x24, 0x00, 0x43, 0xe4, 0x1c, 0x07, 
-	0x98, 0x02, 0x1c, 0x21, 0x4b, 0x4c, 0x18, 0xfa, 
-	0x28, 0x00, 0xd0, 0x03, 0x28, 0x01, 0xd1, 0x6a, 
-	0x20, 0x00, 0xe0, 0x2d, 0x20, 0x00, 0x00, 0x43, 
-	0x19, 0xde, 0x4b, 0x48, 0x18, 0xf6, 0x23, 0x08, 
-	0x5e, 0xf3, 0x42, 0xab, 0xd1, 0x00, 0x1c, 0x04, 
-	0x29, 0x00, 0xda, 0x04, 0x1c, 0x1e, 0x23, 0x01, 
-	0x42, 0xde, 0xd1, 0x00, 0x1c, 0x01, 0x30, 0x01, 
-	0x28, 0x20, 0xdb, 0xec, 0x20, 0x00, 0x43, 0xc0, 
-	0x42, 0x84, 0xd1, 0x05, 0x42, 0x81, 0xd0, 0x03, 
-	0x7a, 0x13, 0x33, 0x01, 0x72, 0x13, 0x1c, 0x0c, 
-	0x2c, 0x00, 0xdb, 0x44, 0x00, 0x60, 0x19, 0xc0, 
-	0x4b, 0x38, 0x18, 0xc0, 0x81, 0x05, 0x00, 0xa0, 
-	0x19, 0xc1, 0x4b, 0x37, 0x18, 0xc8, 0x68, 0x80, 
-	0x4b, 0x36, 0x18, 0xc9, 0x68, 0x8d, 0xe0, 0x2c, 
-	0x00, 0x43, 0x19, 0xde, 0x4b, 0x34, 0x18, 0xf6, 
-	0x23, 0x08, 0x5e, 0xf3, 0x42, 0xab, 0xd1, 0x00, 
-	0x1c, 0x04, 0x29, 0x00, 0xda, 0x04, 0x1c, 0x1e, 
-	0x23, 0x01, 0x42, 0xde, 0xd1, 0x00, 0x1c, 0x01, 
-	0x30, 0x01, 0x28, 0x20, 0xdb, 0xec, 0x20, 0x00, 
-	0x43, 0xc0, 0x42, 0x84, 0xd1, 0x05, 0x42, 0x81, 
-	0xd0, 0x03, 0x7a, 0x93, 0x33, 0x01, 0x72, 0x93, 
-	0x1c, 0x0c, 0x2c, 0x00, 0xdb, 0x17, 0x00, 0x60, 
-	0x19, 0xc0, 0x4b, 0x25, 0x18, 0xc0, 0x81, 0x05, 
-	0x00, 0xa0, 0x19, 0xc1, 0x23, 0x9d, 0x02, 0x5b, 
-	0x18, 0xc8, 0x68, 0x80, 0x4b, 0x21, 0x18, 0xc9, 
-	0x68, 0x8d, 0x28, 0x00, 0xd0, 0x0f, 0x99, 0x01, 
-	0x9b, 0x03, 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x5a, 
-	0x28, 0x00, 0xd1, 0x12, 0x43, 0xc0, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xe7, 0xff, 
-	0x20, 0x00, 0x43, 0xc0, 0xe7, 0xf7, 0x99, 0x01, 
-	0x9b, 0x03, 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x4a, 
-	0x1c, 0x05, 0xd1, 0x01, 0x43, 0xe8, 0xe7, 0xee, 
-	0x1c, 0x28, 0x60, 0x44, 0x9a, 0x02, 0x2a, 0x00, 
-	0xd0, 0x0c, 0x2a, 0x01, 0xd1, 0x08, 0x00, 0xa1, 
-	0x19, 0xc9, 0x23, 0x9d, 0x02, 0x5b, 0x18, 0xca, 
-	0x60, 0x90, 0x4b, 0x0c, 0x18, 0xc8, 0x60, 0x85, 
-	0x1c, 0x20, 0xe7, 0xdc, 0x00, 0xa1, 0x19, 0xc9, 
-	0x4b, 0x05, 0x18, 0xca, 0x60, 0x90, 0x4b, 0x05, 
-	0x18, 0xc8, 0x60, 0x85, 0xe7, 0xf4, 0x00, 0x00, 
-	0x00, 0x01, 0x3b, 0x80, 0x00, 0x01, 0x3b, 0x00, 
-	0x00, 0x01, 0x39, 0x00, 0x00, 0x01, 0x39, 0x80, 
-	0x00, 0x01, 0x3b, 0x40, 0x00, 0x01, 0x3a, 0x80, 
-	0xb5, 0x80, 0x27, 0x00, 0x28, 0x00, 0xd1, 0x03, 
-	0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x22, 0x00, 0x68, 0x81, 0x29, 0x00, 0xd0, 0x0b, 
-	0x68, 0xc3, 0x2b, 0x00, 0xd0, 0x05, 0x60, 0x99, 
-	0x68, 0xc1, 0x68, 0x82, 0x60, 0xd1, 0x68, 0xc7, 
-	0xe0, 0x07, 0x60, 0xca, 0x68, 0x87, 0xe0, 0x04, 
-	0x68, 0xc1, 0x29, 0x00, 0xd0, 0x01, 0x60, 0x8a, 
-	0x68, 0xc7, 0xf7, 0xff, 0xfe, 0xbd, 0x1c, 0x38, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf7, 
-	0x1c, 0x07, 0x98, 0x01, 0x68, 0x46, 0x99, 0x02, 
-	0x29, 0x00, 0xd0, 0x0b, 0x29, 0x01, 0xd1, 0x12, 
-	0x00, 0xb0, 0x19, 0xc0, 0x23, 0x9d, 0x02, 0x5b, 
-	0x18, 0xc1, 0x68, 0x8d, 0x4b, 0x2c, 0x18, 0xc0, 
-	0x68, 0x84, 0xe0, 0x0a, 0x00, 0xb0, 0x19, 0xc0, 
-	0x4b, 0x2a, 0x18, 0xc1, 0x68, 0x8d, 0x4b, 0x2a, 
-	0x18, 0xc0, 0x68, 0x84, 0xe0, 0x01, 0x25, 0x00, 
-	0x24, 0x00, 0x99, 0x01, 0x42, 0xa9, 0xd1, 0x08, 
-	0x98, 0x01, 0xf7, 0xff, 0xff, 0xb9, 0x99, 0x01, 
-	0x1c, 0x05, 0x42, 0xa1, 0xd1, 0x08, 0x24, 0x00, 
-	0xe0, 0x06, 0x99, 0x01, 0x42, 0xa1, 0xd1, 0x03, 
-	0x98, 0x01, 0xf7, 0xff, 0xff, 0xad, 0x1c, 0x04, 
-	0x22, 0x00, 0x43, 0xd2, 0x99, 0x02, 0x4b, 0x1d, 
-	0x18, 0xf8, 0x29, 0x00, 0xd0, 0x1a, 0x29, 0x01, 
-	0xd1, 0x14, 0x00, 0xb1, 0x19, 0xc9, 0x23, 0x9d, 
-	0x02, 0x5b, 0x18, 0xcb, 0x60, 0x9d, 0x4b, 0x14, 
-	0x18, 0xc9, 0x60, 0x8c, 0x2d, 0x00, 0xd1, 0x09, 
-	0x2c, 0x00, 0xd1, 0x07, 0x7a, 0x81, 0x39, 0x01, 
-	0x72, 0x81, 0x00, 0x70, 0x19, 0xc0, 0x4b, 0x12, 
-	0x18, 0xc0, 0x81, 0x02, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0xb1, 0x19, 0xc9, 
-	0x4b, 0x0a, 0x18, 0xcb, 0x60, 0x9d, 0x4b, 0x0a, 
-	0x18, 0xc9, 0x60, 0x8c, 0x2d, 0x00, 0xd1, 0xf1, 
-	0x2c, 0x00, 0xd1, 0xef, 0x7a, 0x01, 0x39, 0x01, 
-	0x72, 0x01, 0x00, 0x70, 0x19, 0xc0, 0x4b, 0x07, 
-	0x18, 0xc0, 0x81, 0x02, 0xe7, 0xe6, 0x00, 0x00, 
-	0x00, 0x01, 0x3a, 0x80, 0x00, 0x01, 0x39, 0x00, 
-	0x00, 0x01, 0x39, 0x80, 0x00, 0x01, 0x3b, 0x80, 
-	0x00, 0x01, 0x3b, 0x40, 0x00, 0x01, 0x3b, 0x00, 
-	0xb5, 0xf0, 0x1c, 0x17, 0x06, 0x1a, 0x0e, 0x12, 
-	0xb0, 0x82, 0x92, 0x00, 0x1c, 0x04, 0x1c, 0x08, 
-	0x1c, 0x0d, 0xb0, 0x81, 0xf7, 0xff, 0xfd, 0x8e, 
-	0x90, 0x00, 0x1c, 0x3a, 0x1c, 0x03, 0xa1, 0x27, 
-	0x48, 0x27, 0xf0, 0x10, 0xf9, 0xe9, 0x2f, 0x00, 
-	0xdd, 0x42, 0x4b, 0x26, 0x18, 0xe0, 0x90, 0x02, 
-	0x68, 0x20, 0x38, 0x02, 0x42, 0xb8, 0xda, 0x01, 
-	0x1c, 0x06, 0xe0, 0x00, 0x1c, 0x3e, 0x42, 0xbe, 
-	0xda, 0x01, 0x22, 0x01, 0xe0, 0x00, 0x22, 0x00, 
-	0x98, 0x02, 0x9b, 0x00, 0x1c, 0x21, 0xf7, 0xff, 
-	0xfe, 0x47, 0x9a, 0x01, 0xb4, 0x04, 0x22, 0x00, 
-	0x99, 0x03, 0x1c, 0x20, 0x1c, 0xb3, 0xf7, 0xff, 
-	0xfe, 0x88, 0xb0, 0x01, 0x28, 0x00, 0xda, 0x05, 
-	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0x80, 0x19, 0x00, 
-	0x4b, 0x13, 0x18, 0xc0, 0x68, 0x80, 0x69, 0x40, 
-	0x68, 0x21, 0x43, 0x48, 0x30, 0x02, 0x19, 0x81, 
-	0x23, 0x01, 0x04, 0x1b, 0x42, 0x99, 0xdd, 0x05, 
-	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x18, 0x20, 0x30, 0x08, 
-	0x1c, 0x29, 0x1c, 0x32, 0xf0, 0x10, 0xf8, 0xda, 
-	0x1b, 0xbf, 0x19, 0xad, 0x2f, 0x00, 0xdc, 0xbf, 
-	0x20, 0x00, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x63, 0x69, 0x3a, 0x00, 
-	0x2e, 0x00, 0x85, 0xcc, 0x00, 0x01, 0x38, 0x08, 
-	0x00, 0x01, 0x39, 0x00, 0xb5, 0xf3, 0xb0, 0x83, 
-	0x1c, 0x07, 0x99, 0x04, 0x00, 0x88, 0x19, 0xc0, 
-	0x4b, 0x2f, 0x18, 0xc0, 0x90, 0x02, 0x68, 0x84, 
-	0x4b, 0x2e, 0x18, 0xfb, 0x93, 0x01, 0x2c, 0x00, 
-	0xd0, 0x46, 0x25, 0x00, 0x7c, 0x26, 0x69, 0x60, 
-	0x68, 0x39, 0x43, 0x48, 0x7c, 0x61, 0x23, 0x80, 
-	0x40, 0x19, 0x91, 0x00, 0x30, 0x02, 0x19, 0x81, 
-	0x02, 0x5b, 0x39, 0x02, 0x42, 0x99, 0xdd, 0x04, 
-	0xb0, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x18, 0x38, 0x1d, 0xc1, 0x31, 0x01, 
-	0x19, 0x78, 0x1e, 0xb2, 0x4b, 0x20, 0x18, 0xc0, 
-	0xf0, 0x10, 0xf8, 0x9c, 0x19, 0xa8, 0x1e, 0x85, 
-	0x68, 0xa0, 0x42, 0xa0, 0xd0, 0x04, 0x1c, 0x04, 
-	0xd0, 0x02, 0x99, 0x00, 0x29, 0x00, 0xd1, 0xd9, 
-	0x23, 0x01, 0x02, 0xdb, 0x42, 0x9d, 0xda, 0x1b, 
-	0x9b, 0x01, 0x68, 0xda, 0x4b, 0x16, 0x18, 0xf8, 
-	0x9b, 0x01, 0x69, 0x9b, 0x1c, 0x29, 0xf0, 0x10, 
-	0xf8, 0x2d, 0x28, 0x00, 0xd1, 0x18, 0x98, 0x02, 
-	0x68, 0x81, 0x29, 0x00, 0xd0, 0x0c, 0x7c, 0x48, 
-	0x24, 0x80, 0x40, 0x04, 0x22, 0x01, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfe, 0xd5, 0x98, 0x02, 0x68, 0x81, 
-	0x29, 0x00, 0xd0, 0x01, 0x2c, 0x00, 0xd1, 0xf2, 
-	0x99, 0x04, 0x1c, 0x48, 0xd5, 0x06, 0x42, 0x40, 
-	0x06, 0xc0, 0x0e, 0xc0, 0x42, 0x40, 0xe0, 0x03, 
-	0xb0, 0x03, 0xe7, 0xbe, 0x06, 0xc0, 0x0e, 0xc0, 
-	0x9b, 0x01, 0x72, 0x58, 0xb0, 0x03, 0xe7, 0xb8, 
-	0x00, 0x01, 0x3a, 0x80, 0x00, 0x01, 0x3b, 0x80, 
-	0x00, 0x01, 0x30, 0x08, 0xb5, 0xf0, 0x21, 0x00, 
-	0x4b, 0x24, 0x18, 0xc4, 0x7a, 0xe7, 0x7a, 0xa2, 
-	0x25, 0x00, 0x2a, 0x00, 0xd1, 0x03, 0x1c, 0x28, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x22, 0x00, 
-	0xe0, 0x1e, 0x00, 0x7b, 0x18, 0x1e, 0x4b, 0x1e, 
-	0x18, 0xf6, 0x23, 0x08, 0x5e, 0xf3, 0x2b, 0x00, 
-	0xdb, 0x0c, 0x00, 0xbb, 0x18, 0x1e, 0x23, 0x9d, 
-	0x02, 0x5b, 0x18, 0xf3, 0x68, 0x9b, 0x2b, 0x00, 
-	0xd0, 0x04, 0x7c, 0x5e, 0x0a, 0x33, 0xd2, 0x01, 
-	0x21, 0x01, 0xe0, 0x09, 0x37, 0x01, 0xd5, 0x04, 
-	0x42, 0x7f, 0x06, 0xff, 0x0e, 0xff, 0x42, 0x7f, 
-	0xe0, 0x01, 0x06, 0xff, 0x0e, 0xff, 0x32, 0x01, 
-	0x2a, 0x20, 0xda, 0x01, 0x29, 0x00, 0xd0, 0xdc, 
-	0x29, 0x00, 0xd1, 0x04, 0x72, 0xe5, 0x1c, 0x28, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x72, 0xe7, 
-	0x1c, 0x39, 0xf7, 0xff, 0xff, 0x57, 0x1c, 0x78, 
-	0xd5, 0x04, 0x42, 0x40, 0x06, 0xc0, 0x0e, 0xc0, 
-	0x42, 0x40, 0xe0, 0x01, 0x06, 0xc0, 0x0e, 0xc0, 
-	0x72, 0xe0, 0x20, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x00, 0x01, 0x3b, 0x80, 
-	0x00, 0x01, 0x3b, 0x40, 0xb5, 0xb0, 0x78, 0x0b, 
-	0x1c, 0x14, 0x1c, 0x05, 0x1c, 0x0f, 0xa1, 0x0c, 
-	0x48, 0x0c, 0xf0, 0x10, 0xf8, 0xd1, 0x78, 0x3a, 
-	0xb4, 0x04, 0x22, 0x01, 0x1c, 0x28, 0x1c, 0x39, 
-	0x1c, 0x23, 0xf7, 0xff, 0xfd, 0x86, 0xb0, 0x01, 
-	0x28, 0x00, 0xda, 0x04, 0x20, 0x00, 0x43, 0xc0, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x63, 0x69, 0x3a, 0x00, 0x2e, 0x00, 0x85, 0xcc, 
-	0xb5, 0xf0, 0x1c, 0x07, 0x4b, 0x2a, 0x18, 0xc4, 
-	0x7a, 0x65, 0x7a, 0x20, 0x28, 0x00, 0xd1, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 
-	0x43, 0xc1, 0xe0, 0x09, 0x35, 0x01, 0xd5, 0x04, 
-	0x42, 0x6d, 0x06, 0xed, 0x0e, 0xed, 0x42, 0x6d, 
-	0xe0, 0x01, 0x06, 0xed, 0x0e, 0xed, 0x30, 0x01, 
-	0x28, 0x20, 0xda, 0x07, 0x00, 0x6a, 0x19, 0xd2, 
-	0x4b, 0x1e, 0x18, 0xd2, 0x23, 0x08, 0x5e, 0xd2, 
-	0x42, 0x8a, 0xd0, 0xeb, 0x00, 0xa8, 0x19, 0xc0, 
-	0x4b, 0x1b, 0x18, 0xc1, 0x68, 0x89, 0x29, 0x00, 
-	0xd0, 0x10, 0x72, 0x65, 0x4b, 0x19, 0x18, 0xc6, 
-	0x68, 0xb1, 0x69, 0x48, 0x68, 0x3a, 0x43, 0x50, 
-	0x7c, 0x09, 0x18, 0x0a, 0x23, 0x01, 0x04, 0x1b, 
-	0x42, 0x9a, 0xdd, 0x08, 0x20, 0x00, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x72, 0x60, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x18, 0x38, 
-	0x69, 0x22, 0x69, 0x63, 0x30, 0x08, 0xf0, 0x0f, 
-	0xff, 0x4d, 0x22, 0x00, 0x68, 0xb1, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfd, 0xfd, 0x1c, 0x68, 0xd5, 0x04, 
-	0x42, 0x40, 0x06, 0xc0, 0x0e, 0xc0, 0x42, 0x40, 
-	0xe0, 0x01, 0x06, 0xc0, 0x0e, 0xc0, 0x72, 0x60, 
-	0x20, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x00, 0x01, 0x3b, 0x80, 0x00, 0x01, 0x3b, 0x00, 
-	0x00, 0x01, 0x39, 0x00, 0x00, 0x01, 0x39, 0x80, 
-	0xb5, 0xff, 0xb0, 0x8b, 0x9a, 0x0d, 0x1c, 0x1c, 
-	0x1c, 0x0f, 0x2a, 0x02, 0xda, 0x06, 0x20, 0x00, 
-	0x43, 0xc0, 0xb0, 0x0b, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x78, 0x79, 0x91, 0x04, 
-	0x31, 0x02, 0x78, 0x3b, 0x1c, 0x0d, 0x42, 0x83, 
-	0xd0, 0x07, 0x1c, 0x19, 0x1c, 0x02, 0xa0, 0xf9, 
-	0xf0, 0x10, 0xf8, 0x3e, 0x42, 0x68, 0xb0, 0x0b, 
-	0xe7, 0xec, 0x9a, 0x0d, 0x42, 0x91, 0xdd, 0x02, 
-	0x42, 0x68, 0xb0, 0x0b, 0xe7, 0xe6, 0x1d, 0x39, 
-	0x91, 0x0a, 0x1d, 0xe2, 0x32, 0x59, 0x92, 0x09, 
-	0x1d, 0xe6, 0x36, 0x39, 0x28, 0x1d, 0xd0, 0x63, 
-	0xdc, 0x08, 0x28, 0x15, 0xd0, 0x13, 0x28, 0x1a, 
-	0xd0, 0x5f, 0x28, 0x1b, 0xd0, 0x5e, 0x28, 0x1c, 
-	0xd0, 0x5a, 0xe0, 0x7a, 0x28, 0x20, 0xd0, 0x41, 
-	0x1c, 0xbe, 0x28, 0xc0, 0xd0, 0x74, 0x28, 0xc1, 
-	0xd1, 0x73, 0x98, 0x14, 0x28, 0x1b, 0xd0, 0x71, 
-	0x42, 0x68, 0xb0, 0x0b, 0xe7, 0xc6, 0x78, 0xb8, 
-	0x28, 0x05, 0xd0, 0x02, 0x42, 0x68, 0xb0, 0x0b, 
-	0xe7, 0xc0, 0x78, 0xf8, 0x28, 0x00, 0xd0, 0x02, 
-	0x42, 0x68, 0xb0, 0x0b, 0xe7, 0xba, 0x98, 0x04, 
-	0x1e, 0x82, 0x2a, 0x4f, 0xda, 0x04, 0x99, 0x0a, 
-	0x1c, 0x20, 0xf0, 0x0f, 0xff, 0x33, 0xe0, 0x04, 
-	0x22, 0x4f, 0x99, 0x0a, 0x1c, 0x20, 0xf0, 0x0f, 
-	0xff, 0x2d, 0x78, 0xfa, 0x78, 0xb9, 0x9c, 0x0a, 
-	0xa0, 0xe0, 0x1c, 0x23, 0xf0, 0x0f, 0xff, 0xf4, 
-	0x98, 0x04, 0x18, 0x38, 0x1c, 0x47, 0x42, 0xa7, 
-	0xd9, 0x0c, 0x1c, 0x20, 0xf0, 0x0f, 0xff, 0x62, 
-	0x19, 0x00, 0x1c, 0x44, 0x42, 0xa7, 0xd9, 0x03, 
-	0x1c, 0x21, 0xa0, 0xdd, 0xf0, 0x0f, 0xff, 0xe4, 
-	0x42, 0xa7, 0xd8, 0xf2, 0xa0, 0xd4, 0xf0, 0x0f, 
-	0xff, 0xdf, 0xe0, 0xe3, 0x98, 0x04, 0x28, 0x04, 
-	0xd0, 0x02, 0x42, 0x68, 0xb0, 0x0b, 0xe7, 0x89, 
-	0x78, 0xf8, 0x02, 0x00, 0x78, 0xb9, 0x43, 0x08, 
-	0x82, 0x30, 0x79, 0x78, 0x02, 0x00, 0x79, 0x39, 
-	0x43, 0x08, 0x82, 0x70, 0x8a, 0x72, 0x8a, 0x31, 
-	0xa0, 0xd1, 0xf0, 0x0f, 0xff, 0xc9, 0xe0, 0xcd, 
-	0xe2, 0x17, 0xe0, 0x00, 0xe0, 0x62, 0x78, 0xb8, 
-	0x07, 0x80, 0x0f, 0x80, 0x30, 0x01, 0x75, 0x30, 
-	0x78, 0xb8, 0x08, 0x80, 0x07, 0x00, 0x0f, 0x00, 
-	0x30, 0x01, 0x75, 0x70, 0x78, 0xf8, 0x9a, 0x09, 
-	0x73, 0x10, 0x20, 0x00, 0x65, 0xa0, 0x7d, 0x31, 
-	0x29, 0x00, 0xdd, 0x0e, 0x18, 0x39, 0x79, 0x09, 
-	0x00, 0xc2, 0x40, 0x91, 0x6d, 0xa2, 0x43, 0x11, 
-	0x65, 0xa1, 0x7d, 0x31, 0x30, 0x01, 0xe0, 0x02, 
-	0xe1, 0x02, 0xe1, 0xf9, 0xe1, 0x4b, 0x42, 0x81, 
-	0xdc, 0xf0, 0x7d, 0x30, 0x30, 0x04, 0x90, 0x03, 
-	0x7d, 0x72, 0x18, 0x39, 0x1d, 0xe0, 0x30, 0x55, 
-	0xf0, 0x0f, 0xfe, 0xcc, 0x7d, 0x70, 0x99, 0x03, 
-	0x18, 0x40, 0x90, 0x03, 0x6d, 0xa1, 0xa0, 0xbc, 
-	0xf0, 0x0f, 0xff, 0x92, 0x7d, 0x70, 0x28, 0x00, 
-	0xd0, 0x17, 0xa0, 0xbf, 0xf0, 0x0f, 0xff, 0x8c, 
-	0x21, 0x00, 0x91, 0x02, 0x7d, 0x70, 0x28, 0x00, 
-	0xdd, 0x0c, 0x99, 0x02, 0x18, 0x60, 0x30, 0x40, 
-	0x7f, 0x01, 0xa0, 0xbc, 0xf0, 0x0f, 0xff, 0x80, 
-	0x99, 0x02, 0x31, 0x01, 0x91, 0x02, 0x7d, 0x70, 
-	0x42, 0x88, 0xdc, 0xf2, 0xa0, 0xb9, 0xf0, 0x0f, 
-	0xff, 0x77, 0x9a, 0x09, 0x7b, 0x11, 0xa0, 0xb8, 
-	0xf0, 0x0f, 0xff, 0x72, 0x22, 0x1a, 0xb4, 0x04, 
-	0x98, 0x04, 0x9a, 0x0e, 0x1a, 0x12, 0x18, 0x39, 
-	0x20, 0xc0, 0x1c, 0x23, 0xf7, 0xff, 0xff, 0x10, 
-	0xb0, 0x01, 0x28, 0x00, 0xda, 0x6a, 0x42, 0x68, 
-	0xb0, 0x0b, 0xe7, 0x13, 0x78, 0xb8, 0x06, 0x86, 
-	0x0e, 0xb6, 0x1c, 0x31, 0xa0, 0xb1, 0xf0, 0x0f, 
-	0xff, 0x5b, 0x9a, 0x09, 0x7b, 0x10, 0x42, 0xb0, 
-	0xd1, 0x01, 0x22, 0x01, 0x67, 0x62, 0x78, 0xb8, 
-	0x23, 0xc0, 0x40, 0x18, 0x28, 0xc0, 0xd0, 0x02, 
-	0x1c, 0x28, 0xb0, 0x0b, 0xe6, 0xfe, 0x2e, 0x00, 
-	0xd1, 0x02, 0x1c, 0x28, 0xb0, 0x0b, 0xe6, 0xf9, 
-	0x78, 0xf8, 0x28, 0x04, 0xd0, 0x02, 0x1c, 0x28, 
-	0xb0, 0x0b, 0xe6, 0xf3, 0x79, 0x38, 0x90, 0x08, 
-	0x23, 0x0b, 0x40, 0x18, 0x28, 0x09, 0xda, 0x02, 
-	0x1c, 0x28, 0xb0, 0x0b, 0xe6, 0xea, 0x20, 0x00, 
-	0x21, 0x00, 0x79, 0x7a, 0x92, 0x07, 0x9a, 0x07, 
-	0x40, 0xca, 0x08, 0x52, 0xd3, 0x05, 0x30, 0x01, 
-	0x18, 0x3a, 0x79, 0x52, 0x0a, 0x12, 0xd3, 0x00, 
-	0x30, 0x01, 0x31, 0x01, 0x29, 0x08, 0xdb, 0xf2, 
-	0x1c, 0x41, 0x98, 0x08, 0x08, 0xc0, 0xd3, 0x22, 
-	0x20, 0x00, 0x18, 0x7a, 0x79, 0x52, 0x92, 0x06, 
-	0x07, 0x92, 0xd0, 0x0a, 0x19, 0xca, 0x79, 0x92, 
-	0x0a, 0x12, 0xd3, 0x05, 0x30, 0x01, 0x18, 0x0a, 
-	0x19, 0xd2, 0x79, 0x92, 0x0a, 0x12, 0xd2, 0xf9, 
-	0x30, 0x01, 0x9a, 0x06, 0x08, 0x92, 0x07, 0x52, 
-	0xd0, 0x0b, 0x18, 0x0a, 0x19, 0xd2, 0x79, 0x92, 
-	0x0a, 0x12, 0xd3, 0x05, 0x30, 0x01, 0x18, 0x0a, 
-	0x19, 0xd2, 0x79, 0x92, 0x0a, 0x12, 0xd2, 0xf9, 
-	0x30, 0x01, 0x18, 0x08, 0x1c, 0x41, 0x18, 0x78, 
-	0x79, 0x40, 0x28, 0x22, 0xd0, 0x03, 0x1c, 0x28, 
-	0xb0, 0x0b, 0xe6, 0xab, 0xe1, 0x49, 0x1c, 0x48, 
-	0x99, 0x08, 0x09, 0x49, 0xd3, 0x05, 0x18, 0x39, 
-	0x79, 0x49, 0x09, 0x49, 0xd3, 0x00, 0x30, 0x02, 
-	0x30, 0x01, 0x99, 0x08, 0x09, 0x49, 0x07, 0x49, 
-	0xd0, 0x1b, 0x22, 0x00, 0x92, 0x01, 0x92, 0x00, 
-	0x18, 0x39, 0x79, 0x49, 0x91, 0x05, 0x08, 0xc9, 
-	0x07, 0x89, 0x0f, 0x89, 0xd0, 0x03, 0x22, 0x01, 
-	0x39, 0x01, 0x40, 0x8a, 0x92, 0x01, 0x99, 0x05, 
-	0x09, 0x49, 0x07, 0x89, 0x0f, 0x89, 0xd0, 0x03, 
-	0x22, 0x01, 0x39, 0x01, 0x40, 0x8a, 0x92, 0x00, 
-	0x99, 0x00, 0x9a, 0x01, 0x18, 0x51, 0x18, 0x08, 
-	0x30, 0x01, 0x1d, 0x41, 0x91, 0x03, 0x22, 0x1b, 
-	0xb4, 0x04, 0x99, 0x04, 0x9a, 0x0e, 0x1a, 0x52, 
-	0x18, 0x79, 0x20, 0xc0, 0x1c, 0x23, 0xf7, 0xff, 
-	0xfe, 0x6b, 0xb0, 0x01, 0x28, 0x00, 0xda, 0x02, 
-	0x42, 0x68, 0xb0, 0x0b, 0xe6, 0x6e, 0x99, 0x03, 
-	0x18, 0x08, 0x22, 0x1b, 0xb4, 0x04, 0x9a, 0x0e, 
-	0x1a, 0x12, 0x18, 0x39, 0x20, 0xc1, 0x1c, 0x23, 
-	0xf7, 0xff, 0xfe, 0x5a, 0xb0, 0x01, 0x28, 0x00, 
-	0xda, 0x02, 0x42, 0x68, 0xb0, 0x0b, 0xe6, 0x5d, 
-	0x9a, 0x09, 0x74, 0x96, 0x9a, 0x09, 0x7c, 0x91, 
-	0xa0, 0x5d, 0xf0, 0x0f, 0xfe, 0xa5, 0xe0, 0xf4, 
-	0x98, 0x14, 0x28, 0x1a, 0xd1, 0x2f, 0x98, 0x04, 
-	0x28, 0x0e, 0xd0, 0x02, 0x42, 0x68, 0xb0, 0x0b, 
-	0xe6, 0x4c, 0x78, 0xb8, 0x28, 0x41, 0xd1, 0x02, 
-	0x78, 0xf8, 0x28, 0x02, 0xd0, 0x02, 0x42, 0x68, 
-	0xb0, 0x0b, 0xe6, 0x43, 0xa0, 0x5a, 0xf0, 0x0f, 
-	0xfe, 0x05, 0x99, 0x0a, 0x1c, 0x02, 0xa0, 0x58, 
-	0xf0, 0x0f, 0xfe, 0xba, 0x28, 0x00, 0xd0, 0x02, 
-	0x42, 0x68, 0xb0, 0x0b, 0xe6, 0x36, 0xa0, 0x54, 
-	0xf0, 0x0f, 0xfd, 0xf8, 0x19, 0xc0, 0x1d, 0x01, 
-	0x1d, 0xe0, 0x30, 0x66, 0x22, 0x04, 0x1c, 0x07, 
-	0xf0, 0x0f, 0xfe, 0x2c, 0x20, 0x00, 0x9a, 0x09, 
-	0x74, 0x50, 0x1c, 0x3a, 0xa1, 0x4c, 0xa0, 0x4f, 
-	0xf0, 0x0f, 0xfe, 0x72, 0xe0, 0xc1, 0x98, 0x14, 
-	0x28, 0x1b, 0xd1, 0x11, 0xa0, 0x4f, 0xf0, 0x0f, 
-	0xfd, 0xe1, 0x1c, 0x31, 0x1c, 0x02, 0xa0, 0x4d, 
-	0xf0, 0x0f, 0xfe, 0x96, 0x28, 0x00, 0xd0, 0x02, 
-	0x42, 0x68, 0xb0, 0x0b, 0xe6, 0x12, 0xa1, 0x49, 
-	0xa0, 0x4b, 0xf0, 0x0f, 0xfe, 0x5d, 0xe0, 0xac, 
-	0x42, 0x68, 0xb0, 0x0b, 0xe6, 0x0a, 0xa0, 0x4c, 
-	0xf0, 0x0f, 0xfd, 0xcc, 0x1c, 0x31, 0x1c, 0x02, 
-	0xa0, 0x49, 0xf0, 0x0f, 0xfe, 0x81, 0x28, 0x00, 
-	0xe0, 0x96, 0x00, 0x00, 0x74, 0x75, 0x70, 0x6c, 
-	0x65, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x20, 
-	0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x20, 0x74, 
-	0x75, 0x70, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x30, 
-	0x78, 0x25, 0x30, 0x32, 0x78, 0x20, 0x6e, 0x6f, 
-	0x74, 0x20, 0x30, 0x78, 0x25, 0x30, 0x32, 0x78, 
-	0x0a, 0x00, 0x00, 0x00, 0x76, 0x65, 0x72, 0x73, 
-	0x5f, 0x31, 0x3a, 0x20, 0x25, 0x64, 0x2e, 0x25, 
-	0x64, 0x2c, 0x20, 0x25, 0x73, 0x00, 0x00, 0x00, 
-	0x2c, 0x20, 0x25, 0x73, 0x00, 0x00, 0x00, 0x00, 
-	0x6d, 0x61, 0x6e, 0x66, 0x69, 0x64, 0x3a, 0x20, 
-	0x30, 0x78, 0x25, 0x30, 0x34, 0x78, 0x20, 0x20, 
-	0x30, 0x78, 0x25, 0x30, 0x34, 0x78, 0x0a, 0x00, 
-	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x62, 
-	0x61, 0x73, 0x65, 0x3a, 0x20, 0x30, 0x78, 0x25, 
-	0x30, 0x34, 0x78, 0x20, 0x00, 0x00, 0x00, 0x00, 
-	0x6d, 0x61, 0x73, 0x6b, 0x3a, 0x20, 0x30, 0x78, 
-	0x00, 0x00, 0x00, 0x00, 0x25, 0x30, 0x32, 0x78, 
-	0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 
-	0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x64, 
-	0x65, 0x78, 0x3a, 0x20, 0x30, 0x78, 0x25, 0x30, 
-	0x32, 0x78, 0x0a, 0x00, 0x63, 0x6f, 0x6e, 0x66, 
-	0x69, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 
-	0x20, 0x6e, 0x62, 0x3a, 0x20, 0x30, 0x78, 0x25, 
-	0x30, 0x32, 0x78, 0x0a, 0x00, 0x00, 0x00, 0x00, 
-	0x63, 0x66, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 
-	0x65, 0x20, 0x63, 0x6f, 0x72, 0x20, 0x76, 0x61, 
-	0x6c, 0x75, 0x65, 0x3a, 0x20, 0x30, 0x78, 0x25, 
-	0x30, 0x32, 0x78, 0x20, 0x0a, 0x00, 0x00, 0x00, 
-	0x44, 0x56, 0x42, 0x5f, 0x43, 0x49, 0x5f, 0x56, 
-	0x00, 0x00, 0x00, 0x00, 0x76, 0x65, 0x72, 0x73, 
-	0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x25, 0x73, 0x25, 
-	0x73, 0x0a, 0x00, 0x00, 0x44, 0x56, 0x42, 0x5f, 
-	0x48, 0x4f, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 
-	0x73, 0x74, 0x63, 0x65, 0x5f, 0x65, 0x76, 0x3a, 
-	0x20, 0x25, 0x73, 0x0a, 0x00, 0x00, 0x00, 0x00, 
-	0x44, 0x56, 0x42, 0x5f, 0x43, 0x49, 0x5f, 0x4d, 
-	0x4f, 0x44, 0x55, 0x4c, 0x45, 0x00, 0x00, 0x00, 
-	0xd0, 0x02, 0x42, 0x68, 0xb0, 0x0b, 0xe5, 0x65, 
-	0x46, 0x79, 0x39, 0x1c, 0xa0, 0x04, 0xf0, 0x0f, 
-	0xfd, 0xaf, 0x1c, 0x28, 0xb0, 0x0b, 0xe5, 0x5d, 
-	0x1c, 0x28, 0xb0, 0x0b, 0xe5, 0x5a, 0x00, 0x00, 
-	0x73, 0x74, 0x63, 0x65, 0x5f, 0x70, 0x64, 0x3a, 
-	0x20, 0x25, 0x73, 0x0a, 0x00, 0x00, 0x00, 0x00, 
-	0xb5, 0xf0, 0x26, 0x00, 0x1c, 0x04, 0x20, 0x00, 
-	0x67, 0x60, 0x1c, 0x0d, 0x1c, 0x17, 0xe0, 0x00, 
-	0x36, 0x01, 0x42, 0xbe, 0xda, 0x02, 0x5d, 0xa8, 
-	0x28, 0x1d, 0xd1, 0xf9, 0x22, 0x00, 0xb4, 0x04, 
-	0x1b, 0xba, 0x19, 0xa9, 0x20, 0x1d, 0x1c, 0x23, 
-	0xf7, 0xff, 0xfd, 0x32, 0xb0, 0x01, 0x28, 0x00, 
-	0xda, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x18, 0x36, 0x22, 0x00, 
-	0xb4, 0x04, 0x1b, 0xba, 0x19, 0xa9, 0x20, 0x1c, 
-	0x1c, 0x23, 0xf7, 0xff, 0xfd, 0x21, 0xb0, 0x01, 
-	0x28, 0x00, 0xda, 0x04, 0x20, 0x00, 0x43, 0xc0, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x18, 0x36, 
-	0x22, 0x00, 0xb4, 0x04, 0x1b, 0xba, 0x19, 0xa9, 
-	0x20, 0x15, 0x1c, 0x23, 0xf7, 0xff, 0xfd, 0x10, 
-	0xb0, 0x01, 0x28, 0x00, 0xda, 0x04, 0x20, 0x00, 
-	0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x18, 0x36, 0x22, 0x00, 0xb4, 0x04, 0x1b, 0xba, 
-	0x19, 0xa9, 0x20, 0x20, 0x1c, 0x23, 0xf7, 0xff, 
-	0xfc, 0xff, 0xb0, 0x01, 0x28, 0x00, 0xda, 0x04, 
-	0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x18, 0x36, 0x22, 0x00, 0xb4, 0x04, 
-	0x1b, 0xba, 0x19, 0xa9, 0x20, 0x1a, 0x1c, 0x23, 
-	0xf7, 0xff, 0xfc, 0xee, 0xb0, 0x01, 0x28, 0x00, 
-	0xda, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x18, 0x36, 0xe0, 0x10, 
-	0x22, 0x00, 0xb4, 0x04, 0x1b, 0xba, 0x19, 0xa9, 
-	0x20, 0x1b, 0x1c, 0x23, 0xf7, 0xff, 0xfc, 0xdc, 
-	0xb0, 0x01, 0x28, 0x00, 0xda, 0x04, 0x20, 0x00, 
-	0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x18, 0x36, 0x42, 0xbe, 0xda, 0x02, 0x6f, 0x60, 
-	0x28, 0x00, 0xd0, 0xe9, 0x22, 0x00, 0xb4, 0x04, 
-	0x1b, 0xba, 0x19, 0xa9, 0x20, 0x14, 0x1c, 0x23, 
-	0xf7, 0xff, 0xfc, 0xc6, 0xb0, 0x01, 0x28, 0x00, 
-	0xda, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf7, 0x06, 0x0e, 
-	0x0e, 0x36, 0xb0, 0x83, 0xf0, 0x0c, 0xfc, 0x40, 
-	0x1c, 0x05, 0xd0, 0x05, 0x00, 0xa8, 0x30, 0x0c, 
-	0xf7, 0xfc, 0xfc, 0x2c, 0x1c, 0x04, 0xd1, 0x01, 
-	0x20, 0x00, 0xe0, 0x22, 0x95, 0x01, 0x1d, 0xe0, 
-	0x30, 0x05, 0x90, 0x02, 0x46, 0x6a, 0xb4, 0x04, 
-	0x25, 0x00, 0x98, 0x04, 0x1c, 0x31, 0xaa, 0x02, 
-	0x1c, 0x2b, 0x1c, 0x27, 0xf0, 0x0c, 0xf9, 0xe6, 
-	0xb0, 0x01, 0x98, 0x00, 0x60, 0x38, 0x28, 0x00, 
-	0xd0, 0x0b, 0x99, 0x05, 0xf0, 0x0c, 0xfb, 0xbc, 
-	0x28, 0x00, 0xd1, 0x02, 0x60, 0x7d, 0x1c, 0x38, 
-	0xe0, 0x07, 0x68, 0x38, 0xa9, 0x01, 0xf0, 0x0c, 
-	0xfa, 0x05, 0x1c, 0x20, 0xf7, 0xfc, 0xfc, 0x28, 
-	0x1c, 0x28, 0xb0, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x9c, 0x0b, 
-	0x9e, 0x09, 0xb0, 0x8b, 0x4a, 0x7c, 0x92, 0x0a, 
-	0x4d, 0x7c, 0x2c, 0x00, 0xd1, 0x0b, 0x20, 0x00, 
-	0x00, 0x81, 0x9a, 0x0a, 0x58, 0x51, 0x29, 0x00, 
-	0xd1, 0x01, 0x1c, 0x04, 0xe0, 0x16, 0x30, 0x01, 
-	0x28, 0x08, 0xdb, 0xf5, 0xe0, 0x12, 0x2c, 0x08, 
-	0xd8, 0x07, 0x3c, 0x01, 0x00, 0xa0, 0x9a, 0x0a, 
-	0x58, 0x10, 0x28, 0x00, 0xd0, 0x0a, 0x20, 0x00, 
-	0xe0, 0xd8, 0x23, 0x20, 0x5e, 0xec, 0x1c, 0x60, 
-	0x84, 0x28, 0x5e, 0xe8, 0x28, 0x00, 0xd1, 0x01, 
-	0x20, 0x64, 0x84, 0x28, 0x98, 0x15, 0x28, 0x00, 
-	0xd0, 0x03, 0x28, 0x01, 0xd1, 0x03, 0x22, 0x01, 
-	0xe0, 0x02, 0x22, 0x00, 0xe0, 0x00, 0x22, 0x03, 
-	0x92, 0x01, 0x1c, 0x30, 0xf0, 0x08, 0xfd, 0xf5, 
-	0x90, 0x00, 0x00, 0x80, 0x30, 0x80, 0xf7, 0xfc, 
-	0xfb, 0xc5, 0x1c, 0x07, 0xd0, 0xdf, 0x98, 0x00, 
-	0x1d, 0xc2, 0x32, 0x79, 0x21, 0x00, 0x1c, 0x38, 
-	0xf0, 0x0f, 0xfc, 0x2e, 0x98, 0x00, 0x60, 0xf8, 
-	0x1d, 0xf8, 0x30, 0x79, 0x61, 0x38, 0x98, 0x0d, 
-	0x86, 0x78, 0x98, 0x0e, 0x86, 0xb8, 0x98, 0x0b, 
-	0x90, 0x02, 0x99, 0x0c, 0x91, 0x03, 0x9a, 0x0d, 
-	0x18, 0x80, 0x38, 0x01, 0x90, 0x04, 0x98, 0x0e, 
-	0x18, 0x08, 0x38, 0x01, 0x90, 0x05, 0xa8, 0x02, 
-	0x1c, 0x31, 0xf0, 0x08, 0xfd, 0xd5, 0x61, 0x78, 
-	0x9a, 0x01, 0x2a, 0x00, 0xd0, 0x0e, 0x2a, 0x01, 
-	0xd1, 0x27, 0x00, 0x80, 0xf7, 0xfc, 0xfb, 0x9a, 
-	0x61, 0xb8, 0x28, 0x00, 0xd0, 0x04, 0x69, 0x79, 
-	0x00, 0x8a, 0x21, 0x00, 0xf0, 0x0f, 0xfc, 0x04, 
-	0x20, 0x01, 0xe0, 0x14, 0x23, 0x28, 0x5e, 0xe8, 
-	0x1c, 0x41, 0x85, 0x29, 0x28, 0x00, 0xd1, 0x01, 
-	0xf7, 0xf7, 0xf8, 0x5e, 0x69, 0x78, 0x00, 0x80, 
-	0xf7, 0xfc, 0xfb, 0xcc, 0x61, 0xb8, 0x28, 0x00, 
-	0xd0, 0x04, 0x69, 0x79, 0x00, 0x8a, 0x21, 0x00, 
-	0xf0, 0x0f, 0xfb, 0xee, 0x20, 0x00, 0x86, 0x38, 
-	0x23, 0x01, 0x03, 0xdb, 0x69, 0xf8, 0x43, 0x18, 
-	0xe0, 0x10, 0x98, 0x15, 0x61, 0xb8, 0x98, 0x15, 
-	0x0e, 0x00, 0x06, 0x00, 0x90, 0x15, 0x23, 0x0d, 
-	0x06, 0x9b, 0x42, 0xd8, 0xd1, 0x01, 0x20, 0x00, 
-	0xe0, 0x00, 0x20, 0x01, 0x86, 0x38, 0x69, 0xf8, 
-	0x4b, 0x33, 0x40, 0x18, 0x61, 0xf8, 0x69, 0xb8, 
-	0x28, 0x00, 0xd1, 0x06, 0x69, 0x78, 0x28, 0x00, 
-	0xd0, 0x03, 0x1c, 0x38, 0xf7, 0xfc, 0xfb, 0x7c, 
-	0xe7, 0x75, 0x68, 0xf8, 0x90, 0x06, 0x69, 0x38, 
-	0x90, 0x07, 0x69, 0x78, 0x90, 0x08, 0x69, 0xb8, 
-	0x90, 0x09, 0xa8, 0x02, 0x1c, 0x21, 0x1d, 0xfa, 
-	0x32, 0x01, 0xb4, 0x07, 0x1c, 0x32, 0xb4, 0x04, 
-	0x20, 0x00, 0x9a, 0x05, 0xa9, 0x0a, 0xab, 0x0c, 
-	0xf0, 0x03, 0xf8, 0xa0, 0xb0, 0x04, 0x28, 0x00, 
-	0xd0, 0x03, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x5f, 
-	0xe7, 0x59, 0x2e, 0x00, 0xd0, 0x09, 0x2e, 0x01, 
-	0xd0, 0x07, 0x2e, 0x02, 0xd0, 0x05, 0x2e, 0x03, 
-	0xd0, 0x03, 0x23, 0x02, 0x69, 0xf8, 0x43, 0x18, 
-	0x61, 0xf8, 0x85, 0xfc, 0x2c, 0x08, 0xd2, 0x02, 
-	0x00, 0xa0, 0x9a, 0x0a, 0x50, 0x17, 0x20, 0x01, 
-	0x24, 0x00, 0x63, 0xf8, 0x63, 0xbc, 0x85, 0xbe, 
-	0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x18, 
-	0x8c, 0xa8, 0x06, 0x01, 0x0e, 0x09, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf8, 0xcb, 0x22, 0x00, 0x21, 0x00, 
-	0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xa0, 0x98, 0x17, 
-	0x60, 0x38, 0x98, 0x17, 0x28, 0x00, 0xd0, 0x06, 
-	0x22, 0x00, 0x21, 0x03, 0x1c, 0x23, 0x9c, 0x17, 
-	0x1c, 0x38, 0xf0, 0x0f, 0xfa, 0xc1, 0x68, 0xb8, 
-	0x60, 0x78, 0x1c, 0x38, 0xb0, 0x0b, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x1a, 0x4c, 0x2e, 0x08, 0x1a, 0x4c, 
-	0xff, 0xff, 0x7f, 0xff, 0xb5, 0x80, 0x1c, 0x07, 
-	0xb0, 0x82, 0x28, 0x00, 0xd0, 0x13, 0x68, 0x78, 
-	0x28, 0x00, 0xd1, 0x10, 0x68, 0xb8, 0x90, 0x00, 
-	0x1d, 0xf8, 0x30, 0x05, 0x90, 0x01, 0x46, 0x69, 
-	0x68, 0x38, 0xf0, 0x0c, 0xf8, 0xe7, 0x22, 0x0c, 
-	0x21, 0x00, 0x1c, 0x38, 0xf0, 0x0f, 0xfb, 0x58, 
-	0x1c, 0x38, 0xf7, 0xfc, 0xfb, 0x05, 0xb0, 0x02, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 
-	0x1c, 0x07, 0xb0, 0x84, 0x28, 0x00, 0xd1, 0x03, 
-	0xb0, 0x04, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x00, 0x23, 0x00, 0x49, 0x22, 0x00, 0x82, 
-	0x58, 0x8c, 0x42, 0xbc, 0xd1, 0x00, 0x50, 0x8b, 
-	0x30, 0x01, 0x28, 0x08, 0xdb, 0xf7, 0x21, 0x00, 
-	0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xc8, 0x68, 0xf8, 
-	0x90, 0x00, 0x69, 0x38, 0x90, 0x01, 0x69, 0x78, 
-	0x90, 0x02, 0x69, 0xb8, 0x90, 0x03, 0x46, 0x68, 
-	0x1d, 0xc2, 0x32, 0x01, 0x46, 0x69, 0x68, 0xb8, 
-	0xf0, 0x03, 0xfb, 0x24, 0x6a, 0x38, 0x28, 0x00, 
-	0xd0, 0x03, 0x68, 0x41, 0x39, 0x01, 0x60, 0x41, 
-	0x30, 0x04, 0x69, 0xf8, 0x0c, 0x00, 0xd3, 0x16, 
-	0x23, 0x30, 0x5e, 0xf8, 0x28, 0x00, 0xd1, 0x0d, 
-	0x69, 0xb8, 0xf7, 0xfc, 0xfa, 0xf9, 0x48, 0x0d, 
-	0x8d, 0x01, 0x39, 0x01, 0x04, 0x09, 0x14, 0x09, 
-	0x85, 0x01, 0xd1, 0x08, 0x20, 0xff, 0xf7, 0xf6, 
-	0xff, 0x73, 0xe0, 0x04, 0x28, 0x01, 0xd1, 0x02, 
-	0x69, 0xb8, 0xf7, 0xfc, 0xfa, 0xb9, 0x22, 0x80, 
-	0x21, 0x00, 0x1c, 0x38, 0xf0, 0x0f, 0xfb, 0x04, 
-	0x1c, 0x38, 0xf7, 0xfc, 0xfa, 0xb1, 0xe7, 0xb3, 
-	0x2e, 0x08, 0x1a, 0x4c, 0x2e, 0x08, 0x1a, 0x4c, 
-	0x28, 0x00, 0xd0, 0x08, 0x28, 0x01, 0xd0, 0x08, 
-	0x28, 0x02, 0xd0, 0x08, 0x28, 0x03, 0xd1, 0x08, 
-	0x20, 0xff, 0x30, 0x01, 0x47, 0x70, 0x20, 0x02, 
-	0x47, 0x70, 0x20, 0x04, 0x47, 0x70, 0x20, 0x10, 
-	0x47, 0x70, 0x20, 0x00, 0x47, 0x70, 0xb5, 0x90, 
-	0x1c, 0x07, 0x06, 0x08, 0x0e, 0x00, 0x06, 0x14, 
-	0x0e, 0x24, 0x28, 0x00, 0xd0, 0x0a, 0x21, 0x03, 
-	0x68, 0xb8, 0xf0, 0x04, 0xfc, 0x1f, 0x68, 0xb8, 
-	0x1c, 0x21, 0xf0, 0x04, 0xfc, 0xc7, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 0x68, 0xb8, 
-	0xf0, 0x04, 0xfc, 0x14, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x00, 0x06, 0x09, 0xd0, 0x02, 
-	0x68, 0x80, 0x21, 0x02, 0xe0, 0x01, 0x68, 0x80, 
-	0x21, 0x00, 0xf0, 0x04, 0xfc, 0x07, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x00, 0x06, 0x09, 0x0e, 0x09, 
-	0x28, 0x00, 0xd0, 0x02, 0x68, 0x80, 0xf0, 0x04, 
-	0xfe, 0x0d, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xb0, 
-	0x23, 0x05, 0x43, 0x18, 0x4d, 0x08, 0x84, 0xa8, 
-	0x27, 0x00, 0x4c, 0x08, 0x00, 0xb8, 0x58, 0x20, 
-	0x8c, 0xa9, 0x06, 0x09, 0x0e, 0x09, 0xf7, 0xff, 
-	0xff, 0xe8, 0x37, 0x01, 0x2f, 0x08, 0xdb, 0xf5, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x1a, 0x4c, 0x2e, 0x08, 0x1a, 0x4c, 
-	0x48, 0x01, 0x23, 0x24, 0x5e, 0xc0, 0x47, 0x70, 
-	0x2e, 0x08, 0x1a, 0x4c, 0xb5, 0x90, 0x1c, 0x04, 
-	0x1c, 0x0f, 0x28, 0x00, 0xd0, 0x15, 0x6a, 0x20, 
-	0x28, 0x00, 0xd0, 0x06, 0x42, 0xb8, 0xd0, 0x10, 
-	0x68, 0x41, 0x39, 0x01, 0x60, 0x41, 0x20, 0x00, 
-	0x62, 0x20, 0x2f, 0x00, 0xd0, 0x09, 0x68, 0xa0, 
-	0x68, 0x39, 0xf0, 0x0c, 0xf8, 0x19, 0x28, 0x00, 
-	0xd1, 0x03, 0x62, 0x27, 0x68, 0x78, 0x30, 0x01, 
-	0x60, 0x78, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0x00, 0x06, 0x09, 0xd0, 0x01, 0x21, 0x01, 
-	0xe0, 0x00, 0x21, 0x00, 0x68, 0x80, 0xf0, 0x04, 
-	0xfd, 0x0d, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 
-	0x1c, 0x07, 0x1c, 0x0c, 0xd0, 0x01, 0x21, 0x01, 
-	0xe0, 0x00, 0x21, 0x00, 0x68, 0xb8, 0xf0, 0x04, 
-	0xf8, 0xa5, 0x2c, 0x00, 0xd0, 0x03, 0x23, 0x01, 
-	0x69, 0xf8, 0x43, 0x18, 0xe0, 0x02, 0x69, 0xf8, 
-	0x08, 0x40, 0x00, 0x40, 0x61, 0xf8, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, 0x21, 0x07, 
-	0x07, 0x09, 0x63, 0x88, 0x47, 0x70, 0x00, 0x00, 
-	0xb5, 0x90, 0x9c, 0x03, 0x9f, 0x04, 0xb0, 0x85, 
-	0x91, 0x00, 0x92, 0x01, 0x93, 0x02, 0x94, 0x03, 
-	0x97, 0x04, 0x68, 0x80, 0x46, 0x69, 0xf0, 0x0a, 
-	0xff, 0x69, 0xb0, 0x05, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0xff, 0xb0, 0x86, 0x98, 0x06, 
-	0x6a, 0x40, 0x68, 0xc3, 0x93, 0x05, 0x98, 0x06, 
-	0x6b, 0xc0, 0x01, 0x80, 0x06, 0x05, 0x0e, 0x2d, 
-	0x95, 0x00, 0x68, 0x18, 0x01, 0x00, 0x30, 0x1f, 
-	0x09, 0x40, 0x01, 0x40, 0x08, 0xc0, 0x90, 0x04, 
-	0x99, 0x07, 0x68, 0x48, 0x99, 0x04, 0x43, 0x48, 
-	0x99, 0x07, 0x68, 0x09, 0x08, 0xc9, 0x18, 0x0f, 
-	0x97, 0x03, 0x21, 0x00, 0x91, 0x02, 0x9b, 0x05, 
-	0x68, 0x58, 0x28, 0x00, 0xdd, 0x5e, 0x23, 0x32, 
-	0x98, 0x06, 0x5e, 0xc0, 0x9b, 0x09, 0x43, 0x58, 
-	0x9a, 0x08, 0x18, 0x81, 0x1c, 0x08, 0xd5, 0x00, 
-	0x30, 0x03, 0x10, 0x80, 0x29, 0x00, 0xda, 0x04, 
-	0x42, 0x49, 0x07, 0x89, 0x0f, 0x89, 0x42, 0x49, 
-	0xe0, 0x01, 0x07, 0x89, 0x0f, 0x89, 0x00, 0x4a, 
-	0x9d, 0x00, 0x41, 0x15, 0x1c, 0x2b, 0x06, 0x2d, 
-	0x0e, 0x2d, 0x27, 0xc0, 0x40, 0xd7, 0x06, 0x3a, 
-	0x0e, 0x12, 0x9b, 0x06, 0x69, 0x9b, 0x18, 0x18, 
-	0x9b, 0x05, 0x9f, 0x03, 0x19, 0xdb, 0x33, 0x88, 
-	0x78, 0x1f, 0x33, 0x01, 0x93, 0x01, 0x24, 0x00, 
-	0x9b, 0x07, 0x68, 0x9b, 0x2b, 0x00, 0xd9, 0x23, 
-	0x0a, 0x3b, 0xd3, 0x05, 0x78, 0x03, 0x43, 0x93, 
-	0x70, 0x03, 0x78, 0x03, 0x43, 0x2b, 0x70, 0x03, 
-	0x31, 0x01, 0x29, 0x03, 0xdd, 0x04, 0x22, 0xc0, 
-	0x21, 0x00, 0x9d, 0x00, 0x30, 0x01, 0xe0, 0x05, 
-	0x10, 0x92, 0x06, 0x12, 0x0e, 0x12, 0x10, 0xab, 
-	0x06, 0x1d, 0x0e, 0x2d, 0x00, 0x7b, 0x06, 0x1f, 
-	0x0e, 0x3f, 0x34, 0x01, 0x07, 0x63, 0xd1, 0x03, 
-	0x9b, 0x01, 0x78, 0x1f, 0x33, 0x01, 0x93, 0x01, 
-	0x9b, 0x07, 0x68, 0x9b, 0x42, 0xa3, 0xd8, 0xdb, 
-	0x98, 0x04, 0x9f, 0x03, 0x18, 0x3f, 0x97, 0x03, 
-	0x9b, 0x09, 0x33, 0x01, 0x93, 0x09, 0x99, 0x02, 
-	0x31, 0x01, 0x91, 0x02, 0x9b, 0x05, 0x68, 0x58, 
-	0x42, 0x88, 0xdc, 0xa0, 0xb0, 0x06, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 
-	0xb0, 0x86, 0x98, 0x06, 0x6a, 0x40, 0x68, 0xc3, 
-	0x93, 0x05, 0x98, 0x06, 0x6b, 0xc0, 0x07, 0x06, 
-	0x0f, 0x36, 0x96, 0x00, 0x01, 0x30, 0x06, 0x06, 
-	0x0e, 0x36, 0x96, 0x01, 0x68, 0x18, 0x01, 0x00, 
-	0x30, 0x1f, 0x09, 0x40, 0x01, 0x40, 0x08, 0xc0, 
-	0x90, 0x04, 0x68, 0x48, 0x9a, 0x04, 0x43, 0x50, 
-	0x68, 0x0a, 0x08, 0xd2, 0x18, 0x17, 0x97, 0x03, 
-	0x22, 0x00, 0x92, 0x02, 0x9b, 0x05, 0x68, 0x58, 
-	0x28, 0x00, 0xdd, 0x48, 0x23, 0x32, 0x98, 0x06, 
-	0x5e, 0xc0, 0x9b, 0x09, 0x43, 0x58, 0x9a, 0x08, 
-	0x18, 0x82, 0x1c, 0x10, 0xd5, 0x00, 0x30, 0x01, 
-	0x10, 0x40, 0x9b, 0x06, 0x69, 0x9b, 0x18, 0x18, 
-	0x9b, 0x05, 0x9f, 0x03, 0x19, 0xdb, 0x1d, 0xdd, 
-	0x35, 0x81, 0x78, 0x2f, 0x24, 0x00, 0x68, 0x8b, 
-	0x35, 0x01, 0x2b, 0x00, 0xd9, 0x21, 0x0a, 0x3b, 
-	0xd3, 0x10, 0x08, 0x53, 0xd3, 0x06, 0x78, 0x06, 
-	0x23, 0xf0, 0x40, 0x33, 0x70, 0x03, 0x78, 0x03, 
-	0x9e, 0x00, 0xe0, 0x05, 0x78, 0x03, 0x07, 0x1b, 
-	0x0f, 0x1b, 0x70, 0x03, 0x78, 0x03, 0x9e, 0x01, 
-	0x43, 0x33, 0x70, 0x03, 0x32, 0x01, 0x08, 0x53, 
-	0xd2, 0x00, 0x30, 0x01, 0x00, 0x7b, 0x06, 0x1f, 
-	0x0e, 0x3f, 0x34, 0x01, 0x07, 0x63, 0xd1, 0x01, 
-	0x78, 0x2f, 0x35, 0x01, 0x68, 0x8b, 0x42, 0xa3, 
-	0xd8, 0xdd, 0x98, 0x04, 0x9f, 0x03, 0x18, 0x3f, 
-	0x97, 0x03, 0x9b, 0x09, 0x33, 0x01, 0x93, 0x09, 
-	0x9a, 0x02, 0x32, 0x01, 0x92, 0x02, 0x9b, 0x05, 
-	0x68, 0x58, 0x42, 0x90, 0xdc, 0xb6, 0xb0, 0x06, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xff, 0xb0, 0x83, 0x98, 0x03, 0x6a, 0x40, 
-	0x68, 0xc4, 0x98, 0x03, 0x6b, 0xc0, 0x06, 0x03, 
-	0x0e, 0x1b, 0x93, 0x00, 0x68, 0x20, 0x01, 0x00, 
-	0x30, 0x1f, 0x09, 0x40, 0x01, 0x40, 0x08, 0xc2, 
-	0x92, 0x02, 0x68, 0x48, 0x43, 0x50, 0x68, 0x0a, 
-	0x08, 0xd2, 0x18, 0x10, 0x90, 0x01, 0x25, 0x00, 
-	0x68, 0x60, 0x28, 0x00, 0xdd, 0x35, 0x23, 0x32, 
-	0x98, 0x03, 0x5e, 0xc0, 0x9b, 0x06, 0x43, 0x58, 
-	0x9a, 0x05, 0x18, 0x80, 0x9a, 0x03, 0x69, 0x92, 
-	0x18, 0x17, 0x98, 0x01, 0x18, 0x20, 0x1d, 0xc6, 
-	0x36, 0x81, 0x78, 0x32, 0x20, 0x00, 0x68, 0x8b, 
-	0x36, 0x01, 0x2b, 0x00, 0xd9, 0x16, 0x0a, 0x13, 
-	0xd3, 0x01, 0x9b, 0x00, 0x70, 0x3b, 0x00, 0x52, 
-	0x06, 0x12, 0x0e, 0x12, 0xd1, 0x09, 0x1d, 0xc2, 
-	0x32, 0x01, 0x08, 0xd2, 0x00, 0xd2, 0x1a, 0x10, 
-	0x19, 0xc7, 0x1c, 0x10, 0x78, 0x32, 0x36, 0x01, 
-	0xe0, 0x01, 0x30, 0x01, 0x37, 0x01, 0x68, 0x8b, 
-	0x42, 0x83, 0xd8, 0xe8, 0x98, 0x01, 0x9a, 0x02, 
-	0x18, 0x80, 0x90, 0x01, 0x9b, 0x06, 0x33, 0x01, 
-	0x93, 0x06, 0x68, 0x60, 0x35, 0x01, 0x42, 0xa8, 
-	0xdc, 0xc9, 0xb0, 0x03, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x23, 0x2c, 
-	0x1c, 0x07, 0x5e, 0xc0, 0xb0, 0x85, 0x28, 0x01, 
-	0xd0, 0x0f, 0x28, 0x02, 0xd0, 0x07, 0x28, 0x03, 
-	0xd1, 0x11, 0xab, 0x06, 0xcb, 0x0e, 0x1c, 0x38, 
-	0xf7, 0xff, 0xff, 0x9a, 0xe0, 0x5d, 0xab, 0x06, 
-	0xcb, 0x0e, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x23, 
-	0xe0, 0x57, 0xab, 0x06, 0xcb, 0x0e, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfe, 0x97, 0xe0, 0x51, 0x6a, 0x78, 
-	0x68, 0xc0, 0x90, 0x04, 0x68, 0x00, 0x01, 0x00, 
-	0x30, 0x1f, 0x09, 0x40, 0x01, 0x40, 0x08, 0xc0, 
-	0x90, 0x03, 0x99, 0x06, 0x68, 0x48, 0x99, 0x03, 
-	0x43, 0x48, 0x99, 0x06, 0x68, 0x09, 0x08, 0xc9, 
-	0x18, 0x09, 0x91, 0x02, 0x21, 0x00, 0x91, 0x01, 
-	0x98, 0x04, 0x68, 0x40, 0x28, 0x00, 0xdd, 0x38, 
-	0x98, 0x04, 0x99, 0x02, 0x9e, 0x07, 0x18, 0x40, 
-	0x30, 0x88, 0x78, 0x05, 0x30, 0x01, 0x90, 0x00, 
-	0x24, 0x00, 0x99, 0x06, 0x68, 0x88, 0x28, 0x00, 
-	0xd9, 0x1d, 0x0a, 0x28, 0xd3, 0x05, 0x68, 0xb8, 
-	0x6b, 0xfb, 0x9a, 0x08, 0x1c, 0x31, 0xf0, 0x0a, 
-	0xfb, 0x87, 0x00, 0x68, 0x06, 0x05, 0x0e, 0x2d, 
-	0xd1, 0x0b, 0x1d, 0xe0, 0x30, 0x01, 0x08, 0xc0, 
-	0x00, 0xc0, 0x1b, 0x01, 0x19, 0x8e, 0x1c, 0x04, 
-	0x98, 0x00, 0x78, 0x05, 0x30, 0x01, 0x90, 0x00, 
-	0xe0, 0x01, 0x34, 0x01, 0x36, 0x01, 0x99, 0x06, 
-	0x68, 0x88, 0x42, 0xa0, 0xd8, 0xe1, 0x98, 0x03, 
-	0x99, 0x02, 0x18, 0x09, 0x91, 0x02, 0x9a, 0x08, 
-	0x32, 0x01, 0x92, 0x08, 0x99, 0x01, 0x31, 0x01, 
-	0x91, 0x01, 0x98, 0x04, 0x68, 0x40, 0x42, 0x88, 
-	0xdc, 0xc6, 0xb0, 0x05, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x1c, 0x07, 
-	0x20, 0x00, 0xb0, 0x88, 0xf0, 0x08, 0xfa, 0x35, 
-	0x90, 0x06, 0x00, 0x80, 0x30, 0x10, 0x00, 0x80, 
-	0xf7, 0xfc, 0xf8, 0x04, 0x1c, 0x04, 0x20, 0x00, 
-	0x2c, 0x00, 0xd1, 0x03, 0xb0, 0x08, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x1d, 0xe1, 0x31, 0x09, 
-	0x91, 0x07, 0x49, 0x19, 0x68, 0x4b, 0x1c, 0x5a, 
-	0x60, 0x4a, 0x60, 0x63, 0x60, 0xe7, 0x68, 0x39, 
-	0x01, 0x09, 0x31, 0x1f, 0x09, 0x49, 0x01, 0x49, 
-	0x90, 0x00, 0x90, 0x01, 0x1e, 0x48, 0x90, 0x02, 
-	0x68, 0xe0, 0x68, 0x40, 0x00, 0xc0, 0x38, 0x01, 
-	0x90, 0x03, 0x46, 0x68, 0x21, 0x00, 0xf0, 0x08, 
-	0xfa, 0x13, 0x60, 0xa0, 0x68, 0xe0, 0x30, 0x88, 
-	0x90, 0x05, 0x68, 0xa0, 0x90, 0x04, 0x46, 0x68, 
-	0x1c, 0x22, 0x68, 0x61, 0xb4, 0x07, 0x22, 0x00, 
-	0xb4, 0x04, 0x22, 0x01, 0x20, 0x00, 0xa9, 0x0a, 
-	0xab, 0x08, 0xf0, 0x02, 0xfd, 0x2b, 0xb0, 0x04, 
-	0x28, 0x00, 0xd0, 0x03, 0x1c, 0x20, 0xf7, 0xfb, 
-	0xff, 0xeb, 0x24, 0x00, 0x1c, 0x20, 0xe7, 0xc5, 
-	0x2e, 0x08, 0x1a, 0x78, 0xb5, 0x80, 0x1c, 0x07, 
-	0xb0, 0x84, 0x28, 0x00, 0xd0, 0x1a, 0x20, 0x00, 
-	0xf0, 0x08, 0xf9, 0xe7, 0x90, 0x00, 0x1d, 0xf8, 
-	0x30, 0x09, 0x90, 0x01, 0x68, 0xb8, 0x90, 0x02, 
-	0x68, 0xf8, 0x30, 0x88, 0x90, 0x03, 0x46, 0x68, 
-	0x46, 0x69, 0x1d, 0xc2, 0x32, 0x01, 0x68, 0x38, 
-	0xf0, 0x03, 0xf8, 0x18, 0x22, 0x10, 0x21, 0x00, 
-	0x1c, 0x38, 0xf0, 0x0f, 0xf8, 0x19, 0x1c, 0x38, 
-	0xf7, 0xfb, 0xff, 0xc6, 0xb0, 0x04, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x23, 0x32, 
-	0x1c, 0x07, 0x5e, 0xc0, 0x1c, 0x0c, 0x1c, 0x15, 
-	0xb0, 0x8a, 0x42, 0x90, 0xdd, 0x63, 0x6a, 0x78, 
-	0x28, 0x00, 0xd1, 0x0b, 0x4e, 0x38, 0x68, 0x30, 
-	0x28, 0x00, 0xd1, 0x05, 0x48, 0x37, 0xf7, 0xff, 
-	0xff, 0x7d, 0x60, 0x30, 0x28, 0x00, 0xd0, 0x61, 
-	0x68, 0x30, 0x62, 0x78, 0x23, 0x01, 0x6b, 0xb8, 
-	0x6a, 0x79, 0x42, 0xd8, 0xd1, 0x01, 0x22, 0x01, 
-	0xe0, 0x00, 0x22, 0x00, 0x92, 0x01, 0x68, 0xc8, 
-	0x90, 0x00, 0x68, 0x00, 0x90, 0x04, 0x98, 0x00, 
-	0x68, 0x40, 0x90, 0x03, 0x6b, 0xf8, 0x28, 0x01, 
-	0xd1, 0x01, 0x90, 0x02, 0xe0, 0x11, 0x20, 0x00, 
-	0x90, 0x02, 0x9a, 0x01, 0x2a, 0x00, 0xd1, 0x0c, 
-	0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x57, 0x6b, 0xba, 
-	0x99, 0x03, 0xb4, 0x06, 0x1c, 0x03, 0x9a, 0x0f, 
-	0x1c, 0x38, 0x1c, 0x29, 0xf7, 0xff, 0xfd, 0x80, 
-	0xb0, 0x02, 0x99, 0x03, 0x91, 0x08, 0x20, 0x01, 
-	0x90, 0x09, 0x78, 0x20, 0x28, 0x00, 0xd0, 0x31, 
-	0x23, 0x32, 0x5e, 0xf8, 0x42, 0xa8, 0xdd, 0x22, 
-	0x78, 0x20, 0x99, 0x00, 0xf0, 0x00, 0xf8, 0x34, 
-	0x90, 0x07, 0x1c, 0x06, 0x78, 0x20, 0x07, 0x00, 
-	0x0f, 0x00, 0x99, 0x04, 0x43, 0x48, 0x90, 0x05, 
-	0x78, 0x20, 0x09, 0x00, 0x07, 0x40, 0x0f, 0x40, 
-	0x99, 0x03, 0x43, 0x48, 0x90, 0x06, 0x98, 0x02, 
-	0x34, 0x01, 0x28, 0x00, 0xd0, 0x0c, 0x99, 0x0d, 
-	0x9a, 0x01, 0xb4, 0x06, 0x6a, 0x78, 0x68, 0xb9, 
-	0x68, 0x00, 0xaa, 0x07, 0x1c, 0x2b, 0xf0, 0x0a, 
-	0xfd, 0x8b, 0xb0, 0x02, 0xe0, 0x06, 0xe0, 0x09, 
-	0x9b, 0x0d, 0x1c, 0x38, 0xa9, 0x05, 0x1c, 0x2a, 
-	0xf7, 0xff, 0xfe, 0xa8, 0x19, 0xad, 0x78, 0x20, 
-	0x28, 0x00, 0xd1, 0xcd, 0xb0, 0x0a, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x1a, 0x78, 0x2e, 0x02, 0xd7, 0x44, 
-	0x29, 0x00, 0xd1, 0x00, 0x49, 0x02, 0x06, 0x40, 
-	0x0e, 0x40, 0x18, 0x40, 0x7a, 0x00, 0x47, 0x70, 
-	0x2e, 0x02, 0xd7, 0x44, 0xb5, 0xb0, 0x1c, 0x04, 
-	0x1c, 0x0f, 0xd1, 0x08, 0x4f, 0x0c, 0x68, 0x38, 
-	0x28, 0x00, 0xd1, 0x03, 0x48, 0x0b, 0xf7, 0xff, 
-	0xfe, 0xf9, 0x60, 0x38, 0x68, 0x3f, 0x25, 0x00, 
-	0x78, 0x20, 0x28, 0x00, 0xd0, 0x08, 0x78, 0x20, 
-	0x68, 0xf9, 0x34, 0x01, 0xf7, 0xff, 0xff, 0xe0, 
-	0x19, 0x45, 0x78, 0x20, 0x28, 0x00, 0xd1, 0xf6, 
-	0x1c, 0x28, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x1a, 0x78, 0x2e, 0x02, 0xd7, 0x44, 
-	0xb5, 0x80, 0x28, 0x00, 0xd1, 0x08, 0x4f, 0x09, 
-	0x68, 0x38, 0x28, 0x00, 0xd1, 0x03, 0x48, 0x08, 
-	0xf7, 0xff, 0xfe, 0xd8, 0x60, 0x38, 0x68, 0x38, 
-	0x28, 0x00, 0xd1, 0x02, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x68, 0xc0, 0x68, 0x40, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x78, 
-	0x2e, 0x02, 0xd7, 0x44, 0xb5, 0xf0, 0xb0, 0x83, 
-	0x4a, 0x18, 0x21, 0x00, 0x20, 0xff, 0x30, 0x01, 
-	0xf7, 0xff, 0xfa, 0x98, 0x49, 0x16, 0x27, 0x00, 
-	0x64, 0x08, 0x49, 0x16, 0x91, 0x02, 0x49, 0x16, 
-	0x91, 0x01, 0x49, 0x16, 0x91, 0x00, 0x4c, 0x16, 
-	0x01, 0x38, 0x06, 0x01, 0x0e, 0x09, 0x20, 0x10, 
-	0x1c, 0x22, 0x1c, 0x0d, 0xf7, 0xff, 0xfa, 0x86, 
-	0x00, 0xbe, 0x99, 0x02, 0x51, 0x88, 0x20, 0x04, 
-	0x1c, 0x29, 0x1c, 0x22, 0xf7, 0xff, 0xfa, 0x7e, 
-	0x99, 0x01, 0x51, 0x88, 0x20, 0x02, 0x1c, 0x29, 
-	0x1c, 0x22, 0xf7, 0xff, 0xfa, 0x77, 0x99, 0x00, 
-	0x51, 0x88, 0x37, 0x01, 0x2f, 0x08, 0xdb, 0xe3, 
-	0x20, 0x00, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0xc0, 
-	0x2e, 0x08, 0x1c, 0x80, 0x2e, 0x08, 0x55, 0x50, 
-	0x2e, 0x08, 0x55, 0x70, 0x2e, 0x08, 0x55, 0x90, 
-	0x2e, 0x08, 0x1a, 0x80, 0xb5, 0x80, 0x48, 0x0c, 
-	0xf7, 0xff, 0xfe, 0x84, 0x4f, 0x0b, 0x64, 0x78, 
-	0x48, 0x0b, 0xf7, 0xff, 0xfe, 0x7f, 0x64, 0xb8, 
-	0x48, 0x0a, 0xf7, 0xff, 0xfe, 0x7b, 0x64, 0xf8, 
-	0x20, 0x00, 0x22, 0x00, 0x49, 0x08, 0x00, 0x83, 
-	0x50, 0xca, 0x30, 0x01, 0x28, 0x10, 0xdb, 0xfa, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x02, 0x5e, 0x2c, 0x2e, 0x08, 0x1c, 0x80, 
-	0x2e, 0x02, 0x94, 0xb8, 0x2e, 0x02, 0xd7, 0x44, 
-	0x2e, 0x08, 0x55, 0x10, 0xb5, 0x90, 0x04, 0x01, 
-	0x0c, 0x09, 0x20, 0xff, 0x29, 0x00, 0xd0, 0x0b, 
-	0x29, 0x0f, 0xdc, 0x09, 0x00, 0x8c, 0x4f, 0x06, 
-	0x59, 0x39, 0x29, 0x00, 0xd0, 0x04, 0x1c, 0x08, 
-	0xf7, 0xff, 0xfb, 0x85, 0x20, 0x00, 0x51, 0x38, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x55, 0x10, 0xb5, 0xff, 0x04, 0x05, 
-	0x0c, 0x2d, 0x04, 0x10, 0x0c, 0x00, 0xb0, 0x82, 
-	0x90, 0x00, 0x04, 0x18, 0x0c, 0x00, 0x90, 0x01, 
-	0x2d, 0x00, 0xd0, 0x01, 0x2d, 0x0f, 0xdd, 0x01, 
-	0x20, 0xff, 0xe0, 0x53, 0x00, 0xaf, 0x4c, 0x2c, 
-	0x59, 0xe0, 0x28, 0x00, 0xd0, 0x02, 0x1c, 0x28, 
-	0xf7, 0xff, 0xff, 0xd0, 0x98, 0x00, 0x4a, 0x29, 
-	0x40, 0x02, 0x92, 0x00, 0x23, 0x2d, 0x01, 0x1b, 
-	0x42, 0x9a, 0xdd, 0x01, 0x1c, 0x1a, 0x93, 0x00, 
-	0x23, 0x09, 0x01, 0x9b, 0x98, 0x01, 0x42, 0x98, 
-	0xdd, 0x01, 0x1c, 0x1a, 0x93, 0x00, 0x2d, 0x08, 
-	0xda, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x01, 
-	0x22, 0x00, 0x21, 0x00, 0xb4, 0x07, 0x9a, 0x06, 
-	0xb4, 0x04, 0x20, 0x00, 0x9a, 0x04, 0x9b, 0x05, 
-	0xf7, 0xff, 0xfa, 0x24, 0x51, 0xe0, 0xb0, 0x04, 
-	0x1c, 0x01, 0xd0, 0xd1, 0x48, 0x18, 0x6c, 0x82, 
-	0x62, 0x4a, 0x21, 0x01, 0x59, 0xe2, 0x63, 0xd1, 
-	0x21, 0x00, 0x43, 0xc9, 0x59, 0xe2, 0x63, 0x91, 
-	0x99, 0x03, 0x29, 0x08, 0xd2, 0x10, 0xa3, 0x02, 
-	0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x04, 0x06, 0x08, 0x0b, 0x04, 0x06, 0x08, 0x0b, 
-	0x48, 0x0e, 0xe0, 0x02, 0x48, 0x0e, 0xe0, 0x00, 
-	0x48, 0x0e, 0x59, 0xc6, 0xe0, 0x00, 0x6c, 0x06, 
-	0x59, 0xe0, 0x1c, 0x31, 0xf7, 0xff, 0xfb, 0xd6, 
-	0x59, 0xe0, 0x68, 0x80, 0x21, 0x07, 0xf0, 0x04, 
-	0xf9, 0xbd, 0x20, 0x00, 0xb0, 0x02, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x55, 0x10, 0x00, 0x00, 0xff, 0xfe, 
-	0x2e, 0x08, 0x1c, 0x80, 0x2e, 0x08, 0x55, 0x90, 
-	0x2e, 0x08, 0x55, 0x70, 0x2e, 0x08, 0x55, 0x50, 
-	0xb5, 0xf0, 0x04, 0x00, 0x0c, 0x00, 0x04, 0x09, 
-	0x14, 0x09, 0x04, 0x16, 0x14, 0x36, 0xb0, 0x85, 
-	0x28, 0x07, 0xdc, 0x29, 0x00, 0x84, 0x4f, 0x21, 
-	0x59, 0x38, 0x28, 0x00, 0xd0, 0x24, 0x08, 0x49, 
-	0x00, 0x49, 0x04, 0x0d, 0x14, 0x2d, 0x68, 0x80, 
-	0xa9, 0x01, 0xf0, 0x04, 0xfa, 0x6b, 0x98, 0x01, 
-	0x19, 0x40, 0x90, 0x01, 0x98, 0x03, 0x19, 0x40, 
-	0x90, 0x03, 0x98, 0x02, 0x19, 0x80, 0x90, 0x02, 
-	0x98, 0x04, 0x19, 0x80, 0x90, 0x04, 0x98, 0x01, 
-	0x49, 0x15, 0x42, 0x88, 0xd8, 0x0c, 0x98, 0x02, 
-	0x42, 0x88, 0xd8, 0x09, 0x23, 0x2d, 0x01, 0x1b, 
-	0x98, 0x01, 0x42, 0x98, 0xda, 0x04, 0x23, 0x09, 
-	0x01, 0x9b, 0x98, 0x02, 0x42, 0x98, 0xdb, 0x01, 
-	0x20, 0xff, 0xe0, 0x12, 0x59, 0x38, 0x68, 0x80, 
-	0xa9, 0x01, 0xf0, 0x02, 0xf8, 0x3b, 0x59, 0x38, 
-	0x68, 0x80, 0x46, 0x69, 0xf0, 0x03, 0xff, 0x0a, 
-	0x98, 0x00, 0x28, 0x00, 0xd1, 0x04, 0x59, 0x38, 
-	0x68, 0x80, 0x21, 0x01, 0xf0, 0x03, 0xfc, 0x4e, 
-	0x20, 0x00, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x10, 
-	0x80, 0x00, 0x00, 0x00, 0xb5, 0xf0, 0x04, 0x07, 
-	0x0c, 0x3f, 0x04, 0x0b, 0x0c, 0x1b, 0x04, 0x16, 
-	0x0c, 0x36, 0x20, 0xff, 0xb0, 0x85, 0x2f, 0x07, 
-	0xdc, 0x10, 0x00, 0xbc, 0x4f, 0x1c, 0x59, 0x39, 
-	0x29, 0x00, 0xd0, 0x0b, 0x08, 0x5a, 0x00, 0x52, 
-	0x04, 0x15, 0x0c, 0x2d, 0x23, 0x2d, 0x01, 0x1b, 
-	0x42, 0x9d, 0xda, 0x03, 0x23, 0x09, 0x01, 0x9b, 
-	0x42, 0x9e, 0xdb, 0x03, 0xb0, 0x05, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x68, 0x88, 0xa9, 0x01, 
-	0xf0, 0x04, 0xfa, 0x0c, 0x98, 0x03, 0x99, 0x01, 
-	0x1a, 0x40, 0x90, 0x03, 0x19, 0x40, 0x90, 0x03, 
-	0x98, 0x04, 0x99, 0x02, 0x1a, 0x40, 0x90, 0x04, 
-	0x19, 0x80, 0x90, 0x04, 0x95, 0x01, 0x96, 0x02, 
-	0x59, 0x38, 0x68, 0x80, 0xa9, 0x01, 0xf0, 0x01, 
-	0xff, 0xed, 0x59, 0x38, 0x68, 0x80, 0x46, 0x69, 
-	0xf0, 0x03, 0xfe, 0xbc, 0x98, 0x00, 0x28, 0x00, 
-	0xd1, 0x04, 0x59, 0x38, 0x68, 0x80, 0x21, 0x01, 
-	0xf0, 0x03, 0xfc, 0x00, 0x20, 0x00, 0xe7, 0xd5, 
-	0x2e, 0x08, 0x55, 0x10, 0xb5, 0x00, 0x04, 0x00, 
-	0x0c, 0x00, 0x00, 0x80, 0x49, 0x04, 0x58, 0x08, 
-	0x28, 0x00, 0xd0, 0x03, 0x68, 0x80, 0x21, 0x00, 
-	0xf0, 0x03, 0xfb, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x55, 0x10, 0xb5, 0x80, 0x04, 0x01, 
-	0x0c, 0x09, 0x20, 0xff, 0x29, 0x07, 0xdc, 0x0c, 
-	0x29, 0x01, 0xdb, 0x0a, 0x00, 0x88, 0x49, 0x06, 
-	0x58, 0x08, 0x27, 0x00, 0x28, 0x00, 0xd0, 0x03, 
-	0x68, 0x80, 0x21, 0x01, 0xf0, 0x03, 0xfa, 0x36, 
-	0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x55, 0x10, 0x04, 0x01, 0x0c, 0x09, 
-	0x20, 0x00, 0x29, 0x0f, 0xdc, 0x06, 0x00, 0x89, 
-	0x4a, 0x03, 0x58, 0x51, 0x29, 0x00, 0xd0, 0x01, 
-	0x23, 0x32, 0x5e, 0xc8, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x55, 0x10, 0x04, 0x01, 0x0c, 0x09, 
-	0x20, 0x00, 0x29, 0x0f, 0xdc, 0x06, 0x00, 0x89, 
-	0x4a, 0x03, 0x58, 0x51, 0x29, 0x00, 0xd0, 0x01, 
-	0x23, 0x34, 0x5e, 0xc8, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x55, 0x10, 0xb5, 0xb0, 0x04, 0x03, 
-	0x0c, 0x1b, 0x04, 0x0a, 0x0c, 0x12, 0x20, 0xff, 
-	0x2b, 0x07, 0xdc, 0x10, 0x00, 0x9d, 0x4f, 0x09, 
-	0x59, 0x79, 0x29, 0x00, 0xd0, 0x0b, 0x07, 0x14, 
-	0x0f, 0x24, 0x68, 0x88, 0x21, 0x03, 0xf0, 0x03, 
-	0xfe, 0xa5, 0x59, 0x78, 0x68, 0x80, 0x1c, 0x21, 
-	0xf0, 0x03, 0xff, 0x4c, 0x20, 0x00, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10, 
-	0xb5, 0x00, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, 
-	0x29, 0x07, 0xdc, 0x09, 0x00, 0x89, 0x4a, 0x05, 
-	0x58, 0x51, 0x29, 0x00, 0xd0, 0x04, 0x68, 0x88, 
-	0x21, 0x02, 0xf0, 0x03, 0xfe, 0x8b, 0x20, 0x00, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10, 
-	0xb5, 0x00, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, 
-	0x29, 0x07, 0xdc, 0x09, 0x00, 0x89, 0x4a, 0x05, 
-	0x58, 0x51, 0x29, 0x00, 0xd0, 0x04, 0x68, 0x88, 
-	0x21, 0x00, 0xf0, 0x03, 0xfe, 0x77, 0x20, 0x00, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10, 
-	0xb5, 0xf0, 0x04, 0x05, 0x0c, 0x2d, 0x04, 0x09, 
-	0x0c, 0x09, 0x04, 0x12, 0x0c, 0x12, 0x04, 0x1e, 
-	0x0c, 0x36, 0x9c, 0x05, 0x9f, 0x06, 0x04, 0x24, 
-	0x0c, 0x24, 0x04, 0x3f, 0x0c, 0x3f, 0x20, 0xff, 
-	0xb0, 0x85, 0x2d, 0x0f, 0xdc, 0x04, 0x00, 0xab, 
-	0x4d, 0x10, 0x58, 0xed, 0x2d, 0x00, 0xd1, 0x03, 
-	0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x19, 0x88, 0x23, 0x32, 0x5e, 0xeb, 0x42, 0x98, 
-	0xdd, 0x02, 0x1a, 0x58, 0x04, 0x06, 0x0c, 0x36, 
-	0x19, 0x10, 0x23, 0x34, 0x5e, 0xeb, 0x42, 0x98, 
-	0xdd, 0x02, 0x1a, 0x98, 0x04, 0x04, 0x0c, 0x24, 
-	0x91, 0x00, 0x92, 0x01, 0x96, 0x02, 0x94, 0x03, 
-	0x97, 0x04, 0x46, 0x69, 0x68, 0xa8, 0xf0, 0x0a, 
-	0xfa, 0x1d, 0xe7, 0xe1, 0x2e, 0x08, 0x55, 0x10, 
-	0xb4, 0x80, 0x04, 0x03, 0x0c, 0x1b, 0x20, 0x00, 
-	0x29, 0x00, 0xdb, 0x0f, 0x2a, 0x00, 0xdb, 0x0d, 
-	0x00, 0x9b, 0x4f, 0x07, 0x58, 0xff, 0x2f, 0x00, 
-	0xd0, 0x08, 0x23, 0x32, 0x5e, 0xfb, 0x42, 0x8b, 
-	0xdd, 0x04, 0x23, 0x34, 0x5e, 0xf9, 0x42, 0x91, 
-	0xdd, 0x00, 0x20, 0x01, 0xbc, 0x80, 0x47, 0x70, 
-	0x2e, 0x08, 0x55, 0x10, 0xb5, 0xf0, 0x9c, 0x06, 
-	0x9e, 0x05, 0x04, 0x00, 0x0c, 0x00, 0xb0, 0x85, 
-	0x90, 0x00, 0x04, 0x08, 0x14, 0x00, 0x04, 0x17, 
-	0x14, 0x3f, 0x04, 0x1d, 0x14, 0x2d, 0x04, 0x31, 
-	0x14, 0x09, 0x91, 0x01, 0x04, 0x23, 0x0c, 0x1b, 
-	0x93, 0x02, 0xb0, 0x82, 0x99, 0x02, 0x00, 0x89, 
-	0x91, 0x06, 0x4a, 0x71, 0x92, 0x05, 0x58, 0x51, 
-	0x29, 0x00, 0xd1, 0x01, 0x20, 0xff, 0xe0, 0xd6, 
-	0x2d, 0x00, 0xda, 0x0e, 0x19, 0x40, 0x04, 0x00, 
-	0x14, 0x00, 0x42, 0x69, 0x04, 0x0d, 0x14, 0x2d, 
-	0x99, 0x03, 0x18, 0x79, 0x04, 0x0f, 0x14, 0x3f, 
-	0x99, 0x03, 0x42, 0x49, 0x04, 0x09, 0x14, 0x09, 
-	0x91, 0x03, 0x1c, 0x01, 0x1c, 0x04, 0x98, 0x02, 
-	0x1c, 0x3a, 0xf7, 0xff, 0xff, 0xb1, 0x28, 0x00, 
-	0xd0, 0x08, 0x98, 0x06, 0x99, 0x05, 0x58, 0x08, 
-	0x68, 0x80, 0x9b, 0x04, 0x1c, 0x21, 0x1c, 0x3a, 
-	0xf0, 0x09, 0xff, 0x7a, 0x98, 0x03, 0x10, 0x40, 
-	0x90, 0x00, 0x10, 0x6e, 0x1c, 0x28, 0xb0, 0x82, 
-	0xf0, 0x0e, 0xfd, 0x58, 0xf0, 0x0e, 0xfd, 0x94, 
-	0x90, 0x00, 0x91, 0x01, 0x98, 0x05, 0xf0, 0x0e, 
-	0xfd, 0x51, 0xf0, 0x0e, 0xfd, 0x8d, 0x9a, 0x00, 
-	0x9b, 0x01, 0xb0, 0x02, 0xf0, 0x0e, 0xfd, 0x8c, 
-	0x28, 0x00, 0xd0, 0x4c, 0x98, 0x03, 0x28, 0x00, 
-	0xdd, 0x21, 0x26, 0x00, 0x2d, 0x00, 0xdd, 0x6d, 
-	0x98, 0x00, 0x99, 0x03, 0x18, 0x40, 0x90, 0x00, 
-	0x34, 0x01, 0x42, 0xa8, 0xdb, 0x03, 0x98, 0x00, 
-	0x1b, 0x40, 0x90, 0x00, 0x37, 0x01, 0x98, 0x02, 
-	0x1c, 0x21, 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x78, 
-	0x28, 0x00, 0xd0, 0x08, 0x98, 0x06, 0x99, 0x05, 
-	0x58, 0x08, 0x68, 0x80, 0x9b, 0x04, 0x1c, 0x21, 
-	0x1c, 0x3a, 0xf0, 0x09, 0xff, 0x41, 0x36, 0x01, 
-	0x42, 0xae, 0xdb, 0xe1, 0xe0, 0x76, 0x98, 0x03, 
-	0x42, 0x40, 0x04, 0x00, 0x14, 0x00, 0x90, 0x03, 
-	0x98, 0x00, 0x42, 0x46, 0x20, 0x00, 0x90, 0x01, 
-	0x2d, 0x00, 0xdd, 0x43, 0x98, 0x03, 0x18, 0x36, 
-	0x34, 0x01, 0x42, 0xae, 0xdb, 0x01, 0x1b, 0x76, 
-	0x3f, 0x01, 0x98, 0x02, 0x1c, 0x21, 0x1c, 0x3a, 
-	0xf7, 0xff, 0xff, 0x52, 0x28, 0x00, 0xd0, 0x08, 
-	0x98, 0x06, 0x99, 0x05, 0x58, 0x08, 0x68, 0x80, 
-	0x9b, 0x04, 0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x09, 
-	0xff, 0x1b, 0x98, 0x01, 0x30, 0x01, 0x90, 0x01, 
-	0x42, 0xa8, 0xdb, 0xe3, 0xe0, 0x4e, 0x98, 0x03, 
-	0x28, 0x00, 0xdd, 0x24, 0x20, 0x00, 0x90, 0x01, 
-	0x98, 0x03, 0x28, 0x00, 0xdd, 0x1e, 0x19, 0x76, 
-	0x99, 0x03, 0x37, 0x01, 0x42, 0x8e, 0xdb, 0x02, 
-	0x98, 0x03, 0x1a, 0x36, 0x34, 0x01, 0x98, 0x02, 
-	0x1c, 0x21, 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x2c, 
-	0x28, 0x00, 0xd0, 0x08, 0x98, 0x06, 0x99, 0x05, 
-	0x58, 0x08, 0x68, 0x80, 0x9b, 0x04, 0x1c, 0x21, 
-	0x1c, 0x3a, 0xf0, 0x09, 0xfe, 0xf5, 0x98, 0x01, 
-	0x30, 0x01, 0x90, 0x01, 0x99, 0x03, 0x42, 0x88, 
-	0xdb, 0xe1, 0xe0, 0x27, 0xe0, 0x26, 0x98, 0x03, 
-	0x42, 0x40, 0x04, 0x01, 0x14, 0x09, 0x91, 0x03, 
-	0x20, 0x00, 0x90, 0x01, 0x29, 0x00, 0xdd, 0x1d, 
-	0x19, 0x76, 0x99, 0x03, 0x3f, 0x01, 0x42, 0x8e, 
-	0xdb, 0x02, 0x99, 0x03, 0x1a, 0x76, 0x34, 0x01, 
-	0x98, 0x02, 0x1c, 0x21, 0x1c, 0x3a, 0xf7, 0xff, 
-	0xff, 0x03, 0x28, 0x00, 0xd0, 0x08, 0x98, 0x06, 
-	0x99, 0x05, 0x58, 0x08, 0x68, 0x80, 0x9b, 0x04, 
-	0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x09, 0xfe, 0xcc, 
-	0x98, 0x01, 0x30, 0x01, 0x90, 0x01, 0x99, 0x03, 
-	0x42, 0x88, 0xdb, 0xe1, 0x20, 0x00, 0xb0, 0x07, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x55, 0x10, 0xb4, 0x80, 0x23, 0x00, 
-	0x88, 0x01, 0x0a, 0x0a, 0x06, 0x12, 0x0e, 0x12, 
-	0x06, 0x09, 0x0e, 0x09, 0x2a, 0xdf, 0xd0, 0x1a, 
-	0xdc, 0x07, 0x2a, 0xc4, 0xd0, 0x19, 0x2a, 0xd6, 
-	0xd0, 0x1b, 0x2a, 0xdc, 0xd1, 0x08, 0x22, 0x1e, 
-	0xe0, 0x06, 0x2a, 0xe4, 0xd0, 0x13, 0x2a, 0xf6, 
-	0xd0, 0x15, 0x2a, 0xfc, 0xd1, 0x00, 0x22, 0x1f, 
-	0x29, 0xdf, 0xd0, 0x26, 0xdc, 0x11, 0x29, 0xc4, 
-	0xd0, 0x25, 0x29, 0xd6, 0xd0, 0x27, 0x29, 0xdc, 
-	0xd1, 0x12, 0x21, 0x1e, 0xe0, 0x10, 0x22, 0x19, 
-	0xe7, 0xf2, 0x22, 0x1a, 0xe7, 0xf0, 0x22, 0x1b, 
-	0xe7, 0xee, 0x22, 0x1c, 0xe7, 0xec, 0x22, 0x1d, 
-	0xe7, 0xea, 0x29, 0xe4, 0xd0, 0x15, 0x29, 0xf6, 
-	0xd0, 0x17, 0x29, 0xfc, 0xd1, 0x00, 0x21, 0x1f, 
-	0x02, 0x17, 0x18, 0x7f, 0x80, 0x07, 0x30, 0x02, 
-	0x2a, 0x00, 0xd0, 0x04, 0x29, 0x00, 0xd0, 0x02, 
-	0x33, 0x01, 0x2b, 0x70, 0xdb, 0xc0, 0xbc, 0x80, 
-	0x47, 0x70, 0x21, 0x19, 0xe7, 0xf0, 0x21, 0x1a, 
-	0xe7, 0xee, 0x21, 0x1b, 0xe7, 0xec, 0x21, 0x1c, 
-	0xe7, 0xea, 0x21, 0x1d, 0xe7, 0xe8, 0xb5, 0xf0, 
-	0x1c, 0x0f, 0x1c, 0x11, 0x04, 0x02, 0x0c, 0x12, 
-	0x04, 0x0c, 0x0c, 0x24, 0x04, 0x1d, 0x0c, 0x2d, 
-	0x00, 0x96, 0xb0, 0x81, 0x48, 0x10, 0x90, 0x00, 
-	0x59, 0x81, 0x20, 0xff, 0x29, 0x00, 0xd0, 0x16, 
-	0x2a, 0x00, 0xd0, 0x14, 0x2a, 0x0f, 0xdc, 0x12, 
-	0x23, 0x32, 0x5e, 0xca, 0x42, 0xa2, 0xdb, 0x0e, 
-	0x23, 0x34, 0x5e, 0xc9, 0x42, 0xa9, 0xdb, 0x0a, 
-	0x1c, 0x38, 0xf7, 0xff, 0xff, 0x93, 0x98, 0x00, 
-	0x59, 0x80, 0x1c, 0x39, 0x1c, 0x22, 0x1c, 0x2b, 
-	0xf7, 0xff, 0xfb, 0x5c, 0x20, 0x00, 0xb0, 0x01, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x55, 0x10, 0xb4, 0xb0, 0x04, 0x07, 
-	0x0c, 0x3f, 0x04, 0x09, 0x0c, 0x09, 0x04, 0x14, 
-	0x14, 0x24, 0x04, 0x1a, 0x14, 0x12, 0x20, 0xff, 
-	0x2f, 0x0f, 0xdc, 0x1d, 0x00, 0xbd, 0x4f, 0x0f, 
-	0x59, 0x7b, 0x2b, 0x00, 0xd0, 0x18, 0x48, 0x0e, 
-	0x29, 0x01, 0xd0, 0x05, 0x29, 0x02, 0xd0, 0x01, 
-	0x29, 0x03, 0xd0, 0x03, 0x6c, 0x80, 0xe0, 0x02, 
-	0x6c, 0x40, 0xe0, 0x00, 0x6c, 0xc0, 0x62, 0x58, 
-	0x59, 0x78, 0x63, 0xc4, 0x20, 0x00, 0x43, 0xc0, 
-	0x42, 0x82, 0xd1, 0x02, 0x59, 0x79, 0x63, 0x88, 
-	0xe0, 0x01, 0x59, 0x78, 0x63, 0x82, 0x20, 0x00, 
-	0xbc, 0xb0, 0x47, 0x70, 0x2e, 0x08, 0x55, 0x10, 
-	0x2e, 0x08, 0x1c, 0x80, 0xb5, 0x00, 0x04, 0x00, 
-	0x0c, 0x00, 0x04, 0x09, 0x0c, 0x09, 0x00, 0x80, 
-	0x4a, 0x07, 0x58, 0x10, 0x28, 0x00, 0xd1, 0x02, 
-	0x20, 0xff, 0xbc, 0x08, 0x47, 0x18, 0x07, 0x89, 
-	0x0f, 0x89, 0x68, 0x80, 0xf0, 0x03, 0xfe, 0x76, 
-	0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x55, 0x10, 0x04, 0x09, 0x0c, 0x09, 
-	0x4b, 0x0a, 0x40, 0x18, 0x08, 0x4a, 0xd3, 0x01, 
-	0x23, 0x02, 0x43, 0x18, 0x08, 0x8a, 0xd3, 0x02, 
-	0x23, 0x01, 0x04, 0x5b, 0x43, 0x18, 0x08, 0xca, 
-	0xd3, 0x01, 0x23, 0x01, 0x43, 0x18, 0x09, 0x09, 
-	0xd3, 0x02, 0x23, 0x01, 0x04, 0x1b, 0x43, 0x18, 
-	0x47, 0x70, 0x00, 0x00, 0xff, 0xfc, 0xff, 0xfc, 
-	0xb5, 0xf0, 0x04, 0x00, 0x0c, 0x00, 0x04, 0x14, 
-	0x0c, 0x24, 0x1c, 0x1e, 0x1c, 0x0f, 0x28, 0x07, 
-	0xdc, 0x25, 0x28, 0x01, 0xdb, 0x23, 0x00, 0x85, 
-	0x48, 0x12, 0x59, 0x40, 0x28, 0x00, 0xd0, 0x1e, 
-	0x0e, 0x31, 0x02, 0x30, 0x0a, 0x00, 0xf7, 0xff, 
-	0xff, 0xd1, 0x1c, 0x06, 0x2f, 0x02, 0xd0, 0x0e, 
-	0x2f, 0x04, 0xd0, 0x0c, 0x2f, 0x10, 0xd0, 0x0a, 
-	0x23, 0xff, 0x33, 0x01, 0x42, 0x9f, 0xd1, 0x0e, 
-	0x06, 0x22, 0x0e, 0x12, 0x1c, 0x31, 0x48, 0x08, 
-	0x6c, 0x00, 0x68, 0x00, 0xe0, 0x05, 0x07, 0x22, 
-	0x0f, 0x12, 0x48, 0x06, 0x59, 0x40, 0x68, 0x00, 
-	0x1c, 0x31, 0xf0, 0x0b, 0xfa, 0xdb, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10, 
-	0x2e, 0x08, 0x1c, 0x80, 0x2e, 0x08, 0x55, 0x50, 
-	0xb5, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x10, 
-	0x0c, 0x00, 0x04, 0x1f, 0x0c, 0x3f, 0x22, 0x00, 
-	0xb0, 0x81, 0x92, 0x00, 0x2c, 0x07, 0xdc, 0x3a, 
-	0x2c, 0x01, 0xdb, 0x38, 0x00, 0xa4, 0x4a, 0x1e, 
-	0x59, 0x12, 0x2a, 0x00, 0xd0, 0x33, 0x29, 0x02, 
-	0xd0, 0x1b, 0x29, 0x04, 0xd0, 0x19, 0x29, 0x10, 
-	0xd0, 0x17, 0x23, 0xff, 0x33, 0x01, 0x42, 0x99, 
-	0xd1, 0x29, 0x06, 0x02, 0x0e, 0x12, 0x46, 0x69, 
-	0x1c, 0x15, 0x4c, 0x16, 0x6c, 0x20, 0x68, 0x00, 
-	0xf0, 0x0b, 0xfa, 0xdc, 0x98, 0x00, 0x02, 0x00, 
-	0x0a, 0x00, 0x1c, 0x39, 0xf7, 0xff, 0xff, 0x82, 
-	0x90, 0x00, 0x1c, 0x01, 0x6c, 0x20, 0x1c, 0x2a, 
-	0xe0, 0x12, 0x07, 0x02, 0x0f, 0x12, 0x1c, 0x15, 
-	0x4e, 0x0d, 0x59, 0x30, 0x68, 0x00, 0x46, 0x69, 
-	0xf0, 0x0b, 0xfa, 0xc8, 0x98, 0x00, 0x02, 0x00, 
-	0x0a, 0x00, 0x1c, 0x39, 0xf7, 0xff, 0xff, 0x6e, 
-	0x90, 0x00, 0x1c, 0x01, 0x59, 0x30, 0x1c, 0x2a, 
-	0x68, 0x00, 0xf0, 0x0b, 0xfa, 0x8b, 0xb0, 0x01, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x55, 0x10, 0x2e, 0x08, 0x1c, 0x80, 
-	0x2e, 0x08, 0x55, 0x50, 0xb5, 0xf0, 0x4f, 0x28, 
-	0x25, 0x00, 0x24, 0xff, 0x69, 0x38, 0x28, 0x00, 
-	0xd1, 0x01, 0x60, 0xbd, 0xe0, 0x0c, 0x26, 0x05, 
-	0x68, 0xb9, 0x29, 0x07, 0xd2, 0xf9, 0xa3, 0x02, 
-	0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x04, 0x08, 0x10, 0x1a, 0x21, 0x30, 0x38, 0x00, 
-	0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x01, 0x02, 0x80, 0xf7, 0xf6, 0xfa, 0x86, 
-	0x28, 0x00, 0xdb, 0x2d, 0x20, 0x02, 0xe0, 0x25, 
-	0x48, 0x18, 0xf7, 0xf6, 0xfa, 0xa1, 0x28, 0x00, 
-	0xdb, 0x26, 0x89, 0xb8, 0x28, 0x00, 0xdd, 0x15, 
-	0x20, 0x03, 0xe0, 0x1b, 0x89, 0xb8, 0xf7, 0xf6, 
-	0xfa, 0x75, 0x28, 0x00, 0xdb, 0x1c, 0x20, 0x04, 
-	0xe0, 0x14, 0xf7, 0xf6, 0xfa, 0x91, 0x28, 0x00, 
-	0xdb, 0x16, 0x69, 0x39, 0x18, 0x09, 0x61, 0x39, 
-	0x89, 0xb9, 0x1a, 0x08, 0x81, 0xb8, 0x89, 0xb8, 
-	0x28, 0x00, 0xdc, 0xe9, 0x60, 0xbe, 0xe0, 0x0b, 
-	0x20, 0x00, 0xf7, 0xf6, 0xfa, 0x5f, 0x28, 0x00, 
-	0xd1, 0x06, 0x20, 0x06, 0x60, 0xb8, 0xe0, 0x03, 
-	0xf7, 0xf6, 0xfa, 0x7a, 0x28, 0x00, 0xda, 0xb8, 
-	0x1c, 0x28, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x1d, 0x00, 0x2e, 0x08, 0x55, 0xb0, 
-	0xb5, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x0d, 
-	0x0c, 0x2d, 0x04, 0x16, 0x0c, 0x36, 0xb0, 0x85, 
-	0xa8, 0x01, 0x49, 0x2e, 0xc9, 0x8e, 0xc0, 0x8e, 
-	0x2c, 0x00, 0xd0, 0x07, 0x2c, 0x01, 0xd0, 0x07, 
-	0x2c, 0x02, 0xd0, 0x07, 0x2c, 0x03, 0xd1, 0x3f, 
-	0x21, 0x08, 0xe0, 0x04, 0x21, 0x01, 0xe0, 0x02, 
-	0x21, 0x02, 0xe0, 0x00, 0x21, 0x04, 0x91, 0x00, 
-	0x23, 0x2d, 0x01, 0x1b, 0x42, 0x9d, 0xdc, 0x33, 
-	0x23, 0x09, 0x01, 0x9b, 0x42, 0x9e, 0xdc, 0x2f, 
-	0x1e, 0x68, 0x90, 0x03, 0x1e, 0x70, 0x90, 0x04, 
-	0xa8, 0x01, 0x1c, 0x21, 0xf0, 0x07, 0xfb, 0xb8, 
-	0x4f, 0x1d, 0x60, 0x78, 0x00, 0x80, 0x23, 0x01, 
-	0x04, 0x1b, 0x42, 0x98, 0xdc, 0x20, 0x1f, 0xf8, 
-	0x38, 0x79, 0x67, 0xc4, 0x68, 0x38, 0x28, 0x00, 
-	0xd0, 0x0a, 0x68, 0x80, 0xb0, 0x81, 0x46, 0x6b, 
-	0x22, 0x00, 0x21, 0x00, 0xf0, 0x09, 0xfd, 0x42, 
-	0x68, 0x38, 0xf7, 0xfe, 0xfe, 0x90, 0xb0, 0x01, 
-	0x22, 0x00, 0x21, 0x0a, 0x20, 0x01, 0xb4, 0x07, 
-	0x1c, 0x22, 0xb4, 0x04, 0x21, 0x00, 0x20, 0x00, 
-	0x1c, 0x2a, 0x1c, 0x33, 0xf7, 0xfe, 0xfd, 0x62, 
-	0xb0, 0x04, 0x60, 0x38, 0x1c, 0x01, 0xd1, 0x03, 
-	0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x69, 0x88, 0x99, 0x00, 0x43, 0x4d, 0x1d, 0xe9, 
-	0xd5, 0x00, 0x31, 0x07, 0x10, 0xc9, 0x43, 0x71, 
-	0x61, 0x38, 0x60, 0x79, 0x81, 0xb9, 0x20, 0x01, 
-	0x60, 0xb8, 0xe7, 0xed, 0x2e, 0x03, 0x39, 0x50, 
-	0x2e, 0x08, 0x1d, 0x00, 0xb5, 0xf0, 0x04, 0x00, 
-	0x0c, 0x00, 0x04, 0x09, 0x0c, 0x09, 0xb0, 0x87, 
-	0x91, 0x00, 0x04, 0x11, 0x0c, 0x09, 0x91, 0x01, 
-	0x04, 0x19, 0x0c, 0x09, 0x91, 0x02, 0xb0, 0x85, 
-	0x28, 0x07, 0xdc, 0x43, 0x28, 0x01, 0xdb, 0x41, 
-	0x00, 0x85, 0x48, 0x3e, 0x90, 0x0b, 0x59, 0x41, 
-	0x29, 0x00, 0xd0, 0x3b, 0x48, 0x3c, 0x90, 0x0a, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x36, 0x23, 0x2c, 
-	0x5e, 0xca, 0x2a, 0x0b, 0xd2, 0x32, 0xa3, 0x02, 
-	0x5c, 0x9b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 
-	0x06, 0x06, 0x06, 0x00, 0x22, 0x00, 0x92, 0x00, 
-	0x92, 0x01, 0x23, 0x32, 0x5e, 0xc3, 0x93, 0x02, 
-	0x23, 0x34, 0x5e, 0xc0, 0x90, 0x03, 0x92, 0x04, 
-	0x98, 0x07, 0x08, 0x80, 0xd3, 0x40, 0x23, 0x2c, 
-	0x5e, 0xc8, 0x28, 0x00, 0xd0, 0x08, 0x28, 0x01, 
-	0xd0, 0x08, 0x28, 0x02, 0xd0, 0x08, 0x28, 0x03, 
-	0xd1, 0x10, 0x27, 0xff, 0x37, 0x01, 0xe0, 0x04, 
-	0x27, 0x02, 0xe0, 0x02, 0x27, 0x04, 0xe0, 0x00, 
-	0x27, 0x10, 0x4e, 0x24, 0x23, 0xff, 0x33, 0x01, 
-	0x42, 0x9f, 0xd1, 0x16, 0x24, 0x00, 0x48, 0x22, 
-	0x90, 0x09, 0xe0, 0x03, 0xb0, 0x0c, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0xa0, 0x58, 0x31, 
-	0x29, 0x00, 0xd0, 0x06, 0x06, 0x22, 0x0e, 0x12, 
-	0x98, 0x09, 0x6c, 0x00, 0x68, 0x00, 0xf0, 0x0b, 
-	0xf9, 0x5d, 0x34, 0x01, 0x42, 0xbc, 0xdb, 0xf1, 
-	0xe0, 0x12, 0x24, 0x00, 0x2f, 0x00, 0xdd, 0x0f, 
-	0x48, 0x16, 0x90, 0x08, 0x00, 0xa0, 0x58, 0x31, 
-	0x29, 0x00, 0xd0, 0x06, 0x07, 0x22, 0x0f, 0x12, 
-	0x98, 0x08, 0x59, 0x40, 0x68, 0x00, 0xf0, 0x0b, 
-	0xf9, 0x49, 0x34, 0x01, 0x42, 0xbc, 0xdb, 0xf1, 
-	0x98, 0x07, 0x08, 0x40, 0xd3, 0x01, 0x22, 0xff, 
-	0xe0, 0x00, 0x22, 0x00, 0x99, 0x06, 0xb4, 0x06, 
-	0x98, 0x0d, 0x59, 0x40, 0x68, 0x81, 0x98, 0x0c, 
-	0x68, 0x00, 0x68, 0x80, 0x9b, 0x07, 0xaa, 0x02, 
-	0xf0, 0x09, 0xff, 0x12, 0xb0, 0x0e, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10, 
-	0x2e, 0x08, 0x1d, 0x00, 0x2e, 0x08, 0x55, 0xb0, 
-	0x2e, 0x08, 0x1c, 0x80, 0x2e, 0x08, 0x55, 0x50, 
-	0xb5, 0x80, 0x4f, 0x0a, 0x68, 0x38, 0x28, 0x00, 
-	0xd0, 0x0c, 0x68, 0x80, 0xb0, 0x81, 0x46, 0x6b, 
-	0x22, 0x00, 0x21, 0x00, 0xf0, 0x09, 0xfc, 0x72, 
-	0x68, 0x38, 0xf7, 0xfe, 0xfd, 0xc0, 0x20, 0x00, 
-	0x60, 0x38, 0xb0, 0x01, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1d, 0x00, 
-	0xb5, 0x00, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, 
-	0x29, 0x07, 0xdc, 0x09, 0x00, 0x89, 0x4a, 0x05, 
-	0x58, 0x51, 0x29, 0x00, 0xd0, 0x04, 0x68, 0x88, 
-	0x21, 0x01, 0xf0, 0x03, 0xfb, 0x93, 0x20, 0x00, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10, 
-	0xb5, 0x00, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, 
-	0x29, 0x07, 0xdc, 0x09, 0x00, 0x89, 0x4a, 0x05, 
-	0x58, 0x51, 0x29, 0x00, 0xd0, 0x04, 0x68, 0x88, 
-	0x21, 0x00, 0xf0, 0x03, 0xfb, 0x7f, 0x20, 0x00, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10, 
-	0xb5, 0xf7, 0xb0, 0x86, 0x9c, 0x07, 0x20, 0x00, 
-	0x6e, 0x40, 0x90, 0x05, 0x98, 0x05, 0x30, 0x0c, 
-	0x90, 0x05, 0x48, 0x7f, 0x90, 0x04, 0x98, 0x04, 
-	0x30, 0x0c, 0x90, 0x04, 0xf0, 0x11, 0xff, 0xf0, 
-	0x90, 0x01, 0xf0, 0x11, 0xff, 0xd3, 0x90, 0x00, 
-	0x20, 0x00, 0x43, 0xc0, 0x49, 0x79, 0x60, 0x08, 
-	0x20, 0x00, 0x43, 0xc0, 0x49, 0x77, 0x60, 0x88, 
-	0x20, 0x00, 0x43, 0xc0, 0x49, 0x75, 0x61, 0x08, 
-	0x98, 0x06, 0x28, 0x00, 0xd0, 0x73, 0x20, 0x00, 
-	0x6a, 0x40, 0x90, 0x03, 0x68, 0x20, 0x30, 0x05, 
-	0x99, 0x06, 0x1a, 0x08, 0x90, 0x06, 0x68, 0xe0, 
-	0x28, 0x00, 0xd0, 0x08, 0x68, 0x60, 0x99, 0x03, 
-	0x68, 0x09, 0x42, 0x88, 0xd1, 0x01, 0x20, 0x01, 
-	0xe0, 0x00, 0x20, 0x00, 0xe0, 0x06, 0x68, 0x60, 
-	0x9a, 0x08, 0x42, 0x90, 0xd1, 0x01, 0x20, 0x01, 
-	0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x73, 
-	0x68, 0x27, 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x01, 
-	0x98, 0x05, 0xe0, 0x00, 0x98, 0x04, 0x1c, 0x06, 
-	0x68, 0xe0, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 
-	0x6e, 0x40, 0xe0, 0x00, 0x48, 0x5c, 0x90, 0x02, 
-	0x1d, 0xe5, 0x35, 0x0d, 0x68, 0xa0, 0x28, 0x08, 
-	0xd2, 0x5f, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, 
-	0x44, 0x9f, 0x1c, 0x00, 0x04, 0x16, 0x28, 0x3a, 
-	0x49, 0x55, 0x65, 0x71, 0x69, 0x20, 0x49, 0x55, 
-	0x60, 0x08, 0xcd, 0x02, 0x48, 0x53, 0x60, 0x41, 
-	0xcd, 0x02, 0x98, 0x02, 0x60, 0x01, 0x3f, 0x01, 
-	0x1c, 0x38, 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 
-	0xcd, 0x02, 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x67, 
-	0x69, 0x20, 0x49, 0x4c, 0x60, 0x88, 0xcd, 0x02, 
-	0x48, 0x4a, 0x60, 0xc1, 0xcd, 0x02, 0x98, 0x02, 
-	0x60, 0x41, 0x3f, 0x01, 0x1c, 0x38, 0x3f, 0x01, 
-	0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, 0xc6, 0x02, 
-	0xe7, 0xf8, 0xe0, 0x55, 0x69, 0x20, 0x49, 0x43, 
-	0x61, 0x08, 0xcd, 0x02, 0x48, 0x41, 0x61, 0x41, 
-	0xcd, 0x02, 0x98, 0x02, 0x60, 0x81, 0x3f, 0x01, 
-	0x1c, 0x38, 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 
-	0xcd, 0x02, 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x43, 
-	0x69, 0x20, 0x00, 0x80, 0xe0, 0x00, 0xe0, 0x4b, 
-	0x21, 0x00, 0x6a, 0x89, 0x50, 0x0e, 0x1c, 0x38, 
-	0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, 
-	0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x34, 0x69, 0x20, 
-	0x00, 0x80, 0x49, 0x33, 0x50, 0x0e, 0x1c, 0x38, 
-	0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, 
-	0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x28, 0x69, 0x20, 
-	0x00, 0x80, 0x21, 0x00, 0x6e, 0x09, 0xe0, 0x01, 
-	0xe0, 0x28, 0xe0, 0x20, 0x50, 0x0e, 0x1c, 0x38, 
-	0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, 
-	0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x18, 0x69, 0x20, 
-	0x00, 0x80, 0x49, 0x26, 0x50, 0x0e, 0x1c, 0x38, 
-	0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, 
-	0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x0c, 0x69, 0x20, 
-	0x90, 0x03, 0x1c, 0x38, 0x3f, 0x01, 0x28, 0x00, 
-	0xd0, 0x04, 0xcd, 0x02, 0x98, 0x03, 0xc0, 0x02, 
-	0x90, 0x03, 0xe7, 0xf6, 0xe0, 0x00, 0xe7, 0xff, 
-	0x68, 0xe0, 0x28, 0xff, 0xd1, 0x01, 0x96, 0x05, 
-	0xe0, 0x00, 0x96, 0x04, 0x68, 0x20, 0x00, 0x80, 
-	0x19, 0x00, 0x1d, 0xc4, 0x34, 0x0d, 0xe7, 0x3b, 
-	0x98, 0x01, 0x28, 0x00, 0xd1, 0x01, 0xf0, 0x11, 
-	0xff, 0x4f, 0x98, 0x00, 0x28, 0x00, 0xd1, 0x01, 
-	0xf0, 0x11, 0xff, 0x2e, 0x20, 0x00, 0x6e, 0x80, 
-	0x68, 0x00, 0x4b, 0x0f, 0x42, 0x98, 0xd0, 0x06, 
-	0x48, 0x0d, 0x21, 0x00, 0x6e, 0x89, 0x60, 0x08, 
-	0x20, 0x01, 0x49, 0x08, 0x62, 0x08, 0x20, 0x00, 
-	0x21, 0x00, 0x6e, 0x89, 0x60, 0x08, 0x20, 0x00, 
-	0xb0, 0x06, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0xb0, 0x06, 0xe7, 0xf9, 0x00, 0x00, 
-	0x2e, 0x08, 0x59, 0xb0, 0x66, 0x00, 0x00, 0x80, 
-	0x2e, 0x08, 0x3a, 0xf4, 0x2e, 0x08, 0x1d, 0x14, 
-	0xda, 0xa5, 0xaa, 0x57, 0xb5, 0x80, 0xb0, 0xa7, 
-	0x46, 0x68, 0x4f, 0x08, 0x23, 0x13, 0xcf, 0x06, 
-	0xc0, 0x06, 0x3b, 0x01, 0xd1, 0xfb, 0xcf, 0x04, 
-	0xc0, 0x04, 0x46, 0x69, 0x4a, 0x04, 0x20, 0x27, 
-	0xf7, 0xff, 0xfe, 0xde, 0xb0, 0x27, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x03, 0x39, 0x60, 
-	0xf0, 0x24, 0x00, 0x09, 0xb5, 0xff, 0xb0, 0x83, 
-	0x99, 0x04, 0x04, 0x09, 0x0c, 0x09, 0x91, 0x00, 
-	0x9a, 0x05, 0x06, 0x16, 0x0e, 0x36, 0x9b, 0x06, 
-	0x06, 0x18, 0x0e, 0x00, 0x90, 0x01, 0x98, 0x0c, 
-	0x06, 0x00, 0x0e, 0x00, 0x90, 0x02, 0xb0, 0x84, 
-	0x25, 0x00, 0x98, 0x07, 0x1d, 0xc2, 0x32, 0x21, 
-	0x92, 0x00, 0x20, 0xff, 0x30, 0x01, 0x68, 0x00, 
-	0x49, 0x6b, 0x60, 0x08, 0x98, 0x12, 0x28, 0x01, 
-	0xd1, 0x73, 0x98, 0x07, 0x28, 0x00, 0xd1, 0x05, 
-	0x20, 0x63, 0xb0, 0x07, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 0x91, 0x01, 
-	0x99, 0x01, 0x23, 0xff, 0x33, 0xe1, 0x42, 0x99, 
-	0xd3, 0x04, 0xe0, 0x0a, 0x99, 0x01, 0x31, 0x01, 
-	0x91, 0x01, 0xe7, 0xf5, 0x20, 0x00, 0x99, 0x01, 
-	0x23, 0x2c, 0x43, 0x59, 0x9a, 0x00, 0x50, 0x50, 
-	0xe7, 0xf4, 0x98, 0x07, 0x49, 0x5b, 0x68, 0x09, 
-	0x60, 0x08, 0x98, 0x05, 0x28, 0x10, 0xdb, 0x01, 
-	0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x99, 0x05, 
-	0x29, 0x1f, 0xdc, 0x01, 0x21, 0x01, 0xe0, 0x00, 
-	0x21, 0x00, 0x40, 0x08, 0xd0, 0x04, 0x98, 0x05, 
-	0x49, 0x53, 0x68, 0x09, 0x60, 0x08, 0xe0, 0x02, 
-	0x20, 0x62, 0xb0, 0x07, 0xe7, 0xce, 0x20, 0x00, 
-	0x49, 0x4d, 0x68, 0x09, 0x70, 0x08, 0x1c, 0x30, 
-	0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 
-	0x21, 0x01, 0xf0, 0x00, 0xfb, 0x01, 0x1c, 0x07, 
-	0x2f, 0x00, 0xd0, 0x02, 0x20, 0xa2, 0xb0, 0x07, 
-	0xe7, 0xbc, 0x22, 0x00, 0xb4, 0x04, 0x99, 0x05, 
-	0x1c, 0x30, 0x23, 0x04, 0x22, 0x00, 0xf0, 0x00, 
-	0xf9, 0x2f, 0xb0, 0x01, 0x1c, 0x07, 0x2f, 0x00, 
-	0xd0, 0x02, 0x20, 0xa2, 0xb0, 0x07, 0xe7, 0xad, 
-	0x98, 0x06, 0x28, 0x00, 0xdb, 0x04, 0x98, 0x06, 
-	0x28, 0x3f, 0xdc, 0x01, 0x9d, 0x06, 0xe0, 0x00, 
-	0x25, 0x1b, 0x98, 0x11, 0x01, 0x80, 0x43, 0x05, 
-	0x23, 0x80, 0x43, 0x1d, 0x48, 0x39, 0x68, 0x01, 
-	0x0a, 0x09, 0x02, 0x09, 0x60, 0x01, 0x48, 0x37, 
-	0x68, 0x01, 0x43, 0x29, 0x60, 0x01, 0xf0, 0x11, 
-	0xfe, 0x2d, 0x90, 0x03, 0xf0, 0x11, 0xfe, 0x44, 
-	0xe0, 0x00, 0xe0, 0x13, 0x90, 0x02, 0xf0, 0x11, 
-	0xfe, 0xa3, 0x1c, 0x04, 0x4b, 0x30, 0x40, 0x1c, 
-	0x1c, 0x20, 0xf0, 0x11, 0xfe, 0xa1, 0x98, 0x02, 
-	0x28, 0x40, 0xd0, 0x01, 0xf0, 0x11, 0xfe, 0x6c, 
-	0x98, 0x03, 0x28, 0x80, 0xd0, 0x01, 0xf0, 0x11, 
-	0xfe, 0x4b, 0xe0, 0x43, 0x22, 0x00, 0xb4, 0x04, 
-	0x1c, 0x30, 0x23, 0x04, 0x22, 0x00, 0x49, 0x27, 
-	0xf0, 0x00, 0xf8, 0xee, 0xb0, 0x01, 0x1c, 0x07, 
-	0x2f, 0x00, 0xd0, 0x02, 0x20, 0xa2, 0xb0, 0x07, 
-	0xe7, 0x6c, 0x1c, 0x30, 0x23, 0x03, 0x02, 0x5b, 
-	0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, 0xf0, 0x00, 
-	0xfa, 0xa3, 0x1c, 0x07, 0x2f, 0x00, 0xd0, 0x02, 
-	0x20, 0xa2, 0xb0, 0x07, 0xe7, 0x5e, 0x48, 0x19, 
-	0x68, 0x01, 0x0a, 0x09, 0x02, 0x09, 0x60, 0x01, 
-	0x48, 0x16, 0x68, 0x01, 0x23, 0x1b, 0x43, 0x19, 
-	0x60, 0x01, 0x48, 0x12, 0x68, 0x00, 0x68, 0x00, 
-	0x90, 0x07, 0xf0, 0x11, 0xfd, 0xe7, 0x90, 0x03, 
-	0xf0, 0x11, 0xfd, 0xfe, 0x90, 0x02, 0xf0, 0x11, 
-	0xfe, 0x5f, 0x1c, 0x04, 0x23, 0x01, 0x04, 0x5b, 
-	0x43, 0x1c, 0x1c, 0x20, 0xf0, 0x11, 0xfe, 0x5c, 
-	0x98, 0x02, 0x28, 0x40, 0xd0, 0x01, 0xf0, 0x11, 
-	0xfe, 0x27, 0x98, 0x03, 0x28, 0x80, 0xd0, 0x01, 
-	0xf0, 0x11, 0xfe, 0x06, 0x1c, 0x38, 0xb0, 0x07, 
-	0xe7, 0x34, 0xb0, 0x04, 0xb0, 0x03, 0xe7, 0x31, 
-	0x2e, 0x08, 0x5d, 0xb8, 0x2e, 0x08, 0x5d, 0xb0, 
-	0x2e, 0x08, 0x5d, 0xb4, 0x68, 0x00, 0x00, 0x38, 
-	0xff, 0xfd, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 
-	0xb5, 0x00, 0xf7, 0xff, 0xfe, 0xe7, 0xf0, 0x00, 
-	0xf8, 0x02, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 
-	0xf0, 0x0b, 0xf9, 0x48, 0x26, 0x00, 0x2e, 0x04, 
-	0xd3, 0x02, 0xe0, 0x12, 0x36, 0x01, 0xe7, 0xfa, 
-	0x01, 0x30, 0x4b, 0x3c, 0x18, 0xc7, 0x25, 0x00, 
-	0x2d, 0x04, 0xd3, 0x02, 0xe0, 0x08, 0x35, 0x01, 
-	0xe7, 0xfa, 0x20, 0x00, 0x60, 0xb8, 0x20, 0x00, 
-	0x60, 0xf8, 0x37, 0xff, 0x37, 0x01, 0xe7, 0xf6, 
-	0xe7, 0xec, 0x4f, 0x35, 0x25, 0x00, 0x2d, 0x04, 
-	0xd3, 0x02, 0xe0, 0x07, 0x35, 0x01, 0xe7, 0xfa, 
-	0x20, 0x00, 0x60, 0xb8, 0x20, 0x00, 0x60, 0xf8, 
-	0x37, 0x10, 0xe7, 0xf7, 0x20, 0x00, 0x49, 0x2f, 
-	0x68, 0x09, 0x70, 0x08, 0x24, 0x00, 0x2c, 0x20, 
-	0xd3, 0x02, 0xe0, 0x1f, 0x34, 0x01, 0xe7, 0xfa, 
-	0x21, 0x00, 0x00, 0xe0, 0x4a, 0x2a, 0x68, 0x12, 
-	0x50, 0x11, 0x20, 0x00, 0x00, 0xe1, 0x4a, 0x28, 
-	0x68, 0x12, 0x18, 0x89, 0x60, 0x48, 0x21, 0x00, 
-	0x00, 0xe0, 0x4a, 0x26, 0x68, 0x12, 0x18, 0x80, 
-	0x60, 0x41, 0x20, 0x00, 0x00, 0xa1, 0x4a, 0x24, 
-	0x68, 0x12, 0x50, 0x50, 0x20, 0x00, 0x00, 0xe1, 
-	0x1b, 0x09, 0x00, 0x89, 0x4a, 0x21, 0x68, 0x12, 
-	0x52, 0x50, 0xe7, 0xdf, 0x20, 0x00, 0x21, 0x19, 
-	0x06, 0x89, 0x62, 0x48, 0x48, 0x1e, 0x21, 0x19, 
-	0x06, 0x89, 0x62, 0x48, 0x20, 0x00, 0x49, 0x1d, 
-	0x68, 0x09, 0x60, 0x08, 0x20, 0x00, 0x49, 0x1b, 
-	0x68, 0x09, 0x60, 0x48, 0x20, 0x00, 0x49, 0x19, 
-	0x68, 0x09, 0x60, 0xc8, 0x20, 0x00, 0x49, 0x17, 
-	0x68, 0x09, 0x61, 0x08, 0x20, 0x00, 0x49, 0x15, 
-	0x68, 0x09, 0x61, 0x48, 0x20, 0x00, 0x49, 0x13, 
-	0x68, 0x09, 0x61, 0x88, 0x20, 0x00, 0x49, 0x12, 
-	0x68, 0x09, 0x60, 0x08, 0x20, 0x00, 0x49, 0x10, 
-	0x68, 0x09, 0x60, 0x48, 0x20, 0x00, 0x49, 0x0e, 
-	0x68, 0x09, 0x60, 0x88, 0x48, 0x0d, 0x68, 0x01, 
-	0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x9e, 0x00, 0x00, 0xc0, 
-	0x9e, 0x00, 0x09, 0x80, 0x2e, 0x08, 0x5d, 0xbc, 
-	0x2e, 0x08, 0x5d, 0xd0, 0x2e, 0x08, 0x5d, 0xd4, 
-	0x2e, 0x08, 0x5d, 0xcc, 0x2e, 0x08, 0x5d, 0xc4, 
-	0x00, 0x40, 0x00, 0x03, 0x2e, 0x08, 0x5e, 0x0c, 
-	0x2e, 0x08, 0x5e, 0x10, 0x6a, 0x00, 0x00, 0x10, 
-	0xb5, 0xff, 0xb0, 0x83, 0x98, 0x03, 0x06, 0x04, 
-	0x0e, 0x24, 0x99, 0x04, 0x04, 0x08, 0x0c, 0x00, 
-	0x90, 0x00, 0x9a, 0x05, 0x06, 0x10, 0x0e, 0x00, 
-	0x90, 0x01, 0x9b, 0x06, 0x06, 0x18, 0x0e, 0x00, 
-	0x90, 0x02, 0xb0, 0x81, 0x00, 0xe0, 0x49, 0xc1, 
-	0x68, 0x09, 0x18, 0x47, 0x00, 0xa0, 0x49, 0xc0, 
-	0x68, 0x09, 0x18, 0x45, 0x00, 0xe0, 0x1b, 0x00, 
-	0x00, 0x80, 0x49, 0xbe, 0x68, 0x09, 0x18, 0x46, 
-	0x2c, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x04, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x68, 0x28, 0x4b, 0xb9, 0x40, 0x18, 0x60, 0x28, 
-	0x68, 0x38, 0x4b, 0xb8, 0x40, 0x18, 0x60, 0x38, 
-	0x68, 0x38, 0x23, 0x40, 0x40, 0x18, 0xd0, 0x17, 
-	0x68, 0x38, 0x23, 0x40, 0x43, 0xdb, 0x40, 0x18, 
-	0x60, 0x38, 0x48, 0xb3, 0x68, 0x01, 0x08, 0x49, 
-	0x00, 0x49, 0x60, 0x01, 0x48, 0xb1, 0x68, 0x01, 
-	0x23, 0x01, 0x05, 0x5b, 0x43, 0x19, 0x60, 0x01, 
-	0x98, 0x01, 0x4b, 0xaf, 0x42, 0x98, 0xd1, 0x03, 
-	0x20, 0x00, 0x49, 0xae, 0x68, 0x09, 0x60, 0x08, 
-	0x98, 0x01, 0x4b, 0xab, 0x42, 0x98, 0xd0, 0x73, 
-	0x68, 0x38, 0x23, 0x21, 0x43, 0xdb, 0x40, 0x18, 
-	0x60, 0x38, 0x68, 0x28, 0x23, 0x07, 0x03, 0x5b, 
-	0x40, 0x18, 0x60, 0x28, 0x98, 0x01, 0x4b, 0xa6, 
-	0x40, 0x18, 0x68, 0x29, 0x43, 0x08, 0x60, 0x28, 
-	0x20, 0x00, 0x75, 0x30, 0x98, 0x02, 0x07, 0x80, 
-	0x0f, 0x80, 0x28, 0x01, 0xd1, 0x04, 0x88, 0x30, 
-	0x23, 0x10, 0x43, 0x18, 0x80, 0x30, 0xe0, 0x04, 
-	0x88, 0x30, 0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, 
-	0x80, 0x30, 0x98, 0x02, 0x23, 0x80, 0x40, 0x18, 
-	0x28, 0x80, 0xd1, 0x08, 0x68, 0x38, 0x23, 0x40, 
-	0x43, 0x18, 0x60, 0x38, 0x20, 0xff, 0x49, 0x97, 
-	0x68, 0x09, 0x70, 0x08, 0xe0, 0x04, 0x68, 0x38, 
-	0x23, 0x40, 0x43, 0xdb, 0x40, 0x18, 0x60, 0x38, 
-	0x98, 0x03, 0x28, 0x01, 0xd1, 0x36, 0x88, 0x30, 
-	0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, 0x80, 0x30, 
-	0x20, 0x33, 0x06, 0x40, 0x6d, 0x40, 0x23, 0x0d, 
-	0x06, 0x9b, 0x1a, 0xc1, 0x00, 0xe0, 0x4a, 0x8c, 
-	0x68, 0x12, 0x18, 0x80, 0x60, 0x41, 0x20, 0x01, 
-	0x70, 0xb0, 0x68, 0x38, 0x23, 0x01, 0x03, 0x9b, 
-	0x43, 0x18, 0x60, 0x38, 0x68, 0x38, 0x4b, 0x87, 
-	0x43, 0x18, 0x60, 0x38, 0x48, 0x86, 0x70, 0x44, 
-	0x20, 0x00, 0x49, 0x86, 0x68, 0x09, 0x60, 0x08, 
-	0x20, 0x01, 0x02, 0xc0, 0x49, 0x84, 0x61, 0x48, 
-	0x49, 0x83, 0x61, 0x08, 0x20, 0x01, 0x49, 0x83, 
-	0x64, 0x48, 0x20, 0x00, 0x49, 0x81, 0x64, 0x48, 
-	0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, 
-	0x60, 0x28, 0x20, 0x00, 0x49, 0x7e, 0x68, 0x09, 
-	0x60, 0x08, 0xe0, 0x9a, 0x98, 0x03, 0x28, 0x02, 
-	0xd1, 0x30, 0x20, 0x33, 0x06, 0x40, 0xe0, 0x00, 
-	0xe0, 0x94, 0x6d, 0xc0, 0x23, 0x0d, 0x06, 0x9b, 
-	0x1a, 0xc0, 0x00, 0xe1, 0x4a, 0x70, 0x68, 0x12, 
-	0x18, 0x89, 0x60, 0x48, 0x20, 0x02, 0x70, 0xb0, 
-	0x68, 0x38, 0x23, 0x01, 0x03, 0xdb, 0x43, 0x18, 
-	0x60, 0x38, 0x68, 0x38, 0x4b, 0x6b, 0x43, 0x18, 
-	0x60, 0x38, 0x48, 0x6b, 0x70, 0x84, 0x20, 0x00, 
-	0x49, 0x6e, 0x60, 0x08, 0x00, 0xe0, 0x49, 0x5b, 
-	0x68, 0x09, 0x58, 0x08, 0x23, 0xff, 0x33, 0x01, 
-	0x43, 0x18, 0x00, 0xe1, 0x4a, 0x57, 0x68, 0x12, 
-	0x50, 0x50, 0x20, 0x4b, 0x49, 0x67, 0x60, 0x08, 
-	0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, 
-	0x60, 0x28, 0xe0, 0x66, 0x98, 0x03, 0x28, 0x04, 
-	0xd1, 0x15, 0x20, 0x00, 0x00, 0xe1, 0x4a, 0x5a, 
-	0x68, 0x12, 0x18, 0x89, 0x60, 0x48, 0x98, 0x03, 
-	0x70, 0xb0, 0x68, 0x38, 0x23, 0x20, 0x43, 0x18, 
-	0x60, 0x38, 0x68, 0x38, 0x60, 0x38, 0x48, 0x56, 
-	0x70, 0x04, 0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 
-	0x43, 0x18, 0x60, 0x28, 0xe0, 0x4d, 0x98, 0x03, 
-	0x23, 0x10, 0x40, 0x18, 0xd0, 0x0f, 0x21, 0x00, 
-	0x00, 0xe0, 0x4a, 0x4d, 0x68, 0x12, 0x18, 0x80, 
-	0x60, 0x41, 0x68, 0x38, 0x4b, 0x52, 0x43, 0x18, 
-	0x60, 0x38, 0x68, 0x38, 0x60, 0x38, 0x37, 0x04, 
-	0x20, 0x0e, 0x60, 0x38, 0xe0, 0x39, 0x98, 0x03, 
-	0x28, 0x08, 0xd1, 0x23, 0x48, 0x4d, 0x68, 0x00, 
-	0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, 0xd0, 0x03, 
-	0x20, 0x4f, 0xb0, 0x04, 0xe6, 0xf8, 0xe0, 0x67, 
-	0x20, 0x01, 0x49, 0x48, 0x68, 0x09, 0x31, 0x60, 
-	0x76, 0x88, 0x48, 0x46, 0x68, 0x00, 0x30, 0x60, 
-	0x76, 0x04, 0x20, 0x01, 0x49, 0x43, 0x68, 0x09, 
-	0x31, 0x80, 0x70, 0xc8, 0x49, 0x42, 0x00, 0xe0, 
-	0x4a, 0x37, 0x68, 0x12, 0x18, 0x80, 0x60, 0x41, 
-	0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, 
-	0x60, 0x28, 0xe0, 0x12, 0x21, 0x00, 0x00, 0xe0, 
-	0x4a, 0x31, 0x68, 0x12, 0x18, 0x80, 0x60, 0x41, 
-	0x98, 0x03, 0x70, 0xb0, 0x68, 0x38, 0x23, 0x20, 
-	0x43, 0x18, 0x60, 0x38, 0x68, 0x38, 0x60, 0x38, 
-	0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, 
-	0x60, 0x28, 0xe0, 0x33, 0x98, 0x03, 0x23, 0x10, 
-	0x40, 0x18, 0xd0, 0x09, 0x1c, 0x20, 0xf0, 0x05, 
-	0xf8, 0x0f, 0x90, 0x00, 0x28, 0x00, 0xd0, 0x02, 
-	0x98, 0x00, 0xb0, 0x04, 0xe6, 0xbc, 0xe0, 0x1a, 
-	0x98, 0x03, 0x28, 0x01, 0xd1, 0x03, 0x20, 0xff, 
-	0x49, 0x21, 0x70, 0x48, 0xe0, 0x13, 0x98, 0x03, 
-	0x28, 0x02, 0xd1, 0x03, 0x20, 0xff, 0x49, 0x1e, 
-	0x70, 0x88, 0xe0, 0x0c, 0x98, 0x03, 0x28, 0x08, 
-	0xd1, 0x09, 0x20, 0x00, 0x49, 0x21, 0x68, 0x09, 
-	0x31, 0x80, 0x70, 0xc8, 0x20, 0x00, 0x49, 0x1f, 
-	0x68, 0x09, 0x31, 0x60, 0x76, 0x88, 0x7d, 0x30, 
-	0x07, 0xc0, 0x0f, 0xc0, 0x28, 0x01, 0xd1, 0x03, 
-	0x1c, 0x20, 0x49, 0x1c, 0xf0, 0x00, 0xf9, 0x16, 
-	0x20, 0x00, 0x70, 0xb0, 0x20, 0x00, 0xb0, 0x04, 
-	0xe6, 0x92, 0xb0, 0x01, 0xb0, 0x03, 0xe6, 0x8f, 
-	0xe6, 0x8e, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xd0, 
-	0x2e, 0x08, 0x5d, 0xcc, 0x2e, 0x08, 0x5d, 0xc4, 
-	0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x3f, 0xff, 
-	0x6a, 0x00, 0x00, 0x18, 0x6c, 0x00, 0x00, 0x20, 
-	0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x5d, 0xd8, 
-	0xff, 0xff, 0x1f, 0xff, 0x2e, 0x08, 0x5e, 0x2c, 
-	0x2e, 0x08, 0x5d, 0xd4, 0x00, 0x00, 0x20, 0x01, 
-	0x2e, 0x08, 0x5e, 0x30, 0x2e, 0x08, 0x5d, 0xfc, 
-	0xcc, 0x00, 0x0f, 0x00, 0x66, 0x00, 0x00, 0x80, 
-	0x2e, 0x08, 0x5e, 0x40, 0x2e, 0x08, 0x5e, 0x44, 
-	0x00, 0x00, 0x20, 0xa0, 0x2e, 0x08, 0x7c, 0x44, 
-	0x66, 0x00, 0x01, 0xf0, 0xff, 0xff, 0x00, 0x00, 
-	0xb5, 0xff, 0x98, 0x00, 0x06, 0x01, 0x0e, 0x09, 
-	0x98, 0x01, 0x06, 0x02, 0x0e, 0x12, 0x98, 0x02, 
-	0x04, 0x07, 0x0c, 0x3f, 0x9b, 0x03, 0x04, 0x1c, 
-	0x0c, 0x24, 0x29, 0x20, 0xdb, 0x04, 0x20, 0xa2, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2a, 0x02, 0xd1, 0x0a, 0x00, 0xc8, 0x4b, 0x1f, 
-	0x68, 0x1b, 0x58, 0x18, 0x4b, 0x1e, 0x40, 0x18, 
-	0x00, 0xcb, 0x4d, 0x1c, 0x68, 0x2d, 0x50, 0xe8, 
-	0xe0, 0x30, 0x2a, 0x01, 0xd1, 0x0b, 0x00, 0xc8, 
-	0x4b, 0x18, 0x68, 0x1b, 0x58, 0x18, 0x43, 0x27, 
-	0x1c, 0x3b, 0x43, 0x18, 0x00, 0xcb, 0x4d, 0x15, 
-	0x68, 0x2d, 0x50, 0xe8, 0xe0, 0x22, 0x20, 0x00, 
-	0x28, 0x20, 0xdb, 0x04, 0xe0, 0x1e, 0x1c, 0x43, 
-	0x06, 0x1b, 0x16, 0x18, 0xe7, 0xf8, 0x2a, 0x03, 
-	0xd1, 0x0b, 0x00, 0xc3, 0x4d, 0x0d, 0x68, 0x2d, 
-	0x58, 0xeb, 0x1c, 0x3d, 0x43, 0x25, 0x43, 0x1d, 
-	0x00, 0xc3, 0x4e, 0x0a, 0x68, 0x36, 0x50, 0xf5, 
-	0xe0, 0x0b, 0x2a, 0x04, 0xd1, 0x09, 0x00, 0xc3, 
-	0x4d, 0x06, 0x68, 0x2d, 0x58, 0xed, 0x4b, 0x06, 
-	0x40, 0x2b, 0x00, 0xc5, 0x4e, 0x03, 0x68, 0x36, 
-	0x51, 0x73, 0xe7, 0xe0, 0x20, 0x00, 0xe7, 0xbb, 
-	0xe7, 0xba, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xd0, 
-	0xff, 0xff, 0xe1, 0xff, 0xb4, 0xb0, 0x1c, 0x07, 
-	0x1c, 0x0a, 0x06, 0x38, 0x0e, 0x00, 0x06, 0x11, 
-	0x0e, 0x09, 0x4c, 0x14, 0x68, 0x25, 0x4b, 0x14, 
-	0x40, 0x2b, 0x60, 0x23, 0x28, 0x01, 0xd1, 0x06, 
-	0x4c, 0x10, 0x68, 0x25, 0x23, 0x01, 0x04, 0x1b, 
-	0x43, 0x2b, 0x60, 0x23, 0xe0, 0x07, 0x28, 0x00, 
-	0xd1, 0x05, 0x4c, 0x0c, 0x68, 0x25, 0x23, 0x01, 
-	0x05, 0x9b, 0x43, 0x2b, 0x60, 0x23, 0x29, 0x01, 
-	0xd1, 0x06, 0x4c, 0x08, 0x68, 0x25, 0x23, 0x01, 
-	0x03, 0x9b, 0x43, 0x2b, 0x60, 0x23, 0xe0, 0x07, 
-	0x29, 0x02, 0xd1, 0x05, 0x4c, 0x03, 0x68, 0x25, 
-	0x23, 0x01, 0x03, 0xdb, 0x43, 0x2b, 0x60, 0x23, 
-	0xbc, 0xb0, 0x47, 0x70, 0x64, 0x00, 0x00, 0x24, 
-	0xff, 0xbe, 0x3f, 0xff, 0xb5, 0xff, 0x1c, 0x1f, 
-	0x9c, 0x09, 0xb0, 0x82, 0x98, 0x02, 0x04, 0x00, 
-	0x0c, 0x00, 0x90, 0x00, 0x99, 0x03, 0x06, 0x0a, 
-	0x0e, 0x12, 0x98, 0x04, 0x06, 0x05, 0x0e, 0x2d, 
-	0x98, 0x0c, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x01, 
-	0x00, 0xd0, 0x1a, 0x80, 0x00, 0x80, 0x4b, 0x1b, 
-	0x68, 0x1b, 0x18, 0xc1, 0x2a, 0x20, 0xdb, 0x05, 
-	0x20, 0xa2, 0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2d, 0x1f, 0xdb, 0x02, 
-	0x20, 0xaf, 0xb0, 0x02, 0xe7, 0xf6, 0x71, 0x8d, 
-	0x68, 0x3b, 0x00, 0xd0, 0x4e, 0x12, 0x68, 0x36, 
-	0x19, 0x80, 0x60, 0x43, 0x1c, 0x20, 0x71, 0xc8, 
-	0x20, 0x00, 0x80, 0x88, 0x20, 0x00, 0x60, 0xc8, 
-	0x98, 0x00, 0x23, 0x01, 0x43, 0x18, 0x75, 0x08, 
-	0x98, 0x01, 0x74, 0x88, 0x60, 0x8f, 0x88, 0xb8, 
-	0x82, 0x08, 0x20, 0x00, 0x74, 0xc8, 0x88, 0xb8, 
-	0x61, 0x38, 0x20, 0x00, 0x73, 0x38, 0x20, 0x00, 
-	0x73, 0x78, 0x20, 0x00, 0x73, 0xb8, 0x20, 0x00, 
-	0x73, 0xf8, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xd1, 
-	0xb0, 0x02, 0xe7, 0xcf, 0x2e, 0x08, 0x5d, 0xc4, 
-	0x2e, 0x08, 0x5d, 0xd4, 0xb5, 0xf3, 0x98, 0x00, 
-	0x06, 0x04, 0x0e, 0x24, 0x99, 0x01, 0x04, 0x0d, 
-	0x0c, 0x2d, 0x00, 0xe0, 0x1b, 0x00, 0x00, 0x80, 
-	0x49, 0x25, 0x68, 0x09, 0x18, 0x47, 0x2c, 0x20, 
-	0xdb, 0x04, 0x20, 0xa2, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x4b, 0x21, 0x42, 0x9d, 
-	0xd1, 0x27, 0x00, 0xe1, 0x4b, 0x20, 0x68, 0x1b, 
-	0x18, 0xc8, 0x00, 0xa1, 0x4b, 0x1f, 0x68, 0x1b, 
-	0x18, 0xca, 0x68, 0x11, 0x4b, 0x1e, 0x40, 0x19, 
-	0x60, 0x11, 0x68, 0x01, 0x23, 0x40, 0x40, 0x19, 
-	0xd0, 0x13, 0x68, 0x01, 0x23, 0x40, 0x43, 0xdb, 
-	0x40, 0x19, 0x60, 0x01, 0x21, 0x00, 0x4b, 0x19, 
-	0x68, 0x1b, 0x70, 0x19, 0x49, 0x18, 0x68, 0x0b, 
-	0x08, 0x5b, 0x00, 0x5b, 0x60, 0x0b, 0x49, 0x17, 
-	0x68, 0x0e, 0x23, 0x01, 0x05, 0x5b, 0x43, 0x33, 
-	0x60, 0x0b, 0x68, 0x01, 0x4b, 0x14, 0x40, 0x19, 
-	0x60, 0x01, 0x20, 0x00, 0x75, 0x38, 0x20, 0x00, 
-	0x80, 0x38, 0x20, 0x00, 0x80, 0xb8, 0x68, 0xb8, 
-	0x72, 0x44, 0x20, 0xa0, 0x68, 0xb9, 0x72, 0x08, 
-	0x20, 0x00, 0x60, 0xb8, 0x79, 0xb9, 0x20, 0x01, 
-	0x40, 0x88, 0xf0, 0x11, 0xf9, 0xe5, 0x20, 0x00, 
-	0x71, 0xb8, 0x20, 0x00, 0xe7, 0xba, 0xe7, 0xb9, 
-	0x2e, 0x08, 0x5d, 0xc4, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x5d, 0xd0, 0x2e, 0x08, 0x5d, 0xcc, 
-	0xff, 0xff, 0xdf, 0xff, 0x2e, 0x08, 0x5d, 0xc0, 
-	0x6a, 0x00, 0x00, 0x18, 0x6c, 0x00, 0x00, 0x20, 
-	0xff, 0xff, 0x3f, 0xde, 0xb5, 0xff, 0x1c, 0x05, 
-	0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x28, 0x0e, 0x00, 
-	0x06, 0x23, 0x0e, 0x1b, 0x06, 0x39, 0x0e, 0x09, 
-	0x9e, 0x03, 0x06, 0x36, 0x16, 0x32, 0x28, 0x20, 
-	0xda, 0x02, 0x4e, 0x08, 0x68, 0x36, 0x60, 0x30, 
-	0x4e, 0x07, 0x68, 0x36, 0x60, 0x33, 0x4e, 0x07, 
-	0x68, 0x36, 0x60, 0x31, 0x4e, 0x06, 0x68, 0x36, 
-	0x60, 0x32, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xec, 
-	0x2e, 0x08, 0x5d, 0xf0, 0x2e, 0x08, 0x5d, 0xf4, 
-	0x2e, 0x08, 0x5d, 0xf8, 0x1c, 0x01, 0x06, 0x08, 
-	0x0e, 0x00, 0x28, 0x01, 0xd1, 0x04, 0x22, 0x01, 
-	0x4b, 0x04, 0x68, 0x1b, 0x60, 0x1a, 0xe0, 0x03, 
-	0x22, 0x02, 0x4b, 0x02, 0x68, 0x1b, 0x60, 0x1a, 
-	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x34, 
-	0xb5, 0xf1, 0x98, 0x00, 0x06, 0x04, 0x0e, 0x24, 
-	0xb0, 0x81, 0x27, 0x00, 0x26, 0x00, 0x4a, 0x55, 
-	0x92, 0x00, 0x00, 0xe0, 0x49, 0x54, 0x68, 0x09, 
-	0x58, 0x08, 0x23, 0x03, 0x03, 0x9b, 0x40, 0x18, 
-	0x23, 0x01, 0x03, 0x9b, 0x42, 0x98, 0xd0, 0x05, 
-	0x20, 0xa0, 0xb0, 0x01, 0xb0, 0x01, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0xe0, 0x49, 0x4c, 
-	0x68, 0x09, 0x58, 0x08, 0x21, 0x20, 0x43, 0x01, 
-	0x00, 0xe0, 0x4a, 0x49, 0x68, 0x12, 0x50, 0x11, 
-	0x21, 0x00, 0x48, 0x48, 0xf0, 0x05, 0xfc, 0x3c, 
-	0x48, 0x47, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x01, 
-	0xe0, 0x08, 0xe0, 0x82, 0x20, 0x02, 0xf0, 0x0c, 
-	0xf8, 0x75, 0x1c, 0x38, 0x37, 0x01, 0x4b, 0x43, 
-	0x42, 0x98, 0xd3, 0xf1, 0x4b, 0x41, 0x42, 0x9f, 
-	0xd3, 0x00, 0x26, 0xa1, 0x48, 0x40, 0x68, 0x01, 
-	0x4b, 0x40, 0x40, 0x19, 0x60, 0x01, 0x20, 0x00, 
-	0x00, 0xe1, 0x1b, 0x09, 0x00, 0x89, 0x4a, 0x3e, 
-	0x68, 0x12, 0x18, 0x89, 0x70, 0x88, 0x20, 0x00, 
-	0x43, 0xc0, 0x49, 0x3c, 0x67, 0x48, 0x22, 0x00, 
-	0xb4, 0x04, 0x1c, 0x20, 0x23, 0x00, 0x22, 0x00, 
-	0x49, 0x39, 0xf7, 0xff, 0xfc, 0x69, 0xb0, 0x01, 
-	0x27, 0x00, 0x25, 0x00, 0x2d, 0x04, 0xdb, 0x02, 
-	0xe0, 0x1e, 0x35, 0x01, 0xe7, 0xfa, 0x00, 0xa9, 
-	0x22, 0x0f, 0x1c, 0x10, 0x40, 0x88, 0x01, 0x29, 
-	0x9a, 0x00, 0x18, 0x89, 0x68, 0x49, 0x42, 0xa1, 
-	0xd1, 0x11, 0x21, 0x33, 0x06, 0x49, 0x6b, 0xc9, 
-	0x40, 0x01, 0xd0, 0x01, 0x37, 0x01, 0xe0, 0x00, 
-	0xe0, 0x02, 0x4b, 0x26, 0x42, 0x9f, 0xd3, 0xf4, 
-	0x4b, 0x24, 0x42, 0x9f, 0xd3, 0x02, 0x26, 0xa1, 
-	0xe0, 0x02, 0xe0, 0x3a, 0x27, 0x00, 0xe7, 0xe0, 
-	0x48, 0x26, 0x68, 0x01, 0x23, 0xff, 0x33, 0x01, 
-	0x43, 0x19, 0x60, 0x01, 0x48, 0x21, 0x6d, 0x80, 
-	0x49, 0x20, 0x65, 0x88, 0x48, 0x1f, 0x6b, 0xc0, 
-	0x23, 0x01, 0x07, 0x9b, 0x40, 0x18, 0xd0, 0x00, 
-	0xe7, 0xf8, 0x20, 0x33, 0x06, 0x40, 0x6d, 0x40, 
-	0x21, 0x33, 0x06, 0x49, 0x66, 0x48, 0x20, 0x33, 
-	0x06, 0x40, 0x6d, 0x80, 0x21, 0x33, 0x06, 0x49, 
-	0x66, 0x88, 0x20, 0x03, 0x02, 0x00, 0x49, 0x15, 
-	0x67, 0x48, 0x48, 0x11, 0x68, 0x01, 0x23, 0x01, 
-	0x02, 0x5b, 0x43, 0x19, 0x60, 0x01, 0x20, 0x00, 
-	0x49, 0x13, 0x65, 0x88, 0x20, 0x00, 0x49, 0x12, 
-	0x65, 0xc8, 0x20, 0x00, 0x49, 0x10, 0x66, 0x08, 
-	0x21, 0x00, 0x20, 0xff, 0xf0, 0x05, 0xfb, 0xb8, 
-	0x1c, 0x30, 0xb0, 0x01, 0xe7, 0x66, 0xb0, 0x01, 
-	0xe7, 0x64, 0xe7, 0x63, 0x9e, 0x00, 0x00, 0xc0, 
-	0x2e, 0x08, 0x5d, 0xd0, 0x00, 0x00, 0x80, 0x0f, 
-	0xcc, 0x00, 0x05, 0x00, 0x00, 0x1e, 0x84, 0x80, 
-	0x66, 0x00, 0x00, 0x4c, 0xff, 0xff, 0xfd, 0xff, 
-	0x2e, 0x08, 0x5d, 0xc4, 0x66, 0x00, 0x00, 0x80, 
-	0x00, 0x00, 0xff, 0xff, 0x66, 0x00, 0x00, 0xe0, 
-	0xcc, 0x00, 0x00, 0x00, 0xb5, 0xf1, 0x98, 0x00, 
-	0x06, 0x07, 0x0e, 0x3f, 0xb0, 0x81, 0x25, 0x00, 
-	0x26, 0x00, 0x4a, 0x2e, 0x92, 0x00, 0x00, 0xf8, 
-	0x49, 0x2d, 0x68, 0x09, 0x58, 0x08, 0x23, 0x03, 
-	0x03, 0x9b, 0x40, 0x18, 0x23, 0x01, 0x03, 0xdb, 
-	0x42, 0x98, 0xd0, 0x05, 0x20, 0xa0, 0xb0, 0x01, 
-	0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x22, 0x00, 0xb4, 0x04, 0x1c, 0x38, 0x23, 0x00, 
-	0x22, 0x00, 0x49, 0x24, 0xf7, 0xff, 0xfb, 0xd0, 
-	0xb0, 0x01, 0x24, 0x00, 0x2c, 0x04, 0xdb, 0x02, 
-	0xe0, 0x1e, 0x34, 0x01, 0xe7, 0xfa, 0x00, 0xa1, 
-	0x22, 0x0f, 0x1c, 0x10, 0x40, 0x88, 0x01, 0x21, 
-	0x9a, 0x00, 0x18, 0x89, 0x68, 0x49, 0x42, 0xb9, 
-	0xd1, 0x11, 0x21, 0x33, 0x06, 0x49, 0x6b, 0xc9, 
-	0x40, 0x01, 0xd0, 0x01, 0x35, 0x01, 0xe0, 0x00, 
-	0xe0, 0x02, 0x4b, 0x17, 0x42, 0x9d, 0xd3, 0xf4, 
-	0x4b, 0x15, 0x42, 0x9d, 0xd9, 0x02, 0x26, 0xa1, 
-	0xe0, 0x02, 0xe0, 0x1d, 0x25, 0x00, 0xe7, 0xe0, 
-	0x20, 0x04, 0xf0, 0x02, 0xff, 0xb7, 0x20, 0x01, 
-	0x21, 0x33, 0x06, 0x49, 0x66, 0xc8, 0x21, 0x00, 
-	0x00, 0xf8, 0x4a, 0x0b, 0x68, 0x12, 0x50, 0x11, 
-	0x21, 0x00, 0x00, 0xf8, 0x4a, 0x08, 0x68, 0x12, 
-	0x18, 0x80, 0x60, 0x41, 0x21, 0x00, 0x00, 0xb8, 
-	0x4a, 0x08, 0x68, 0x12, 0x50, 0x11, 0x1c, 0x30, 
-	0xb0, 0x01, 0xe7, 0xb5, 0xb0, 0x01, 0xe7, 0xb3, 
-	0xe7, 0xb2, 0x00, 0x00, 0x9e, 0x00, 0x00, 0xc0, 
-	0x2e, 0x08, 0x5d, 0xd0, 0x00, 0x00, 0xff, 0xff, 
-	0x00, 0x01, 0xd4, 0xc0, 0x2e, 0x08, 0x5d, 0xcc, 
-	0xb5, 0xff, 0x99, 0x01, 0x06, 0x0f, 0x0e, 0x3f, 
-	0x9a, 0x02, 0x06, 0x15, 0x0e, 0x2d, 0x9b, 0x03, 
-	0x06, 0x1e, 0x0e, 0x36, 0x2d, 0x1f, 0xdb, 0x04, 
-	0x20, 0xaf, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x2f, 0x20, 0xdb, 0x01, 0x20, 0xa2, 
-	0xe7, 0xf7, 0x2e, 0x80, 0xd0, 0x13, 0xf0, 0x11, 
-	0xf8, 0x89, 0x1c, 0x04, 0x1c, 0x39, 0x22, 0x80, 
-	0x20, 0x01, 0xf0, 0x00, 0xfb, 0x6d, 0x2c, 0x80, 
-	0xd0, 0x01, 0xf0, 0x11, 0xf8, 0xb5, 0x98, 0x00, 
-	0x21, 0x80, 0x68, 0x49, 0x60, 0x08, 0x48, 0x09, 
-	0x68, 0x00, 0x70, 0x05, 0xe0, 0x0b, 0xf0, 0x11, 
-	0xf8, 0x75, 0x1c, 0x04, 0x1c, 0x39, 0x22, 0x80, 
-	0x20, 0x02, 0xf0, 0x00, 0xfb, 0x59, 0x2c, 0x80, 
-	0xd0, 0x01, 0xf0, 0x11, 0xf8, 0xa1, 0x20, 0x00, 
-	0xe7, 0xd3, 0xe7, 0xd2, 0x2e, 0x08, 0x5e, 0x1c, 
-	0xb5, 0xff, 0x99, 0x01, 0x06, 0x0e, 0x0e, 0x36, 
-	0x9a, 0x02, 0x06, 0x17, 0x0e, 0x3f, 0x9b, 0x03, 
-	0x06, 0x1c, 0x0e, 0x24, 0xb0, 0x82, 0x20, 0x80, 
-	0x40, 0x38, 0x90, 0x00, 0x06, 0x7f, 0x0e, 0x7f, 
-	0x2e, 0x1f, 0xdb, 0x05, 0x20, 0xaf, 0xb0, 0x02, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2c, 0x20, 0xdb, 0x02, 0x20, 0xa2, 0xb0, 0x02, 
-	0xe7, 0xf6, 0x2f, 0x04, 0xd1, 0x00, 0x27, 0x00, 
-	0x00, 0xe0, 0x1b, 0x00, 0x00, 0x80, 0x49, 0x17, 
-	0x68, 0x09, 0x18, 0x40, 0x90, 0x01, 0x98, 0x00, 
-	0x28, 0x00, 0xd0, 0x0d, 0xf0, 0x11, 0xf8, 0x3a, 
-	0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x02, 0x92, 
-	0x20, 0x02, 0xf0, 0x00, 0xfb, 0x1d, 0x2d, 0x80, 
-	0xd0, 0x01, 0xf0, 0x11, 0xf8, 0x65, 0xe0, 0x13, 
-	0xf0, 0x11, 0xf8, 0x2c, 0x1c, 0x05, 0x1c, 0x21, 
-	0x22, 0x01, 0x02, 0x92, 0x20, 0x01, 0xf0, 0x00, 
-	0xfb, 0x0f, 0x2d, 0x80, 0xd0, 0x01, 0xf0, 0x11, 
-	0xf8, 0x57, 0x98, 0x02, 0x21, 0x80, 0x68, 0x89, 
-	0x60, 0x08, 0x20, 0x80, 0x6a, 0x00, 0x55, 0xc6, 
-	0x20, 0x00, 0xb0, 0x02, 0xe7, 0xc4, 0xb0, 0x02, 
-	0xe7, 0xc2, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xc4, 
-	0xb5, 0xff, 0xb0, 0x82, 0x99, 0x03, 0x04, 0x0d, 
-	0x0c, 0x2d, 0x9a, 0x04, 0x06, 0x10, 0x0e, 0x00, 
-	0x90, 0x00, 0x9b, 0x05, 0x06, 0x18, 0x0e, 0x00, 
-	0x90, 0x01, 0x98, 0x00, 0x28, 0x1f, 0xdb, 0x05, 
-	0x20, 0xaf, 0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x98, 0x01, 0x23, 0x80, 
-	0x40, 0x18, 0xd1, 0x2f, 0x98, 0x00, 0x49, 0x2c, 
-	0x68, 0x09, 0x73, 0x08, 0x27, 0x00, 0x2f, 0x20, 
-	0xdb, 0x04, 0xe0, 0x26, 0x1c, 0x78, 0x06, 0x07, 
-	0x0e, 0x3f, 0xe7, 0xf8, 0x20, 0x01, 0x40, 0xb8, 
-	0x99, 0x02, 0x40, 0x08, 0xd0, 0x1c, 0x24, 0x00, 
-	0x20, 0x40, 0x40, 0x28, 0xd0, 0x04, 0x04, 0x20, 
-	0x0c, 0x00, 0x24, 0x01, 0x03, 0xa4, 0x43, 0x04, 
-	0x20, 0x80, 0x40, 0x28, 0xd0, 0x04, 0x04, 0x20, 
-	0x0c, 0x00, 0x24, 0x01, 0x03, 0xe4, 0x43, 0x04, 
-	0xf0, 0x10, 0xff, 0xd4, 0x1c, 0x06, 0x1c, 0x22, 
-	0x1c, 0x39, 0x20, 0x01, 0xf0, 0x00, 0xfa, 0xb8, 
-	0x2e, 0x80, 0xd0, 0x01, 0xf0, 0x11, 0xf8, 0x00, 
-	0xe7, 0xd8, 0xe0, 0x24, 0x27, 0x00, 0x2f, 0x20, 
-	0xdb, 0x04, 0xe0, 0x20, 0x1c, 0x78, 0x06, 0x07, 
-	0x0e, 0x3f, 0xe7, 0xf8, 0x20, 0x01, 0x40, 0xb8, 
-	0x99, 0x02, 0x40, 0x08, 0xd0, 0x16, 0x24, 0x00, 
-	0x20, 0x40, 0x40, 0x28, 0xd0, 0x01, 0x4b, 0x0d, 
-	0x40, 0x1c, 0x20, 0x80, 0x40, 0x28, 0xd0, 0x01, 
-	0x04, 0x64, 0x0c, 0x64, 0xf0, 0x10, 0xff, 0xae, 
-	0x1c, 0x06, 0x1c, 0x22, 0x1c, 0x39, 0x20, 0x02, 
-	0xf0, 0x00, 0xfa, 0x92, 0x2e, 0x80, 0xd0, 0x01, 
-	0xf0, 0x10, 0xff, 0xda, 0xe7, 0xde, 0x20, 0x00, 
-	0xb0, 0x02, 0xe7, 0x9f, 0xb0, 0x02, 0xe7, 0x9d, 
-	0x2e, 0x08, 0x5e, 0x10, 0x00, 0x00, 0xbf, 0xff, 
-	0xb5, 0x80, 0x1c, 0x07, 0x48, 0x07, 0x68, 0x01, 
-	0x20, 0x00, 0xf0, 0x19, 0xfe, 0x73, 0x60, 0x38, 
-	0x48, 0x04, 0x68, 0x00, 0x1d, 0x01, 0x20, 0x00, 
-	0xf0, 0x19, 0xfe, 0x6c, 0x60, 0x78, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x5e, 0x10, 
-	0xb5, 0xf7, 0x1c, 0x07, 0x99, 0x01, 0x06, 0x0e, 
-	0x0e, 0x36, 0x9a, 0x02, 0x06, 0x14, 0x0e, 0x24, 
-	0x2e, 0x1f, 0xdb, 0x04, 0x20, 0xaf, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x20, 
-	0xdb, 0x01, 0x20, 0xa2, 0xe7, 0xf7, 0x20, 0x80, 
-	0x40, 0x20, 0xd0, 0x0d, 0xf0, 0x10, 0xff, 0x6e, 
-	0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x02, 0xd2, 
-	0x20, 0x02, 0xf0, 0x00, 0xfa, 0x51, 0x2d, 0x80, 
-	0xd0, 0x01, 0xf0, 0x10, 0xff, 0x99, 0xe0, 0x16, 
-	0x48, 0x0c, 0x68, 0x00, 0x60, 0x07, 0x48, 0x0b, 
-	0x68, 0x00, 0x71, 0x46, 0x20, 0xff, 0x49, 0x09, 
-	0x68, 0x09, 0x71, 0x08, 0xf0, 0x10, 0xff, 0x56, 
-	0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x02, 0xd2, 
-	0x20, 0x01, 0xf0, 0x00, 0xfa, 0x39, 0x2d, 0x80, 
-	0xd0, 0x01, 0xf0, 0x10, 0xff, 0x81, 0x20, 0x00, 
-	0xe7, 0xcd, 0xe7, 0xcc, 0x2e, 0x08, 0x5e, 0x14, 
-	0xb5, 0xf7, 0x1c, 0x07, 0x99, 0x01, 0x06, 0x0e, 
-	0x0e, 0x36, 0x9a, 0x02, 0x06, 0x14, 0x0e, 0x24, 
-	0x2e, 0x1f, 0xdb, 0x04, 0x20, 0xaf, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x20, 
-	0xdb, 0x01, 0x20, 0xa2, 0xe7, 0xf7, 0x20, 0x80, 
-	0x40, 0x20, 0xd0, 0x0d, 0xf0, 0x10, 0xff, 0x2e, 
-	0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x03, 0x12, 
-	0x20, 0x02, 0xf0, 0x00, 0xfa, 0x11, 0x2d, 0x80, 
-	0xd0, 0x01, 0xf0, 0x10, 0xff, 0x59, 0xe0, 0x16, 
-	0x48, 0x0c, 0x68, 0x00, 0x60, 0x07, 0x48, 0x0b, 
-	0x68, 0x00, 0x71, 0x46, 0x20, 0xff, 0x49, 0x09, 
-	0x68, 0x09, 0x71, 0x08, 0xf0, 0x10, 0xff, 0x16, 
-	0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x03, 0x12, 
-	0x20, 0x01, 0xf0, 0x00, 0xf9, 0xf9, 0x2d, 0x80, 
-	0xd0, 0x01, 0xf0, 0x10, 0xff, 0x41, 0x20, 0x00, 
-	0xe7, 0xcd, 0xe7, 0xcc, 0x2e, 0x08, 0x5e, 0x18, 
-	0xb5, 0xff, 0xb0, 0x81, 0x98, 0x01, 0x06, 0x00, 
-	0x0e, 0x00, 0x90, 0x00, 0x99, 0x02, 0x06, 0x0d, 
-	0x0e, 0x2d, 0x9a, 0x03, 0x06, 0x16, 0x0e, 0x36, 
-	0x9f, 0x04, 0x1c, 0x29, 0x98, 0x00, 0xf0, 0x00, 
-	0xf8, 0x91, 0x28, 0x00, 0xd0, 0x05, 0x20, 0xa2, 
-	0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x79, 0x38, 0x79, 0x79, 0x18, 0x40, 
-	0x79, 0xb9, 0x18, 0x40, 0x06, 0x04, 0x0e, 0x24, 
-	0x79, 0xb8, 0x02, 0x00, 0x43, 0x04, 0x00, 0x68, 
-	0x19, 0x80, 0x01, 0x00, 0x49, 0x15, 0x68, 0x09, 
-	0x50, 0x0c, 0x9b, 0x04, 0x88, 0x99, 0x00, 0x68, 
-	0x19, 0x80, 0x01, 0x00, 0x4a, 0x11, 0x68, 0x12, 
-	0x18, 0x80, 0x60, 0x41, 0x78, 0x78, 0x78, 0x39, 
-	0x18, 0x40, 0x78, 0xb9, 0x18, 0x40, 0x06, 0x04, 
-	0x0e, 0x24, 0x78, 0xb8, 0x02, 0x00, 0x43, 0x04, 
-	0x00, 0x68, 0x19, 0x80, 0x01, 0x00, 0x49, 0x09, 
-	0x68, 0x09, 0x18, 0x40, 0x60, 0x84, 0x9b, 0x04, 
-	0x88, 0x19, 0x00, 0x68, 0x19, 0x80, 0x01, 0x00, 
-	0x4a, 0x04, 0x68, 0x12, 0x18, 0x80, 0x60, 0xc1, 
-	0x20, 0x00, 0xb0, 0x01, 0xe7, 0xc5, 0xb0, 0x01, 
-	0xe7, 0xc3, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xc8, 
-	0xb5, 0xff, 0x1c, 0x07, 0x06, 0x3d, 0x0e, 0x2d, 
-	0x99, 0x01, 0x06, 0x0c, 0x0e, 0x24, 0x9a, 0x02, 
-	0x06, 0x16, 0x0e, 0x36, 0x1c, 0x21, 0x1c, 0x28, 
-	0xf0, 0x00, 0xf8, 0x40, 0x28, 0x00, 0xd0, 0x04, 
-	0x20, 0xa2, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x9a, 0x03, 0x1c, 0x31, 0x1c, 0x20, 
-	0xf0, 0x00, 0xf8, 0x02, 0xe7, 0xf5, 0xe7, 0xf4, 
-	0xb4, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x13, 
-	0x06, 0x21, 0x0e, 0x09, 0x06, 0x3a, 0x0e, 0x12, 
-	0x29, 0x10, 0xdb, 0x02, 0x20, 0xa2, 0xbc, 0xf0, 
-	0x47, 0x70, 0x88, 0xdd, 0x00, 0x48, 0x18, 0x80, 
-	0x01, 0x00, 0x4e, 0x0f, 0x68, 0x36, 0x50, 0x35, 
-	0x88, 0x98, 0x00, 0x4d, 0x18, 0xad, 0x01, 0x2d, 
-	0x4e, 0x0b, 0x68, 0x36, 0x19, 0xad, 0x60, 0x68, 
-	0x88, 0x58, 0x00, 0x4d, 0x18, 0xad, 0x01, 0x2d, 
-	0x4e, 0x07, 0x68, 0x36, 0x19, 0xad, 0x60, 0xa8, 
-	0x88, 0x18, 0x00, 0x4d, 0x18, 0xad, 0x01, 0x2d, 
-	0x4e, 0x03, 0x68, 0x36, 0x19, 0xad, 0x60, 0xe8, 
-	0x20, 0x00, 0xe7, 0xdc, 0xe7, 0xdb, 0x00, 0x00, 
-	0x2e, 0x08, 0x5d, 0xc8, 0xb4, 0xb0, 0x1c, 0x07, 
-	0x1c, 0x0a, 0x06, 0x39, 0x0e, 0x09, 0x06, 0x15, 
-	0x0e, 0x2d, 0xb0, 0x81, 0x29, 0x20, 0xdb, 0x03, 
-	0x20, 0xa2, 0xb0, 0x01, 0xbc, 0xb0, 0x47, 0x70, 
-	0x2d, 0x10, 0xdb, 0x02, 0x20, 0xa2, 0xb0, 0x01, 
-	0xe7, 0xf8, 0x00, 0xc8, 0x4b, 0x0a, 0x68, 0x1b, 
-	0x18, 0xc4, 0x68, 0x20, 0x90, 0x00, 0x98, 0x00, 
-	0x4b, 0x08, 0x40, 0x18, 0x90, 0x00, 0x00, 0x68, 
-	0x23, 0x1e, 0x40, 0x18, 0x9b, 0x00, 0x43, 0x18, 
-	0x90, 0x00, 0x98, 0x00, 0x60, 0x20, 0x20, 0x00, 
-	0xb0, 0x01, 0xe7, 0xe3, 0xb0, 0x01, 0xe7, 0xe1, 
-	0x2e, 0x08, 0x5d, 0xd0, 0xff, 0xff, 0xdf, 0xe1, 
-	0x20, 0xff, 0x49, 0x02, 0x68, 0x09, 0x70, 0x08, 
-	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x2c, 
-	0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0a, 0xb0, 0x83, 
-	0x20, 0x00, 0x43, 0xc0, 0x23, 0x19, 0x06, 0x9b, 
-	0x67, 0x58, 0x08, 0xb9, 0x00, 0x89, 0x1a, 0x78, 
-	0x90, 0x02, 0x98, 0x02, 0x18, 0x10, 0x07, 0x80, 
-	0x0f, 0x80, 0x90, 0x01, 0x98, 0x02, 0x18, 0x10, 
-	0x08, 0x80, 0x90, 0x00, 0x9b, 0x02, 0x20, 0x03, 
-	0x1a, 0xc0, 0x23, 0x19, 0x06, 0x9b, 0x67, 0xd8, 
-	0x24, 0x00, 0x98, 0x00, 0x42, 0x84, 0xd3, 0x02, 
-	0xe0, 0x06, 0x34, 0x01, 0xe7, 0xf9, 0xc9, 0x08, 
-	0x20, 0x19, 0x06, 0x80, 0x67, 0x03, 0xe7, 0xf8, 
-	0x98, 0x01, 0x28, 0x00, 0xd0, 0x0b, 0x9b, 0x01, 
-	0x00, 0xd8, 0x25, 0x00, 0x43, 0xed, 0x40, 0xc5, 
-	0x1c, 0x2b, 0x43, 0xdb, 0x68, 0x0d, 0x40, 0x2b, 
-	0x25, 0x19, 0x06, 0xad, 0x67, 0x2b, 0x20, 0x19, 
-	0x06, 0x80, 0x6f, 0x40, 0xb0, 0x03, 0xbc, 0xb0, 
-	0x47, 0x70, 0xb0, 0x03, 0xe7, 0xfb, 0x1c, 0x01, 
-	0x06, 0x08, 0x0e, 0x00, 0x22, 0x19, 0x06, 0x92, 
-	0x63, 0x90, 0x47, 0x70, 0xb4, 0xf0, 0x48, 0x4d, 
-	0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x74, 
-	0x22, 0x00, 0x27, 0x00, 0x49, 0x4a, 0x20, 0x00, 
-	0x28, 0x20, 0xdb, 0x04, 0xe0, 0x16, 0x1c, 0x43, 
-	0x06, 0x18, 0x0e, 0x00, 0xe7, 0xf8, 0x00, 0x83, 
-	0x58, 0xcc, 0x23, 0x01, 0x03, 0x5b, 0x40, 0x23, 
-	0xd0, 0x0b, 0x24, 0x01, 0x40, 0x84, 0x1c, 0x23, 
-	0x43, 0x1f, 0x00, 0x83, 0x58, 0xcc, 0x23, 0x01, 
-	0x03, 0x5b, 0x43, 0x9c, 0x1c, 0x23, 0x00, 0x84, 
-	0x51, 0x0b, 0xe7, 0xe8, 0x20, 0x00, 0x28, 0x04, 
-	0xdb, 0x04, 0xe0, 0x1a, 0x1c, 0x43, 0x06, 0x18, 
-	0x0e, 0x00, 0xe7, 0xf8, 0x01, 0x05, 0x4b, 0x39, 
-	0x18, 0xec, 0x22, 0x00, 0x2a, 0x04, 0xdb, 0x04, 
-	0xe0, 0x0e, 0x1c, 0x53, 0x06, 0x1a, 0x0e, 0x12, 
-	0xe7, 0xf8, 0x4b, 0x35, 0x60, 0x23, 0x4b, 0x35, 
-	0x60, 0x63, 0x23, 0x00, 0x60, 0xa3, 0x23, 0x00, 
-	0x60, 0xe3, 0x34, 0xff, 0x34, 0x01, 0xe7, 0xf0, 
-	0xe7, 0xe4, 0xb0, 0x82, 0x4b, 0x2b, 0x69, 0xdc, 
-	0x23, 0x0c, 0x40, 0x23, 0x08, 0x9c, 0xab, 0x01, 
-	0x70, 0x1c, 0x4b, 0x28, 0x69, 0xdc, 0x23, 0x30, 
-	0x40, 0x23, 0x09, 0x1c, 0xab, 0x00, 0x70, 0x1c, 
-	0xab, 0x01, 0x78, 0x1b, 0xac, 0x00, 0x78, 0x24, 
-	0x42, 0xa3, 0xd1, 0x09, 0x23, 0x33, 0x06, 0x5b, 
-	0x6b, 0xdb, 0x2b, 0x00, 0xd1, 0x04, 0x4b, 0x1f, 
-	0x6a, 0x9b, 0x07, 0xdb, 0x0f, 0xdb, 0xd0, 0x21, 
-	0x4b, 0x1c, 0x69, 0xdd, 0x23, 0x0c, 0x40, 0x2b, 
-	0x08, 0x9c, 0x00, 0xa5, 0x26, 0x01, 0x40, 0xae, 
-	0x1c, 0x33, 0x25, 0x33, 0x06, 0x6d, 0x64, 0x2b, 
-	0x25, 0x01, 0x40, 0xa5, 0x1c, 0x2b, 0x4d, 0x1a, 
-	0x63, 0xab, 0x4b, 0x14, 0x69, 0xdd, 0x23, 0x0c, 
-	0x40, 0x2b, 0x08, 0x9d, 0xab, 0x01, 0x70, 0x1d, 
-	0xe0, 0x00, 0xe0, 0x1d, 0x4b, 0x0f, 0x69, 0xdd, 
-	0x23, 0x30, 0x40, 0x2b, 0x09, 0x1d, 0xab, 0x00, 
-	0x70, 0x1d, 0xe7, 0xcd, 0xb0, 0x02, 0x20, 0x00, 
-	0x28, 0x20, 0xdb, 0x04, 0xe0, 0x10, 0x1c, 0x43, 
-	0x06, 0x18, 0x0e, 0x00, 0xe7, 0xf8, 0x24, 0x01, 
-	0x40, 0x84, 0x1c, 0x23, 0x40, 0x3b, 0xd0, 0x06, 
-	0x00, 0x83, 0x58, 0xcc, 0x23, 0x01, 0x03, 0x5b, 
-	0x43, 0x23, 0x00, 0x84, 0x51, 0x0b, 0xe7, 0xee, 
-	0xbc, 0xf0, 0x47, 0x70, 0x66, 0x00, 0x01, 0x00, 
-	0x64, 0x00, 0x00, 0x80, 0x9e, 0x00, 0x00, 0xc0, 
-	0x9e, 0x00, 0x00, 0x00, 0x2e, 0x0f, 0x00, 0x00, 
-	0x66, 0x00, 0x00, 0x80, 0xb4, 0x80, 0x1c, 0x03, 
-	0x1c, 0x0a, 0x48, 0x0a, 0x68, 0x00, 0x68, 0x01, 
-	0x20, 0x19, 0x06, 0x80, 0x6a, 0x80, 0x0a, 0x40, 
-	0x00, 0x4f, 0x43, 0x38, 0x60, 0x18, 0x0f, 0xc8, 
-	0x07, 0xc0, 0x60, 0x10, 0x68, 0x10, 0x0f, 0xc0, 
-	0x60, 0x10, 0x20, 0x00, 0xbc, 0x80, 0x47, 0x70, 
-	0xe7, 0xfc, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x38, 
-	0xb5, 0x80, 0x1c, 0x07, 0x48, 0x05, 0x68, 0x00, 
-	0x1d, 0xc1, 0x31, 0x01, 0x20, 0x00, 0xf0, 0x19, 
-	0xfb, 0xfd, 0x60, 0x38, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x10, 
-	0xb4, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x13, 
-	0x06, 0x20, 0x0e, 0x00, 0x06, 0x39, 0x0e, 0x09, 
-	0x04, 0x1a, 0x0c, 0x12, 0x4d, 0x07, 0x68, 0x2d, 
-	0x70, 0xe8, 0x4d, 0x06, 0x68, 0x2d, 0x70, 0xa9, 
-	0x4d, 0x04, 0x68, 0x2d, 0x80, 0x2a, 0x25, 0x01, 
-	0x04, 0x2d, 0x26, 0x33, 0x06, 0x76, 0x60, 0x35, 
-	0xbc, 0xf0, 0x47, 0x70, 0x2e, 0x08, 0x5e, 0x3c, 
-	0x20, 0x0d, 0x06, 0xc0, 0x69, 0xc0, 0x47, 0x70, 
-	0xe7, 0xfd, 0x1c, 0x01, 0x31, 0x01, 0x23, 0x2d, 
-	0x01, 0x1b, 0x42, 0x99, 0xd9, 0x03, 0x20, 0x2d, 
-	0x01, 0x00, 0x47, 0x70, 0xe0, 0x01, 0x1c, 0x08, 
-	0xe7, 0xfb, 0xe7, 0xfa, 0xb5, 0xf3, 0xb0, 0x85, 
-	0x20, 0x00, 0x90, 0x03, 0x20, 0x00, 0x90, 0x02, 
-	0x9f, 0x05, 0x69, 0x3d, 0x69, 0x38, 0x28, 0x13, 
-	0xd1, 0x05, 0x20, 0x75, 0xb0, 0x05, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x99, 0x06, 
-	0x68, 0x88, 0x68, 0x09, 0x1a, 0x40, 0x1c, 0x41, 
-	0x91, 0x04, 0x69, 0x78, 0x23, 0x04, 0x40, 0x18, 
-	0xd0, 0x02, 0x99, 0x04, 0x08, 0x49, 0x91, 0x04, 
-	0x00, 0xa8, 0x49, 0xf8, 0x58, 0x08, 0x99, 0x04, 
-	0x43, 0x48, 0x61, 0xf8, 0x99, 0x06, 0x68, 0x88, 
-	0x68, 0x09, 0x1a, 0x40, 0x30, 0x01, 0x63, 0xb8, 
-	0x68, 0xf8, 0x90, 0x01, 0x48, 0xf2, 0x68, 0x00, 
-	0x28, 0x00, 0xd0, 0x06, 0x98, 0x01, 0x28, 0x19, 
-	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
-	0xe0, 0x05, 0x98, 0x01, 0x28, 0x08, 0xd3, 0x01, 
-	0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 
-	0xd0, 0x07, 0x1d, 0xf8, 0x30, 0x21, 0x99, 0x06, 
-	0xf0, 0x02, 0xf9, 0xea, 0x20, 0x00, 0xb0, 0x05, 
-	0xe7, 0xc5, 0x49, 0xe6, 0x20, 0x91, 0xf0, 0x19, 
-	0xfb, 0x7d, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 
-	0xf0, 0x0b, 0xfb, 0x64, 0xe7, 0xf5, 0x98, 0x01, 
-	0x00, 0x80, 0x49, 0xe1, 0x58, 0x08, 0x99, 0x05, 
-	0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, 0x49, 0xdd, 
-	0x60, 0x08, 0x20, 0xff, 0xb0, 0x05, 0xe7, 0xae, 
-	0x48, 0xd9, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x03, 
-	0x2d, 0x0b, 0xdb, 0x26, 0x2d, 0x12, 0xdc, 0x24, 
-	0x2d, 0x0b, 0xdb, 0x0b, 0x2d, 0x12, 0xdc, 0x09, 
-	0x48, 0xd6, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 
-	0x1d, 0xf8, 0x30, 0x21, 0x99, 0x06, 0xf0, 0x02, 
-	0xf9, 0xbb, 0xe0, 0x16, 0x6b, 0x38, 0xf7, 0xff, 
-	0xff, 0x7c, 0x90, 0x00, 0x6a, 0xb9, 0x9a, 0x00, 
-	0x48, 0xcf, 0xf0, 0x0c, 0xfb, 0x4b, 0x1d, 0xf8, 
-	0x30, 0x21, 0x99, 0x06, 0xf0, 0x02, 0xf9, 0xac, 
-	0x6b, 0x38, 0xf7, 0xff, 0xff, 0x6e, 0x90, 0x00, 
-	0x6a, 0xb9, 0x9a, 0x00, 0x48, 0xc8, 0xf0, 0x0c, 
-	0xfb, 0x6b, 0x48, 0xc8, 0x68, 0x00, 0x99, 0x05, 
-	0x42, 0x88, 0xd1, 0x30, 0x48, 0xc0, 0x68, 0x00, 
-	0x28, 0x00, 0xd1, 0x2c, 0x48, 0xc1, 0x68, 0x00, 
-	0x28, 0x00, 0xd1, 0x0a, 0x20, 0x0d, 0x06, 0xc0, 
-	0x68, 0xc0, 0x90, 0x02, 0x98, 0x02, 0x28, 0x01, 
-	0xd1, 0x03, 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 
-	0x60, 0xc8, 0x48, 0xba, 0x68, 0x00, 0x28, 0x00, 
-	0xd1, 0x0d, 0x6a, 0xb8, 0x30, 0x01, 0x05, 0x00, 
-	0x6a, 0xf9, 0x31, 0x01, 0x02, 0x89, 0x43, 0x08, 
-	0x6b, 0x79, 0x31, 0x02, 0x43, 0x08, 0x21, 0x0d, 
-	0x06, 0xc9, 0x61, 0x88, 0xe0, 0x0b, 0x6a, 0xb8, 
-	0x30, 0x01, 0x05, 0x00, 0x6a, 0xf9, 0x31, 0x01, 
-	0x02, 0x89, 0x43, 0x08, 0x6b, 0x79, 0x31, 0x02, 
-	0x43, 0x08, 0x49, 0xaf, 0x60, 0x08, 0x2d, 0x0b, 
-	0xdb, 0x15, 0x2d, 0x12, 0xdc, 0x13, 0x48, 0xa9, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x0f, 0x48, 0xa4, 
-	0x68, 0x00, 0x28, 0x00, 0xd1, 0x0b, 0x20, 0x00, 
-	0x62, 0xb8, 0x20, 0x00, 0x62, 0xf8, 0x48, 0xa7, 
-	0x63, 0x38, 0x48, 0xa7, 0x63, 0x78, 0x6b, 0x38, 
-	0xf7, 0xff, 0xff, 0x1b, 0x90, 0x00, 0x48, 0x9c, 
-	0x68, 0x00, 0x28, 0x00, 0xd1, 0x16, 0x20, 0x0d, 
-	0x06, 0xc0, 0x68, 0x80, 0x90, 0x03, 0x20, 0x00, 
-	0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 0xf0, 0x01, 
-	0xfb, 0x07, 0x6b, 0x38, 0xf7, 0xff, 0xff, 0x09, 
-	0x90, 0x00, 0x9a, 0x00, 0x99, 0x01, 0x1c, 0x38, 
-	0xf0, 0x01, 0xfa, 0x8c, 0x98, 0x03, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0x88, 0x48, 0x93, 0x68, 0x00, 
-	0x99, 0x05, 0x42, 0x88, 0xd1, 0x0b, 0x48, 0x8c, 
-	0x68, 0x00, 0x28, 0x00, 0xd1, 0x07, 0x48, 0x8d, 
-	0x68, 0x00, 0x28, 0x00, 0xd1, 0x03, 0x98, 0x02, 
-	0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 0x48, 0x86, 
-	0x68, 0x00, 0x28, 0x01, 0xd1, 0x73, 0x48, 0x87, 
-	0x68, 0x00, 0x28, 0x01, 0xd1, 0x6f, 0xb0, 0x84, 
-	0x98, 0x05, 0xf0, 0x0c, 0xf9, 0xe1, 0x28, 0x00, 
-	0xd1, 0x0e, 0x2d, 0x0b, 0xdb, 0x01, 0x2d, 0x12, 
-	0xdd, 0x0a, 0x1d, 0xf8, 0x30, 0x21, 0x99, 0x0a, 
-	0xf0, 0x02, 0xf9, 0x12, 0x20, 0x92, 0x49, 0x7b, 
-	0x60, 0x08, 0x20, 0x00, 0xb0, 0x09, 0xe6, 0xea, 
-	0x49, 0x80, 0x20, 0x91, 0xf0, 0x19, 0xfa, 0xa2, 
-	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0c, 
-	0xfa, 0x22, 0x20, 0x92, 0x49, 0x7b, 0x60, 0x08, 
-	0x20, 0x01, 0x49, 0x7b, 0x68, 0x09, 0x60, 0x08, 
-	0x2d, 0x0b, 0xdb, 0x39, 0x2d, 0x12, 0xdc, 0x37, 
-	0xb0, 0x81, 0x24, 0x00, 0x20, 0x00, 0x90, 0x03, 
-	0x20, 0x01, 0x49, 0x75, 0x68, 0x09, 0x23, 0x07, 
-	0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0x6a, 0xb8, 
-	0x30, 0x01, 0x05, 0x00, 0x6a, 0xf9, 0x31, 0x01, 
-	0x02, 0x89, 0x43, 0x08, 0x6b, 0x79, 0x31, 0x02, 
-	0x43, 0x08, 0x90, 0x00, 0x20, 0x00, 0x62, 0xb8, 
-	0x20, 0x00, 0x62, 0xf8, 0x48, 0x67, 0x63, 0x38, 
-	0x48, 0x67, 0x63, 0x78, 0x6b, 0x38, 0xf7, 0xff, 
-	0xfe, 0x9c, 0x90, 0x02, 0x48, 0x66, 0x68, 0x00, 
-	0x23, 0x77, 0x01, 0x1b, 0x18, 0xc0, 0x9a, 0x02, 
-	0x1c, 0x39, 0xf0, 0x0b, 0xfe, 0x05, 0x98, 0x00, 
-	0x49, 0x61, 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 
-	0x18, 0xc9, 0x66, 0xc8, 0x48, 0x5e, 0x68, 0x00, 
-	0xf0, 0x0c, 0xf9, 0xf8, 0xb0, 0x01, 0xe1, 0x2b, 
-	0x24, 0x00, 0x26, 0x00, 0x2e, 0x00, 0xd1, 0x16, 
-	0x2c, 0x07, 0xd2, 0x14, 0x6a, 0xf8, 0x05, 0x81, 
-	0x0d, 0x89, 0x1c, 0x20, 0x34, 0x01, 0x00, 0x83, 
-	0x18, 0x18, 0x00, 0xc0, 0xe0, 0x00, 0xe1, 0x3c, 
-	0x4a, 0x53, 0x68, 0x12, 0x18, 0x80, 0x23, 0x05, 
-	0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0x81, 
-	0xd1, 0x00, 0x26, 0x01, 0xe7, 0xe6, 0x2e, 0x00, 
-	0xd1, 0x13, 0x2c, 0x18, 0xd2, 0x11, 0x6a, 0xf8, 
-	0x05, 0x81, 0x0d, 0x89, 0x1c, 0x20, 0x34, 0x01, 
-	0x23, 0x4c, 0x43, 0x58, 0x4a, 0x48, 0x68, 0x12, 
-	0x18, 0x80, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 
-	0x69, 0x40, 0x42, 0x81, 0xd1, 0x00, 0x26, 0x01, 
-	0xe7, 0xe9, 0x3c, 0x01, 0x6b, 0x38, 0xf7, 0xff, 
-	0xfe, 0x50, 0x90, 0x01, 0x2c, 0x07, 0xd2, 0x05, 
-	0x48, 0x3f, 0x68, 0x01, 0x1c, 0x20, 0xf0, 0x0b, 
-	0xfc, 0xcb, 0xe0, 0x06, 0x2c, 0x18, 0xd2, 0x04, 
-	0x1f, 0xe0, 0x49, 0x3b, 0x68, 0x09, 0xf0, 0x0b, 
-	0xfd, 0x01, 0x48, 0x3a, 0x49, 0x38, 0x68, 0x09, 
-	0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x66, 0xc8, 
-	0x48, 0x36, 0x49, 0x35, 0x68, 0x09, 0x23, 0x09, 
-	0x01, 0xdb, 0x18, 0xc9, 0x67, 0x08, 0x48, 0x33, 
-	0x49, 0x31, 0x68, 0x09, 0x23, 0x09, 0x01, 0xdb, 
-	0x18, 0xc9, 0x66, 0x88, 0x48, 0x2f, 0x49, 0x2e, 
-	0x68, 0x09, 0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 
-	0x66, 0x48, 0x20, 0x00, 0x49, 0x2a, 0x68, 0x09, 
-	0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x64, 0x88, 
-	0x6b, 0x79, 0x48, 0x27, 0x68, 0x00, 0xf0, 0x0b, 
-	0xfd, 0x4b, 0x94, 0x02, 0x1d, 0xf8, 0x30, 0x21, 
-	0x99, 0x0a, 0xf0, 0x02, 0xf8, 0x4d, 0x24, 0x00, 
-	0x26, 0x00, 0x2e, 0x00, 0xd1, 0x14, 0x2c, 0x07, 
-	0xd2, 0x12, 0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89, 
-	0x1c, 0x20, 0x34, 0x01, 0x00, 0x83, 0x18, 0x18, 
-	0x00, 0xc0, 0x4a, 0x1b, 0x68, 0x12, 0x18, 0x80, 
-	0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 
-	0x42, 0x81, 0xda, 0x00, 0x26, 0x01, 0xe7, 0xe8, 
-	0x2e, 0x00, 0xd1, 0x2f, 0x2c, 0x18, 0xd2, 0x2d, 
-	0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x20, 
-	0x34, 0x01, 0x23, 0x4c, 0x43, 0x58, 0x4a, 0x10, 
-	0x68, 0x12, 0x18, 0x80, 0x38, 0xff, 0x38, 0xff, 
-	0x38, 0x02, 0x69, 0x40, 0x42, 0x81, 0xda, 0x1c, 
-	0xe0, 0x1a, 0x00, 0x00, 0x2e, 0x03, 0x3a, 0x54, 
-	0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc0, 
-	0x2e, 0x08, 0x7c, 0x58, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x7d, 0x94, 0x2e, 0x08, 0x7c, 0xbc, 
-	0x2e, 0x08, 0x5e, 0x4c, 0x00, 0x00, 0x02, 0xcf, 
-	0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x94, 0x88, 
-	0x2e, 0x08, 0x7d, 0xb4, 0x00, 0x00, 0xff, 0xff, 
-	0x26, 0x01, 0xe7, 0xcd, 0x3c, 0x01, 0x6b, 0x38, 
-	0xf7, 0xff, 0xfd, 0xc3, 0x90, 0x01, 0x2c, 0x07, 
-	0xd2, 0x12, 0x48, 0x48, 0x68, 0x01, 0x1c, 0x20, 
-	0xf0, 0x0b, 0xfb, 0xcc, 0x00, 0xa0, 0x19, 0x00, 
-	0x00, 0xc0, 0x49, 0x44, 0x68, 0x09, 0x18, 0x40, 
-	0x23, 0x2b, 0x01, 0x5b, 0x18, 0xc0, 0x9a, 0x01, 
-	0x1c, 0x39, 0xf0, 0x0b, 0xfd, 0x21, 0xe0, 0x4a, 
-	0x2c, 0x18, 0xd2, 0x48, 0x1f, 0xe0, 0x49, 0x3d, 
-	0x68, 0x09, 0xf0, 0x0b, 0xfc, 0x0b, 0x20, 0x4c, 
-	0x43, 0x60, 0x49, 0x3a, 0x68, 0x09, 0x18, 0x40, 
-	0x38, 0xff, 0x38, 0xff, 0x38, 0x0a, 0x9a, 0x01, 
-	0x1c, 0x39, 0xf0, 0x0b, 0xfd, 0x0d, 0x20, 0x4c, 
-	0x43, 0x60, 0x49, 0x34, 0x68, 0x09, 0x18, 0x40, 
-	0x38, 0xff, 0x38, 0xff, 0x38, 0x82, 0x6f, 0xc0, 
-	0x28, 0x00, 0xd0, 0x17, 0x20, 0x4c, 0x43, 0x60, 
-	0x49, 0x2e, 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 
-	0x38, 0xff, 0x38, 0x02, 0x68, 0x00, 0x04, 0x00, 
-	0x0c, 0x00, 0xd0, 0x0b, 0x20, 0x4c, 0x43, 0x60, 
-	0x49, 0x28, 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 
-	0x38, 0xff, 0x38, 0x02, 0x68, 0x00, 0x0c, 0x00, 
-	0x04, 0x00, 0xd1, 0x0a, 0x20, 0x02, 0x21, 0x4c, 
-	0x43, 0x61, 0x4a, 0x22, 0x68, 0x12, 0x18, 0x89, 
-	0x39, 0xff, 0x39, 0xff, 0x39, 0x82, 0x67, 0x48, 
-	0xe0, 0x09, 0x20, 0x03, 0x21, 0x4c, 0x43, 0x61, 
-	0x4a, 0x1c, 0x68, 0x12, 0x18, 0x89, 0x39, 0xff, 
-	0x39, 0xff, 0x39, 0x82, 0x67, 0x48, 0x48, 0x19, 
-	0x68, 0x00, 0xf0, 0x0c, 0xf8, 0xcf, 0x6b, 0x79, 
-	0x48, 0x16, 0x68, 0x00, 0xf0, 0x0b, 0xfc, 0x36, 
-	0x98, 0x02, 0x42, 0x84, 0xda, 0x01, 0x1c, 0x21, 
-	0xe0, 0x00, 0x99, 0x02, 0x91, 0x00, 0x99, 0x00, 
-	0x48, 0x10, 0x68, 0x00, 0xf0, 0x0b, 0xfd, 0x46, 
-	0x49, 0x0f, 0x20, 0x91, 0xf0, 0x19, 0xf9, 0x1e, 
-	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x0b, 
-	0x68, 0x00, 0x90, 0x03, 0x48, 0x0b, 0x68, 0x00, 
-	0x49, 0x08, 0x60, 0x08, 0x98, 0x03, 0x49, 0x09, 
-	0x60, 0x08, 0x20, 0x92, 0x49, 0x06, 0x60, 0x08, 
-	0xb0, 0x04, 0x20, 0x92, 0x49, 0x06, 0x60, 0x08, 
-	0x20, 0x00, 0xb0, 0x05, 0xe5, 0x4b, 0xb0, 0x05, 
-	0xe5, 0x49, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0xb4, 
-	0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb8, 
-	0x2e, 0x08, 0x7c, 0xc0, 0xb5, 0xff, 0x1c, 0x07, 
-	0x9d, 0x09, 0xb0, 0x89, 0x26, 0x00, 0x20, 0x00, 
-	0x90, 0x03, 0x99, 0x0a, 0x68, 0x4c, 0x2d, 0x13, 
-	0xd1, 0x05, 0x20, 0x75, 0xb0, 0x09, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x15, 
-	0x60, 0x04, 0x20, 0x00, 0x60, 0xe0, 0x20, 0x00, 
-	0x61, 0x20, 0x69, 0x60, 0x4b, 0xf9, 0x40, 0x18, 
-	0x61, 0x60, 0x02, 0x00, 0x69, 0x60, 0x4b, 0xf8, 
-	0x40, 0x18, 0x61, 0x60, 0x04, 0x80, 0x69, 0x60, 
-	0x4b, 0xf6, 0x40, 0x18, 0x61, 0x60, 0x05, 0x80, 
-	0x69, 0x60, 0x23, 0xc0, 0x43, 0xdb, 0x40, 0x18, 
-	0x61, 0x60, 0x06, 0x00, 0x69, 0x60, 0x4b, 0xf2, 
-	0x40, 0x18, 0x61, 0x60, 0x04, 0x40, 0x69, 0x60, 
-	0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0x61, 0x60, 
-	0x06, 0x80, 0x69, 0x60, 0x09, 0x40, 0x01, 0x40, 
-	0x61, 0x60, 0x06, 0xc0, 0x20, 0x00, 0x61, 0xa0, 
-	0x20, 0x00, 0x61, 0xe0, 0x20, 0x00, 0x62, 0x20, 
-	0x20, 0x00, 0x62, 0x60, 0x20, 0x00, 0x63, 0xa0, 
-	0x20, 0x00, 0x63, 0xe0, 0x20, 0x00, 0x64, 0x60, 
-	0x20, 0x00, 0x64, 0x20, 0x20, 0x00, 0x60, 0x20, 
-	0x20, 0x00, 0x71, 0x20, 0x99, 0x0a, 0x68, 0x48, 
-	0x64, 0xe0, 0x99, 0x0a, 0x68, 0x08, 0x64, 0xa0, 
-	0x1d, 0xe0, 0x30, 0x21, 0x99, 0x13, 0xf0, 0x01, 
-	0xff, 0x07, 0x2d, 0x0b, 0xdb, 0x06, 0x2d, 0x12, 
-	0xdc, 0x04, 0x1d, 0xe0, 0x30, 0x49, 0x99, 0x13, 
-	0xf0, 0x01, 0xfe, 0xfe, 0x6b, 0x20, 0x6a, 0xa1, 
-	0x1a, 0x40, 0x30, 0x01, 0x63, 0xa0, 0x00, 0xa8, 
-	0x49, 0xd4, 0x58, 0x08, 0x69, 0x61, 0x09, 0x49, 
-	0x01, 0x49, 0x06, 0xc0, 0x0e, 0xc0, 0x43, 0x08, 
-	0x61, 0x60, 0x06, 0xc0, 0x0e, 0xc0, 0x6b, 0x20, 
-	0x6a, 0xa1, 0x1a, 0x40, 0x1c, 0x41, 0x91, 0x04, 
-	0x69, 0x60, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x02, 
-	0x99, 0x04, 0x08, 0x49, 0x91, 0x04, 0x00, 0xa8, 
-	0x49, 0xc9, 0x58, 0x08, 0x99, 0x04, 0x43, 0x48, 
-	0x61, 0xe0, 0x2d, 0x13, 0xd1, 0x04, 0x20, 0x00, 
-	0x90, 0x14, 0x20, 0x00, 0x61, 0xa0, 0xe0, 0x13, 
-	0x9b, 0x0c, 0x68, 0x58, 0x90, 0x01, 0x98, 0x01, 
-	0x08, 0x80, 0x61, 0xa0, 0x98, 0x01, 0x64, 0x60, 
-	0x9b, 0x0c, 0x68, 0x18, 0x64, 0x20, 0x20, 0x00, 
-	0x62, 0x60, 0x9a, 0x0b, 0x63, 0xe2, 0x69, 0x60, 
-	0x4b, 0xb6, 0x40, 0x18, 0x61, 0x60, 0x02, 0x00, 
-	0x69, 0x60, 0x4b, 0xb6, 0x40, 0x18, 0x61, 0x60, 
-	0x05, 0x80, 0x69, 0x60, 0x23, 0x0f, 0x02, 0x9b, 
-	0x43, 0x18, 0x61, 0x60, 0x04, 0x80, 0x69, 0x60, 
-	0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0x61, 0x60, 
-	0x06, 0x80, 0x69, 0x60, 0x23, 0xc0, 0x43, 0x18, 
-	0x61, 0x60, 0x06, 0x00, 0x69, 0x60, 0x23, 0x01, 
-	0x03, 0x9b, 0x43, 0x18, 0x61, 0x60, 0x04, 0x40, 
-	0x98, 0x14, 0x60, 0xe0, 0x61, 0x25, 0x48, 0xab, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x06, 0x98, 0x14, 
-	0x28, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 
-	0x20, 0x00, 0xe0, 0x05, 0x98, 0x14, 0x28, 0x08, 
-	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
-	0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x09, 
-	0xe7, 0x35, 0x49, 0xa1, 0x20, 0x91, 0xf0, 0x19, 
-	0xf8, 0x21, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 
-	0xf0, 0x0b, 0xf8, 0x08, 0xe7, 0xf5, 0x48, 0x9d, 
-	0x68, 0x00, 0x28, 0x01, 0xd1, 0x53, 0x68, 0x38, 
-	0x01, 0x80, 0x0f, 0xc0, 0x68, 0xa1, 0x4b, 0x9a, 
-	0x40, 0x19, 0x07, 0xc0, 0x09, 0x80, 0x43, 0x08, 
-	0x60, 0xa0, 0x01, 0x80, 0x0f, 0xc0, 0x68, 0x38, 
-	0x01, 0xc0, 0x0f, 0xc0, 0x68, 0xa1, 0x4b, 0x95, 
-	0x40, 0x19, 0x07, 0xc0, 0x09, 0xc0, 0x43, 0x08, 
-	0x60, 0xa0, 0x01, 0xc0, 0x0f, 0xc0, 0x68, 0x38, 
-	0x02, 0x00, 0x0e, 0x00, 0x68, 0xa1, 0x4b, 0x85, 
-	0x40, 0x19, 0x06, 0x00, 0x0e, 0x00, 0x04, 0x00, 
-	0x43, 0x08, 0x60, 0xa0, 0x02, 0x00, 0x0e, 0x00, 
-	0x48, 0x86, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x2a, 
-	0x2f, 0x00, 0xd0, 0x28, 0x20, 0x0d, 0x06, 0xc0, 
-	0x6a, 0x00, 0x1c, 0x06, 0x68, 0x38, 0x4b, 0x85, 
-	0x43, 0x98, 0xd0, 0x06, 0x68, 0x38, 0x02, 0x00, 
-	0x0e, 0x01, 0x20, 0x01, 0x40, 0x88, 0x43, 0x06, 
-	0xe0, 0x05, 0x68, 0x38, 0x02, 0x00, 0x0e, 0x00, 
-	0x21, 0x01, 0x40, 0x81, 0x43, 0x8e, 0x68, 0x38, 
-	0x4b, 0x7b, 0x43, 0x98, 0xd0, 0x08, 0x68, 0x38, 
-	0x02, 0x00, 0x0e, 0x00, 0x1d, 0xc1, 0x31, 0x01, 
-	0x20, 0x01, 0x40, 0x88, 0x43, 0x06, 0xe0, 0x06, 
-	0x68, 0x38, 0x02, 0x00, 0x0e, 0x00, 0x30, 0x08, 
-	0x21, 0x01, 0x40, 0x81, 0x43, 0x8e, 0x2d, 0x0b, 
-	0xdb, 0x0a, 0x2d, 0x12, 0xdc, 0x08, 0x48, 0x6f, 
-	0x68, 0x00, 0x28, 0x01, 0xd1, 0x04, 0x20, 0x51, 
-	0x01, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x08, 
-	0x98, 0x14, 0x00, 0x80, 0x49, 0x6c, 0x58, 0x08, 
-	0x28, 0x00, 0xd0, 0x01, 0x20, 0x83, 0x90, 0x03, 
-	0x2d, 0x0b, 0xdb, 0x08, 0x2d, 0x12, 0xdc, 0x06, 
-	0x48, 0x68, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x01, 
-	0x20, 0x84, 0x90, 0x03, 0xe0, 0x06, 0x9a, 0x0b, 
-	0x2a, 0x01, 0xd1, 0x03, 0x2d, 0x13, 0xd0, 0x01, 
-	0x20, 0x82, 0x90, 0x03, 0x98, 0x03, 0x28, 0x00, 
-	0xd0, 0x07, 0x20, 0x92, 0x49, 0x5a, 0x60, 0x08, 
-	0x20, 0x08, 0x60, 0xe0, 0x98, 0x03, 0xb0, 0x09, 
-	0xe6, 0xa1, 0x98, 0x15, 0x68, 0x01, 0x98, 0x14, 
-	0x00, 0x80, 0x4a, 0x59, 0x50, 0x11, 0x6a, 0xa0, 
-	0x28, 0x00, 0xda, 0x01, 0x20, 0x00, 0x62, 0xa0, 
-	0x6b, 0x20, 0x28, 0x00, 0xdc, 0x01, 0x20, 0x01, 
-	0x63, 0x20, 0x6a, 0xe0, 0x28, 0x00, 0xda, 0x01, 
-	0x20, 0x00, 0x62, 0xe0, 0x6b, 0x60, 0x4b, 0x52, 
-	0x42, 0x98, 0xdd, 0x01, 0x48, 0x50, 0x63, 0x60, 
-	0x6b, 0x20, 0xf7, 0xff, 0xfb, 0x9e, 0x90, 0x00, 
-	0x2d, 0x13, 0xd1, 0x05, 0x6a, 0xa1, 0x9a, 0x00, 
-	0x48, 0x4c, 0xf0, 0x0b, 0xff, 0x99, 0xe0, 0x15, 
-	0x2d, 0x0b, 0xdb, 0x01, 0x2d, 0x12, 0xdd, 0x03, 
-	0x48, 0x40, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x0d, 
-	0x2d, 0x0b, 0xdb, 0x06, 0x2d, 0x12, 0xdc, 0x04, 
-	0x48, 0x3e, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x00, 
-	0xe0, 0x04, 0x6a, 0xa1, 0x9a, 0x00, 0x48, 0x41, 
-	0xf0, 0x0b, 0xff, 0x82, 0x2d, 0x0b, 0xdb, 0x5f, 
-	0x2d, 0x12, 0xdc, 0x5e, 0x98, 0x15, 0x68, 0x00, 
-	0x49, 0x3a, 0x60, 0x08, 0x99, 0x13, 0xa8, 0x05, 
-	0xf0, 0x01, 0xfd, 0xae, 0xa9, 0x05, 0x98, 0x15, 
-	0x68, 0x00, 0xf0, 0x05, 0xfc, 0x5f, 0x1d, 0xe0, 
-	0x30, 0x21, 0xa9, 0x05, 0xf0, 0x01, 0xfd, 0xa4, 
-	0x20, 0x01, 0x49, 0x35, 0x65, 0x08, 0x20, 0x02, 
-	0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 0x21, 0x00, 
-	0x20, 0x02, 0xf0, 0x04, 0xfa, 0xdd, 0x2d, 0x0b, 
-	0xd0, 0x05, 0x2d, 0x0f, 0xd0, 0x03, 0x2d, 0x10, 
-	0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x03, 0x21, 0x00, 
-	0x20, 0x12, 0xf0, 0x04, 0xfa, 0xd1, 0x2d, 0x0c, 
-	0xd0, 0x01, 0x2d, 0x0f, 0xd1, 0x03, 0x21, 0x00, 
-	0x20, 0x04, 0xf0, 0x04, 0xfa, 0xc9, 0x2d, 0x0d, 
-	0xd0, 0x01, 0x2d, 0x10, 0xd1, 0x03, 0x21, 0x00, 
-	0x20, 0x08, 0xf0, 0x04, 0xfa, 0xc1, 0x2d, 0x0e, 
-	0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x03, 0x21, 0x00, 
-	0x20, 0x01, 0xf0, 0x04, 0xfa, 0xb9, 0x48, 0x15, 
-	0x68, 0x00, 0x28, 0x01, 0xd1, 0x73, 0xb0, 0x82, 
-	0x49, 0x1c, 0x20, 0x91, 0xf0, 0x18, 0xff, 0x06, 
-	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0b, 
-	0xfe, 0x86, 0x20, 0x92, 0x49, 0x17, 0x60, 0x08, 
-	0x20, 0x01, 0x49, 0x17, 0x68, 0x09, 0x60, 0x08, 
-	0x20, 0x01, 0x49, 0x15, 0x68, 0x09, 0x23, 0x07, 
-	0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0xe0, 0x25, 
-	0xe0, 0xae, 0xe0, 0xad, 0xff, 0x00, 0xff, 0xff, 
-	0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xfc, 0xff, 
-	0xff, 0xff, 0xbf, 0xff, 0x2e, 0x03, 0x3a, 0x04, 
-	0x2e, 0x03, 0x3a, 0x54, 0x2e, 0x08, 0x94, 0x84, 
-	0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x60, 0x84, 
-	0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 
-	0x2e, 0x08, 0x7c, 0x58, 0x2e, 0x08, 0x7c, 0xbc, 
-	0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x7d, 0x94, 
-	0xcc, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x88, 
-	0x2e, 0x08, 0x7d, 0xb4, 0x6a, 0xa0, 0x30, 0x01, 
-	0x05, 0x00, 0x6a, 0xe1, 0x31, 0x01, 0x02, 0x89, 
-	0x43, 0x08, 0x6b, 0x61, 0x31, 0x02, 0x43, 0x08, 
-	0x90, 0x00, 0x20, 0x00, 0x62, 0xa0, 0x20, 0x00, 
-	0x62, 0xe0, 0x48, 0x5f, 0x63, 0x20, 0x48, 0x5f, 
-	0x63, 0x60, 0x6b, 0x20, 0xf7, 0xff, 0xfa, 0xe1, 
-	0x90, 0x02, 0x48, 0x5d, 0x68, 0x00, 0x23, 0x77, 
-	0x01, 0x1b, 0x18, 0xc0, 0x9a, 0x02, 0x1c, 0x21, 
-	0xf0, 0x0b, 0xfa, 0x4a, 0x98, 0x00, 0x49, 0x58, 
-	0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 
-	0x66, 0xc8, 0x48, 0x55, 0x68, 0x00, 0x21, 0x00, 
-	0xf0, 0x0b, 0xfa, 0xc4, 0x48, 0x52, 0x68, 0x00, 
-	0xf0, 0x0b, 0xfe, 0x38, 0x49, 0x51, 0x20, 0x91, 
-	0xf0, 0x18, 0xfe, 0x98, 0xe0, 0x00, 0xe0, 0x11, 
-	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf6, 0x48, 0x4c, 
-	0x68, 0x00, 0x90, 0x01, 0x48, 0x4c, 0x68, 0x00, 
-	0x49, 0x49, 0x60, 0x08, 0x98, 0x01, 0x49, 0x4a, 
-	0x60, 0x08, 0x20, 0x92, 0x49, 0x47, 0x60, 0x08, 
-	0xb0, 0x02, 0xe0, 0x40, 0x48, 0x47, 0x68, 0x00, 
-	0x28, 0x00, 0xd0, 0x0c, 0x6a, 0xa0, 0x30, 0x01, 
-	0x05, 0x00, 0x6a, 0xe1, 0x31, 0x01, 0x02, 0x89, 
-	0x43, 0x08, 0x6b, 0x61, 0x31, 0x02, 0x43, 0x08, 
-	0x49, 0x41, 0x60, 0x08, 0xe0, 0x0c, 0x6a, 0xa0, 
-	0x30, 0x01, 0x05, 0x00, 0x6a, 0xe1, 0x31, 0x01, 
-	0x02, 0x89, 0x43, 0x08, 0x6b, 0x61, 0x31, 0x02, 
-	0x43, 0x08, 0x21, 0x0d, 0x06, 0xc9, 0x61, 0x88, 
-	0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, 0x90, 0x02, 
-	0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 
-	0xf0, 0x00, 0xfe, 0x82, 0x48, 0x33, 0x68, 0x00, 
-	0x28, 0x00, 0xd0, 0x07, 0x20, 0x00, 0x62, 0xa0, 
-	0x20, 0x00, 0x62, 0xe0, 0x48, 0x2a, 0x63, 0x20, 
-	0x48, 0x2a, 0x63, 0x60, 0x6b, 0x20, 0xf7, 0xff, 
-	0xfa, 0x78, 0x90, 0x00, 0x9a, 0x00, 0x99, 0x14, 
-	0x1c, 0x20, 0xf0, 0x00, 0xfd, 0xfb, 0x98, 0x02, 
-	0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 0xe0, 0x05, 
-	0x2d, 0x13, 0xd1, 0x03, 0x20, 0x1f, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0x08, 0x2d, 0x0b, 0xdb, 0x01, 
-	0x2d, 0x12, 0xdd, 0x1a, 0x48, 0x23, 0x68, 0x00, 
-	0x28, 0x00, 0xd1, 0x16, 0x20, 0x0d, 0x06, 0xc0, 
-	0x68, 0x80, 0x90, 0x02, 0x20, 0x00, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0x88, 0xf0, 0x00, 0xfe, 0x50, 
-	0x6b, 0x20, 0xf7, 0xff, 0xfa, 0x52, 0x90, 0x00, 
-	0x9a, 0x00, 0x99, 0x14, 0x1c, 0x20, 0xf0, 0x00, 
-	0xfd, 0xd5, 0x98, 0x02, 0x21, 0x0d, 0x06, 0xc9, 
-	0x60, 0x88, 0x48, 0x14, 0x68, 0x00, 0x28, 0x01, 
-	0xd1, 0x06, 0x48, 0x14, 0x68, 0x00, 0x28, 0x00, 
-	0xd1, 0x02, 0x20, 0x0d, 0x06, 0xc0, 0x62, 0x06, 
-	0x48, 0x0e, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x07, 
-	0x48, 0x0e, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x03, 
-	0x98, 0x14, 0x21, 0x00, 0xf0, 0x0b, 0xfd, 0x0a, 
-	0x20, 0x92, 0x49, 0x0b, 0x60, 0x08, 0x20, 0x00, 
-	0xb0, 0x09, 0xe5, 0x10, 0xb0, 0x09, 0xe5, 0x0e, 
-	0x00, 0x00, 0x02, 0xcf, 0x00, 0x00, 0x02, 0x3f, 
-	0x2e, 0x08, 0x7d, 0xb4, 0x2e, 0x08, 0x94, 0x88, 
-	0x2e, 0x08, 0x7d, 0xb8, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x5e, 0x4c, 0x2e, 0x08, 0x94, 0x84, 
-	0x2e, 0x08, 0x7c, 0xc0, 0xb5, 0xf7, 0xb0, 0x83, 
-	0x9f, 0x03, 0x69, 0x38, 0x90, 0x00, 0x98, 0x00, 
-	0x28, 0x13, 0xd1, 0x05, 0x20, 0x75, 0xb0, 0x03, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x6c, 0x78, 0x99, 0x04, 0x60, 0x48, 0x6c, 0x38, 
-	0x99, 0x04, 0x60, 0x08, 0x6c, 0xf8, 0x9a, 0x05, 
-	0x60, 0x50, 0x6c, 0xb8, 0x9a, 0x05, 0x60, 0x10, 
-	0x68, 0xfd, 0x48, 0xf9, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, 
-	0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, 
-	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
-	0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x03, 
-	0xe7, 0xda, 0x49, 0xf0, 0x20, 0x91, 0xf0, 0x18, 
-	0xfd, 0xb9, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 
-	0xf0, 0x0a, 0xfd, 0xa0, 0xe7, 0xf5, 0x00, 0xa8, 
-	0x49, 0xeb, 0x58, 0x08, 0x99, 0x03, 0x42, 0x88, 
-	0xd0, 0x05, 0x20, 0x92, 0x49, 0xe7, 0x60, 0x08, 
-	0x20, 0xff, 0xb0, 0x03, 0xe7, 0xc4, 0x21, 0x00, 
-	0x00, 0xa8, 0x4a, 0xe5, 0x50, 0x11, 0x48, 0xe2, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x69, 0x38, 
-	0x28, 0x0b, 0xdb, 0x16, 0x69, 0x38, 0x28, 0x12, 
-	0xdc, 0x13, 0x48, 0xe0, 0x68, 0x00, 0x28, 0x01, 
-	0xd1, 0x06, 0x69, 0x38, 0x28, 0x0b, 0xdb, 0x03, 
-	0x69, 0x38, 0x28, 0x12, 0xdc, 0x00, 0xe0, 0x08, 
-	0x6b, 0x38, 0xf7, 0xff, 0xf9, 0xb6, 0x90, 0x01, 
-	0x6a, 0xb9, 0x9a, 0x01, 0x48, 0xd8, 0xf0, 0x0b, 
-	0xfd, 0x85, 0x69, 0x38, 0x28, 0x0b, 0xdb, 0x2e, 
-	0x69, 0x38, 0x28, 0x12, 0xdc, 0x2b, 0x48, 0xd0, 
-	0x68, 0x00, 0x28, 0x00, 0xd1, 0x27, 0x20, 0x00, 
-	0x49, 0xd2, 0x65, 0x08, 0x20, 0x01, 0x03, 0x00, 
-	0x49, 0xd0, 0x65, 0x48, 0x20, 0x00, 0x49, 0xcf, 
-	0x65, 0x88, 0x20, 0x00, 0x49, 0xcd, 0x65, 0xc8, 
-	0x20, 0x00, 0x49, 0xcc, 0x66, 0x08, 0x20, 0x00, 
-	0x49, 0xcb, 0x60, 0x08, 0x20, 0x02, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0xc8, 0x21, 0x00, 0x20, 0x02, 
-	0xf0, 0x04, 0xf9, 0x0a, 0x48, 0xc3, 0x68, 0x00, 
-	0x28, 0x00, 0xd1, 0x04, 0x48, 0xc5, 0x21, 0x0d, 
-	0x06, 0xc9, 0x61, 0x88, 0xe0, 0x02, 0x48, 0xc3, 
-	0x49, 0xc3, 0x60, 0x08, 0xe0, 0x06, 0x69, 0x38, 
-	0x28, 0x13, 0xd1, 0x03, 0x20, 0x00, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0x08, 0x48, 0xb6, 0x68, 0x00, 
-	0x28, 0x00, 0xd1, 0x2c, 0x20, 0x0d, 0x06, 0xc0, 
-	0x68, 0x80, 0x90, 0x02, 0x20, 0x00, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0x88, 0xf0, 0x00, 0xfd, 0x64, 
-	0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0xb7, 
-	0x18, 0xc9, 0x60, 0x08, 0x20, 0x00, 0x43, 0xc0, 
-	0x00, 0xe9, 0x4b, 0xb4, 0x18, 0xc9, 0x60, 0x48, 
-	0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0xb1, 
-	0x18, 0xc9, 0x64, 0x08, 0x20, 0x00, 0x43, 0xc0, 
-	0x00, 0xe9, 0x4b, 0xae, 0x18, 0xc9, 0x64, 0x48, 
-	0x20, 0x01, 0x40, 0xa8, 0x43, 0xc0, 0x99, 0x02, 
-	0x40, 0x08, 0x90, 0x02, 0x98, 0x02, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0x88, 0xe0, 0x9c, 0x69, 0x38, 
-	0x28, 0x0b, 0xdb, 0x74, 0x69, 0x38, 0x28, 0x12, 
-	0xdc, 0x72, 0x48, 0x9b, 0x68, 0x00, 0x28, 0x01, 
-	0xd1, 0x6f, 0x20, 0x00, 0x49, 0x9d, 0x65, 0x08, 
-	0x20, 0x01, 0x03, 0x00, 0x49, 0x9b, 0x65, 0x48, 
-	0x20, 0x00, 0x49, 0x9a, 0x65, 0x88, 0x20, 0x00, 
-	0x49, 0x98, 0x65, 0xc8, 0x20, 0x00, 0x49, 0x97, 
-	0x66, 0x08, 0x20, 0x00, 0x49, 0x96, 0x60, 0x08, 
-	0x20, 0x02, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 
-	0x21, 0x00, 0x20, 0x02, 0xf0, 0x04, 0xf8, 0xa0, 
-	0x49, 0x95, 0x20, 0x91, 0xf0, 0x18, 0xfc, 0xf2, 
-	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0b, 
-	0xfc, 0x72, 0x20, 0x92, 0x49, 0x90, 0x60, 0x08, 
-	0x48, 0x90, 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, 
-	0x18, 0xc0, 0x69, 0x80, 0x08, 0x40, 0x00, 0x40, 
-	0x49, 0x8c, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 
-	0x18, 0xc9, 0x61, 0x88, 0x20, 0x01, 0x49, 0x89, 
-	0x68, 0x09, 0x60, 0x08, 0x20, 0x01, 0x49, 0x87, 
-	0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 
-	0x66, 0x88, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x83, 
-	0x68, 0x09, 0x23, 0x0f, 0x01, 0xdb, 0x18, 0xc9, 
-	0x61, 0x08, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x7f, 
-	0x68, 0x09, 0x23, 0x0f, 0x01, 0xdb, 0x18, 0xc9, 
-	0x61, 0x48, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x7b, 
-	0x68, 0x09, 0x23, 0x0f, 0x01, 0xdb, 0x18, 0xc9, 
-	0x60, 0xc8, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x77, 
-	0x68, 0x09, 0x23, 0x0f, 0x01, 0xdb, 0x18, 0xc9, 
-	0x60, 0x88, 0x6b, 0x38, 0xf7, 0xff, 0xf8, 0xd9, 
-	0x90, 0x01, 0x48, 0x72, 0x68, 0x00, 0x23, 0x77, 
-	0x01, 0x1b, 0x18, 0xc0, 0x9a, 0x01, 0x1c, 0x39, 
-	0xf0, 0x0b, 0xf8, 0x42, 0xe0, 0x02, 0xe0, 0x23, 
-	0xe0, 0x22, 0xe0, 0x21, 0x48, 0x67, 0x49, 0x6b, 
-	0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 
-	0x66, 0xc8, 0x48, 0x68, 0x68, 0x00, 0x21, 0x00, 
-	0xf0, 0x0b, 0xf8, 0xb8, 0x48, 0x65, 0x68, 0x00, 
-	0xf0, 0x0b, 0xfc, 0x2c, 0x49, 0x62, 0x20, 0x91, 
-	0xf0, 0x18, 0xfc, 0x8c, 0x28, 0x92, 0xd0, 0x00, 
-	0xe7, 0xf8, 0x48, 0x60, 0x68, 0x04, 0x48, 0x60, 
-	0x68, 0x00, 0x49, 0x5e, 0x60, 0x08, 0x48, 0x5e, 
-	0x60, 0x04, 0x20, 0x92, 0x49, 0x5a, 0x60, 0x08, 
-	0x48, 0x52, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x73, 
-	0x48, 0x4d, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x6f, 
-	0x1c, 0x28, 0xf0, 0x0b, 0xfb, 0x9d, 0x28, 0x01, 
-	0xd1, 0x6a, 0x98, 0x00, 0x28, 0x0b, 0xdb, 0x02, 
-	0x98, 0x00, 0x28, 0x12, 0xdd, 0x65, 0xb0, 0x84, 
-	0x49, 0x4f, 0x20, 0x91, 0xf0, 0x18, 0xfc, 0x66, 
-	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0b, 
-	0xfb, 0xe6, 0x48, 0x4c, 0x68, 0x00, 0x68, 0x40, 
-	0x28, 0x00, 0xd0, 0x06, 0x48, 0x49, 0x68, 0x00, 
-	0x68, 0x40, 0x38, 0x01, 0x49, 0x47, 0x68, 0x09, 
-	0x60, 0x48, 0x20, 0x92, 0x49, 0x44, 0x60, 0x08, 
-	0x20, 0x01, 0x49, 0x44, 0x68, 0x09, 0x60, 0x08, 
-	0x24, 0x00, 0x20, 0x00, 0x90, 0x02, 0x98, 0x02, 
-	0x28, 0x00, 0xd1, 0x15, 0x2c, 0x07, 0xd2, 0x13, 
-	0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x20, 
-	0x34, 0x01, 0x00, 0x83, 0x18, 0x18, 0x00, 0xc0, 
-	0x4a, 0x3a, 0x68, 0x12, 0x18, 0x80, 0x23, 0x05, 
-	0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0x81, 
-	0xd1, 0x01, 0x20, 0x01, 0x90, 0x02, 0xe7, 0xe6, 
-	0x98, 0x02, 0x28, 0x00, 0xd1, 0x14, 0x2c, 0x18, 
-	0xd2, 0x12, 0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89, 
-	0x1c, 0x20, 0x34, 0x01, 0x23, 0x4c, 0x43, 0x58, 
-	0x4a, 0x2e, 0x68, 0x12, 0x18, 0x80, 0x38, 0xff, 
-	0x38, 0xff, 0x38, 0x02, 0x69, 0x40, 0x42, 0x81, 
-	0xd1, 0x01, 0x20, 0x01, 0x90, 0x02, 0xe7, 0xe7, 
-	0x3c, 0x01, 0x6b, 0x38, 0xf7, 0xff, 0xf8, 0x41, 
-	0x90, 0x01, 0x2c, 0x07, 0xd2, 0x09, 0x48, 0x25, 
-	0x68, 0x01, 0x1c, 0x20, 0xf0, 0x0a, 0xfe, 0xbc, 
-	0x48, 0x22, 0x68, 0x00, 0xf0, 0x0b, 0xfb, 0xa6, 
-	0xe0, 0x09, 0x2c, 0x18, 0xd2, 0x07, 0xe0, 0x01, 
-	0xe0, 0x95, 0xe0, 0x94, 0x1f, 0xe0, 0x49, 0x1d, 
-	0x68, 0x09, 0xf0, 0x0a, 0xfe, 0xeb, 0x48, 0x1b, 
-	0x68, 0x00, 0x4b, 0x1c, 0x18, 0xc0, 0xf0, 0x0b, 
-	0xf8, 0x0b, 0x20, 0x00, 0x49, 0x17, 0x68, 0x09, 
-	0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x64, 0x88, 
-	0x48, 0x14, 0x68, 0x00, 0x68, 0x40, 0x28, 0x07, 
-	0xd3, 0x2c, 0x48, 0x12, 0x68, 0x00, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x23, 0xfe, 
-	0x43, 0x18, 0x49, 0x0e, 0x68, 0x09, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc9, 0xe0, 0x1c, 0x00, 0x00, 
-	0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc0, 
-	0x2e, 0x08, 0x7c, 0x58, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x7d, 0x94, 0xcc, 0x00, 0x00, 0x00, 
-	0x2e, 0x08, 0x7c, 0xbc, 0x3f, 0xff, 0xff, 0xff, 
-	0x2e, 0x08, 0x5e, 0x4c, 0x68, 0x00, 0x04, 0x00, 
-	0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4, 
-	0x2e, 0x08, 0x7d, 0xb8, 0x00, 0x00, 0x04, 0xcc, 
-	0x61, 0x88, 0xe0, 0x2d, 0x26, 0x01, 0x21, 0x00, 
-	0x91, 0x00, 0x48, 0x2b, 0x68, 0x00, 0x68, 0x40, 
-	0x99, 0x00, 0x42, 0x88, 0xd8, 0x04, 0xe0, 0x06, 
-	0x99, 0x00, 0x31, 0x01, 0x91, 0x00, 0xe7, 0xf4, 
-	0x00, 0x70, 0x1c, 0x46, 0xe7, 0xf8, 0x08, 0x76, 
-	0x00, 0x76, 0x48, 0x23, 0x68, 0x00, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x07, 0xc0, 
-	0x0f, 0xc0, 0x49, 0x1f, 0x68, 0x09, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x48, 0x1c, 
-	0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, 
-	0x69, 0x80, 0x43, 0x30, 0x49, 0x18, 0x68, 0x09, 
-	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 
-	0x1c, 0x21, 0x48, 0x15, 0x68, 0x00, 0xf0, 0x0a, 
-	0xff, 0xb1, 0x6b, 0x79, 0x48, 0x12, 0x68, 0x00, 
-	0xf0, 0x0a, 0xfe, 0xe6, 0x1c, 0x28, 0x21, 0x00, 
-	0xf0, 0x0b, 0xfa, 0x88, 0x49, 0x0f, 0x20, 0x91, 
-	0xf0, 0x18, 0xfb, 0x80, 0x28, 0x92, 0xd0, 0x00, 
-	0xe7, 0xf8, 0x48, 0x0b, 0x68, 0x00, 0x90, 0x03, 
-	0x48, 0x0b, 0x68, 0x00, 0x49, 0x08, 0x60, 0x08, 
-	0x98, 0x03, 0x49, 0x09, 0x60, 0x08, 0x20, 0x92, 
-	0x49, 0x06, 0x60, 0x08, 0xb0, 0x04, 0x20, 0x92, 
-	0x49, 0x06, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x03, 
-	0xe5, 0x86, 0xb0, 0x03, 0xe5, 0x84, 0x00, 0x00, 
-	0x2e, 0x08, 0x7d, 0xb4, 0x2e, 0x08, 0x94, 0x88, 
-	0x2e, 0x08, 0x7d, 0xb8, 0x2e, 0x08, 0x7c, 0xc0, 
-	0xb5, 0xf3, 0xb0, 0x85, 0x20, 0x00, 0x90, 0x01, 
-	0x9d, 0x05, 0x9f, 0x06, 0x69, 0x28, 0x90, 0x04, 
-	0x69, 0x3c, 0x98, 0x04, 0x28, 0x13, 0xd0, 0x01, 
-	0x2c, 0x13, 0xd1, 0x05, 0x20, 0xff, 0xb0, 0x05, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x68, 0xee, 0x68, 0xf9, 0x91, 0x03, 0x48, 0xdf, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2e, 0x19, 
-	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
-	0xe0, 0x04, 0x2e, 0x08, 0xd3, 0x01, 0x20, 0x01, 
-	0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x20, 
-	0x48, 0xd6, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x06, 
-	0x99, 0x03, 0x29, 0x19, 0xd3, 0x01, 0x20, 0x01, 
-	0xe0, 0x00, 0x20, 0x00, 0xe0, 0x05, 0x99, 0x03, 
-	0x29, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 
-	0x20, 0x00, 0x28, 0x00, 0xd0, 0x06, 0x99, 0x03, 
-	0x60, 0xe9, 0x60, 0xfe, 0x20, 0x00, 0xb0, 0x05, 
-	0xe7, 0xce, 0xe1, 0x92, 0x1c, 0x3d, 0x9f, 0x05, 
-	0x9e, 0x03, 0x68, 0xf9, 0x91, 0x03, 0x9c, 0x04, 
-	0xe0, 0xaa, 0x48, 0xc6, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x06, 0x99, 0x03, 0x29, 0x19, 0xd3, 0x01, 
-	0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x05, 
-	0x99, 0x03, 0x29, 0x08, 0xd3, 0x01, 0x20, 0x01, 
-	0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd1, 0x73, 
-	0x49, 0xbd, 0x20, 0x91, 0xf0, 0x18, 0xfa, 0xfe, 
-	0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x0a, 
-	0xfa, 0xe5, 0xe7, 0xf5, 0x00, 0xb0, 0x49, 0xb9, 
-	0x58, 0x08, 0x42, 0xa8, 0xd1, 0x05, 0x99, 0x03, 
-	0x00, 0x88, 0x49, 0xb6, 0x58, 0x08, 0x42, 0xb8, 
-	0xd0, 0x05, 0x20, 0x92, 0x49, 0xb2, 0x60, 0x08, 
-	0x20, 0xff, 0xb0, 0x05, 0xe7, 0x98, 0x48, 0xb2, 
-	0x68, 0x00, 0x42, 0xa8, 0xd0, 0x03, 0x48, 0xb0, 
-	0x68, 0x00, 0x42, 0xb8, 0xd1, 0x0a, 0x20, 0x0d, 
-	0x06, 0xc0, 0x68, 0xc0, 0x90, 0x01, 0x98, 0x01, 
-	0x28, 0x01, 0xd1, 0x03, 0x20, 0x00, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0xc8, 0x99, 0x03, 0x60, 0xe9, 
-	0x60, 0xfe, 0x00, 0xb0, 0x49, 0xa5, 0x50, 0x0f, 
-	0x99, 0x03, 0x00, 0x88, 0x49, 0xa3, 0x50, 0x0d, 
-	0x48, 0xa0, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x55, 
-	0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, 0x90, 0x02, 
-	0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 
-	0x20, 0x01, 0x40, 0xb0, 0x99, 0x02, 0x40, 0x08, 
-	0xd1, 0x12, 0x99, 0x03, 0x20, 0x01, 0x40, 0x88, 
-	0x99, 0x02, 0x40, 0x08, 0xd0, 0x0b, 0x99, 0x03, 
-	0x20, 0x01, 0x40, 0x88, 0x43, 0xc0, 0x99, 0x02, 
-	0x40, 0x08, 0x90, 0x02, 0x20, 0x01, 0x40, 0xb0, 
-	0x99, 0x02, 0x43, 0x08, 0x90, 0x02, 0xe0, 0x11, 
-	0x99, 0x03, 0x20, 0x01, 0x40, 0x88, 0x99, 0x02, 
-	0x40, 0x08, 0xd1, 0x0b, 0x20, 0x01, 0x40, 0xb0, 
-	0x43, 0xc0, 0x99, 0x02, 0x40, 0x08, 0x90, 0x02, 
-	0x99, 0x03, 0x20, 0x01, 0x40, 0x88, 0x99, 0x02, 
-	0x43, 0x08, 0x90, 0x02, 0x6b, 0x28, 0xf7, 0xfe, 
-	0xfe, 0xbc, 0x90, 0x00, 0x9a, 0x00, 0xe0, 0x00, 
-	0xe0, 0x22, 0x99, 0x03, 0x1c, 0x28, 0xf0, 0x00, 
-	0xfa, 0x3d, 0x6b, 0x38, 0xf7, 0xfe, 0xfe, 0xb1, 
-	0x90, 0x00, 0x9a, 0x00, 0x1c, 0x31, 0x1c, 0x38, 
-	0xf0, 0x00, 0xfa, 0x34, 0x98, 0x02, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0x88, 0x48, 0x7c, 0x68, 0x00, 
-	0x42, 0xa8, 0xd0, 0x03, 0x48, 0x7a, 0x68, 0x00, 
-	0x42, 0xb8, 0xd1, 0x03, 0x98, 0x01, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0xc8, 0x20, 0x92, 0x49, 0x74, 
-	0x60, 0x08, 0x20, 0x00, 0xb0, 0x05, 0xe7, 0x1b, 
-	0x49, 0x71, 0x20, 0x91, 0xf0, 0x18, 0xfa, 0x66, 
-	0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x0a, 
-	0xfa, 0x4d, 0xe7, 0xf5, 0x00, 0xb0, 0x49, 0x6d, 
-	0x58, 0x08, 0x42, 0xa8, 0xd0, 0x05, 0x20, 0x92, 
-	0x49, 0x69, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x05, 
-	0xe7, 0x06, 0x2c, 0x0b, 0xdb, 0x12, 0x2c, 0x12, 
-	0xdc, 0x10, 0x48, 0x67, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x09, 0x48, 0x65, 0x68, 0x00, 0x42, 0xa8, 
-	0xd0, 0x05, 0x20, 0x92, 0x49, 0x60, 0x60, 0x08, 
-	0x20, 0xff, 0xb0, 0x05, 0xe6, 0xf4, 0x48, 0x60, 
-	0x60, 0x07, 0xe0, 0x08, 0x6b, 0xf8, 0x28, 0x01, 
-	0xd1, 0x05, 0x20, 0x92, 0x49, 0x5a, 0x60, 0x08, 
-	0x20, 0xff, 0xb0, 0x05, 0xe6, 0xe8, 0x48, 0x5a, 
-	0x68, 0x00, 0x42, 0xa8, 0xd1, 0x02, 0x20, 0x00, 
-	0x49, 0x57, 0x60, 0x08, 0x00, 0xb0, 0x49, 0x55, 
-	0x50, 0x0f, 0x99, 0x03, 0x60, 0xe9, 0x60, 0xfe, 
-	0x48, 0x50, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x73, 
-	0x6b, 0x28, 0xf7, 0xfe, 0xfe, 0x4e, 0x90, 0x00, 
-	0x6a, 0xa9, 0x9a, 0x00, 0x48, 0x4f, 0xf0, 0x0b, 
-	0xfa, 0x1d, 0x6b, 0x38, 0xf7, 0xfe, 0xfe, 0x45, 
-	0x90, 0x00, 0x6a, 0xb9, 0x9a, 0x00, 0x48, 0x4b, 
-	0xf0, 0x0b, 0xfa, 0x42, 0x48, 0x48, 0x68, 0x00, 
-	0x42, 0xa8, 0xd1, 0x0f, 0x20, 0x02, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0xc8, 0x2c, 0x0b, 0xdb, 0x01, 
-	0x2c, 0x12, 0xdd, 0x07, 0x21, 0x00, 0x20, 0x02, 
-	0xf0, 0x03, 0xfd, 0xae, 0x48, 0x42, 0x21, 0x0d, 
-	0x06, 0xc9, 0x61, 0x88, 0x2c, 0x0b, 0xdb, 0x42, 
-	0x2c, 0x12, 0xdc, 0x40, 0x98, 0x04, 0x42, 0xa0, 
-	0xd0, 0x2c, 0x20, 0x02, 0x21, 0x0d, 0x06, 0xc9, 
-	0x60, 0xc8, 0x21, 0x00, 0x20, 0x02, 0xf0, 0x03, 
-	0xfd, 0x9b, 0x2c, 0x0f, 0xd0, 0x05, 0x2c, 0x10, 
-	0xd0, 0x03, 0x2c, 0x11, 0xd0, 0x01, 0x2c, 0x0b, 
-	0xd1, 0x03, 0x21, 0x00, 0x20, 0x12, 0xf0, 0x03, 
-	0xfd, 0x8f, 0x2c, 0x0c, 0xd0, 0x01, 0x2c, 0x0f, 
-	0xd1, 0x03, 0x21, 0x00, 0x20, 0x04, 0xf0, 0x03, 
-	0xfd, 0x87, 0x2c, 0x0d, 0xd0, 0x01, 0x2c, 0x10, 
-	0xd1, 0x03, 0x21, 0x00, 0x20, 0x08, 0xf0, 0x03, 
-	0xfd, 0x7f, 0x2c, 0x0e, 0xd0, 0x01, 0x2c, 0x11, 
-	0xd1, 0x03, 0x21, 0x00, 0x20, 0x01, 0xf0, 0x03, 
-	0xfd, 0x77, 0xe0, 0x03, 0x20, 0x00, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0xc8, 0x6a, 0xb8, 0x30, 0x01, 
-	0x05, 0x00, 0x6a, 0xf9, 0x31, 0x01, 0x02, 0x89, 
-	0x43, 0x08, 0x6b, 0x79, 0x31, 0x02, 0x43, 0x08, 
-	0x21, 0x0d, 0x06, 0xc9, 0x61, 0x88, 0x20, 0x0d, 
-	0x06, 0xc0, 0x68, 0x80, 0x90, 0x02, 0x20, 0x00, 
-	0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 0xe0, 0x00, 
-	0xe0, 0x1f, 0x20, 0x01, 0x40, 0xb0, 0x43, 0xc0, 
-	0x99, 0x02, 0x40, 0x08, 0x90, 0x02, 0xf0, 0x00, 
-	0xf9, 0xcf, 0x6b, 0x38, 0xf7, 0xfe, 0xfd, 0xd1, 
-	0x90, 0x00, 0x9a, 0x00, 0x1c, 0x31, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf9, 0x54, 0x98, 0x02, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0x88, 0x2c, 0x0b, 0xdb, 0x08, 
-	0x2c, 0x12, 0xdc, 0x06, 0x98, 0x04, 0x42, 0xa0, 
-	0xd1, 0x03, 0x20, 0x01, 0x21, 0x0d, 0x06, 0xc9, 
-	0x60, 0xc8, 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 
-	0x20, 0x00, 0xb0, 0x05, 0xe6, 0x3c, 0xb0, 0x05, 
-	0xe6, 0x3a, 0xe6, 0x39, 0x2e, 0x08, 0x94, 0x84, 
-	0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58, 
-	0x2e, 0x08, 0x7c, 0xbc, 0x2e, 0x08, 0x7d, 0x94, 
-	0x3f, 0xff, 0xff, 0xff, 0xb5, 0xf0, 0x1c, 0x07, 
-	0x00, 0xb8, 0x49, 0x09, 0x58, 0x0c, 0x1c, 0x7d, 
-	0x60, 0xe5, 0x00, 0xa8, 0x49, 0x06, 0x50, 0x0c, 
-	0x6b, 0x20, 0xf7, 0xfe, 0xfd, 0x9a, 0x1c, 0x06, 
-	0x1c, 0x32, 0x1c, 0x29, 0x1c, 0x20, 0xf0, 0x00, 
-	0xf9, 0x1d, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x7c, 0x58, 0xb5, 0xf0, 0x1c, 0x07, 
-	0x00, 0xb8, 0x49, 0x09, 0x58, 0x0c, 0x1e, 0x7d, 
-	0x60, 0xe5, 0x00, 0xa8, 0x49, 0x06, 0x50, 0x0c, 
-	0x6b, 0x20, 0xf7, 0xfe, 0xfd, 0x82, 0x1c, 0x06, 
-	0x1c, 0x32, 0x1c, 0x29, 0x1c, 0x20, 0xf0, 0x00, 
-	0xf9, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x7c, 0x58, 0xb5, 0xf3, 0x1c, 0x0f, 
-	0xb0, 0x86, 0x98, 0x06, 0x90, 0x05, 0x98, 0x05, 
-	0x68, 0xc5, 0x48, 0x77, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, 
-	0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, 
-	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
-	0x28, 0x00, 0xd0, 0x05, 0x20, 0xff, 0xb0, 0x06, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x98, 0x05, 0x69, 0x00, 0x28, 0x13, 0xd1, 0x02, 
-	0x20, 0xff, 0xb0, 0x06, 0xe7, 0xf4, 0x49, 0x69, 
-	0x20, 0x91, 0xf0, 0x18, 0xf9, 0x23, 0x28, 0x92, 
-	0xd0, 0x03, 0x20, 0x01, 0xf0, 0x0a, 0xf9, 0x0a, 
-	0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x64, 0x58, 0x08, 
-	0x99, 0x05, 0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, 
-	0x49, 0x60, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x06, 
-	0xe7, 0xde, 0x42, 0xbd, 0xd1, 0x05, 0x20, 0x92, 
-	0x49, 0x5c, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x06, 
-	0xe7, 0xd6, 0x20, 0x00, 0x00, 0xa9, 0x4a, 0x5a, 
-	0x50, 0x50, 0x98, 0x05, 0x60, 0xc7, 0x48, 0x59, 
-	0x68, 0x00, 0x28, 0x01, 0xd1, 0x0d, 0x48, 0x54, 
-	0x68, 0x00, 0x28, 0x01, 0xd1, 0x09, 0x99, 0x05, 
-	0x00, 0xb8, 0x4a, 0x53, 0x50, 0x11, 0x20, 0x92, 
-	0x49, 0x50, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x06, 
-	0xe7, 0xbe, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, 
-	0x1c, 0x04, 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 
-	0x60, 0x88, 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, 
-	0x4b, 0x4b, 0x18, 0xc9, 0x60, 0x08, 0x20, 0x00, 
-	0x43, 0xc0, 0x00, 0xe9, 0x4b, 0x48, 0x18, 0xc9, 
-	0x60, 0x48, 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, 
-	0x4b, 0x45, 0x18, 0xc9, 0x64, 0x08, 0x20, 0x00, 
-	0x43, 0xc0, 0x00, 0xe9, 0x4b, 0x42, 0x18, 0xc9, 
-	0x64, 0x48, 0x20, 0x01, 0x90, 0x01, 0x20, 0x01, 
-	0x40, 0xa8, 0x40, 0x20, 0xd1, 0x01, 0x20, 0x00, 
-	0x90, 0x01, 0x20, 0x01, 0x40, 0xa8, 0x43, 0xc0, 
-	0x40, 0x04, 0x1c, 0x3e, 0x42, 0xbd, 0xd9, 0x23, 
-	0x00, 0xb0, 0x49, 0x37, 0x58, 0x08, 0x28, 0x00, 
-	0xd0, 0x01, 0x36, 0x01, 0xe7, 0xf8, 0x1e, 0x70, 
-	0x90, 0x04, 0x98, 0x04, 0x42, 0xb8, 0xda, 0x04, 
-	0xe0, 0x07, 0x98, 0x04, 0x38, 0x01, 0x90, 0x04, 
-	0xe7, 0xf7, 0x98, 0x04, 0xf7, 0xff, 0xff, 0x32, 
-	0xe7, 0xf7, 0x20, 0xff, 0x40, 0xb8, 0x90, 0x03, 
-	0x20, 0xff, 0x40, 0xb0, 0x43, 0xc0, 0x99, 0x03, 
-	0x40, 0x08, 0x90, 0x03, 0x98, 0x03, 0x00, 0x40, 
-	0x90, 0x03, 0x00, 0x60, 0x90, 0x00, 0xe0, 0x1f, 
-	0x00, 0xb0, 0x49, 0x25, 0x58, 0x08, 0x28, 0x00, 
-	0xd0, 0x01, 0x3e, 0x01, 0xe7, 0xf8, 0x1c, 0x70, 
-	0x90, 0x04, 0x98, 0x04, 0x42, 0xb8, 0xd9, 0x04, 
-	0xe0, 0x07, 0x98, 0x04, 0x30, 0x01, 0x90, 0x04, 
-	0xe7, 0xf7, 0x98, 0x04, 0xf7, 0xff, 0xff, 0x26, 
-	0xe7, 0xf7, 0x20, 0xff, 0x40, 0xb0, 0x90, 0x03, 
-	0x20, 0xff, 0x40, 0xb8, 0x43, 0xc0, 0x99, 0x03, 
-	0x40, 0x08, 0x90, 0x03, 0x08, 0x60, 0x90, 0x00, 
-	0x98, 0x00, 0x99, 0x03, 0x40, 0x08, 0x90, 0x00, 
-	0x98, 0x03, 0x43, 0x84, 0x98, 0x00, 0x43, 0x04, 
-	0x20, 0x01, 0x40, 0xb8, 0x43, 0xc0, 0x40, 0x04, 
-	0x98, 0x01, 0x40, 0xb8, 0x43, 0x04, 0x99, 0x05, 
-	0x00, 0xb8, 0x4a, 0x0d, 0x50, 0x11, 0x98, 0x05, 
-	0x6b, 0x00, 0xf7, 0xfe, 0xfc, 0x92, 0x90, 0x02, 
-	0x9a, 0x02, 0x1c, 0x39, 0x98, 0x05, 0xf0, 0x00, 
-	0xf8, 0x15, 0x20, 0x0d, 0x06, 0xc0, 0x60, 0x84, 
-	0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 0x20, 0x00, 
-	0xb0, 0x06, 0xe7, 0x25, 0xb0, 0x06, 0xe7, 0x23, 
-	0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc0, 
-	0x2e, 0x08, 0x7c, 0x58, 0x2e, 0x08, 0x60, 0x84, 
-	0x68, 0x00, 0x04, 0x00, 0xb5, 0xf7, 0x1c, 0x04, 
-	0x1c, 0x0f, 0x01, 0x3d, 0x4b, 0x2f, 0x18, 0xe9, 
-	0x1d, 0xe2, 0x32, 0x0d, 0x20, 0x00, 0x28, 0x03, 
-	0xd3, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, 
-	0xca, 0x20, 0xc1, 0x20, 0xe7, 0xfa, 0x6a, 0xe3, 
-	0x05, 0x9d, 0x0d, 0xad, 0x00, 0xfe, 0x4b, 0x28, 
-	0x18, 0xf3, 0x60, 0x1d, 0x6b, 0x63, 0x33, 0x01, 
-	0x05, 0x9d, 0x0d, 0xad, 0x00, 0xfe, 0x4b, 0x24, 
-	0x18, 0xf3, 0x60, 0x5d, 0x6a, 0xa5, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x1d, 0x00, 0xfe, 0x4b, 0x20, 
-	0x18, 0xf3, 0x64, 0x1d, 0x9d, 0x02, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x1d, 0x00, 0xfe, 0x4b, 0x1c, 
-	0x18, 0xf3, 0x64, 0x5d, 0x4b, 0x1b, 0x68, 0x1b, 
-	0x2b, 0x01, 0xd1, 0x2a, 0x2f, 0x00, 0xd1, 0x28, 
-	0x4b, 0x17, 0x68, 0x5d, 0x23, 0x8f, 0x00, 0x9b, 
-	0x42, 0x9d, 0xd3, 0x03, 0x23, 0x8f, 0x00, 0x9b, 
-	0x4d, 0x13, 0x60, 0x6b, 0x4b, 0x12, 0x68, 0x1d, 
-	0x4b, 0x13, 0x42, 0x9d, 0xd3, 0x02, 0x4b, 0x12, 
-	0x4d, 0x0f, 0x60, 0x2b, 0x4b, 0x0e, 0x6c, 0x5d, 
-	0x23, 0x01, 0x02, 0x9b, 0x1a, 0xed, 0x23, 0xb3, 
-	0x00, 0x9b, 0x42, 0x9d, 0xd3, 0x02, 0x4b, 0x0d, 
-	0x4d, 0x09, 0x64, 0x6b, 0x4b, 0x08, 0x6c, 0x1d, 
-	0x23, 0x01, 0x02, 0x9b, 0x1a, 0xed, 0x4b, 0x0a, 
-	0x42, 0x9d, 0xd3, 0x02, 0x4b, 0x09, 0x4d, 0x04, 
-	0x64, 0x2b, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x68, 0x00, 0x0c, 0x00, 
-	0x68, 0x00, 0x04, 0x00, 0x2e, 0x08, 0x60, 0x84, 
-	0x00, 0x00, 0x02, 0x3a, 0x00, 0x00, 0x06, 0xcc, 
-	0x00, 0x00, 0x02, 0xca, 0x00, 0x00, 0x06, 0xca, 
-	0xb4, 0xf0, 0x4f, 0x15, 0x4c, 0x15, 0x20, 0x00, 
-	0x21, 0x00, 0x22, 0x00, 0x43, 0xd2, 0x4d, 0x14, 
-	0x68, 0x6d, 0x42, 0x85, 0xdd, 0x1b, 0x1c, 0x05, 
-	0x30, 0x01, 0x00, 0xad, 0x59, 0x7b, 0x42, 0x93, 
-	0xd0, 0xf9, 0x4d, 0x0f, 0x68, 0x6d, 0x42, 0x85, 
-	0xda, 0x00, 0xe0, 0x10, 0x31, 0x01, 0x1c, 0x05, 
-	0x30, 0x01, 0x00, 0xad, 0x59, 0x7a, 0x42, 0x93, 
-	0xd0, 0xf9, 0x02, 0x95, 0x43, 0x1d, 0x1c, 0x2e, 
-	0xc4, 0x40, 0x4d, 0x07, 0x68, 0x6d, 0x42, 0x85, 
-	0xdb, 0x00, 0x31, 0x01, 0xe7, 0xdf, 0x25, 0x0d, 
-	0x06, 0xed, 0x61, 0x29, 0xbc, 0xf0, 0x47, 0x70, 
-	0x2e, 0x08, 0x7c, 0xcc, 0x68, 0x00, 0x0d, 0x40, 
-	0x2e, 0x08, 0x7d, 0x94, 0xb5, 0xf3, 0xb0, 0x82, 
-	0x9d, 0x02, 0x69, 0x2c, 0x2c, 0x13, 0xd1, 0x05, 
-	0x20, 0x75, 0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x68, 0xee, 0x48, 0xf8, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2e, 0x19, 
-	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
-	0xe0, 0x04, 0x2e, 0x08, 0xd3, 0x01, 0x20, 0x01, 
-	0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x02, 
-	0x20, 0xff, 0xb0, 0x02, 0xe7, 0xe6, 0x49, 0xef, 
-	0x20, 0x91, 0xf0, 0x17, 0xff, 0x83, 0x28, 0x92, 
-	0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, 0xff, 0x6a, 
-	0xe7, 0xf5, 0x00, 0xb0, 0x49, 0xea, 0x58, 0x08, 
-	0x99, 0x02, 0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, 
-	0x49, 0xe6, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x02, 
-	0xe7, 0xd0, 0x48, 0xe3, 0x68, 0x00, 0x28, 0x00, 
-	0xd1, 0x16, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, 
-	0x90, 0x01, 0x99, 0x03, 0x29, 0x01, 0xd1, 0x05, 
-	0x20, 0x01, 0x40, 0xb0, 0x99, 0x01, 0x43, 0x08, 
-	0x90, 0x01, 0xe0, 0x05, 0x20, 0x01, 0x40, 0xb0, 
-	0x43, 0xc0, 0x99, 0x01, 0x40, 0x08, 0x90, 0x01, 
-	0x98, 0x01, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 
-	0x48, 0xd8, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x73, 
-	0x48, 0xd3, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x6f, 
-	0x99, 0x03, 0x29, 0x01, 0xd1, 0x6c, 0xb0, 0x83, 
-	0x1c, 0x30, 0xf0, 0x0a, 0xfe, 0x71, 0x28, 0x01, 
-	0xd1, 0x05, 0x20, 0x92, 0x49, 0xcd, 0x60, 0x08, 
-	0x20, 0x00, 0xb0, 0x05, 0xe7, 0x9e, 0x49, 0xce, 
-	0x20, 0x91, 0xf0, 0x17, 0xff, 0x3b, 0x28, 0x92, 
-	0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 0xfe, 0xbb, 
-	0x2c, 0x0b, 0xdb, 0x01, 0x2c, 0x12, 0xdd, 0x06, 
-	0x48, 0xc8, 0x68, 0x00, 0x68, 0x40, 0x30, 0x01, 
-	0x49, 0xc6, 0x68, 0x09, 0x60, 0x48, 0x20, 0x92, 
-	0x49, 0xc3, 0x60, 0x08, 0x20, 0x01, 0x49, 0xc3, 
-	0x68, 0x09, 0x60, 0x08, 0x2c, 0x0b, 0xdb, 0x11, 
-	0x2c, 0x12, 0xdc, 0x0f, 0x48, 0xbf, 0x68, 0x00, 
-	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 
-	0x23, 0x01, 0x43, 0x18, 0x49, 0xbb, 0x68, 0x09, 
-	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 
-	0x27, 0x00, 0xe0, 0xbc, 0x27, 0x00, 0x20, 0x00, 
-	0x90, 0x01, 0x98, 0x01, 0x28, 0x00, 0xd1, 0x15, 
-	0x2f, 0x07, 0xd2, 0x13, 0x6a, 0xe8, 0x05, 0x81, 
-	0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 0x00, 0x83, 
-	0x18, 0x18, 0x00, 0xc0, 0x4a, 0xaf, 0x68, 0x12, 
-	0x18, 0x80, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 
-	0x6f, 0xc0, 0x42, 0x81, 0xda, 0x01, 0x20, 0x01, 
-	0x90, 0x01, 0xe7, 0xe6, 0x98, 0x01, 0x28, 0x00, 
-	0xd1, 0x16, 0x2f, 0x18, 0xd2, 0x14, 0x6a, 0xe8, 
-	0x05, 0x81, 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 
-	0x23, 0x4c, 0x43, 0x58, 0x4a, 0xa3, 0x68, 0x12, 
-	0x18, 0x80, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 
-	0x69, 0x40, 0x42, 0x81, 0xda, 0x03, 0xe0, 0x00, 
-	0xe0, 0xb0, 0x20, 0x01, 0x90, 0x01, 0xe7, 0xe5, 
-	0x3f, 0x01, 0x6b, 0x28, 0xf7, 0xfe, 0xfb, 0x01, 
-	0x90, 0x00, 0x2f, 0x07, 0xd2, 0x16, 0x48, 0x99, 
-	0x68, 0x01, 0x1c, 0x38, 0xf0, 0x0a, 0xf9, 0x0a, 
-	0x00, 0xb8, 0x19, 0xc0, 0x00, 0xc0, 0x49, 0x95, 
-	0x68, 0x09, 0x18, 0x40, 0x23, 0x2b, 0x01, 0x5b, 
-	0x18, 0xc0, 0x9a, 0x00, 0x1c, 0x29, 0xf0, 0x0a, 
-	0xfa, 0x5f, 0x48, 0x90, 0x68, 0x00, 0xf0, 0x0a, 
-	0xfe, 0x59, 0xe0, 0x4a, 0x2f, 0x18, 0xd2, 0x48, 
-	0x1f, 0xf8, 0x49, 0x8c, 0x68, 0x09, 0xf0, 0x0a, 
-	0xf9, 0x45, 0x20, 0x4c, 0x43, 0x78, 0x49, 0x89, 
-	0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 
-	0x38, 0x0a, 0x9a, 0x00, 0x1c, 0x29, 0xf0, 0x0a, 
-	0xfa, 0x47, 0x20, 0x4c, 0x43, 0x78, 0x49, 0x83, 
-	0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 
-	0x38, 0x82, 0x6f, 0xc0, 0x28, 0x00, 0xd0, 0x17, 
-	0x20, 0x4c, 0x43, 0x78, 0x49, 0x7d, 0x68, 0x09, 
-	0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 
-	0x68, 0x00, 0x04, 0x00, 0x0c, 0x00, 0xd0, 0x0b, 
-	0x20, 0x4c, 0x43, 0x78, 0x49, 0x77, 0x68, 0x09, 
-	0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 
-	0x68, 0x00, 0x0c, 0x00, 0x04, 0x00, 0xd1, 0x0a, 
-	0x20, 0x02, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x71, 
-	0x68, 0x12, 0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 
-	0x39, 0x82, 0x67, 0x48, 0xe0, 0x09, 0x20, 0x03, 
-	0x21, 0x4c, 0x43, 0x79, 0x4a, 0x6b, 0x68, 0x12, 
-	0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 0x39, 0x82, 
-	0x67, 0x48, 0x48, 0x68, 0x68, 0x00, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x00, 0x40, 
-	0x90, 0x03, 0x98, 0x03, 0x23, 0x02, 0x43, 0x18, 
-	0x90, 0x03, 0x48, 0x62, 0x68, 0x00, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x07, 0xc0, 
-	0x0f, 0xc0, 0x99, 0x03, 0x18, 0x40, 0x90, 0x03, 
-	0x98, 0x03, 0x49, 0x5c, 0x68, 0x09, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x1c, 0x39, 
-	0x48, 0x58, 0x68, 0x00, 0xf0, 0x0a, 0xfa, 0x72, 
-	0x2c, 0x0b, 0xdb, 0x01, 0x2c, 0x12, 0xdd, 0x04, 
-	0x6b, 0x69, 0x48, 0x54, 0x68, 0x00, 0xf0, 0x0a, 
-	0xf9, 0x4d, 0x1c, 0x30, 0x21, 0x01, 0xf0, 0x0a, 
-	0xfd, 0x45, 0x49, 0x4f, 0x20, 0x91, 0xf0, 0x17, 
-	0xfe, 0x3d, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 
-	0x48, 0x4c, 0x68, 0x00, 0x90, 0x02, 0x48, 0x4c, 
-	0x68, 0x00, 0x49, 0x4a, 0x60, 0x08, 0x98, 0x02, 
-	0x49, 0x49, 0x60, 0x08, 0x20, 0x92, 0x49, 0x46, 
-	0x60, 0x08, 0xb0, 0x03, 0x48, 0x43, 0x68, 0x00, 
-	0x28, 0x01, 0xd1, 0x75, 0x48, 0x3e, 0x68, 0x00, 
-	0x28, 0x01, 0xd1, 0x71, 0x99, 0x03, 0x29, 0x00, 
-	0xd1, 0x6e, 0xb0, 0x85, 0x1c, 0x30, 0xf0, 0x0a, 
-	0xfd, 0x47, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x92, 
-	0x49, 0x38, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x07, 
-	0xe6, 0x74, 0x49, 0x39, 0x20, 0x91, 0xf0, 0x17, 
-	0xfe, 0x11, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 
-	0xf0, 0x0a, 0xfd, 0x91, 0x2c, 0x0b, 0xdb, 0x01, 
-	0x2c, 0x12, 0xdd, 0x0b, 0x48, 0x33, 0x68, 0x00, 
-	0x68, 0x40, 0x28, 0x00, 0xd0, 0x06, 0x48, 0x31, 
-	0x68, 0x00, 0x68, 0x40, 0x38, 0x01, 0x49, 0x2f, 
-	0x68, 0x09, 0x60, 0x48, 0x20, 0x92, 0x49, 0x2c, 
-	0x60, 0x08, 0x20, 0x01, 0x49, 0x2b, 0x68, 0x09, 
-	0x60, 0x08, 0x2c, 0x0b, 0xdb, 0x11, 0x2c, 0x12, 
-	0xdc, 0x0f, 0x48, 0x28, 0x68, 0x00, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x08, 0x40, 
-	0x00, 0x40, 0x49, 0x24, 0x68, 0x09, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x27, 0x00, 
-	0xe0, 0xb2, 0x27, 0x00, 0x20, 0x00, 0x90, 0x03, 
-	0x98, 0x03, 0x28, 0x00, 0xd1, 0x15, 0x2f, 0x07, 
-	0xd2, 0x13, 0x6a, 0xe8, 0x05, 0x81, 0x0d, 0x89, 
-	0x1c, 0x38, 0x37, 0x01, 0x00, 0x83, 0x18, 0x18, 
-	0x00, 0xc0, 0x4a, 0x18, 0x68, 0x12, 0x18, 0x80, 
-	0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 
-	0x42, 0x81, 0xd1, 0x01, 0x20, 0x01, 0x90, 0x03, 
-	0xe7, 0xe6, 0x98, 0x03, 0x28, 0x00, 0xd1, 0x26, 
-	0x2f, 0x18, 0xd2, 0x24, 0x6a, 0xe8, 0x05, 0x81, 
-	0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 0x23, 0x4c, 
-	0x43, 0x58, 0x4a, 0x0c, 0x68, 0x12, 0x18, 0x80, 
-	0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0xe0, 0x00, 
-	0xe0, 0xa9, 0x69, 0x40, 0x42, 0x81, 0xd1, 0x11, 
-	0x20, 0x01, 0x90, 0x03, 0xe0, 0x0e, 0x00, 0x00, 
-	0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc0, 
-	0x2e, 0x08, 0x7c, 0x58, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4, 
-	0x2e, 0x08, 0x7d, 0xb8, 0xe7, 0xd5, 0x3f, 0x01, 
-	0x6b, 0x28, 0xf7, 0xfe, 0xf9, 0xc2, 0x90, 0x01, 
-	0x2f, 0x07, 0xd2, 0x09, 0x48, 0x4a, 0x68, 0x01, 
-	0x1c, 0x38, 0xf0, 0x0a, 0xf8, 0x3d, 0x48, 0x48, 
-	0x68, 0x00, 0xf0, 0x0a, 0xfd, 0x27, 0xe0, 0x06, 
-	0x2f, 0x18, 0xd2, 0x04, 0x1f, 0xf8, 0x49, 0x44, 
-	0x68, 0x09, 0xf0, 0x0a, 0xf8, 0x6f, 0x48, 0x42, 
-	0x68, 0x00, 0x4b, 0x42, 0x18, 0xc0, 0xf0, 0x0a, 
-	0xf9, 0x8f, 0x20, 0x00, 0x49, 0x3e, 0x68, 0x09, 
-	0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x64, 0x88, 
-	0x48, 0x3b, 0x68, 0x00, 0x68, 0x40, 0x28, 0x07, 
-	0xd3, 0x0e, 0x48, 0x39, 0x68, 0x00, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x23, 0xfe, 
-	0x43, 0x18, 0x49, 0x35, 0x68, 0x09, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0xe0, 0x33, 
-	0x20, 0x01, 0x90, 0x00, 0x21, 0x00, 0x91, 0x02, 
-	0x48, 0x2f, 0x68, 0x00, 0x68, 0x40, 0x99, 0x02, 
-	0x42, 0x88, 0xd8, 0x04, 0xe0, 0x08, 0x99, 0x02, 
-	0x31, 0x01, 0x91, 0x02, 0xe7, 0xf4, 0x98, 0x00, 
-	0x00, 0x40, 0x30, 0x01, 0x90, 0x00, 0xe7, 0xf6, 
-	0x98, 0x00, 0x08, 0x40, 0x00, 0x40, 0x90, 0x00, 
-	0x48, 0x25, 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, 
-	0x18, 0xc0, 0x69, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 
-	0x49, 0x21, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 
-	0x18, 0xc9, 0x61, 0x88, 0x48, 0x1e, 0x68, 0x00, 
-	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 
-	0x99, 0x00, 0x43, 0x08, 0x49, 0x1a, 0x68, 0x09, 
-	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 
-	0x1c, 0x39, 0x48, 0x17, 0x68, 0x00, 0xf0, 0x0a, 
-	0xf9, 0x4d, 0x2c, 0x0b, 0xdb, 0x01, 0x2c, 0x12, 
-	0xdd, 0x04, 0x6b, 0x69, 0x48, 0x12, 0x68, 0x00, 
-	0xf0, 0x0a, 0xf8, 0x7e, 0x1c, 0x30, 0x21, 0x00, 
-	0xf0, 0x0a, 0xfc, 0x20, 0x49, 0x10, 0x20, 0x91, 
-	0xf0, 0x17, 0xfd, 0x18, 0x28, 0x92, 0xd0, 0x00, 
-	0xe7, 0xf8, 0x48, 0x0b, 0x68, 0x00, 0x90, 0x04, 
-	0x48, 0x0c, 0x68, 0x00, 0x49, 0x08, 0x60, 0x08, 
-	0x98, 0x04, 0x49, 0x0a, 0x60, 0x08, 0x20, 0x92, 
-	0x49, 0x07, 0x60, 0x08, 0xb0, 0x05, 0x20, 0x92, 
-	0x49, 0x07, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x02, 
-	0xe5, 0x60, 0xb0, 0x02, 0xe5, 0x5e, 0x00, 0x00, 
-	0x2e, 0x08, 0x7d, 0xb4, 0x00, 0x00, 0x04, 0xcc, 
-	0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb8, 
-	0x2e, 0x08, 0x7c, 0xc0, 0xb5, 0xf3, 0x1c, 0x07, 
-	0x1c, 0x3e, 0x69, 0x30, 0x28, 0x13, 0xd1, 0x04, 
-	0x20, 0x75, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x68, 0xf4, 0x48, 0x1e, 0x68, 0x00, 
-	0x28, 0x00, 0xd0, 0x05, 0x2c, 0x19, 0xd3, 0x01, 
-	0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 
-	0x2c, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 
-	0x20, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x20, 0xff, 
-	0xe7, 0xe7, 0x49, 0x16, 0x20, 0x91, 0xf0, 0x17, 
-	0xfc, 0xd1, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 
-	0xf0, 0x09, 0xfc, 0xb8, 0xe7, 0xf5, 0x00, 0xa0, 
-	0x49, 0x11, 0x58, 0x08, 0x42, 0xb8, 0xd0, 0x04, 
-	0x20, 0x92, 0x49, 0x0e, 0x60, 0x08, 0x20, 0xff, 
-	0xe7, 0xd3, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, 
-	0x1c, 0x05, 0x20, 0x01, 0x40, 0xa0, 0x40, 0x05, 
-	0x2d, 0x00, 0xd1, 0x03, 0x20, 0x00, 0x99, 0x01, 
-	0x60, 0x08, 0xe0, 0x02, 0x20, 0x01, 0x99, 0x01, 
-	0x60, 0x08, 0x20, 0x92, 0x49, 0x03, 0x60, 0x08, 
-	0x20, 0x00, 0xe7, 0xbe, 0xe7, 0xbd, 0x00, 0x00, 
-	0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc0, 
-	0x2e, 0x08, 0x7c, 0x58, 0xb5, 0xf3, 0x1c, 0x07, 
-	0xb0, 0x81, 0x1c, 0x3c, 0x68, 0xe5, 0x69, 0x60, 
-	0x4b, 0x49, 0x40, 0x18, 0x99, 0x02, 0x07, 0x89, 
-	0x0f, 0x89, 0x02, 0x09, 0x43, 0x08, 0x61, 0x60, 
-	0x05, 0x80, 0x48, 0x46, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, 
-	0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, 
-	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
-	0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, 0xb0, 0x01, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x49, 0x3b, 0x20, 0x91, 0xf0, 0x17, 0xfc, 0x7a, 
-	0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, 
-	0xfc, 0x61, 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x37, 
-	0x58, 0x08, 0x42, 0xb8, 0xd0, 0x05, 0x20, 0x92, 
-	0x49, 0x33, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x01, 
-	0xe7, 0xe6, 0x48, 0x30, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x05, 0x69, 0x20, 0x28, 0x0b, 0xdb, 0x0c, 
-	0x69, 0x20, 0x28, 0x12, 0xdc, 0x09, 0x01, 0x28, 
-	0x4b, 0x2d, 0x18, 0xc1, 0x91, 0x00, 0x1d, 0xe6, 
-	0x36, 0x0d, 0x68, 0x30, 0x99, 0x00, 0x60, 0x08, 
-	0xe0, 0x41, 0x48, 0x26, 0x68, 0x00, 0x28, 0x01, 
-	0xd1, 0x3d, 0x48, 0x28, 0x68, 0x00, 0x28, 0x01, 
-	0xd1, 0x39, 0xb0, 0x82, 0x1c, 0x28, 0xf0, 0x0a, 
-	0xfb, 0x73, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x92, 
-	0x49, 0x1f, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x03, 
-	0xe7, 0xbe, 0x49, 0x21, 0x20, 0x91, 0xf0, 0x17, 
-	0xfc, 0x3d, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 
-	0xf0, 0x0a, 0xfb, 0xbd, 0x20, 0x92, 0x49, 0x1c, 
-	0x60, 0x08, 0x20, 0x01, 0x49, 0x1b, 0x68, 0x09, 
-	0x60, 0x08, 0x48, 0x1a, 0x68, 0x01, 0x1c, 0x20, 
-	0xf0, 0x0a, 0xfb, 0x6e, 0x90, 0x00, 0x69, 0x60, 
-	0x99, 0x00, 0x60, 0xc8, 0x49, 0x14, 0x20, 0x91, 
-	0xf0, 0x17, 0xfc, 0x24, 0x28, 0x92, 0xd0, 0x00, 
-	0xe7, 0xf8, 0x48, 0x12, 0x68, 0x00, 0x90, 0x01, 
-	0x48, 0x11, 0x68, 0x00, 0x49, 0x0f, 0x60, 0x08, 
-	0x98, 0x01, 0x49, 0x0f, 0x60, 0x08, 0x20, 0x92, 
-	0x49, 0x0b, 0x60, 0x08, 0xb0, 0x02, 0x20, 0x92, 
-	0x49, 0x05, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x01, 
-	0xe7, 0x8a, 0xb0, 0x01, 0xe7, 0x88, 0x00, 0x00, 
-	0xff, 0xff, 0xfc, 0xff, 0x2e, 0x08, 0x94, 0x84, 
-	0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58, 
-	0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4, 
-	0x2e, 0x08, 0x7d, 0xb8, 0xb5, 0xf3, 0x1c, 0x07, 
-	0xb0, 0x81, 0x1c, 0x3c, 0x68, 0xe5, 0x69, 0x60, 
-	0x4b, 0x49, 0x40, 0x18, 0x99, 0x02, 0x07, 0x09, 
-	0x0f, 0x09, 0x02, 0x89, 0x43, 0x08, 0x61, 0x60, 
-	0x04, 0x80, 0x48, 0x46, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, 
-	0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, 
-	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
-	0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, 0xb0, 0x01, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x49, 0x3b, 0x20, 0x91, 0xf0, 0x17, 0xfb, 0xce, 
-	0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, 
-	0xfb, 0xb5, 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x37, 
-	0x58, 0x08, 0x42, 0xb8, 0xd0, 0x05, 0x20, 0x92, 
-	0x49, 0x33, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x01, 
-	0xe7, 0xe6, 0x48, 0x30, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x05, 0x69, 0x20, 0x28, 0x0b, 0xdb, 0x0c, 
-	0x69, 0x20, 0x28, 0x12, 0xdc, 0x09, 0x01, 0x28, 
-	0x4b, 0x2d, 0x18, 0xc6, 0x1d, 0xe0, 0x30, 0x0d, 
-	0x90, 0x00, 0x98, 0x00, 0x68, 0x00, 0x60, 0x30, 
-	0xe0, 0x41, 0x48, 0x26, 0x68, 0x00, 0x28, 0x01, 
-	0xd1, 0x3d, 0x48, 0x28, 0x68, 0x00, 0x28, 0x01, 
-	0xd1, 0x39, 0xb0, 0x82, 0x1c, 0x28, 0xf0, 0x0a, 
-	0xfa, 0xc7, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x92, 
-	0x49, 0x1f, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x03, 
-	0xe7, 0xbe, 0x49, 0x21, 0x20, 0x91, 0xf0, 0x17, 
-	0xfb, 0x91, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 
-	0xf0, 0x0a, 0xfb, 0x11, 0x20, 0x92, 0x49, 0x1c, 
-	0x60, 0x08, 0x20, 0x01, 0x49, 0x1b, 0x68, 0x09, 
-	0x60, 0x08, 0x48, 0x1a, 0x68, 0x01, 0x1c, 0x20, 
-	0xf0, 0x0a, 0xfa, 0xc2, 0x90, 0x00, 0x69, 0x60, 
-	0x99, 0x00, 0x60, 0xc8, 0x49, 0x14, 0x20, 0x91, 
-	0xf0, 0x17, 0xfb, 0x78, 0x28, 0x92, 0xd0, 0x00, 
-	0xe7, 0xf8, 0x48, 0x12, 0x68, 0x00, 0x90, 0x01, 
-	0x48, 0x11, 0x68, 0x00, 0x49, 0x0f, 0x60, 0x08, 
-	0x98, 0x01, 0x49, 0x0f, 0x60, 0x08, 0x20, 0x92, 
-	0x49, 0x0b, 0x60, 0x08, 0xb0, 0x02, 0x20, 0x92, 
-	0x49, 0x05, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x01, 
-	0xe7, 0x8a, 0xb0, 0x01, 0xe7, 0x88, 0x00, 0x00, 
-	0xff, 0xff, 0xc3, 0xff, 0x2e, 0x08, 0x94, 0x84, 
-	0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58, 
-	0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4, 
-	0x2e, 0x08, 0x7d, 0xb8, 0xb5, 0xf3, 0x1c, 0x07, 
-	0xb0, 0x82, 0x1c, 0x3c, 0x68, 0xe5, 0x26, 0x00, 
-	0x99, 0x03, 0x29, 0x01, 0xd1, 0x00, 0x26, 0x01, 
-	0x69, 0x60, 0x06, 0x80, 0x0f, 0xc0, 0x42, 0xb0, 
-	0xd1, 0x05, 0x20, 0x00, 0xb0, 0x02, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x69, 0x60, 
-	0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0x07, 0xf1, 
-	0x0e, 0x89, 0x43, 0x08, 0x61, 0x60, 0x06, 0x80, 
-	0x48, 0x44, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 
-	0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 
-	0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, 0xd3, 0x01, 
-	0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 
-	0xd0, 0x02, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xde, 
-	0x49, 0x3b, 0x20, 0x91, 0xf0, 0x17, 0xfb, 0x16, 
-	0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, 
-	0xfa, 0xfd, 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x37, 
-	0x58, 0x08, 0x42, 0xb8, 0xd0, 0x05, 0x20, 0x92, 
-	0x49, 0x33, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x02, 
-	0xe7, 0xc9, 0x48, 0x30, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x05, 0x69, 0x20, 0x28, 0x0b, 0xdb, 0x0e, 
-	0x69, 0x20, 0x28, 0x12, 0xdc, 0x0b, 0x01, 0x28, 
-	0x4b, 0x2d, 0x18, 0xc1, 0x91, 0x01, 0x1d, 0xe0, 
-	0x30, 0x0d, 0x90, 0x00, 0x98, 0x00, 0x68, 0x00, 
-	0x99, 0x01, 0x60, 0x08, 0xe0, 0x41, 0x48, 0x25, 
-	0x68, 0x00, 0x28, 0x01, 0xd1, 0x3d, 0x48, 0x27, 
-	0x68, 0x00, 0x28, 0x01, 0xd1, 0x39, 0xb0, 0x82, 
-	0x1c, 0x28, 0xf0, 0x0a, 0xfa, 0x0d, 0x28, 0x00, 
-	0xd1, 0x05, 0x20, 0x92, 0x49, 0x1e, 0x60, 0x08, 
-	0x20, 0x00, 0xb0, 0x04, 0xe7, 0x9f, 0x49, 0x20, 
-	0x20, 0x91, 0xf0, 0x17, 0xfa, 0xd7, 0x28, 0x92, 
-	0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 0xfa, 0x57, 
-	0x20, 0x92, 0x49, 0x1b, 0x60, 0x08, 0x20, 0x01, 
-	0x49, 0x1a, 0x68, 0x09, 0x60, 0x08, 0x48, 0x19, 
-	0x68, 0x01, 0x1c, 0x20, 0xf0, 0x0a, 0xfa, 0x08, 
-	0x90, 0x00, 0x69, 0x60, 0x99, 0x00, 0x60, 0xc8, 
-	0x49, 0x13, 0x20, 0x91, 0xf0, 0x17, 0xfa, 0xbe, 
-	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x11, 
-	0x68, 0x00, 0x90, 0x01, 0x48, 0x10, 0x68, 0x00, 
-	0x49, 0x0e, 0x60, 0x08, 0x98, 0x01, 0x49, 0x0e, 
-	0x60, 0x08, 0x20, 0x92, 0x49, 0x0a, 0x60, 0x08, 
-	0xb0, 0x02, 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 
-	0x20, 0x00, 0xb0, 0x02, 0xe7, 0x6b, 0xb0, 0x02, 
-	0xe7, 0x69, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x84, 
-	0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58, 
-	0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4, 
-	0x2e, 0x08, 0x7d, 0xb8, 0xb5, 0xf0, 0x1c, 0x04, 
-	0x1c, 0x0f, 0xb0, 0x83, 0x1c, 0x25, 0x69, 0x28, 
-	0x28, 0x13, 0xd1, 0x04, 0x20, 0x75, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xee, 
-	0x20, 0x04, 0x40, 0x38, 0x08, 0x81, 0x91, 0x02, 
-	0x69, 0x68, 0x23, 0xc0, 0x43, 0xdb, 0x40, 0x18, 
-	0x07, 0xb9, 0x0f, 0x89, 0x01, 0x89, 0x43, 0x08, 
-	0x61, 0x68, 0x06, 0x00, 0x69, 0x68, 0x4b, 0x48, 
-	0x40, 0x18, 0x99, 0x02, 0x07, 0xc9, 0x0c, 0x49, 
-	0x43, 0x08, 0x61, 0x68, 0x04, 0x40, 0x48, 0x45, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2e, 0x19, 
-	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
-	0xe0, 0x04, 0x2e, 0x08, 0xd3, 0x01, 0x20, 0x01, 
-	0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x02, 
-	0x20, 0x00, 0xb0, 0x03, 0xe7, 0xd0, 0x49, 0x3c, 
-	0x20, 0x91, 0xf0, 0x17, 0xfa, 0x57, 0x28, 0x92, 
-	0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, 0xfa, 0x3e, 
-	0xe7, 0xf5, 0x00, 0xb0, 0x49, 0x37, 0x58, 0x08, 
-	0x42, 0xa0, 0xd0, 0x05, 0x20, 0x92, 0x49, 0x34, 
-	0x60, 0x08, 0x20, 0xff, 0xb0, 0x03, 0xe7, 0xbb, 
-	0x48, 0x30, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 
-	0x69, 0x28, 0x28, 0x0b, 0xdb, 0x0e, 0x69, 0x28, 
-	0x28, 0x12, 0xdc, 0x0b, 0x01, 0x30, 0x4b, 0x2e, 
-	0x18, 0xc0, 0x90, 0x01, 0x1d, 0xe8, 0x30, 0x0d, 
-	0x90, 0x00, 0x98, 0x00, 0x68, 0x00, 0x99, 0x01, 
-	0x60, 0x08, 0xe0, 0x41, 0x48, 0x25, 0x68, 0x00, 
-	0x28, 0x01, 0xd1, 0x3d, 0x48, 0x27, 0x68, 0x00, 
-	0x28, 0x01, 0xd1, 0x39, 0xb0, 0x82, 0x1c, 0x30, 
-	0xf0, 0x0a, 0xf9, 0x4e, 0x28, 0x00, 0xd1, 0x05, 
-	0x20, 0x92, 0x49, 0x1f, 0x60, 0x08, 0x20, 0x00, 
-	0xb0, 0x05, 0xe7, 0x91, 0x49, 0x20, 0x20, 0x91, 
-	0xf0, 0x17, 0xfa, 0x18, 0x28, 0x92, 0xd0, 0x00, 
-	0xe7, 0xf8, 0xf0, 0x0a, 0xf9, 0x98, 0x20, 0x92, 
-	0x49, 0x1b, 0x60, 0x08, 0x20, 0x01, 0x49, 0x1b, 
-	0x68, 0x09, 0x60, 0x08, 0x48, 0x19, 0x68, 0x01, 
-	0x1c, 0x28, 0xf0, 0x0a, 0xf9, 0x49, 0x90, 0x00, 
-	0x69, 0x68, 0x99, 0x00, 0x60, 0xc8, 0x49, 0x14, 
-	0x20, 0x91, 0xf0, 0x17, 0xf9, 0xff, 0x28, 0x92, 
-	0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x11, 0x68, 0x00, 
-	0x90, 0x01, 0x48, 0x11, 0x68, 0x00, 0x49, 0x0f, 
-	0x60, 0x08, 0x98, 0x01, 0x49, 0x0e, 0x60, 0x08, 
-	0x20, 0x92, 0x49, 0x0b, 0x60, 0x08, 0xb0, 0x02, 
-	0x20, 0x92, 0x49, 0x05, 0x60, 0x08, 0x20, 0x00, 
-	0xb0, 0x03, 0xe7, 0x5d, 0xb0, 0x03, 0xe7, 0x5b, 
-	0xff, 0xff, 0xbf, 0xff, 0x2e, 0x08, 0x94, 0x84, 
-	0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58, 
-	0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4, 
-	0x2e, 0x08, 0x7d, 0xb8, 0x1c, 0x01, 0x20, 0x0d, 
-	0x06, 0xc0, 0x60, 0x41, 0x48, 0x02, 0x63, 0x81, 
-	0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x00, 0x00, 
-	0x68, 0x00, 0x0d, 0x00, 0x20, 0x0d, 0x06, 0xc0, 
-	0x68, 0x40, 0x02, 0x00, 0x0a, 0x00, 0x47, 0x70, 
-	0xe7, 0xfd, 0x1c, 0x01, 0x1c, 0x0a, 0x68, 0xd0, 
-	0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x03, 0x1c, 0x0a, 
-	0x1c, 0x19, 0x69, 0x08, 0x28, 0x13, 0xd1, 0x01, 
-	0x20, 0x75, 0x47, 0x70, 0x69, 0x08, 0x28, 0x0b, 
-	0xdb, 0x0b, 0x69, 0x08, 0x28, 0x12, 0xdc, 0x08, 
-	0x6d, 0x08, 0x60, 0x10, 0x6d, 0x88, 0x60, 0x90, 
-	0x6d, 0x48, 0x60, 0x50, 0x6d, 0xc8, 0x60, 0xd0, 
-	0xe0, 0x07, 0x6a, 0x88, 0x60, 0x10, 0x6b, 0x08, 
-	0x60, 0x90, 0x6a, 0xc8, 0x60, 0x50, 0x6b, 0x48, 
-	0x60, 0xd0, 0x20, 0x00, 0xe7, 0xe5, 0xe7, 0xe4, 
-	0x1c, 0x03, 0x1c, 0x0a, 0x68, 0x10, 0x60, 0x18, 
-	0x68, 0x90, 0x60, 0x98, 0x68, 0x50, 0x60, 0x58, 
-	0x68, 0xd0, 0x60, 0xd8, 0x47, 0x70, 0xe7, 0xfd, 
-	0x1c, 0x01, 0x1c, 0x0a, 0x69, 0x50, 0x05, 0x80, 
-	0x0f, 0x80, 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, 
-	0x1c, 0x0a, 0x69, 0x50, 0x12, 0x80, 0x07, 0x00, 
-	0x0f, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0xb4, 0x80, 
-	0x1c, 0x01, 0x1c, 0x0f, 0x22, 0x01, 0x69, 0x78, 
-	0x23, 0x20, 0x40, 0x18, 0xd1, 0x00, 0x22, 0x00, 
-	0x1c, 0x10, 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, 
-	0x1c, 0x01, 0x1c, 0x0b, 0x69, 0x18, 0x28, 0x13, 
-	0xd1, 0x01, 0x20, 0x75, 0x47, 0x70, 0x69, 0x58, 
-	0x06, 0x00, 0x0f, 0x82, 0x69, 0x58, 0x04, 0x40, 
-	0x0f, 0xc0, 0x00, 0x80, 0x43, 0x02, 0x1c, 0x10, 
-	0xe7, 0xf4, 0xe7, 0xf3, 0x1c, 0x01, 0x20, 0x0d, 
-	0x06, 0xc0, 0x61, 0x41, 0x20, 0x00, 0x47, 0x70, 
-	0xe7, 0xfd, 0x20, 0x0d, 0x06, 0xc0, 0x69, 0x40, 
-	0x1c, 0x01, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd, 
-	0x1c, 0x01, 0x22, 0x00, 0x29, 0x01, 0xd1, 0x00, 
-	0x22, 0x01, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0xc0, 
-	0x1c, 0x03, 0x2b, 0x02, 0xd1, 0x01, 0x29, 0x00, 
-	0xd1, 0x02, 0x20, 0x0d, 0x06, 0xc0, 0x60, 0xc2, 
-	0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x21, 0x01, 
-	0x20, 0x0d, 0x06, 0xc0, 0x68, 0xc0, 0x1c, 0x02, 
-	0x2a, 0x00, 0xd1, 0x00, 0x21, 0x00, 0x1c, 0x08, 
-	0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, 0x1c, 0x0a, 
-	0x69, 0x10, 0x47, 0x70, 0xe7, 0xfd, 0xb4, 0x90, 
-	0x1c, 0x07, 0x1c, 0x0a, 0x1c, 0x39, 0x69, 0x08, 
-	0x28, 0x13, 0xd0, 0x05, 0x69, 0x08, 0x28, 0x0b, 
-	0xdb, 0x05, 0x69, 0x08, 0x28, 0x12, 0xdc, 0x02, 
-	0x20, 0x86, 0xbc, 0x90, 0x47, 0x70, 0x6b, 0x8c, 
-	0x69, 0x48, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x00, 
-	0x08, 0x64, 0x69, 0x08, 0x00, 0x80, 0x4b, 0x03, 
-	0x58, 0x18, 0x43, 0x60, 0x60, 0x10, 0x20, 0x00, 
-	0xe7, 0xef, 0xe7, 0xee, 0x2e, 0x03, 0x3a, 0x54, 
-	0xb5, 0xf3, 0x1c, 0x07, 0xb0, 0x81, 0x9c, 0x02, 
-	0x69, 0x20, 0x28, 0x13, 0xd0, 0x05, 0x69, 0x20, 
-	0x28, 0x0b, 0xdb, 0x08, 0x69, 0x20, 0x28, 0x12, 
-	0xdc, 0x05, 0x20, 0x86, 0xb0, 0x01, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xe5, 
-	0x68, 0x38, 0x64, 0x20, 0x68, 0x7e, 0x64, 0x66, 
-	0x08, 0xb6, 0x61, 0xa6, 0x48, 0x3f, 0x68, 0x00, 
-	0x28, 0x00, 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 
-	0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 
-	0x2d, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 
-	0x20, 0x00, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 
-	0xb0, 0x01, 0xe7, 0xe0, 0x49, 0x36, 0x20, 0x91, 
-	0xf0, 0x17, 0xf8, 0xdc, 0x28, 0x92, 0xd0, 0x03, 
-	0x20, 0x01, 0xf0, 0x09, 0xf8, 0xc3, 0xe7, 0xf5, 
-	0x00, 0xa8, 0x49, 0x32, 0x58, 0x08, 0x99, 0x02, 
-	0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, 0x49, 0x2e, 
-	0x60, 0x08, 0x20, 0x86, 0xb0, 0x01, 0xe7, 0xca, 
-	0x48, 0x2a, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x06, 
-	0x01, 0x28, 0x4b, 0x2b, 0x18, 0xc0, 0x90, 0x00, 
-	0x98, 0x00, 0x60, 0x06, 0xe0, 0x41, 0x48, 0x25, 
-	0x68, 0x00, 0x28, 0x01, 0xd1, 0x3d, 0x48, 0x27, 
-	0x68, 0x00, 0x28, 0x01, 0xd1, 0x39, 0xb0, 0x82, 
-	0x1c, 0x28, 0xf0, 0x09, 0xff, 0xdd, 0x28, 0x00, 
-	0xd1, 0x05, 0x20, 0x92, 0x49, 0x1e, 0x60, 0x08, 
-	0x20, 0x00, 0xb0, 0x03, 0xe7, 0xab, 0x49, 0x20, 
-	0x20, 0x91, 0xf0, 0x17, 0xf8, 0xa7, 0x28, 0x92, 
-	0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 0xf8, 0x27, 
-	0x20, 0x92, 0x49, 0x1b, 0x60, 0x08, 0x20, 0x01, 
-	0x49, 0x1a, 0x68, 0x09, 0x60, 0x08, 0x48, 0x19, 
-	0x68, 0x01, 0x1c, 0x20, 0xf0, 0x09, 0xff, 0xd8, 
-	0x90, 0x00, 0x69, 0xa0, 0x99, 0x00, 0x61, 0x08, 
-	0x49, 0x13, 0x20, 0x91, 0xf0, 0x17, 0xf8, 0x8e, 
-	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x11, 
-	0x68, 0x00, 0x90, 0x01, 0x48, 0x10, 0x68, 0x00, 
-	0x49, 0x0e, 0x60, 0x08, 0x98, 0x01, 0x49, 0x0e, 
-	0x60, 0x08, 0x20, 0x92, 0x49, 0x0a, 0x60, 0x08, 
-	0xb0, 0x02, 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 
-	0x20, 0x00, 0xb0, 0x01, 0xe7, 0x77, 0xb0, 0x01, 
-	0xe7, 0x75, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x84, 
-	0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58, 
-	0x68, 0x00, 0x0c, 0x04, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4, 
-	0x2e, 0x08, 0x7d, 0xb8, 0xb4, 0x80, 0x1c, 0x01, 
-	0x06, 0x0b, 0x0e, 0x1b, 0x22, 0x01, 0x2a, 0x19, 
-	0xd3, 0x02, 0xe0, 0x0f, 0x32, 0x01, 0xe7, 0xfa, 
-	0x00, 0x90, 0x4f, 0x08, 0x58, 0x38, 0x68, 0x80, 
-	0x02, 0x00, 0x0e, 0x00, 0x42, 0x98, 0xd1, 0x04, 
-	0x00, 0x90, 0x4f, 0x04, 0x58, 0x38, 0xbc, 0x80, 
-	0x47, 0x70, 0xe7, 0xef, 0x20, 0x00, 0xe7, 0xfa, 
-	0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x58, 
-	0xb4, 0x90, 0x1c, 0x07, 0x1c, 0x0a, 0x06, 0x38, 
-	0x16, 0x01, 0x48, 0x20, 0x60, 0x02, 0x48, 0x20, 
-	0x68, 0x80, 0x23, 0x33, 0x06, 0x5b, 0x65, 0xd8, 
-	0x48, 0x1d, 0x68, 0xc0, 0x23, 0x33, 0x06, 0x5b, 
-	0x66, 0x18, 0x48, 0x1c, 0x4b, 0x1a, 0x60, 0x98, 
-	0x48, 0x1b, 0x4b, 0x19, 0x60, 0xd8, 0x20, 0x01, 
-	0x23, 0x33, 0x06, 0x5b, 0x66, 0xd8, 0x48, 0x19, 
-	0x68, 0x04, 0x23, 0x01, 0x04, 0xdb, 0x43, 0x23, 
-	0x60, 0x03, 0x48, 0x16, 0x68, 0x04, 0x23, 0x01, 
-	0x04, 0xdb, 0x43, 0x9c, 0x1c, 0x23, 0x60, 0x03, 
-	0x29, 0x00, 0xd1, 0x10, 0x20, 0xff, 0x30, 0x14, 
-	0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, 0x48, 0x10, 
-	0x68, 0x04, 0x23, 0xff, 0x33, 0x01, 0x43, 0x9c, 
-	0x1c, 0x23, 0x60, 0x03, 0x48, 0x0d, 0x23, 0x1b, 
-	0x06, 0x9b, 0x64, 0x18, 0xe0, 0x08, 0x20, 0xff, 
-	0x30, 0x14, 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, 
-	0x48, 0x02, 0x68, 0x00, 0x4b, 0x08, 0x60, 0x18, 
-	0xbc, 0x90, 0x47, 0x70, 0x2e, 0x08, 0x5e, 0x50, 
-	0x2e, 0x08, 0x7c, 0x1c, 0xcc, 0x1f, 0xe0, 0x00, 
-	0xcc, 0x1f, 0xfe, 0x00, 0x6c, 0x00, 0x00, 0x40, 
-	0x6c, 0x00, 0x00, 0x20, 0x00, 0x00, 0x82, 0x18, 
-	0x6c, 0x00, 0x00, 0x80, 0xb4, 0xf0, 0x1c, 0x01, 
-	0xb0, 0x82, 0x23, 0x1b, 0x06, 0x9b, 0x6a, 0x1b, 
-	0x1c, 0x18, 0x27, 0x00, 0x22, 0x00, 0x08, 0x40, 
-	0x00, 0x40, 0x4b, 0xaf, 0x68, 0x1c, 0x08, 0x64, 
-	0x00, 0x64, 0x60, 0x1c, 0x4b, 0xad, 0x68, 0x1b, 
-	0x1c, 0x1d, 0x23, 0x1b, 0x06, 0x9b, 0x6c, 0x1b, 
-	0x93, 0x01, 0x23, 0xff, 0x33, 0x01, 0x40, 0x03, 
-	0xd0, 0x00, 0x22, 0xff, 0x23, 0x01, 0x04, 0x9b, 
-	0x40, 0x03, 0xd0, 0x1b, 0x4c, 0xa4, 0x68, 0x26, 
-	0x23, 0x01, 0x04, 0x9b, 0x43, 0x9e, 0x1c, 0x33, 
-	0x60, 0x23, 0x4c, 0xa1, 0x68, 0x26, 0x23, 0x01, 
-	0x43, 0x33, 0x60, 0x23, 0x23, 0x00, 0x93, 0x00, 
-	0x9b, 0x00, 0x2b, 0x0a, 0xdb, 0x04, 0xe0, 0x04, 
-	0x9b, 0x00, 0x33, 0x01, 0x93, 0x00, 0xe7, 0xf7, 
-	0xe7, 0xfa, 0x4b, 0x99, 0x68, 0x1c, 0x08, 0x64, 
-	0x00, 0x64, 0x60, 0x1c, 0x23, 0x01, 0x02, 0x9b, 
-	0x40, 0x0b, 0xd0, 0x29, 0x23, 0x01, 0x02, 0xdb, 
-	0x40, 0x0b, 0xd0, 0x01, 0x4b, 0x94, 0x40, 0x18, 
-	0x23, 0x01, 0x03, 0x1b, 0x40, 0x0b, 0xd0, 0x02, 
-	0x23, 0x01, 0x05, 0x9b, 0x43, 0x18, 0x4b, 0x91, 
-	0x40, 0x18, 0x02, 0x4c, 0x23, 0x7f, 0x02, 0x5b, 
-	0x40, 0x23, 0x43, 0x18, 0x23, 0x40, 0x40, 0x0b, 
-	0xd0, 0x03, 0x23, 0x01, 0x04, 0x5b, 0x43, 0x18, 
-	0xe0, 0x0a, 0x4b, 0x8b, 0x40, 0x18, 0x23, 0x20, 
-	0x40, 0x0b, 0xd0, 0x03, 0x23, 0x01, 0x04, 0x1b, 
-	0x43, 0x18, 0xe0, 0x01, 0x4b, 0x87, 0x40, 0x18, 
-	0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, 0xe0, 0xfc, 
-	0x23, 0x04, 0x40, 0x0b, 0xd0, 0x0f, 0x4c, 0x7e, 
-	0x68, 0x26, 0x23, 0x01, 0x43, 0x33, 0x60, 0x23, 
-	0x4b, 0x81, 0x68, 0x9b, 0x24, 0x33, 0x06, 0x64, 
-	0x65, 0xe3, 0x4b, 0x7f, 0x68, 0xdb, 0x24, 0x33, 
-	0x06, 0x64, 0x66, 0x23, 0xe0, 0xe9, 0x23, 0x01, 
-	0x03, 0x5b, 0x40, 0x0b, 0xd0, 0x13, 0x4b, 0x7a, 
-	0x68, 0x9b, 0x24, 0x33, 0x06, 0x64, 0x65, 0xe3, 
-	0x4b, 0x77, 0x68, 0xdb, 0x24, 0x33, 0x06, 0x64, 
-	0x66, 0x23, 0x23, 0x01, 0x24, 0x33, 0x06, 0x64, 
-	0x66, 0xe3, 0x4c, 0x6d, 0x68, 0x26, 0x23, 0x01, 
-	0x43, 0x33, 0x60, 0x23, 0xe0, 0xd1, 0x07, 0xcb, 
-	0x0f, 0xdb, 0xd0, 0x02, 0x23, 0x02, 0x43, 0x18, 
-	0xe0, 0x05, 0x23, 0x02, 0x40, 0x0b, 0xd0, 0x02, 
-	0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, 0x23, 0x07, 
-	0x01, 0xdb, 0x40, 0x0b, 0xd0, 0x0f, 0x23, 0x0c, 
-	0x43, 0xdb, 0x40, 0x18, 0x23, 0xff, 0x33, 0x01, 
-	0x40, 0x0b, 0xd0, 0x02, 0x23, 0x04, 0x43, 0x18, 
-	0xe0, 0x05, 0x23, 0x01, 0x02, 0x5b, 0x40, 0x0b, 
-	0xd0, 0x01, 0x23, 0x08, 0x43, 0x18, 0x23, 0x01, 
-	0x04, 0x1b, 0x40, 0x0b, 0xd0, 0x08, 0x23, 0x01, 
-	0x04, 0x9b, 0x43, 0x98, 0x1c, 0x04, 0x20, 0x01, 
-	0x04, 0xc0, 0x43, 0x20, 0x23, 0x01, 0x43, 0x18, 
-	0x23, 0x78, 0x40, 0x0b, 0xd0, 0x73, 0x23, 0x30, 
-	0x40, 0x03, 0xd0, 0x06, 0x2b, 0x10, 0xd0, 0x04, 
-	0x2b, 0x20, 0xd0, 0x42, 0x2b, 0x30, 0xd0, 0x40, 
-	0xe0, 0x81, 0x23, 0x10, 0x40, 0x0b, 0xd1, 0x02, 
-	0x23, 0x08, 0x40, 0x0b, 0xd0, 0x08, 0x23, 0x30, 
-	0x43, 0xdb, 0x40, 0x18, 0x23, 0x10, 0x40, 0x0b, 
-	0xd0, 0x01, 0x23, 0x10, 0x43, 0x18, 0xe0, 0x2f, 
-	0x23, 0x30, 0x43, 0xdb, 0x40, 0x18, 0x23, 0x20, 
-	0x40, 0x0b, 0xd0, 0x02, 0x23, 0x20, 0x43, 0x18, 
-	0xe0, 0x01, 0x23, 0x30, 0x43, 0x18, 0x23, 0x01, 
-	0x43, 0x18, 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, 
-	0x27, 0xff, 0x2a, 0x00, 0xd0, 0x04, 0x4b, 0x43, 
-	0x68, 0x1b, 0x4c, 0x43, 0x60, 0x23, 0xe0, 0x17, 
-	0x07, 0xab, 0x0f, 0x9b, 0xd0, 0x09, 0x2b, 0x01, 
-	0xd0, 0x02, 0x2b, 0x02, 0xd0, 0x0a, 0xe0, 0x0e, 
-	0x4b, 0x3e, 0x24, 0x1b, 0x06, 0xa4, 0x64, 0x23, 
-	0xe0, 0x0a, 0x4b, 0x3d, 0x24, 0x1b, 0x06, 0xa4, 
-	0x64, 0x23, 0xe0, 0x05, 0x4b, 0x3b, 0x24, 0x1b, 
-	0x06, 0xa4, 0x64, 0x23, 0xe0, 0x00, 0xe7, 0xff, 
-	0xe0, 0x42, 0x23, 0x40, 0x40, 0x0b, 0xd1, 0x02, 
-	0x23, 0x20, 0x40, 0x0b, 0xd0, 0x0b, 0x23, 0x30, 
-	0x43, 0xdb, 0x40, 0x18, 0x23, 0x20, 0x40, 0x0b, 
-	0xd0, 0x02, 0x23, 0x20, 0x43, 0x18, 0xe0, 0x01, 
-	0x23, 0x30, 0x43, 0x18, 0xe0, 0x2e, 0x23, 0x30, 
-	0x43, 0xdb, 0x40, 0x18, 0x23, 0x10, 0x40, 0x0b, 
-	0xd0, 0x01, 0x23, 0x10, 0x43, 0x18, 0x23, 0x01, 
-	0x43, 0x18, 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, 
-	0x27, 0xff, 0x2a, 0x00, 0xd0, 0x04, 0x4b, 0x23, 
-	0x68, 0x1b, 0x4c, 0x23, 0x60, 0x23, 0xe0, 0x19, 
-	0x07, 0xab, 0x0f, 0x9b, 0xe0, 0x00, 0xe0, 0x17, 
-	0xd0, 0x09, 0x2b, 0x01, 0xd0, 0x02, 0x2b, 0x02, 
-	0xd0, 0x0a, 0xe0, 0x0e, 0x4b, 0x20, 0x24, 0x1b, 
-	0x06, 0xa4, 0x64, 0x23, 0xe0, 0x0a, 0x4b, 0x1f, 
-	0x24, 0x1b, 0x06, 0xa4, 0x64, 0x23, 0xe0, 0x05, 
-	0x4b, 0x1d, 0x24, 0x1b, 0x06, 0xa4, 0x64, 0x23, 
-	0xe0, 0x00, 0xe7, 0xff, 0xe0, 0x00, 0xe7, 0xff, 
-	0x2f, 0x00, 0xd1, 0x12, 0x23, 0x1b, 0x06, 0x9b, 
-	0x62, 0x18, 0x23, 0x00, 0x93, 0x00, 0x9b, 0x00, 
-	0x2b, 0x0a, 0xdb, 0x04, 0xe0, 0x04, 0x9b, 0x00, 
-	0x33, 0x01, 0x93, 0x00, 0xe7, 0xf7, 0xe7, 0xfa, 
-	0x4b, 0x03, 0x68, 0x1c, 0x08, 0x64, 0x00, 0x64, 
-	0x60, 0x1c, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 
-	0x6c, 0x00, 0x00, 0x20, 0x6c, 0x00, 0x68, 0x00, 
-	0xff, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0x01, 0xff, 
-	0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 
-	0x2e, 0x08, 0x7c, 0x1c, 0x2e, 0x08, 0x5e, 0x50, 
-	0x6c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x98, 0x60, 
-	0x00, 0x01, 0x58, 0x60, 0x00, 0x02, 0x54, 0x28, 
-	0x00, 0x00, 0x82, 0x18, 0x00, 0x01, 0x42, 0x18, 
-	0x00, 0x02, 0x42, 0x18, 0xb5, 0xf3, 0x1c, 0x0f, 
-	0xb0, 0x81, 0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 
-	0x90, 0x00, 0x98, 0x00, 0x28, 0x20, 0xdb, 0x05, 
-	0x20, 0xa2, 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x33, 0x06, 0x40, 
-	0x6e, 0x00, 0x21, 0x33, 0x06, 0x49, 0x6d, 0xc9, 
-	0x1a, 0x46, 0x48, 0x12, 0x6c, 0x80, 0x1c, 0x04, 
-	0x48, 0x10, 0x6c, 0xc0, 0x1c, 0x05, 0x42, 0xac, 
-	0xd9, 0x09, 0x1b, 0x60, 0x21, 0x64, 0x43, 0x41, 
-	0x1c, 0x30, 0xf0, 0x09, 0xff, 0xcb, 0x21, 0x64, 
-	0x1a, 0x08, 0x60, 0x38, 0xe0, 0x06, 0x1b, 0x28, 
-	0x21, 0x64, 0x43, 0x41, 0x1c, 0x30, 0xf0, 0x09, 
-	0xff, 0xc1, 0x60, 0x38, 0x42, 0xac, 0xd1, 0x03, 
-	0x20, 0x31, 0xb0, 0x01, 0xe7, 0xd6, 0xe0, 0x02, 
-	0x20, 0x00, 0xb0, 0x01, 0xe7, 0xd2, 0xb0, 0x01, 
-	0xe7, 0xd0, 0x00, 0x00, 0x66, 0x00, 0x00, 0x80, 
-	0xb5, 0xff, 0x1c, 0x14, 0x1c, 0x1f, 0xb0, 0x82, 
-	0x98, 0x02, 0x06, 0x01, 0x0e, 0x09, 0x91, 0x00, 
-	0x98, 0x0b, 0x06, 0x03, 0x16, 0x1b, 0x93, 0x01, 
-	0xb0, 0x84, 0x99, 0x04, 0x29, 0x20, 0xdb, 0x05, 
-	0x20, 0xa2, 0xb0, 0x06, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x9b, 0x05, 0x2b, 0x1f, 
-	0xdd, 0x02, 0x20, 0xaf, 0xb0, 0x06, 0xe7, 0xf5, 
-	0x98, 0x07, 0x90, 0x01, 0x2f, 0x00, 0xd0, 0x47, 
-	0xb0, 0x81, 0x98, 0x08, 0x22, 0x00, 0x92, 0x00, 
-	0x22, 0x1b, 0x06, 0x92, 0x6a, 0x12, 0x23, 0x01, 
-	0x05, 0x1b, 0x40, 0x1a, 0xd0, 0x01, 0x22, 0xff, 
-	0x92, 0x00, 0x25, 0x00, 0x08, 0x62, 0x42, 0xaa, 
-	0xd8, 0x02, 0xe0, 0x34, 0x35, 0x01, 0xe7, 0xf9, 
-	0x9a, 0x00, 0x2a, 0x00, 0xd0, 0x1e, 0x88, 0x02, 
-	0x23, 0xff, 0x02, 0x1b, 0x40, 0x1a, 0x12, 0x12, 
-	0x88, 0x03, 0x02, 0x1b, 0x43, 0x1a, 0x04, 0x11, 
-	0x0c, 0x09, 0x2f, 0x00, 0xda, 0x05, 0x42, 0x7a, 
-	0x41, 0x11, 0x1c, 0x0b, 0x04, 0x19, 0x0c, 0x09, 
-	0xe0, 0x03, 0x40, 0xb9, 0x1c, 0x0a, 0x04, 0x11, 
-	0x0c, 0x09, 0x22, 0xff, 0x02, 0x12, 0x40, 0x0a, 
-	0x12, 0x12, 0x02, 0x0b, 0x43, 0x13, 0x80, 0x03, 
-	0x30, 0x02, 0xe0, 0x0f, 0x2f, 0x00, 0xda, 0x07, 
-	0x88, 0x02, 0x42, 0x7e, 0x41, 0x32, 0x04, 0x12, 
-	0x0c, 0x12, 0x80, 0x02, 0x30, 0x02, 0xe0, 0x05, 
-	0x88, 0x02, 0x40, 0xba, 0x04, 0x12, 0x0c, 0x12, 
-	0x80, 0x02, 0x30, 0x02, 0xe7, 0xca, 0xb0, 0x01, 
-	0x49, 0x23, 0x91, 0x03, 0x20, 0x01, 0x06, 0x00, 
-	0x99, 0x03, 0x60, 0x08, 0x48, 0x21, 0x6c, 0x80, 
-	0x49, 0x20, 0x6c, 0xc9, 0x1a, 0x40, 0x90, 0x00, 
-	0x98, 0x00, 0x28, 0x00, 0xdc, 0x09, 0x20, 0x33, 
-	0x06, 0x40, 0x6e, 0x00, 0x21, 0x33, 0x06, 0x49, 
-	0x6d, 0xc9, 0x1a, 0x40, 0x99, 0x00, 0x18, 0x40, 
-	0x90, 0x00, 0x98, 0x00, 0x23, 0x3b, 0x01, 0xdb, 
-	0x42, 0x98, 0xda, 0x02, 0x20, 0x06, 0xf0, 0x08, 
-	0xfd, 0x8d, 0x98, 0x00, 0x23, 0x3b, 0x01, 0xdb, 
-	0x42, 0x98, 0xdb, 0xdf, 0x98, 0x00, 0x42, 0x84, 
-	0xd9, 0x02, 0x98, 0x00, 0x90, 0x02, 0xe0, 0x00, 
-	0x94, 0x02, 0x22, 0x04, 0x99, 0x03, 0xb4, 0x06, 
-	0x9b, 0x07, 0x9a, 0x04, 0x99, 0x06, 0x98, 0x03, 
-	0xf0, 0x04, 0xfb, 0x8c, 0xb0, 0x02, 0x98, 0x02, 
-	0x1a, 0x24, 0x98, 0x01, 0x99, 0x02, 0x18, 0x40, 
-	0x90, 0x01, 0x20, 0x00, 0x90, 0x00, 0x2c, 0x00, 
-	0xd1, 0xc4, 0x20, 0x00, 0xb0, 0x06, 0xe7, 0x65, 
-	0xb0, 0x04, 0xb0, 0x02, 0xe7, 0x62, 0x00, 0x00, 
-	0x9e, 0x00, 0x08, 0x00, 0x66, 0x00, 0x00, 0x80, 
-	0x20, 0x1b, 0x06, 0x80, 0x6a, 0x00, 0x07, 0xc0, 
-	0x0f, 0xc0, 0x4a, 0x03, 0x68, 0x12, 0x1c, 0x01, 
-	0x43, 0x11, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd, 
-	0x6c, 0x00, 0x08, 0x00, 0xb4, 0x90, 0x1c, 0x01, 
-	0x20, 0x1b, 0x06, 0x80, 0x6a, 0x00, 0x1c, 0x04, 
-	0x48, 0x1b, 0x68, 0x00, 0x1c, 0x07, 0x20, 0x30, 
-	0x40, 0x20, 0xd0, 0x06, 0x28, 0x10, 0xd0, 0x06, 
-	0x28, 0x20, 0xd0, 0x06, 0x28, 0x30, 0xd0, 0x06, 
-	0xe0, 0x07, 0x22, 0x01, 0xe0, 0x08, 0x22, 0x02, 
-	0xe0, 0x06, 0x22, 0x04, 0xe0, 0x04, 0x22, 0x08, 
-	0xe0, 0x02, 0x20, 0x30, 0xbc, 0x90, 0x47, 0x70, 
-	0x20, 0x03, 0x07, 0x40, 0x40, 0x38, 0x0f, 0x40, 
-	0xd0, 0x04, 0x28, 0x01, 0xd0, 0x05, 0x28, 0x02, 
-	0xd0, 0x06, 0xe0, 0x08, 0x23, 0x10, 0x43, 0x1a, 
-	0xe0, 0x07, 0x23, 0x20, 0x43, 0x1a, 0xe0, 0x04, 
-	0x23, 0x40, 0x43, 0x1a, 0xe0, 0x01, 0x20, 0x30, 
-	0xe7, 0xe8, 0x20, 0x01, 0x05, 0xc0, 0x40, 0x38, 
-	0xd1, 0x01, 0x23, 0x80, 0x43, 0x1a, 0x60, 0x0a, 
-	0x20, 0x00, 0xe7, 0xdf, 0xe7, 0xde, 0x00, 0x00, 
-	0x6c, 0x00, 0x08, 0x00, 0x1c, 0x01, 0x48, 0x01, 
-	0x60, 0x01, 0x47, 0x70, 0x6c, 0x00, 0x00, 0x80, 
-	0x1c, 0x01, 0x29, 0x1f, 0xdd, 0x01, 0x20, 0xaf, 
-	0x47, 0x70, 0x20, 0x80, 0x6c, 0x00, 0x60, 0x01, 
-	0x20, 0x00, 0xe7, 0xf9, 0xe7, 0xf8, 0xb5, 0xf3, 
-	0x1c, 0x0a, 0xb0, 0x81, 0x98, 0x01, 0x06, 0x03, 
-	0x0e, 0x1b, 0x93, 0x00, 0xb0, 0x81, 0x20, 0x1b, 
-	0x06, 0x80, 0x6a, 0x00, 0x1c, 0x01, 0x25, 0x00, 
-	0x20, 0x00, 0x90, 0x00, 0x20, 0x1b, 0x06, 0x80, 
-	0x6c, 0x00, 0x1c, 0x04, 0x27, 0x00, 0x9b, 0x01, 
-	0x2b, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x02, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x33, 0x06, 0x40, 0x6d, 0xc0, 0x23, 0x0d, 
-	0x06, 0x9b, 0x1a, 0xc0, 0x9b, 0x01, 0x00, 0xdb, 
-	0x4e, 0x5f, 0x68, 0x36, 0x19, 0x9b, 0x60, 0x58, 
-	0x20, 0xff, 0x30, 0x01, 0x40, 0x08, 0xd0, 0x01, 
-	0x20, 0xff, 0x90, 0x00, 0x23, 0x01, 0x04, 0xdb, 
-	0x43, 0x99, 0x1c, 0x08, 0x21, 0x01, 0x04, 0x89, 
-	0x43, 0x01, 0x20, 0x01, 0x03, 0x00, 0x40, 0x10, 
-	0xd0, 0x05, 0x06, 0x90, 0x0e, 0x80, 0xd0, 0x02, 
-	0x23, 0x01, 0x05, 0x1b, 0x43, 0x19, 0x23, 0x30, 
-	0x43, 0xdb, 0x40, 0x19, 0x05, 0x10, 0x0d, 0x00, 
-	0x28, 0x40, 0xd0, 0x48, 0xdc, 0x0e, 0x28, 0x08, 
-	0xd0, 0x32, 0xdc, 0x06, 0x28, 0x01, 0xd0, 0x1e, 
-	0x28, 0x02, 0xd0, 0x21, 0x28, 0x04, 0xd0, 0x26, 
-	0xe0, 0x67, 0x28, 0x10, 0xd0, 0x2f, 0x28, 0x20, 
-	0xd0, 0x32, 0xe0, 0x62, 0x23, 0x01, 0x02, 0x5b, 
-	0x42, 0x98, 0xd0, 0x49, 0xdc, 0x06, 0x28, 0x80, 
-	0xd0, 0x38, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, 
-	0xd0, 0x3b, 0xe0, 0x56, 0x23, 0x01, 0x02, 0x9b, 
-	0x42, 0x98, 0xd0, 0x44, 0x23, 0x01, 0x02, 0xdb, 
-	0x42, 0x98, 0xd0, 0x47, 0xe0, 0x4d, 0x4b, 0x3d, 
-	0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x3b, 0xe0, 0x49, 
-	0x23, 0x10, 0x43, 0x19, 0x4b, 0x39, 0x42, 0x9c, 
-	0xd0, 0x00, 0x4f, 0x38, 0xe0, 0x42, 0x4b, 0x38, 
-	0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x36, 0xe0, 0x3d, 
-	0x23, 0x10, 0x43, 0x19, 0x4b, 0x34, 0x42, 0x9c, 
-	0xd0, 0x00, 0x4f, 0x33, 0xe0, 0x36, 0x4b, 0x33, 
-	0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x31, 0xe0, 0x31, 
-	0x23, 0x10, 0x43, 0x19, 0x4b, 0x2f, 0x42, 0x9c, 
-	0xd0, 0x00, 0x4f, 0x2e, 0xe0, 0x2a, 0x23, 0x20, 
-	0x43, 0x19, 0x4b, 0x2d, 0x42, 0x9c, 0xd0, 0x00, 
-	0x4f, 0x2b, 0xe0, 0x23, 0x23, 0x30, 0x43, 0x19, 
-	0x4b, 0x29, 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x28, 
-	0xe0, 0x1c, 0x23, 0x20, 0x43, 0x19, 0x4b, 0x27, 
-	0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x25, 0xe0, 0x15, 
-	0x23, 0x30, 0x43, 0x19, 0x4b, 0x23, 0x42, 0x9c, 
-	0xd0, 0x00, 0x4f, 0x22, 0xe0, 0x0e, 0x23, 0x20, 
-	0x43, 0x19, 0x4b, 0x21, 0x42, 0x9c, 0xd0, 0x00, 
-	0x4f, 0x1f, 0xe0, 0x07, 0x23, 0x30, 0x43, 0x19, 
-	0x4b, 0x1d, 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x1c, 
-	0xe0, 0x00, 0xe7, 0xff, 0x98, 0x00, 0x28, 0x00, 
-	0xd0, 0x0a, 0x23, 0x01, 0x43, 0x19, 0x20, 0x1b, 
-	0x06, 0x80, 0x62, 0x01, 0x48, 0x17, 0x68, 0x00, 
-	0x4b, 0x17, 0x60, 0x18, 0x25, 0xff, 0xe0, 0x0e, 
-	0x23, 0x01, 0x43, 0x19, 0x2f, 0x00, 0xd0, 0x07, 
-	0x20, 0x1b, 0x06, 0x80, 0x62, 0x01, 0x20, 0x1b, 
-	0x06, 0x80, 0x64, 0x07, 0x25, 0xff, 0xe0, 0x02, 
-	0x20, 0x1b, 0x06, 0x80, 0x62, 0x01, 0x2d, 0x00, 
-	0xd1, 0x04, 0x48, 0x0e, 0x68, 0x03, 0x08, 0x5b, 
-	0x00, 0x5b, 0x60, 0x03, 0x20, 0x00, 0xb0, 0x02, 
-	0xe7, 0x36, 0xb0, 0x01, 0xb0, 0x01, 0xe7, 0x33, 
-	0x2e, 0x08, 0x5d, 0xd4, 0x00, 0x00, 0x82, 0x18, 
-	0x00, 0x01, 0x42, 0x18, 0x00, 0x02, 0x42, 0x18, 
-	0x00, 0x00, 0x98, 0x60, 0x00, 0x01, 0x58, 0x60, 
-	0x00, 0x02, 0x54, 0x28, 0x2e, 0x08, 0x5e, 0x50, 
-	0x6c, 0x00, 0x00, 0x80, 0x6c, 0x00, 0x00, 0x20, 
-	0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x82, 0x49, 0x2c, 
-	0x46, 0x68, 0x22, 0x08, 0xf0, 0x09, 0xfd, 0xca, 
-	0x20, 0x04, 0xf7, 0xff, 0xfc, 0x23, 0x48, 0x29, 
-	0x68, 0x80, 0x21, 0x33, 0x06, 0x49, 0x65, 0xc8, 
-	0x48, 0x26, 0x68, 0xc0, 0x21, 0x33, 0x06, 0x49, 
-	0x66, 0x08, 0x48, 0x25, 0x68, 0x01, 0x23, 0x02, 
-	0x43, 0x19, 0x60, 0x01, 0x20, 0x01, 0x21, 0x33, 
-	0x06, 0x49, 0x67, 0xc8, 0x48, 0x21, 0x68, 0x01, 
-	0x31, 0xff, 0x31, 0xff, 0x31, 0x02, 0x60, 0x01, 
-	0x1c, 0x78, 0x12, 0x00, 0xab, 0x01, 0x70, 0x18, 
-	0x1c, 0x78, 0xab, 0x01, 0x70, 0x58, 0x20, 0x33, 
-	0x06, 0x40, 0x6d, 0xc5, 0x4b, 0x1a, 0x43, 0x1d, 
-	0x26, 0x00, 0x2e, 0x10, 0xdb, 0x02, 0xe0, 0x18, 
-	0x36, 0x01, 0xe7, 0xfa, 0x24, 0x00, 0x2c, 0x07, 
-	0xd3, 0x02, 0xe0, 0x06, 0x34, 0x01, 0xe7, 0xfa, 
-	0x46, 0x68, 0x5d, 0x01, 0x70, 0x29, 0x35, 0x01, 
-	0xe7, 0xf8, 0x24, 0x00, 0x42, 0xbc, 0xdb, 0x02, 
-	0xe0, 0x06, 0x34, 0x01, 0xe7, 0xfa, 0x98, 0x02, 
-	0x5d, 0x01, 0x70, 0x29, 0x35, 0x01, 0xe7, 0xf8, 
-	0xe7, 0xe6, 0x20, 0x33, 0x06, 0x40, 0x66, 0x05, 
-	0x48, 0x0a, 0x68, 0x01, 0x23, 0x01, 0x05, 0x5b, 
-	0x43, 0x19, 0x60, 0x01, 0xb0, 0x02, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x03, 0x39, 0xfc, 0x2e, 0x08, 0x7c, 0x1c, 
-	0x66, 0x00, 0x00, 0x70, 0x66, 0x00, 0x00, 0x5c, 
-	0xcc, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x20, 
-	0xb5, 0xf7, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x20, 
-	0x0e, 0x00, 0x06, 0x3d, 0x0e, 0x2d, 0x99, 0x02, 
-	0x06, 0x0a, 0x0e, 0x12, 0x21, 0x02, 0x40, 0x01, 
-	0xd0, 0x04, 0x21, 0xff, 0x4b, 0x2f, 0x68, 0x1b, 
-	0x72, 0x19, 0xe0, 0x0c, 0x49, 0x2d, 0x68, 0x09, 
-	0x7a, 0x09, 0x29, 0xff, 0xd1, 0x03, 0x21, 0x00, 
-	0x4b, 0x2a, 0x68, 0x1b, 0x60, 0x19, 0x21, 0x00, 
-	0x4b, 0x28, 0x68, 0x1b, 0x72, 0x19, 0x07, 0xc1, 
-	0x0f, 0xc9, 0xd0, 0x04, 0x21, 0xff, 0x4b, 0x25, 
-	0x68, 0x1b, 0x72, 0x59, 0xe0, 0x0c, 0x49, 0x23, 
-	0x68, 0x09, 0x7a, 0x49, 0x29, 0xff, 0xd1, 0x03, 
-	0x21, 0x00, 0x4b, 0x20, 0x68, 0x1b, 0x60, 0x59, 
-	0x21, 0x00, 0x4b, 0x1e, 0x68, 0x1b, 0x72, 0x59, 
-	0x2d, 0x01, 0xd1, 0x0f, 0x49, 0x1c, 0x68, 0x0e, 
-	0x23, 0x01, 0x05, 0x5b, 0x43, 0x9e, 0x1c, 0x33, 
-	0x60, 0x0b, 0x49, 0x1a, 0x68, 0x09, 0x78, 0x09, 
-	0x23, 0x02, 0x43, 0x19, 0x4b, 0x17, 0x68, 0x1b, 
-	0x70, 0x19, 0xe0, 0x0e, 0x49, 0x14, 0x68, 0x0e, 
-	0x23, 0x01, 0x05, 0x5b, 0x43, 0x33, 0x60, 0x0b, 
-	0x49, 0x12, 0x68, 0x09, 0x78, 0x09, 0x23, 0x02, 
-	0x43, 0xdb, 0x40, 0x19, 0x4b, 0x0f, 0x68, 0x1b, 
-	0x70, 0x19, 0x49, 0x0f, 0x62, 0x4a, 0x2a, 0x01, 
-	0xd1, 0x08, 0x49, 0x0c, 0x68, 0x09, 0x78, 0x09, 
-	0x23, 0x01, 0x43, 0x19, 0x4b, 0x09, 0x68, 0x1b, 
-	0x70, 0x19, 0xe0, 0x07, 0x49, 0x07, 0x68, 0x09, 
-	0x78, 0x09, 0x08, 0x49, 0x00, 0x49, 0x4b, 0x05, 
-	0x68, 0x1b, 0x70, 0x19, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x5e, 0x54, 
-	0x6c, 0x00, 0x00, 0x20, 0x2e, 0x08, 0x5e, 0x58, 
-	0xcc, 0x00, 0x0f, 0x80, 0xb4, 0x80, 0x1c, 0x07, 
-	0x1c, 0x0a, 0x68, 0x38, 0x49, 0x23, 0x68, 0x09, 
-	0x60, 0xc8, 0x68, 0x78, 0x49, 0x21, 0x68, 0x09, 
-	0x61, 0x08, 0x68, 0xb8, 0x49, 0x1f, 0x68, 0x09, 
-	0x61, 0x48, 0x68, 0xf8, 0x49, 0x1d, 0x68, 0x09, 
-	0x61, 0x88, 0x7d, 0x38, 0x49, 0x1b, 0x68, 0x09, 
-	0x31, 0x20, 0x70, 0x08, 0x7d, 0x78, 0x49, 0x19, 
-	0x68, 0x09, 0x31, 0x20, 0x70, 0x48, 0x69, 0x38, 
-	0x49, 0x16, 0x68, 0x09, 0x61, 0xc8, 0x7d, 0xb8, 
-	0x49, 0x14, 0x68, 0x09, 0x31, 0x20, 0x70, 0x88, 
-	0x68, 0x10, 0x49, 0x12, 0x68, 0x09, 0x62, 0x48, 
-	0x68, 0x50, 0x49, 0x10, 0x68, 0x09, 0x62, 0x88, 
-	0x68, 0x90, 0x49, 0x0e, 0x68, 0x09, 0x62, 0xc8, 
-	0x68, 0xd0, 0x49, 0x0c, 0x68, 0x09, 0x63, 0x08, 
-	0x7d, 0x10, 0x49, 0x0a, 0x68, 0x09, 0x31, 0x20, 
-	0x76, 0x08, 0x7d, 0x50, 0x49, 0x07, 0x68, 0x09, 
-	0x31, 0x20, 0x76, 0x48, 0x69, 0x10, 0x49, 0x05, 
-	0x68, 0x09, 0x63, 0x48, 0x7d, 0x90, 0x49, 0x03, 
-	0x68, 0x09, 0x31, 0x20, 0x76, 0x88, 0xbc, 0x80, 
-	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x54, 
-	0x1c, 0x02, 0x1c, 0x0b, 0x48, 0x03, 0x68, 0x00, 
-	0x60, 0x02, 0x48, 0x02, 0x68, 0x00, 0x60, 0x43, 
-	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x54, 
-	0xb5, 0xf3, 0xb0, 0x88, 0x98, 0x08, 0x68, 0x04, 
-	0x20, 0x01, 0x90, 0x06, 0x20, 0x01, 0x90, 0x05, 
-	0x48, 0x8c, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x19, 
-	0x48, 0x8a, 0x68, 0x00, 0x38, 0x01, 0x49, 0x89, 
-	0x60, 0x08, 0x48, 0x88, 0x68, 0x00, 0x28, 0x00, 
-	0xd1, 0x10, 0x48, 0x87, 0x78, 0x80, 0x90, 0x00, 
-	0x98, 0x00, 0x00, 0xc0, 0x49, 0x85, 0x68, 0x09, 
-	0x58, 0x08, 0x23, 0xff, 0x33, 0x01, 0x43, 0x98, 
-	0x1c, 0x01, 0x98, 0x00, 0x00, 0xc0, 0x4a, 0x81, 
-	0x68, 0x12, 0x50, 0x11, 0x20, 0x33, 0x06, 0x40, 
-	0x6e, 0x00, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc1, 
-	0x91, 0x02, 0x20, 0x33, 0x06, 0x40, 0x6d, 0xc0, 
-	0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 0x90, 0x01, 
-	0x48, 0x79, 0x68, 0x00, 0x42, 0x84, 0xd1, 0x73, 
-	0x98, 0x01, 0x1d, 0xc7, 0x37, 0x01, 0x78, 0x38, 
-	0x18, 0x38, 0x1c, 0x47, 0x48, 0x75, 0x6c, 0xc0, 
-	0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 0x42, 0xb8, 
-	0xd9, 0x19, 0x78, 0x38, 0x28, 0xff, 0xd1, 0x12, 
-	0x78, 0x78, 0x23, 0xf0, 0x40, 0x18, 0x28, 0xf0, 
-	0xd1, 0x0d, 0x78, 0xb8, 0x10, 0x80, 0x07, 0x80, 
-	0x0f, 0x80, 0x06, 0x00, 0x16, 0x00, 0x90, 0x06, 
-	0x78, 0x78, 0x10, 0xc0, 0x07, 0xc0, 0x09, 0xc0, 
-	0x16, 0x00, 0x90, 0x05, 0xe0, 0x03, 0x21, 0x01, 
-	0x70, 0x39, 0x18, 0x7f, 0xe7, 0xde, 0x21, 0x40, 
-	0x91, 0x03, 0x25, 0x20, 0x21, 0x14, 0x91, 0x07, 
-	0x98, 0x06, 0x28, 0x00, 0xd1, 0x02, 0x25, 0x23, 
-	0x21, 0x12, 0x91, 0x07, 0x98, 0x06, 0x28, 0x02, 
-	0xd1, 0x02, 0x25, 0x30, 0x21, 0x18, 0x91, 0x07, 
-	0x98, 0x05, 0x28, 0x00, 0xd1, 0x02, 0x00, 0x6d, 
-	0x21, 0x70, 0x91, 0x03, 0x99, 0x03, 0x00, 0x48, 
-	0x99, 0x02, 0x1a, 0x08, 0x90, 0x04, 0x98, 0x04, 
-	0x99, 0x02, 0x42, 0x88, 0xd3, 0x05, 0xe0, 0x4e, 
-	0x98, 0x04, 0x99, 0x03, 0x18, 0x40, 0x90, 0x04, 
-	0xe7, 0xf5, 0x9f, 0x04, 0x21, 0x00, 0x70, 0x39, 
-	0x37, 0x01, 0x21, 0x00, 0x70, 0x39, 0x37, 0x01, 
-	0x21, 0x01, 0x70, 0x39, 0x18, 0x7f, 0x21, 0xc0, 
-	0x70, 0x39, 0x37, 0x01, 0x21, 0x00, 0x70, 0x39, 
-	0x37, 0x01, 0x21, 0x3a, 0x70, 0x39, 0x37, 0x01, 
-	0x21, 0x80, 0x70, 0x39, 0x37, 0x01, 0x21, 0x00, 
-	0x70, 0x39, 0x37, 0x01, 0x99, 0x03, 0x1f, 0xc8, 
-	0x38, 0x02, 0x1b, 0x41, 0x70, 0x39, 0x37, 0x01, 
-	0x26, 0x00, 0x99, 0x03, 0x1f, 0xc8, 0x38, 0x02, 
-	0x1b, 0x40, 0x42, 0xb0, 0xdc, 0x04, 0xe0, 0x00, 
-	0xe0, 0x34, 0xe0, 0x05, 0x36, 0x01, 0xe7, 0xf4, 
-	0x21, 0xff, 0x70, 0x39, 0x37, 0x01, 0xe7, 0xf9, 
-	0x21, 0xff, 0x70, 0x39, 0x37, 0x01, 0x98, 0x05, 
-	0x00, 0xc0, 0x21, 0xf7, 0x43, 0x01, 0x70, 0x39, 
-	0x37, 0x01, 0x99, 0x07, 0x70, 0x39, 0x37, 0x01, 
-	0x21, 0xc0, 0x70, 0x39, 0x37, 0x01, 0x26, 0x00, 
-	0x1f, 0x28, 0x42, 0xb0, 0xdc, 0x02, 0xe0, 0x05, 
-	0x36, 0x01, 0xe7, 0xf9, 0x21, 0x00, 0x70, 0x39, 
-	0x37, 0x01, 0xe7, 0xf9, 0xe7, 0xb0, 0x99, 0x03, 
-	0x00, 0x48, 0x99, 0x02, 0x1a, 0x08, 0x23, 0x0d, 
-	0x06, 0x9b, 0x18, 0xc0, 0x49, 0x29, 0x64, 0x88, 
-	0x99, 0x09, 0x20, 0x78, 0x40, 0x08, 0x23, 0x02, 
-	0x43, 0x18, 0xf7, 0xff, 0xfa, 0x17, 0x20, 0x01, 
-	0xf7, 0xff, 0xfa, 0x14, 0x48, 0x22, 0x68, 0x00, 
-	0x38, 0x02, 0x42, 0xa0, 0xd1, 0x09, 0x48, 0x22, 
-	0x68, 0x01, 0x23, 0x01, 0x05, 0x5b, 0x43, 0x19, 
-	0x60, 0x01, 0x20, 0xff, 0x49, 0x1f, 0x68, 0x09, 
-	0x70, 0x08, 0x48, 0x1b, 0x68, 0x00, 0x38, 0x02, 
-	0x42, 0xa0, 0xd3, 0x0f, 0x48, 0x1c, 0x68, 0x00, 
-	0x28, 0x00, 0xd0, 0x05, 0x48, 0x1a, 0x68, 0x00, 
-	0x23, 0x01, 0x06, 0x9b, 0x40, 0x18, 0xd0, 0x05, 
-	0x20, 0x32, 0x49, 0x13, 0x60, 0x08, 0x48, 0x12, 
-	0x68, 0x00, 0x1e, 0x84, 0x2c, 0x01, 0xd1, 0x02, 
-	0x20, 0x02, 0xf7, 0xff, 0xf9, 0xeb, 0x2c, 0xff, 
-	0xd1, 0x08, 0x20, 0x33, 0x06, 0x40, 0x6d, 0xc0, 
-	0x30, 0xbc, 0x49, 0x0c, 0x6c, 0xc9, 0x42, 0x88, 
-	0xd2, 0x00, 0x24, 0x18, 0x2c, 0x00, 0xd0, 0x02, 
-	0x2c, 0xff, 0xd0, 0x00, 0x3c, 0x01, 0x98, 0x08, 
-	0x60, 0x04, 0xb0, 0x08, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x5e, 0x44, 
-	0x2e, 0x08, 0x5e, 0x30, 0x2e, 0x08, 0x5d, 0xd0, 
-	0x2e, 0x08, 0x1f, 0x18, 0x66, 0x00, 0x00, 0x80, 
-	0x6c, 0x00, 0x00, 0x20, 0x2e, 0x08, 0x5e, 0x2c, 
-	0x6c, 0x00, 0x08, 0x00, 0xb5, 0xff, 0x1c, 0x04, 
-	0x1c, 0x0f, 0x9a, 0x02, 0x06, 0x15, 0x0e, 0x2d, 
-	0x9b, 0x03, 0x06, 0x1e, 0x0e, 0x36, 0x2e, 0x20, 
-	0xdb, 0x04, 0x20, 0xa2, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2d, 0x1f, 0xdb, 0x01, 
-	0x20, 0xaf, 0xe7, 0xf7, 0x20, 0x01, 0x03, 0x40, 
-	0xf7, 0xff, 0xf9, 0xac, 0x20, 0x14, 0x49, 0x09, 
-	0x60, 0x08, 0x20, 0xff, 0x60, 0x20, 0x1c, 0x33, 
-	0x1c, 0x29, 0x1c, 0x38, 0x22, 0x02, 0xf7, 0xfc, 
-	0xfa, 0x4b, 0x48, 0x05, 0x68, 0x01, 0x23, 0x01, 
-	0x05, 0x5b, 0x43, 0x19, 0x60, 0x01, 0x20, 0x00, 
-	0xe7, 0xe0, 0xe7, 0xdf, 0x2e, 0x08, 0x1f, 0x18, 
-	0x6c, 0x00, 0x00, 0x20, 0xb4, 0x0f, 0xb5, 0xf0, 
-	0x1c, 0x07, 0xb0, 0x82, 0x20, 0x00, 0x49, 0x16, 
-	0x60, 0x08, 0x48, 0x16, 0x6f, 0x80, 0x23, 0x09, 
-	0x01, 0x9b, 0x42, 0x98, 0xd1, 0x02, 0x20, 0xe1, 
-	0x00, 0xc0, 0xe0, 0x00, 0x48, 0x12, 0x1c, 0x05, 
-	0x68, 0x38, 0x28, 0xff, 0xd1, 0x17, 0x98, 0x0d, 
-	0x90, 0x00, 0x98, 0x0c, 0x90, 0x01, 0x98, 0x01, 
-	0x99, 0x00, 0x1a, 0x46, 0x08, 0x68, 0x19, 0x81, 
-	0x1c, 0x28, 0xf0, 0x09, 0xfa, 0xeb, 0x1c, 0x04, 
-	0x34, 0x01, 0x0f, 0xf0, 0x07, 0xc0, 0xd0, 0x00, 
-	0x24, 0x04, 0x2c, 0x32, 0xd9, 0x00, 0x24, 0x04, 
-	0x1d, 0xe0, 0x30, 0x0d, 0x60, 0x38, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0xb0, 0x04, 0x47, 0x18, 
-	0x2e, 0x08, 0x5e, 0x44, 0xcc, 0x00, 0x0f, 0x80, 
-	0x00, 0x00, 0x05, 0xdd, 0xb5, 0xf3, 0x1c, 0x07, 
-	0xb0, 0x81, 0x99, 0x02, 0x06, 0x09, 0x0e, 0x09, 
-	0x91, 0x00, 0xb0, 0x82, 0x99, 0x02, 0x29, 0x20, 
-	0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x03, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x99, 0x02, 
-	0x00, 0x88, 0x49, 0x2f, 0x58, 0x08, 0x90, 0x01, 
-	0x28, 0x00, 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x03, 
-	0xe7, 0xf1, 0x20, 0x00, 0x70, 0x78, 0x78, 0xb8, 
-	0x07, 0x00, 0x0f, 0x00, 0x90, 0x00, 0x98, 0x00, 
-	0x28, 0x04, 0xd1, 0x1f, 0x6a, 0xfe, 0x24, 0x00, 
-	0x2c, 0x08, 0xdb, 0x04, 0xe0, 0x18, 0x1c, 0x60, 
-	0x06, 0x04, 0x0e, 0x24, 0xe7, 0xf8, 0x00, 0xa0, 
-	0x19, 0x80, 0x68, 0x40, 0x00, 0xa1, 0x19, 0x89, 
-	0x64, 0x48, 0x21, 0x00, 0x00, 0xa0, 0x19, 0x80, 
-	0x62, 0x41, 0x00, 0xa0, 0x19, 0x80, 0x6c, 0x40, 
-	0x28, 0x00, 0xd0, 0x04, 0x20, 0x80, 0x41, 0x20, 
-	0x88, 0x31, 0x43, 0x08, 0x80, 0x30, 0xe7, 0xe6, 
-	0x88, 0x30, 0x80, 0x70, 0x78, 0xb8, 0x23, 0x20, 
-	0x40, 0x18, 0xd0, 0x1f, 0x6b, 0x3d, 0x20, 0x00, 
-	0x60, 0x28, 0x20, 0x00, 0x60, 0x68, 0x20, 0x00, 
-	0x60, 0xa8, 0x24, 0x00, 0x2c, 0x08, 0xdb, 0x04, 
-	0xe0, 0x0c, 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, 
-	0xe7, 0xf8, 0x20, 0x00, 0x00, 0xa1, 0x19, 0x49, 
-	0x60, 0xc8, 0x20, 0x00, 0x00, 0xa1, 0x19, 0x49, 
-	0x63, 0x88, 0xe7, 0xf2, 0x20, 0x00, 0x62, 0xe8, 
-	0x20, 0x00, 0x63, 0x28, 0x20, 0x00, 0x63, 0x68, 
-	0x20, 0x00, 0x65, 0xa8, 0x99, 0x02, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf8, 0x3e, 0xb0, 0x03, 0xe7, 0x9e, 
-	0xb0, 0x02, 0xb0, 0x01, 0xe7, 0x9b, 0x00, 0x00, 
-	0x2e, 0x08, 0x5e, 0x5c, 0xb5, 0xf3, 0x1c, 0x07, 
-	0x99, 0x01, 0x06, 0x0c, 0x0e, 0x24, 0xb0, 0x82, 
-	0x2c, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x02, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x00, 0xa0, 0x49, 0x12, 0x58, 0x08, 0x1c, 0x05, 
-	0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x02, 0xe7, 0xf3, 
-	0x1c, 0x21, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x84, 
-	0x1c, 0x06, 0xd0, 0x02, 0x1c, 0x30, 0xb0, 0x02, 
-	0xe7, 0xea, 0x78, 0x68, 0x21, 0x20, 0x40, 0x01, 
-	0x91, 0x00, 0x99, 0x00, 0x1c, 0x38, 0xf0, 0x00, 
-	0xff, 0x3f, 0x68, 0xe9, 0x91, 0x01, 0x29, 0x00, 
-	0xd0, 0x03, 0x99, 0x01, 0x1c, 0x38, 0xf0, 0x03, 
-	0xfe, 0x7a, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xd7, 
-	0xb0, 0x02, 0xe7, 0xd5, 0x2e, 0x08, 0x5e, 0x5c, 
-	0xb5, 0xf3, 0x1c, 0x02, 0x99, 0x01, 0x06, 0x0f, 
-	0x0e, 0x3f, 0xb0, 0x86, 0x00, 0xb8, 0x4b, 0xa1, 
-	0x68, 0x1b, 0x18, 0xc0, 0x90, 0x00, 0x2f, 0x20, 
-	0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x06, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0xb8, 
-	0x4b, 0x9b, 0x58, 0x18, 0x90, 0x05, 0x28, 0x00, 
-	0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x06, 0xe7, 0xf2, 
-	0x78, 0x90, 0x90, 0x01, 0x71, 0xd7, 0x78, 0xd1, 
-	0x98, 0x01, 0x23, 0x80, 0x40, 0x18, 0xd1, 0x73, 
-	0x29, 0x20, 0xdd, 0x02, 0x20, 0xb1, 0xb0, 0x06, 
-	0xe7, 0xe5, 0x48, 0x92, 0x68, 0x00, 0x23, 0x01, 
-	0x42, 0xd8, 0xd1, 0x02, 0x20, 0xb2, 0xb0, 0x06, 
-	0xe7, 0xdd, 0x20, 0x01, 0x40, 0x88, 0x4b, 0x8d, 
-	0x68, 0x1b, 0x40, 0x18, 0xd0, 0x02, 0x20, 0xb1, 
-	0xb0, 0x06, 0xe7, 0xd4, 0x00, 0x88, 0x4b, 0x8a, 
-	0x50, 0x1a, 0x48, 0x8a, 0x54, 0x47, 0x01, 0x08, 
-	0x4b, 0x89, 0x18, 0xc5, 0x7f, 0x10, 0x06, 0x00, 
-	0x7f, 0x53, 0x04, 0x1b, 0x43, 0x18, 0x7f, 0x93, 
-	0x02, 0x1b, 0x43, 0x18, 0x7f, 0xd3, 0x43, 0x03, 
-	0xc5, 0x08, 0x1d, 0xd0, 0x30, 0x19, 0x78, 0x00, 
-	0x06, 0x00, 0x1d, 0xd3, 0x33, 0x19, 0x78, 0x5b, 
-	0x04, 0x1b, 0x43, 0x18, 0x1d, 0xd3, 0x33, 0x19, 
-	0x78, 0x9b, 0x02, 0x1b, 0x43, 0x18, 0x1d, 0xd3, 
-	0x33, 0x19, 0x78, 0xdb, 0x43, 0x03, 0xc5, 0x08, 
-	0x01, 0x08, 0x4b, 0x7a, 0x18, 0xc4, 0x7b, 0x10, 
-	0x06, 0x00, 0x7b, 0x53, 0x04, 0x1b, 0x43, 0x18, 
-	0x7b, 0x93, 0x02, 0x1b, 0x43, 0x18, 0x7b, 0xd3, 
-	0x43, 0x03, 0xc4, 0x08, 0x7c, 0x10, 0x06, 0x00, 
-	0x7c, 0x53, 0x04, 0x1b, 0x43, 0x18, 0x7c, 0x93, 
-	0x02, 0x1b, 0x43, 0x18, 0x7c, 0xd3, 0x43, 0x03, 
-	0xc4, 0x08, 0x98, 0x01, 0x07, 0xc0, 0x0f, 0xc0, 
-	0xd0, 0x20, 0x1d, 0xd0, 0x30, 0x19, 0x79, 0x00, 
-	0x06, 0x00, 0x1d, 0xd3, 0x33, 0x19, 0x79, 0x5b, 
-	0x04, 0x1b, 0x43, 0x18, 0x1d, 0xd3, 0x33, 0x19, 
-	0x79, 0x9b, 0x02, 0x1b, 0x43, 0x18, 0x1d, 0xd3, 
-	0x33, 0x19, 0x79, 0xdb, 0x43, 0x03, 0xc5, 0x08, 
-	0x7d, 0x10, 0x06, 0x00, 0x7d, 0x53, 0x04, 0x1b, 
-	0x43, 0x18, 0x7d, 0x93, 0x02, 0x1b, 0xe0, 0x00, 
-	0xe0, 0x42, 0x43, 0x18, 0x7d, 0xd3, 0x43, 0x03, 
-	0xc4, 0x08, 0xe0, 0x03, 0x23, 0x00, 0xc5, 0x08, 
-	0x23, 0x00, 0xc4, 0x08, 0x23, 0xff, 0xc5, 0x08, 
-	0x20, 0x19, 0x06, 0x80, 0x6b, 0x00, 0x23, 0x08, 
-	0x40, 0x18, 0xd0, 0x06, 0x88, 0x90, 0x04, 0x00, 
-	0x19, 0xc3, 0x93, 0x02, 0x9b, 0x02, 0xc4, 0x08, 
-	0xe0, 0x00, 0xc4, 0x80, 0x98, 0x01, 0x23, 0x08, 
-	0x40, 0x18, 0xd0, 0x17, 0x48, 0x50, 0x5d, 0xc0, 
-	0x30, 0x01, 0x4b, 0x4f, 0x55, 0xd8, 0x7a, 0x10, 
-	0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x04, 0x20, 0x01, 
-	0x40, 0x88, 0x23, 0x19, 0x06, 0x9b, 0x61, 0x18, 
-	0x7a, 0x10, 0x23, 0x02, 0x40, 0x18, 0xd0, 0x04, 
-	0x20, 0x01, 0x40, 0x88, 0x23, 0x19, 0x06, 0x9b, 
-	0x61, 0x58, 0xe0, 0x05, 0x4e, 0x45, 0x20, 0x01, 
-	0x40, 0x88, 0x68, 0x33, 0x43, 0x18, 0x60, 0x30, 
-	0x20, 0x01, 0x40, 0x88, 0x4b, 0x3b, 0x68, 0x1b, 
-	0x43, 0x18, 0x4b, 0x3a, 0x60, 0x18, 0xe0, 0x4f, 
-	0x98, 0x01, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x48, 
-	0x48, 0x3d, 0x88, 0x00, 0x4b, 0x3d, 0x42, 0x98, 
-	0xd1, 0x02, 0x20, 0xb2, 0xb0, 0x06, 0xe7, 0x26, 
-	0x00, 0x88, 0x4b, 0x3b, 0x58, 0x18, 0x28, 0x00, 
-	0xd0, 0x02, 0x20, 0xb1, 0xb0, 0x06, 0xe7, 0x1e, 
-	0x29, 0x10, 0xdb, 0x02, 0x20, 0xb1, 0xb0, 0x06, 
-	0xe7, 0x19, 0x20, 0x01, 0x40, 0x88, 0x4b, 0x32, 
-	0x88, 0x1b, 0x40, 0x18, 0xd0, 0x02, 0x20, 0xb1, 
-	0xb0, 0x06, 0xe7, 0x10, 0x98, 0x05, 0x78, 0x80, 
-	0x28, 0x02, 0xdb, 0x02, 0x20, 0xb1, 0xb0, 0x06, 
-	0xe7, 0x09, 0x00, 0x88, 0x4b, 0x2c, 0x50, 0x1a, 
-	0x48, 0x2c, 0x54, 0x47, 0x00, 0xf8, 0x1b, 0xc0, 
-	0x00, 0x80, 0x4b, 0x2b, 0x68, 0x1b, 0x18, 0xc0, 
-	0x90, 0x04, 0x98, 0x04, 0x7e, 0x00, 0x28, 0xff, 
-	0xd1, 0x02, 0x98, 0x04, 0x76, 0x01, 0xe0, 0x01, 
-	0x98, 0x04, 0x76, 0x41, 0x4e, 0x25, 0x96, 0x03, 
-	0x1d, 0xd3, 0x33, 0x05, 0x00, 0x88, 0x9e, 0x03, 
-	0x50, 0x33, 0x20, 0x01, 0x40, 0x88, 0x4b, 0x1c, 
-	0x88, 0x1b, 0x43, 0x18, 0x4b, 0x1a, 0x80, 0x18, 
-	0xe0, 0x02, 0x20, 0xb1, 0xb0, 0x06, 0xe6, 0xe2, 
-	0x78, 0x50, 0x23, 0x80, 0x43, 0xdb, 0x40, 0x18, 
-	0x70, 0x50, 0x98, 0x05, 0x78, 0x80, 0x28, 0x00, 
-	0xd1, 0x09, 0x98, 0x00, 0x68, 0x00, 0x23, 0x01, 
-	0x03, 0x5b, 0x43, 0x18, 0x9b, 0x00, 0x60, 0x18, 
-	0x20, 0x02, 0x9b, 0x05, 0x70, 0xd8, 0x98, 0x05, 
-	0x78, 0x80, 0x30, 0x01, 0x9b, 0x05, 0x70, 0x98, 
-	0x20, 0x00, 0xb0, 0x06, 0xe6, 0xc7, 0xb0, 0x06, 
-	0xe6, 0xc5, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xcc, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5e, 0xdc, 
-	0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x5f, 0xa4, 
-	0x64, 0x00, 0x10, 0x00, 0x64, 0x00, 0x08, 0x00, 
-	0x2e, 0x08, 0x7b, 0xf4, 0x64, 0x00, 0x00, 0x18, 
-	0x2e, 0x08, 0x5e, 0xe0, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x5f, 0x64, 0x2e, 0x08, 0x5f, 0xc4, 
-	0x2e, 0x08, 0x5d, 0xc4, 0x9e, 0x00, 0x04, 0xb8, 
-	0xb5, 0xf3, 0x1c, 0x02, 0x99, 0x01, 0x06, 0x0f, 
-	0x0e, 0x3f, 0xb0, 0x86, 0x00, 0xb8, 0x4b, 0x65, 
-	0x68, 0x1b, 0x18, 0xc0, 0x90, 0x01, 0x2f, 0x20, 
-	0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x06, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0xb8, 
-	0x4b, 0x5f, 0x58, 0x18, 0x1c, 0x05, 0xd1, 0x02, 
-	0x20, 0xb0, 0xb0, 0x06, 0xe7, 0xf3, 0x78, 0x90, 
-	0x90, 0x03, 0x78, 0xd1, 0x00, 0x88, 0x4b, 0x5b, 
-	0x58, 0x18, 0x42, 0x90, 0xd0, 0x02, 0x20, 0xb1, 
-	0xb0, 0x06, 0xe7, 0xe8, 0x98, 0x03, 0x23, 0x80, 
-	0x40, 0x18, 0xd1, 0x49, 0x01, 0x08, 0x4b, 0x56, 
-	0x18, 0xc3, 0x93, 0x00, 0x20, 0x00, 0x9b, 0x00, 
-	0x60, 0x18, 0x23, 0x00, 0x00, 0x88, 0x4e, 0x51, 
-	0x50, 0x33, 0x23, 0xff, 0x48, 0x51, 0x54, 0x43, 
-	0x20, 0x01, 0x40, 0x88, 0x43, 0xc0, 0x4b, 0x50, 
-	0x68, 0x1b, 0x40, 0x18, 0x4b, 0x4e, 0x60, 0x18, 
-	0x98, 0x03, 0x23, 0x08, 0x40, 0x18, 0xd0, 0x27, 
-	0x20, 0x01, 0x40, 0x88, 0x90, 0x04, 0x7a, 0x10, 
-	0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x0b, 0x98, 0x04, 
-	0x23, 0x19, 0x06, 0x9b, 0x69, 0x1b, 0x40, 0x18, 
-	0xd0, 0x04, 0x98, 0x04, 0x23, 0x19, 0x06, 0x9b, 
-	0x61, 0x18, 0xe7, 0xf4, 0xe0, 0x0e, 0x7a, 0x10, 
-	0x23, 0x02, 0x40, 0x18, 0xd0, 0x0a, 0x98, 0x04, 
-	0x23, 0x19, 0x06, 0x9b, 0x69, 0x5b, 0x40, 0x18, 
-	0xd0, 0x04, 0x98, 0x04, 0x23, 0x19, 0x06, 0x9b, 
-	0x61, 0x58, 0xe7, 0xf4, 0x48, 0x3b, 0x5d, 0xc0, 
-	0x38, 0x01, 0x4b, 0x3a, 0x55, 0xd8, 0xe0, 0x06, 
-	0x4e, 0x39, 0x20, 0x01, 0x40, 0x88, 0x43, 0xc0, 
-	0x68, 0x33, 0x40, 0x18, 0x60, 0x30, 0xe0, 0x36, 
-	0x98, 0x03, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x2f, 
-	0x00, 0xf8, 0x1b, 0xc0, 0x00, 0x80, 0x4b, 0x33, 
-	0x68, 0x1b, 0x18, 0xc3, 0x93, 0x02, 0x9b, 0x02, 
-	0x7e, 0x18, 0x42, 0x88, 0xd1, 0x03, 0x20, 0xff, 
-	0x9b, 0x02, 0x76, 0x18, 0xe0, 0x0a, 0x9b, 0x02, 
-	0x7e, 0x58, 0x42, 0x88, 0xd1, 0x03, 0x20, 0xff, 
-	0x9b, 0x02, 0x76, 0x58, 0xe0, 0x02, 0x20, 0xb1, 
-	0xb0, 0x06, 0xe7, 0x7c, 0x23, 0x00, 0x00, 0x88, 
-	0x4e, 0x27, 0x50, 0x33, 0x20, 0xff, 0x4b, 0x27, 
-	0x54, 0x58, 0x20, 0x01, 0x40, 0x88, 0x43, 0xc0, 
-	0x4b, 0x25, 0x88, 0x1b, 0x40, 0x18, 0x4b, 0x24, 
-	0x80, 0x18, 0x4e, 0x24, 0x96, 0x05, 0x23, 0x00, 
-	0x00, 0x88, 0x9e, 0x05, 0x50, 0x33, 0xe0, 0x02, 
-	0x20, 0xb1, 0xb0, 0x06, 0xe7, 0x63, 0x78, 0xa8, 
-	0x38, 0x01, 0x70, 0xa8, 0x78, 0x50, 0x23, 0x80, 
-	0x43, 0x18, 0x70, 0x50, 0x78, 0xa8, 0x28, 0x00, 
-	0xd1, 0x07, 0x98, 0x01, 0x68, 0x00, 0x4b, 0x1a, 
-	0x40, 0x18, 0x9b, 0x01, 0x60, 0x18, 0x20, 0x01, 
-	0x70, 0xe8, 0x24, 0x1f, 0x2c, 0x00, 0xd1, 0x02, 
-	0xe0, 0x0a, 0x3c, 0x01, 0xe7, 0xfa, 0x48, 0x0d, 
-	0x5d, 0x00, 0x28, 0x00, 0xd1, 0x03, 0x20, 0x19, 
-	0x06, 0x80, 0x64, 0xc4, 0xe0, 0x00, 0xe7, 0xf4, 
-	0x20, 0x00, 0xb0, 0x06, 0xe7, 0x3f, 0xb0, 0x06, 
-	0xe7, 0x3d, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xcc, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5e, 0xe4, 
-	0x64, 0x00, 0x08, 0x08, 0x2e, 0x08, 0x5f, 0xa4, 
-	0x2e, 0x08, 0x5e, 0xdc, 0x2e, 0x08, 0x7b, 0xf4, 
-	0x64, 0x00, 0x00, 0x18, 0x2e, 0x08, 0x5d, 0xc4, 
-	0x2e, 0x08, 0x5f, 0x64, 0x2e, 0x08, 0x5f, 0xc4, 
-	0x2e, 0x08, 0x5e, 0xe0, 0x9e, 0x00, 0x04, 0xb8, 
-	0xff, 0xff, 0xdf, 0xff, 0x1c, 0x03, 0x1c, 0x0a, 
-	0x78, 0x58, 0x70, 0x10, 0x20, 0x00, 0x47, 0x70, 
-	0xe7, 0xfd, 0xb5, 0xf7, 0x1c, 0x07, 0xb0, 0x81, 
-	0x9a, 0x03, 0x06, 0x10, 0x0e, 0x00, 0x90, 0x00, 
-	0xb0, 0x87, 0x78, 0x78, 0x23, 0x80, 0x40, 0x18, 
-	0xd0, 0x4c, 0x78, 0x78, 0x23, 0x80, 0x40, 0x18, 
-	0xd0, 0x48, 0x78, 0xb8, 0x90, 0x06, 0x99, 0x09, 
-	0x78, 0x88, 0x90, 0x05, 0x98, 0x06, 0x23, 0x20, 
-	0x40, 0x18, 0xd0, 0x3f, 0x98, 0x05, 0x23, 0x20, 
-	0x40, 0x18, 0xd0, 0x3b, 0x6b, 0x38, 0x90, 0x01, 
-	0x99, 0x09, 0x6b, 0x08, 0x90, 0x00, 0x98, 0x01, 
-	0x28, 0x00, 0xd1, 0x02, 0x98, 0x00, 0x28, 0x00, 
-	0xd0, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
-	0x28, 0x00, 0xd1, 0x05, 0x20, 0xb6, 0xb0, 0x08, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x98, 0x01, 0x68, 0x05, 0x98, 0x00, 0x68, 0x04, 
-	0x7a, 0x2e, 0x7a, 0x21, 0x91, 0x04, 0x7d, 0x6a, 
-	0x92, 0x03, 0x7d, 0x62, 0x92, 0x02, 0x98, 0x07, 
-	0x28, 0x00, 0xd0, 0x0a, 0x9a, 0x02, 0x99, 0x04, 
-	0x1c, 0x28, 0xf0, 0x00, 0xfc, 0xe5, 0x9a, 0x03, 
-	0x1c, 0x31, 0x1c, 0x20, 0xf0, 0x00, 0xfc, 0xe0, 
-	0xe0, 0x09, 0x99, 0x04, 0x1c, 0x28, 0x22, 0x00, 
-	0xf0, 0x00, 0xfc, 0xda, 0x1c, 0x31, 0x1c, 0x20, 
-	0x22, 0x00, 0xf0, 0x00, 0xfc, 0xd5, 0x20, 0x00, 
-	0xb0, 0x08, 0xe7, 0xd5, 0x20, 0xb1, 0xb0, 0x08, 
-	0xe7, 0xd2, 0xb0, 0x07, 0xb0, 0x01, 0xe7, 0xcf, 
-	0xb4, 0xf0, 0x1c, 0x02, 0x1c, 0x0b, 0x06, 0x1d, 
-	0x0e, 0x2d, 0xb0, 0x82, 0x2d, 0x00, 0xd1, 0x0a, 
-	0x48, 0x1a, 0x69, 0x00, 0x90, 0x01, 0x49, 0x1a, 
-	0x48, 0x18, 0x69, 0x40, 0x90, 0x00, 0x48, 0x17, 
-	0x6a, 0x00, 0x1e, 0x44, 0xe0, 0x10, 0x2d, 0x20, 
-	0xd1, 0x0a, 0x48, 0x14, 0x69, 0x80, 0x90, 0x01, 
-	0x49, 0x14, 0x48, 0x12, 0x69, 0xc0, 0x90, 0x00, 
-	0x48, 0x10, 0x6a, 0x40, 0x1e, 0x44, 0xe0, 0x03, 
-	0x20, 0xb3, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 
-	0x20, 0x00, 0x70, 0x10, 0x78, 0x50, 0x00, 0x80, 
-	0x4e, 0x0d, 0x58, 0x37, 0x69, 0x38, 0x61, 0x78, 
-	0x98, 0x01, 0x9e, 0x00, 0x42, 0xb0, 0xd0, 0x07, 
-	0x98, 0x01, 0x30, 0x01, 0x90, 0x01, 0x98, 0x01, 
-	0x40, 0x20, 0x90, 0x01, 0x98, 0x01, 0x60, 0x08, 
-	0x20, 0x00, 0xb0, 0x02, 0xe7, 0xe6, 0xb0, 0x02, 
-	0xe7, 0xe4, 0x00, 0x00, 0x9e, 0x00, 0x04, 0x80, 
-	0x9e, 0x00, 0x04, 0x90, 0x9e, 0x00, 0x04, 0x98, 
-	0x2e, 0x08, 0x5e, 0x5c, 0xb5, 0xf3, 0x1c, 0x07, 
-	0xb0, 0x81, 0x99, 0x02, 0x06, 0x08, 0x0e, 0x00, 
-	0x90, 0x00, 0xb0, 0x88, 0x98, 0x08, 0x28, 0x00, 
-	0xd1, 0x0e, 0x49, 0x69, 0x91, 0x02, 0x48, 0x69, 
-	0x69, 0x00, 0x90, 0x07, 0x48, 0x68, 0x90, 0x06, 
-	0x48, 0x66, 0x69, 0x40, 0x90, 0x05, 0x48, 0x65, 
-	0x6a, 0x00, 0x1e, 0x41, 0x91, 0x04, 0xe0, 0x17, 
-	0x98, 0x08, 0x28, 0x20, 0xd1, 0x0e, 0x49, 0x63, 
-	0x91, 0x02, 0x48, 0x60, 0x69, 0x80, 0x90, 0x07, 
-	0x48, 0x61, 0x90, 0x06, 0x48, 0x5d, 0x69, 0xc0, 
-	0x90, 0x05, 0x48, 0x5c, 0x6a, 0x40, 0x1e, 0x41, 
-	0x91, 0x04, 0xe0, 0x05, 0x20, 0xb3, 0xb0, 0x09, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x25, 0x00, 0x98, 0x07, 0x99, 0x05, 0x42, 0x88, 
-	0xd0, 0x73, 0x2d, 0x00, 0xd1, 0x72, 0x98, 0x07, 
-	0x00, 0x80, 0x99, 0x02, 0x18, 0x40, 0x23, 0x01, 
-	0x02, 0x9b, 0x18, 0xc0, 0x68, 0x01, 0x91, 0x03, 
-	0x98, 0x07, 0x00, 0x80, 0x99, 0x02, 0x58, 0x08, 
-	0x90, 0x01, 0x99, 0x02, 0x98, 0x07, 0x18, 0x08, 
-	0x23, 0x01, 0x02, 0xdb, 0x18, 0xc0, 0x78, 0x00, 
-	0x90, 0x00, 0x20, 0x00, 0x99, 0x02, 0x9a, 0x07, 
-	0x18, 0x89, 0x23, 0x01, 0x02, 0xdb, 0x18, 0xc9, 
-	0x70, 0x08, 0x98, 0x07, 0x30, 0x01, 0x90, 0x07, 
-	0x98, 0x07, 0x99, 0x04, 0x40, 0x08, 0x90, 0x07, 
-	0x99, 0x03, 0x29, 0x00, 0xd0, 0x71, 0xb0, 0x83, 
-	0x20, 0x00, 0x90, 0x00, 0x99, 0x06, 0x91, 0x02, 
-	0x20, 0x01, 0x90, 0x01, 0x98, 0x03, 0x28, 0x80, 
-	0xd1, 0x1f, 0x24, 0x00, 0x2c, 0x10, 0xd3, 0x02, 
-	0xe0, 0x1a, 0x34, 0x01, 0xe7, 0xfa, 0x98, 0x01, 
-	0x99, 0x02, 0x40, 0x08, 0xd0, 0x10, 0x48, 0x39, 
-	0x5d, 0x00, 0x28, 0xff, 0xd0, 0x0c, 0x48, 0x37, 
-	0x5d, 0x00, 0x90, 0x00, 0x00, 0xa0, 0x49, 0x36, 
-	0x58, 0x09, 0x00, 0xa8, 0x19, 0xc0, 0x61, 0x01, 
-	0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, 0xe0, 0x03, 
-	0x98, 0x01, 0x00, 0x40, 0x90, 0x01, 0xe7, 0xe4, 
-	0xe0, 0x1d, 0x24, 0x00, 0x2c, 0x20, 0xd3, 0x02, 
-	0xe0, 0x19, 0x34, 0x01, 0xe7, 0xfa, 0x98, 0x01, 
-	0x99, 0x02, 0x40, 0x08, 0xd0, 0x0f, 0x48, 0x2b, 
-	0x5d, 0x00, 0x28, 0xff, 0xd0, 0x0b, 0x48, 0x29, 
-	0x5d, 0x00, 0x90, 0x00, 0x00, 0xa0, 0x49, 0x28, 
-	0x58, 0x09, 0x00, 0xa8, 0x19, 0xc0, 0x61, 0x01, 
-	0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, 0x98, 0x01, 
-	0x00, 0x40, 0x90, 0x01, 0xe7, 0xe5, 0x2d, 0x00, 
-	0xe0, 0x01, 0xe0, 0x27, 0xe0, 0x26, 0xd0, 0x23, 
-	0xb0, 0x81, 0x98, 0x01, 0x70, 0x78, 0x98, 0x05, 
-	0x60, 0x78, 0x98, 0x01, 0x00, 0x80, 0x49, 0x1d, 
-	0x58, 0x08, 0x90, 0x00, 0x98, 0x00, 0x69, 0x46, 
-	0x98, 0x05, 0x42, 0xb0, 0xd3, 0x04, 0x1d, 0xf0, 
-	0x30, 0xb9, 0x99, 0x05, 0x42, 0x88, 0xd2, 0x08, 
-	0x68, 0x30, 0x28, 0x00, 0xd0, 0x01, 0x68, 0x36, 
-	0xe0, 0x02, 0x20, 0xba, 0xb0, 0x0d, 0xe7, 0x63, 
-	0xe7, 0xee, 0x60, 0xbe, 0x98, 0x00, 0x61, 0x46, 
-	0x1c, 0x38, 0xf0, 0x00, 0xfb, 0x02, 0xb0, 0x01, 
-	0xb0, 0x03, 0xe7, 0x5e, 0x70, 0x3d, 0x98, 0x07, 
-	0x99, 0x06, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x09, 
-	0xe7, 0x52, 0xb0, 0x08, 0xb0, 0x01, 0xe7, 0x4f, 
-	0x2e, 0x08, 0x60, 0x90, 0x9e, 0x00, 0x04, 0x80, 
-	0x9e, 0x00, 0x04, 0x90, 0x2e, 0x08, 0x69, 0x90, 
-	0x9e, 0x00, 0x04, 0x98, 0x2e, 0x08, 0x5f, 0xc4, 
-	0x2e, 0x08, 0x5f, 0x64, 0x2e, 0x08, 0x5f, 0xa4, 
-	0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x5e, 0x5c, 
-	0xb4, 0x90, 0x1c, 0x01, 0x78, 0x48, 0x00, 0x80, 
-	0x4c, 0x0d, 0x58, 0x23, 0x69, 0x1a, 0x68, 0x8f, 
-	0x42, 0xba, 0xd0, 0x12, 0x68, 0x10, 0x42, 0xb8, 
-	0xd0, 0x08, 0x68, 0x10, 0x28, 0x00, 0xd0, 0x01, 
-	0x68, 0x12, 0xe0, 0x02, 0x20, 0xba, 0xbc, 0x90, 
-	0x47, 0x70, 0xe7, 0xf3, 0x20, 0x00, 0x60, 0x10, 
-	0x69, 0x9c, 0x69, 0x18, 0x60, 0x20, 0x61, 0x1f, 
-	0x61, 0x9a, 0x20, 0x00, 0xe7, 0xf3, 0xe7, 0xf2, 
-	0x2e, 0x08, 0x5e, 0x5c, 0xb4, 0xb0, 0x1c, 0x02, 
-	0x1c, 0x0f, 0x78, 0x90, 0x23, 0x04, 0x40, 0x18, 
-	0xd0, 0x1c, 0x78, 0x90, 0x23, 0x20, 0x40, 0x18, 
-	0xd0, 0x18, 0x6b, 0x14, 0x68, 0x20, 0x28, 0x00, 
-	0xd0, 0x02, 0x1d, 0xe5, 0x35, 0x05, 0xe0, 0x01, 
-	0x1d, 0xe5, 0x35, 0x31, 0x21, 0x00, 0x29, 0x08, 
-	0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x48, 0x06, 0x01, 
-	0x0e, 0x09, 0xe7, 0xf8, 0x00, 0x88, 0x58, 0x2b, 
-	0x00, 0x88, 0x50, 0x3b, 0xe7, 0xf6, 0x20, 0x00, 
-	0xbc, 0xb0, 0x47, 0x70, 0x20, 0xb1, 0xe7, 0xfb, 
-	0xe7, 0xfa, 0xb5, 0xf3, 0x1c, 0x0a, 0xb0, 0x93, 
-	0x20, 0x00, 0x90, 0x06, 0x98, 0x13, 0x69, 0x00, 
-	0x90, 0x00, 0x98, 0x00, 0x6b, 0x00, 0x90, 0x12, 
-	0x98, 0x00, 0x78, 0x80, 0x90, 0x05, 0x98, 0x12, 
-	0x68, 0x00, 0x90, 0x01, 0x28, 0x00, 0xd0, 0x03, 
-	0x98, 0x12, 0x30, 0x0c, 0x90, 0x09, 0xe0, 0x0e, 
-	0x98, 0x12, 0x6a, 0xc0, 0x90, 0x01, 0x28, 0x00, 
-	0xd0, 0x03, 0x98, 0x12, 0x30, 0x38, 0x90, 0x09, 
-	0xe0, 0x05, 0x20, 0xb1, 0xb0, 0x13, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 
-	0x90, 0x06, 0x98, 0x05, 0x23, 0x04, 0x40, 0x18, 
-	0xd0, 0x73, 0x21, 0x00, 0x29, 0x08, 0xdb, 0x04, 
-	0xe0, 0x0c, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, 
-	0xe7, 0xf8, 0x98, 0x13, 0x30, 0x80, 0x69, 0x00, 
-	0x00, 0x8b, 0x58, 0xc0, 0x00, 0x8e, 0xab, 0x0a, 
-	0x51, 0x98, 0xe7, 0xf2, 0x9d, 0x01, 0x21, 0x00, 
-	0x29, 0x08, 0xdb, 0x04, 0xe0, 0xa7, 0x1c, 0x48, 
-	0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x00, 0x88, 
-	0xab, 0x0a, 0x58, 0x18, 0x28, 0x00, 0xd0, 0x55, 
-	0x20, 0x00, 0x90, 0x08, 0x48, 0x73, 0x90, 0x07, 
-	0x20, 0x00, 0x90, 0x02, 0x98, 0x02, 0x28, 0x20, 
-	0xdb, 0x06, 0xe0, 0x8d, 0x98, 0x02, 0x30, 0x01, 
-	0x06, 0x00, 0x0e, 0x00, 0x90, 0x02, 0xe7, 0xf5, 
-	0x00, 0x8b, 0xa8, 0x0a, 0x58, 0xc0, 0x9b, 0x07, 
-	0x40, 0x18, 0x90, 0x08, 0x28, 0x00, 0xd0, 0x73, 
-	0x00, 0x88, 0x9b, 0x09, 0x58, 0x18, 0x9b, 0x08, 
-	0x40, 0x18, 0xd0, 0x6e, 0x1d, 0xec, 0x34, 0x01, 
-	0x27, 0x00, 0x79, 0xa0, 0x9b, 0x06, 0x42, 0x98, 
-	0xd0, 0x08, 0x68, 0x68, 0x1c, 0x05, 0xd1, 0x02, 
-	0x20, 0xba, 0xb0, 0x13, 0xe7, 0xab, 0x1d, 0xec, 
-	0x34, 0x01, 0xe7, 0xf2, 0x78, 0x60, 0x07, 0x00, 
-	0x0f, 0x00, 0x02, 0x00, 0x04, 0x07, 0x0c, 0x3f, 
-	0x78, 0xa0, 0x19, 0xc0, 0x30, 0x03, 0x04, 0x07, 
-	0x0c, 0x3f, 0x2a, 0x00, 0xd0, 0x42, 0x98, 0x13, 
-	0x88, 0x40, 0x42, 0xb8, 0xdb, 0x3a, 0x98, 0x13, 
-	0x88, 0x40, 0x1b, 0xc0, 0x9b, 0x13, 0x80, 0x58, 
-	0x20, 0xbc, 0x90, 0x04, 0x2f, 0x00, 0xdd, 0x30, 
-	0x2f, 0xbc, 0xdd, 0x1b, 0x20, 0x00, 0x90, 0x03, 
-	0x98, 0x03, 0x28, 0xbc, 0xdb, 0x09, 0xe0, 0x0d, 
-	0x98, 0x03, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 
-	0xe0, 0x01, 0xe0, 0x4c, 0xe0, 0x41, 0x90, 0x03, 
-	0xe7, 0xf2, 0x78, 0x23, 0x34, 0x01, 0x70, 0x13, 
-	0x32, 0x01, 0xe7, 0xf1, 0x1f, 0xf8, 0x38, 0xb5, 
-	0x04, 0x07, 0x0c, 0x3f, 0x68, 0x2d, 0x1d, 0xec, 
-	0x34, 0x01, 0xe0, 0x11, 0x20, 0x00, 0x90, 0x03, 
-	0x98, 0x03, 0x42, 0xb8, 0xdb, 0x06, 0xe0, 0x0a, 
-	0x98, 0x03, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 
-	0x90, 0x03, 0xe7, 0xf5, 0x78, 0x23, 0x34, 0x01, 
-	0x70, 0x13, 0x32, 0x01, 0xe7, 0xf4, 0x27, 0x00, 
-	0xe7, 0xcc, 0xe0, 0x02, 0x20, 0xb7, 0xb0, 0x13, 
-	0xe7, 0x59, 0xe0, 0x04, 0x98, 0x13, 0x88, 0x40, 
-	0x19, 0xc0, 0x9b, 0x13, 0x80, 0x58, 0x00, 0x88, 
-	0xab, 0x0a, 0x58, 0x18, 0x9b, 0x07, 0x43, 0x98, 
-	0x00, 0x8e, 0xab, 0x0a, 0x51, 0x98, 0xe0, 0x01, 
-	0xe0, 0x01, 0xe0, 0x00, 0x9d, 0x01, 0x98, 0x06, 
-	0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x06, 
-	0x98, 0x07, 0x08, 0x40, 0x90, 0x07, 0xe7, 0x71, 
-	0xe0, 0x04, 0x98, 0x06, 0x30, 0x20, 0x06, 0x00, 
-	0x0e, 0x00, 0x90, 0x06, 0xe7, 0x57, 0x20, 0x00, 
-	0xb0, 0x13, 0xe7, 0x34, 0xe0, 0x44, 0x98, 0x05, 
-	0x23, 0x02, 0x40, 0x18, 0xd0, 0x3b, 0x98, 0x01, 
-	0x1d, 0xc4, 0x34, 0x01, 0x78, 0x60, 0x07, 0x00, 
-	0x0f, 0x00, 0x02, 0x00, 0x04, 0x07, 0x0c, 0x3f, 
-	0x78, 0xa0, 0x19, 0xc0, 0x30, 0x03, 0x04, 0x07, 
-	0x0c, 0x3f, 0x2f, 0x00, 0xdd, 0x28, 0x2f, 0xbc, 
-	0xdd, 0x17, 0x21, 0x00, 0x29, 0xbc, 0xdb, 0x04, 
-	0xe0, 0x08, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, 
-	0xe7, 0xf8, 0x78, 0x23, 0x34, 0x01, 0x70, 0x13, 
-	0x32, 0x01, 0xe7, 0xf6, 0x1f, 0xf8, 0x38, 0xb5, 
-	0x04, 0x07, 0x0c, 0x3f, 0x98, 0x01, 0x68, 0x00, 
-	0x90, 0x01, 0x98, 0x01, 0x1d, 0xc4, 0x34, 0x01, 
-	0xe0, 0x0d, 0x21, 0x00, 0x42, 0xb9, 0xdb, 0x04, 
-	0xe0, 0x08, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, 
-	0xe7, 0xf8, 0x78, 0x23, 0x34, 0x01, 0x70, 0x13, 
-	0x32, 0x01, 0xe7, 0xf6, 0x27, 0x00, 0xe7, 0xd4, 
-	0x20, 0x00, 0xb0, 0x13, 0xe6, 0xf3, 0x20, 0xb1, 
-	0xb0, 0x13, 0xe6, 0xf0, 0xb0, 0x13, 0xe6, 0xee, 
-	0xe6, 0xed, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 
-	0xb5, 0xf3, 0xb0, 0x84, 0x98, 0x04, 0x78, 0x40, 
-	0x00, 0x80, 0x49, 0x4b, 0x58, 0x08, 0x90, 0x03, 
-	0x28, 0x00, 0xd1, 0x05, 0x20, 0xb0, 0xb0, 0x04, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x98, 0x04, 0x68, 0x86, 0x98, 0x04, 0x88, 0x47, 
-	0x98, 0x04, 0x68, 0x44, 0x1d, 0xf0, 0x30, 0xb9, 
-	0x99, 0x04, 0x68, 0x49, 0x1a, 0x45, 0x42, 0xbd, 
-	0xdb, 0x0c, 0x2f, 0x00, 0xdb, 0x01, 0x2f, 0xbc, 
-	0xdd, 0x02, 0x20, 0xba, 0xb0, 0x04, 0xe7, 0xe7, 
-	0x1c, 0x3a, 0x99, 0x05, 0x1c, 0x20, 0xf0, 0x00, 
-	0xf9, 0x29, 0xe0, 0x6b, 0x20, 0x00, 0x90, 0x00, 
-	0x98, 0x04, 0x78, 0x40, 0x00, 0xc3, 0x1a, 0x18, 
-	0x00, 0x80, 0x49, 0x36, 0x68, 0x09, 0x18, 0x40, 
-	0x90, 0x01, 0x98, 0x01, 0x78, 0x80, 0x90, 0x02, 
-	0x98, 0x02, 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x02, 
-	0x98, 0x02, 0x28, 0x12, 0xd1, 0x03, 0x2d, 0x0e, 
-	0xda, 0x01, 0x20, 0x01, 0x90, 0x00, 0x2f, 0x00, 
-	0xdd, 0x50, 0xb0, 0x81, 0x42, 0xaf, 0xdd, 0x0d, 
-	0x2d, 0x00, 0xdb, 0x01, 0x2d, 0xbc, 0xdd, 0x02, 
-	0x20, 0xba, 0xb0, 0x05, 0xe7, 0xbc, 0x1c, 0x2a, 
-	0x99, 0x06, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0xfe, 
-	0x68, 0x36, 0xe0, 0x0b, 0x2f, 0x00, 0xdb, 0x01, 
-	0x2f, 0xbc, 0xdd, 0x02, 0x20, 0xba, 0xb0, 0x05, 
-	0xe7, 0xae, 0x1c, 0x3a, 0x99, 0x06, 0x1c, 0x20, 
-	0xf0, 0x00, 0xf8, 0xf0, 0x99, 0x06, 0x19, 0x49, 
-	0x91, 0x06, 0x1b, 0x7f, 0x1d, 0x31, 0x91, 0x00, 
-	0x99, 0x00, 0x78, 0x88, 0x19, 0x84, 0x98, 0x01, 
-	0x28, 0x00, 0xd0, 0x20, 0x99, 0x00, 0x78, 0xc8, 
-	0x23, 0x80, 0x40, 0x18, 0xd1, 0x1b, 0x1d, 0xf0, 
-	0x30, 0xb9, 0x1b, 0x05, 0x42, 0xbd, 0xdb, 0x01, 
-	0x3c, 0x01, 0xe0, 0x14, 0x1c, 0x68, 0x42, 0xb8, 
-	0xd1, 0x11, 0x99, 0x00, 0x78, 0x88, 0x28, 0x09, 
-	0xdd, 0x08, 0x99, 0x00, 0x79, 0x08, 0x30, 0x09, 
-	0x99, 0x00, 0x78, 0x89, 0x42, 0x88, 0xd0, 0x00, 
-	0x3c, 0x01, 0xe0, 0x04, 0x99, 0x00, 0x78, 0x88, 
-	0x28, 0x09, 0xd1, 0x00, 0x3c, 0x01, 0x20, 0x00, 
-	0x90, 0x01, 0x1d, 0xf0, 0x30, 0xb9, 0x1b, 0x05, 
-	0xb0, 0x01, 0xe7, 0xac, 0x20, 0x00, 0xb0, 0x04, 
-	0xe7, 0x72, 0xb0, 0x04, 0xe7, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5d, 0xc4, 
-	0xb5, 0xf1, 0x98, 0x00, 0x06, 0x04, 0x0e, 0x24, 
-	0xb0, 0x83, 0x00, 0xa0, 0x4b, 0x4c, 0x58, 0x1d, 
-	0x78, 0x28, 0x90, 0x02, 0x2c, 0x20, 0xdb, 0x05, 
-	0x20, 0xa2, 0xb0, 0x03, 0xb0, 0x01, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0xa0, 0x4b, 0x46, 
-	0x58, 0x18, 0x1c, 0x05, 0xd1, 0x02, 0x20, 0xb0, 
-	0xb0, 0x03, 0xe7, 0xf3, 0x00, 0xe0, 0x1b, 0x00, 
-	0x00, 0x80, 0x4b, 0x42, 0x68, 0x1b, 0x18, 0xc7, 
-	0x78, 0xa8, 0x28, 0x00, 0xd0, 0x63, 0x20, 0x00, 
-	0x42, 0x80, 0xd0, 0x20, 0x21, 0x00, 0x29, 0x20, 
-	0xdb, 0x04, 0xe0, 0x1b, 0x1c, 0x48, 0x06, 0x01, 
-	0x0e, 0x09, 0xe7, 0xf8, 0x00, 0x88, 0x4b, 0x3a, 
-	0x58, 0x18, 0x90, 0x01, 0x98, 0x01, 0x79, 0xc0, 
-	0x42, 0xa0, 0xd1, 0x0e, 0x20, 0x01, 0x40, 0x88, 
-	0x43, 0xc0, 0x4b, 0x36, 0x68, 0x1b, 0x40, 0x18, 
-	0x4b, 0x34, 0x60, 0x18, 0x23, 0x00, 0x00, 0x88, 
-	0x4e, 0x31, 0x50, 0x33, 0x23, 0xff, 0x48, 0x32, 
-	0x54, 0x43, 0xe7, 0xe3, 0xe0, 0x3f, 0x7e, 0x38, 
-	0x1c, 0x02, 0x28, 0xff, 0xd0, 0x10, 0x20, 0xff, 
-	0x4b, 0x2e, 0x54, 0x98, 0x23, 0x00, 0x00, 0x90, 
-	0x4e, 0x2d, 0x50, 0x33, 0x20, 0x01, 0x40, 0x90, 
-	0x43, 0xc0, 0x4b, 0x2c, 0x88, 0x1b, 0x40, 0x18, 
-	0x4b, 0x2a, 0x80, 0x18, 0x20, 0xff, 0x76, 0x38, 
-	0x7e, 0x78, 0x1c, 0x02, 0x28, 0xff, 0xd0, 0x11, 
-	0x20, 0xff, 0x4b, 0x24, 0x54, 0x98, 0x23, 0x00, 
-	0x00, 0x90, 0x4e, 0x23, 0x50, 0x33, 0x20, 0x01, 
-	0x40, 0x90, 0x43, 0xc0, 0x4b, 0x21, 0x88, 0x1b, 
-	0x40, 0x18, 0x4b, 0x20, 0x80, 0x18, 0x20, 0xff, 
-	0x76, 0x78, 0xe0, 0x02, 0x20, 0xb1, 0xb0, 0x03, 
-	0xe7, 0x98, 0x23, 0x00, 0x00, 0x90, 0x4e, 0x1a, 
-	0x50, 0x33, 0x20, 0x01, 0x40, 0x90, 0x43, 0xc0, 
-	0x4b, 0x18, 0x88, 0x1b, 0x40, 0x18, 0x4b, 0x17, 
-	0x80, 0x18, 0x4e, 0x17, 0x96, 0x00, 0x20, 0x00, 
-	0x00, 0x93, 0x9e, 0x00, 0x50, 0xf0, 0x98, 0x02, 
-	0x23, 0x20, 0x40, 0x18, 0xd0, 0xff, 0x21, 0x00, 
-	0x29, 0x0c, 0xdb, 0x04, 0xe0, 0x07, 0x1c, 0x48, 
-	0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x20, 0x00, 
-	0x18, 0x7b, 0x73, 0x18, 0xe7, 0xf7, 0x20, 0x00, 
-	0x83, 0x38, 0x20, 0x00, 0x70, 0xf8, 0x20, 0x00, 
-	0xb0, 0x03, 0xe7, 0x6f, 0xb0, 0x03, 0xe7, 0x6d, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5d, 0xc4, 
-	0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x5e, 0xdc, 
-	0x2e, 0x08, 0x5f, 0xa4, 0x2e, 0x08, 0x5f, 0xc4, 
-	0x2e, 0x08, 0x5f, 0x64, 0x2e, 0x08, 0x5e, 0xe0, 
-	0x9e, 0x00, 0x04, 0xb8, 0xb5, 0xf0, 0x1c, 0x05, 
-	0x1c, 0x0c, 0x1c, 0x17, 0x20, 0x1d, 0x02, 0x80, 
-	0x69, 0x86, 0x1c, 0x3a, 0x1c, 0x29, 0x1c, 0x20, 
-	0xf0, 0x08, 0xfb, 0x32, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0xb4, 0xf0, 0x1c, 0x01, 0xb0, 0x82, 
-	0x68, 0x48, 0x68, 0x8c, 0x1d, 0xe2, 0x32, 0xb7, 
-	0x42, 0x82, 0xd9, 0x09, 0x78, 0x42, 0x07, 0x12, 
-	0x0f, 0x12, 0x02, 0x12, 0x78, 0x83, 0x43, 0x1a, 
-	0x32, 0x03, 0x04, 0x17, 0x0c, 0x3f, 0xe0, 0x41, 
-	0xb0, 0x82, 0x68, 0x23, 0x93, 0x01, 0x9b, 0x01, 
-	0x33, 0x04, 0x93, 0x00, 0x9b, 0x00, 0x78, 0x9b, 
-	0x9e, 0x01, 0x19, 0x9a, 0x78, 0x4e, 0x00, 0xf3, 
-	0x1b, 0x9b, 0x00, 0x9b, 0x4e, 0x1b, 0x68, 0x36, 
-	0x19, 0x9b, 0x93, 0x02, 0x9b, 0x02, 0x78, 0x9d, 
-	0x06, 0xed, 0x0e, 0xed, 0x2d, 0x12, 0xd1, 0x0f, 
-	0x1d, 0xe3, 0x33, 0xb9, 0x68, 0x4e, 0x1b, 0x9b, 
-	0x06, 0x1b, 0x0e, 0x1b, 0x93, 0x03, 0x9b, 0x00, 
-	0x78, 0xde, 0x23, 0x80, 0x40, 0x33, 0xd1, 0x03, 
-	0x9b, 0x03, 0x2b, 0x0e, 0xda, 0x00, 0x3a, 0x01, 
-	0x1d, 0xe3, 0x33, 0xb8, 0x42, 0x83, 0xd9, 0x0b, 
-	0x78, 0x43, 0x07, 0x1b, 0x0f, 0x1b, 0x02, 0x1b, 
-	0x04, 0x1f, 0x0c, 0x3f, 0x78, 0x13, 0x18, 0xfb, 
-	0x33, 0x03, 0x04, 0x1f, 0x0c, 0x3f, 0xe0, 0x08, 
-	0x78, 0x13, 0x07, 0x1b, 0x0f, 0x1b, 0x02, 0x1b, 
-	0x78, 0x56, 0x43, 0x33, 0x33, 0x03, 0x04, 0x1f, 
-	0x0c, 0x3f, 0xb0, 0x02, 0x80, 0x4f, 0xb0, 0x02, 
-	0xbc, 0xf0, 0x47, 0x70, 0x2e, 0x08, 0x5d, 0xc4, 
-	0xb5, 0xf3, 0xb0, 0x81, 0x99, 0x02, 0x06, 0x0b, 
-	0x0e, 0x1b, 0x93, 0x00, 0x9b, 0x00, 0x2b, 0x00, 
-	0xd1, 0x0a, 0x49, 0x24, 0x4b, 0x24, 0x69, 0x1b, 
-	0x1c, 0x18, 0x4b, 0x23, 0x69, 0x5b, 0x1c, 0x1c, 
-	0x4b, 0x21, 0x6a, 0x1b, 0x1e, 0x5a, 0xe0, 0x09, 
-	0x49, 0x20, 0x4b, 0x1f, 0x69, 0x9b, 0x1c, 0x18, 
-	0x4b, 0x1d, 0x69, 0xdb, 0x1c, 0x1c, 0x4b, 0x1c, 
-	0x6a, 0x5b, 0x1e, 0x5a, 0x9b, 0x01, 0x78, 0xdd, 
-	0x26, 0x01, 0x40, 0xae, 0x1c, 0x37, 0x42, 0xa0, 
-	0xd0, 0x26, 0x00, 0x83, 0x18, 0x5d, 0x23, 0x01, 
-	0x02, 0x9b, 0x18, 0xeb, 0x68, 0x1b, 0x40, 0x3b, 
-	0xd0, 0x1b, 0x00, 0x83, 0x18, 0x5d, 0x23, 0x01, 
-	0x02, 0x9b, 0x18, 0xeb, 0x68, 0x1b, 0x43, 0xbb, 
-	0x1c, 0x1d, 0x00, 0x83, 0x18, 0x5e, 0x23, 0x01, 
-	0x02, 0x9b, 0x18, 0xf3, 0x60, 0x1d, 0x00, 0x83, 
-	0x18, 0x5d, 0x23, 0x01, 0x02, 0x9b, 0x18, 0xeb, 
-	0x68, 0x1b, 0x2b, 0x00, 0xd1, 0x05, 0x25, 0x00, 
-	0x18, 0x0e, 0x23, 0x01, 0x02, 0xdb, 0x18, 0xf3, 
-	0x70, 0x1d, 0x30, 0x01, 0x40, 0x10, 0xe7, 0xd6, 
-	0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x60, 0x90, 
-	0x9e, 0x00, 0x04, 0x80, 0x2e, 0x08, 0x69, 0x90, 
-	0xb4, 0x90, 0x1c, 0x03, 0x1c, 0x0c, 0x1c, 0x17, 
-	0x06, 0x21, 0x0e, 0x09, 0x06, 0x38, 0x0e, 0x00, 
-	0x72, 0x19, 0x28, 0x00, 0xd0, 0x00, 0x75, 0x58, 
-	0x68, 0x5b, 0x2b, 0x00, 0xd1, 0xf8, 0xbc, 0x90, 
-	0x47, 0x70, 0x00, 0x00, 0xb5, 0x80, 0x1c, 0x07, 
-	0x68, 0xf8, 0x28, 0x1f, 0xd9, 0x03, 0x20, 0xe1, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x1e, 
-	0x6d, 0x00, 0x68, 0x00, 0x4b, 0x1d, 0x40, 0x18, 
-	0x49, 0x1b, 0x6d, 0x09, 0x60, 0x08, 0x05, 0x80, 
-	0x48, 0x19, 0x6d, 0x00, 0x68, 0x00, 0x49, 0x18, 
-	0x6e, 0xc9, 0x60, 0x08, 0x48, 0x16, 0x6d, 0x00, 
-	0x68, 0x00, 0x23, 0x01, 0x02, 0x5b, 0x43, 0x18, 
-	0x49, 0x13, 0x6d, 0x09, 0x60, 0x08, 0x05, 0x80, 
-	0x48, 0x11, 0x6d, 0x00, 0x68, 0x00, 0x49, 0x10, 
-	0x6e, 0xc9, 0x60, 0x08, 0x48, 0x0e, 0x6f, 0xc1, 
-	0xcf, 0x09, 0xc1, 0x09, 0xcf, 0x09, 0xc1, 0x09, 
-	0xcf, 0x08, 0xc1, 0x08, 0xf0, 0x00, 0xfc, 0x1e, 
-	0x20, 0x00, 0x49, 0x09, 0x60, 0x08, 0x20, 0x00, 
-	0x49, 0x07, 0x60, 0x48, 0x20, 0x00, 0x49, 0x06, 
-	0x60, 0x88, 0x49, 0x07, 0x20, 0x0b, 0xf0, 0x0c, 
-	0xf9, 0xb5, 0x20, 0xff, 0x30, 0x01, 0x49, 0x02, 
-	0x61, 0xc8, 0x20, 0x00, 0xe7, 0xc0, 0xe7, 0xbf, 
-	0x2e, 0x08, 0x1f, 0x1c, 0xff, 0xff, 0xfd, 0xff, 
-	0x2e, 0x01, 0x09, 0x15, 0x1c, 0x01, 0x48, 0x0e, 
-	0x6f, 0x00, 0x68, 0x00, 0x60, 0x08, 0x48, 0x0c, 
-	0x6e, 0x80, 0x68, 0x00, 0x60, 0x48, 0x48, 0x0a, 
-	0x6e, 0xc0, 0x68, 0x00, 0x60, 0x88, 0x48, 0x08, 
-	0x6f, 0x40, 0x68, 0x00, 0x60, 0xc8, 0x48, 0x06, 
-	0x68, 0x00, 0x61, 0x08, 0x48, 0x04, 0x68, 0x40, 
-	0x61, 0x48, 0x48, 0x03, 0x68, 0x80, 0x61, 0x88, 
-	0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x00, 0x00, 
-	0x2e, 0x08, 0x1f, 0x1c, 0x48, 0x03, 0x6e, 0x80, 
-	0x68, 0x00, 0x07, 0x40, 0x0f, 0xc0, 0x47, 0x70, 
-	0xe7, 0xfd, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0x1c, 
-	0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x48, 0x37, 
-	0x69, 0xc0, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, 
-	0xd0, 0x02, 0x20, 0xe0, 0xbc, 0x80, 0x47, 0x70, 
-	0x48, 0x32, 0x62, 0x07, 0x20, 0x00, 0x49, 0x31, 
-	0x62, 0x48, 0x48, 0x31, 0x60, 0x02, 0x48, 0x30, 
-	0x68, 0x00, 0x78, 0x00, 0x49, 0x2d, 0x61, 0x88, 
-	0x48, 0x2d, 0x68, 0x00, 0x7a, 0x00, 0x49, 0x2b, 
-	0x61, 0x08, 0x48, 0x2b, 0x68, 0x00, 0x68, 0x40, 
-	0x49, 0x28, 0x60, 0xc8, 0x48, 0x27, 0x69, 0x80, 
-	0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x01, 0x48, 0x27, 
-	0xe0, 0x01, 0x20, 0x01, 0x02, 0x40, 0x49, 0x23, 
-	0x61, 0xc8, 0x48, 0x22, 0x68, 0x40, 0x30, 0x01, 
-	0x49, 0x20, 0x60, 0x48, 0x48, 0x1f, 0x6d, 0x40, 
-	0x68, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x49, 0x1d, 
-	0x69, 0x89, 0x08, 0x49, 0x06, 0x09, 0x0e, 0x09, 
-	0x43, 0x08, 0x49, 0x1a, 0x6d, 0x49, 0x60, 0x08, 
-	0x06, 0x00, 0x48, 0x18, 0x6d, 0x00, 0x68, 0x00, 
-	0x4b, 0x19, 0x40, 0x18, 0x49, 0x15, 0x69, 0x89, 
-	0x07, 0xc9, 0x0c, 0x49, 0x43, 0x08, 0x49, 0x13, 
-	0x6d, 0x09, 0x60, 0x08, 0x04, 0x40, 0x48, 0x11, 
-	0x6d, 0x00, 0x68, 0x00, 0x4b, 0x13, 0x40, 0x18, 
-	0x49, 0x0e, 0x6d, 0x09, 0x60, 0x08, 0x05, 0x40, 
-	0x48, 0x0c, 0x6d, 0x00, 0x68, 0x00, 0x23, 0x01, 
-	0x03, 0x1b, 0x43, 0x18, 0x49, 0x09, 0x6d, 0x09, 
-	0x60, 0x08, 0x04, 0xc0, 0x48, 0x07, 0x6d, 0x40, 
-	0x68, 0x00, 0x49, 0x06, 0x6f, 0x09, 0x60, 0x08, 
-	0x48, 0x04, 0x6d, 0x00, 0x68, 0x00, 0x49, 0x03, 
-	0x6e, 0xc9, 0x60, 0x08, 0x20, 0x00, 0xe7, 0x99, 
-	0xe7, 0x98, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0x1c, 
-	0x2e, 0x08, 0x60, 0x54, 0x00, 0x00, 0x02, 0x01, 
-	0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0xff, 
-	0xb5, 0x00, 0x48, 0xf6, 0x6e, 0x80, 0x68, 0x00, 
-	0x23, 0x08, 0x40, 0x18, 0xd0, 0x74, 0x48, 0xf3, 
-	0x6d, 0x00, 0x68, 0x00, 0x4b, 0xf2, 0x40, 0x18, 
-	0x49, 0xf0, 0x6d, 0x09, 0x60, 0x08, 0x04, 0x80, 
-	0x48, 0xee, 0x6e, 0x40, 0x68, 0x00, 0x0a, 0x00, 
-	0x02, 0x00, 0x49, 0xec, 0x6e, 0x49, 0x60, 0x08, 
-	0x06, 0x00, 0x48, 0xea, 0x6e, 0xc0, 0x68, 0x00, 
-	0x23, 0x01, 0x02, 0xdb, 0x40, 0x18, 0xd0, 0x3e, 
-	0x20, 0xff, 0x30, 0x01, 0x49, 0xe5, 0x61, 0xc8, 
-	0x48, 0xe4, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0xe5, 
-	0x40, 0x18, 0x49, 0xe2, 0x6d, 0x09, 0x60, 0x08, 
-	0x04, 0xc0, 0x48, 0xe0, 0x6f, 0xc0, 0x68, 0x80, 
-	0x68, 0x01, 0x02, 0x09, 0x0a, 0x09, 0x4a, 0xdd, 
-	0x6a, 0x52, 0x06, 0x12, 0x43, 0x11, 0x60, 0x01, 
-	0x48, 0xdd, 0x68, 0x00, 0x7a, 0x00, 0x49, 0xd9, 
-	0x69, 0x09, 0x1a, 0x41, 0x48, 0xd7, 0x6f, 0xc0, 
-	0x68, 0x80, 0x68, 0x02, 0x4b, 0xd9, 0x40, 0x1a, 
-	0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, 0x43, 0x11, 
-	0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, 0x48, 0xd1, 
-	0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x23, 0x04, 
-	0x43, 0x19, 0x60, 0x01, 0x07, 0x48, 0x48, 0xcd, 
-	0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, 0x40, 0x88, 
-	0xf0, 0x0c, 0xf8, 0x96, 0x48, 0xc9, 0x68, 0x00, 
-	0x30, 0x01, 0x49, 0xc8, 0x60, 0x08, 0x48, 0xc7, 
-	0x69, 0xc0, 0x4b, 0xcb, 0x42, 0x98, 0xd0, 0x73, 
-	0xdc, 0x08, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, 
-	0xd0, 0x6f, 0x23, 0x01, 0x02, 0x5b, 0x42, 0x98, 
-	0xd0, 0x07, 0xe2, 0xba, 0x4b, 0xc5, 0x42, 0x98, 
-	0xd0, 0x68, 0x4b, 0xc5, 0x42, 0x98, 0xd0, 0x66, 
-	0xe2, 0xb3, 0x48, 0xbc, 0x6e, 0x80, 0x68, 0x00, 
-	0x23, 0x01, 0x02, 0x5b, 0x40, 0x18, 0xe0, 0x00, 
-	0xe2, 0xcd, 0xd0, 0x3f, 0x48, 0xb7, 0x68, 0x00, 
-	0x30, 0x01, 0x49, 0xb6, 0x60, 0x08, 0x48, 0xb5, 
-	0x6d, 0x00, 0x68, 0x00, 0x4b, 0xb5, 0x40, 0x18, 
-	0x49, 0xb2, 0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, 
-	0x20, 0xff, 0x30, 0x01, 0x49, 0xaf, 0x61, 0xc8, 
-	0x48, 0xae, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 
-	0x02, 0x09, 0x0a, 0x09, 0x4a, 0xab, 0x6a, 0x52, 
-	0x06, 0x12, 0x43, 0x11, 0x60, 0x01, 0x48, 0xac, 
-	0x68, 0x00, 0x7a, 0x00, 0x49, 0xa7, 0x69, 0x09, 
-	0x1a, 0x41, 0x48, 0xa6, 0x6f, 0xc0, 0x68, 0x80, 
-	0x68, 0x02, 0x4b, 0xa8, 0x40, 0x1a, 0x04, 0x09, 
-	0x0c, 0x09, 0x02, 0x09, 0x43, 0x11, 0x60, 0x01, 
-	0x02, 0x08, 0x0c, 0x00, 0x48, 0x9f, 0x6f, 0xc0, 
-	0x68, 0x80, 0x68, 0x01, 0x23, 0x02, 0x43, 0x19, 
-	0x60, 0x01, 0x07, 0x88, 0x48, 0x9b, 0x6f, 0xc0, 
-	0x68, 0xc1, 0x20, 0x01, 0x40, 0x88, 0xf0, 0x0c, 
-	0xf8, 0x33, 0xe0, 0x5e, 0x48, 0x97, 0x69, 0x00, 
-	0x28, 0x00, 0xd0, 0x20, 0x48, 0x95, 0x69, 0x00, 
-	0x38, 0x01, 0x49, 0x94, 0x61, 0x08, 0x48, 0x93, 
-	0x68, 0xc0, 0x78, 0x00, 0x49, 0x91, 0x6c, 0x89, 
-	0x68, 0x09, 0x0a, 0x09, 0x02, 0x09, 0x43, 0x08, 
-	0x49, 0x8e, 0x6c, 0x89, 0x60, 0x08, 0x06, 0x00, 
-	0x0e, 0x00, 0x48, 0x8c, 0x68, 0xc0, 0xe0, 0x03, 
-	0xe1, 0x4b, 0xe2, 0x4d, 0xe0, 0x42, 0xe1, 0x93, 
-	0x30, 0x01, 0x49, 0x88, 0x60, 0xc8, 0x48, 0x8d, 
-	0x49, 0x86, 0x61, 0xc8, 0xe0, 0x39, 0x20, 0xff, 
-	0x30, 0x01, 0x49, 0x84, 0x61, 0xc8, 0x48, 0x83, 
-	0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x02, 0x09, 
-	0x0a, 0x09, 0x4a, 0x80, 0x6a, 0x52, 0x06, 0x12, 
-	0x43, 0x11, 0x60, 0x01, 0x48, 0x80, 0x68, 0x00, 
-	0x7a, 0x00, 0x49, 0x7c, 0x69, 0x09, 0x1a, 0x41, 
-	0x48, 0x7a, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, 
-	0x4b, 0x7c, 0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, 
-	0x02, 0x09, 0x43, 0x11, 0x60, 0x01, 0x02, 0x08, 
-	0x0c, 0x00, 0x48, 0x74, 0x6f, 0xc0, 0x68, 0x80, 
-	0x68, 0x01, 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 
-	0x07, 0xc8, 0x48, 0x70, 0x6f, 0xc0, 0x68, 0xc1, 
-	0x20, 0x01, 0x40, 0x88, 0xf0, 0x0b, 0xff, 0xdc, 
-	0x48, 0x6c, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x6d, 
-	0x40, 0x18, 0x49, 0x6a, 0x6d, 0x09, 0x60, 0x08, 
-	0x04, 0xc0, 0xe2, 0x08, 0x48, 0x67, 0x69, 0x00, 
-	0x28, 0x00, 0xd0, 0x5f, 0x48, 0x65, 0x6e, 0x80, 
-	0x68, 0x00, 0x23, 0xff, 0x33, 0x01, 0x40, 0x18, 
-	0xd0, 0x3f, 0x48, 0x62, 0x68, 0x00, 0x30, 0x01, 
-	0x49, 0x60, 0x60, 0x08, 0x48, 0x5f, 0x6d, 0x00, 
-	0x68, 0x00, 0x4b, 0x60, 0x40, 0x18, 0x49, 0x5d, 
-	0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, 0x20, 0xff, 
-	0x30, 0x01, 0x49, 0x5a, 0x61, 0xc8, 0x48, 0x59, 
-	0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x02, 0x09, 
-	0x0a, 0x09, 0x4a, 0x56, 0x6a, 0x52, 0x06, 0x12, 
-	0x43, 0x11, 0x60, 0x01, 0x48, 0x56, 0x68, 0x00, 
-	0x7a, 0x00, 0x49, 0x52, 0x69, 0x09, 0x1a, 0x41, 
-	0x48, 0x50, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, 
-	0x4b, 0x52, 0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, 
-	0x02, 0x09, 0x43, 0x11, 0x60, 0x01, 0x02, 0x08, 
-	0x0c, 0x00, 0x48, 0x4a, 0x6f, 0xc0, 0x68, 0x80, 
-	0x68, 0x01, 0x23, 0x02, 0x43, 0x19, 0x60, 0x01, 
-	0x07, 0x88, 0x48, 0x46, 0x6f, 0xc0, 0x68, 0xc1, 
-	0x20, 0x01, 0x40, 0x88, 0xf0, 0x0b, 0xff, 0x88, 
-	0xe0, 0x17, 0x48, 0x42, 0x68, 0xc0, 0x78, 0x00, 
-	0x49, 0x40, 0x6c, 0x89, 0x68, 0x09, 0x0a, 0x09, 
-	0x02, 0x09, 0x43, 0x08, 0x49, 0x3d, 0x6c, 0x89, 
-	0x60, 0x08, 0x06, 0x00, 0x0e, 0x00, 0x48, 0x3b, 
-	0x68, 0xc0, 0x30, 0x01, 0x49, 0x39, 0x60, 0xc8, 
-	0x48, 0x38, 0x69, 0x00, 0x38, 0x01, 0x49, 0x37, 
-	0x61, 0x08, 0xe0, 0xa1, 0x48, 0x35, 0x6a, 0x00, 
-	0x38, 0x01, 0x49, 0x34, 0x62, 0x08, 0x48, 0x33, 
-	0x6a, 0x00, 0x28, 0x00, 0xd0, 0x4b, 0x48, 0x31, 
-	0x6a, 0x40, 0x30, 0x01, 0x49, 0x2f, 0x62, 0x48, 
-	0x48, 0x31, 0x68, 0x00, 0x30, 0x0c, 0x49, 0x30, 
-	0x60, 0x08, 0x48, 0x2f, 0x68, 0x00, 0x78, 0x00, 
-	0x49, 0x2a, 0x61, 0x88, 0x48, 0x2c, 0x68, 0x00, 
-	0x7a, 0x00, 0x49, 0x28, 0x61, 0x08, 0x48, 0x2a, 
-	0x68, 0x00, 0x68, 0x40, 0x49, 0x25, 0x60, 0xc8, 
-	0x48, 0x24, 0x69, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 
-	0xd0, 0x01, 0x48, 0x27, 0xe0, 0x01, 0x20, 0x01, 
-	0x02, 0x40, 0x49, 0x20, 0x61, 0xc8, 0x48, 0x1f, 
-	0x6d, 0x00, 0x68, 0x00, 0x23, 0x01, 0x03, 0x5b, 
-	0x43, 0x18, 0x49, 0x1c, 0x6d, 0x09, 0x60, 0x08, 
-	0x04, 0x80, 0x48, 0x1a, 0x6d, 0x40, 0x68, 0x00, 
-	0x0a, 0x00, 0x02, 0x00, 0x49, 0x17, 0x69, 0x89, 
-	0x08, 0x49, 0x06, 0x09, 0x0e, 0x09, 0x43, 0x08, 
-	0x49, 0x14, 0x6d, 0x49, 0x60, 0x08, 0x06, 0x00, 
-	0x48, 0x12, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x19, 
-	0x40, 0x18, 0x49, 0x10, 0x69, 0x89, 0x07, 0xc9, 
-	0x0c, 0x49, 0x43, 0x08, 0x49, 0x0d, 0x6d, 0x09, 
-	0x60, 0x08, 0x04, 0x40, 0xe0, 0x4c, 0x20, 0xff, 
-	0x30, 0x01, 0x49, 0x0a, 0x61, 0xc8, 0x48, 0x09, 
-	0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x02, 0x09, 
-	0x0a, 0x09, 0x4a, 0x06, 0x6a, 0x52, 0x06, 0x12, 
-	0x43, 0x11, 0x60, 0x01, 0x48, 0x06, 0x68, 0x00, 
-	0x7a, 0x00, 0x49, 0x02, 0x69, 0x09, 0x1a, 0x41, 
-	0x48, 0x00, 0xe0, 0x11, 0x2e, 0x08, 0x1f, 0x1c, 
-	0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xef, 0xff, 
-	0x2e, 0x08, 0x60, 0x54, 0xff, 0x00, 0x00, 0xff, 
-	0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x02, 0x02, 
-	0x00, 0x00, 0x02, 0x03, 0xff, 0xff, 0xbf, 0xff, 
-	0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, 0x4b, 0xa5, 
-	0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, 
-	0x43, 0x11, 0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, 
-	0x48, 0xa1, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 
-	0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 0x07, 0xc8, 
-	0x48, 0x9d, 0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, 
-	0x40, 0x88, 0xf0, 0x0b, 0xfe, 0xd5, 0x48, 0x9a, 
-	0x6d, 0x00, 0x68, 0x00, 0x4b, 0x99, 0x40, 0x18, 
-	0x49, 0x97, 0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, 
-	0xe1, 0x01, 0x48, 0x95, 0x6e, 0x80, 0x68, 0x00, 
-	0x23, 0x01, 0x02, 0x5b, 0x40, 0x18, 0xd0, 0x3f, 
-	0x48, 0x91, 0x68, 0x00, 0x30, 0x01, 0x49, 0x90, 
-	0x60, 0x08, 0x48, 0x8f, 0x6d, 0x00, 0x68, 0x00, 
-	0x4b, 0x8e, 0x40, 0x18, 0x49, 0x8c, 0x6d, 0x09, 
-	0x60, 0x08, 0x04, 0xc0, 0x20, 0xff, 0x30, 0x01, 
-	0x49, 0x89, 0x61, 0xc8, 0x48, 0x88, 0x6f, 0xc0, 
-	0x68, 0x80, 0x68, 0x01, 0x02, 0x09, 0x0a, 0x09, 
-	0x4a, 0x85, 0x6a, 0x52, 0x06, 0x12, 0x43, 0x11, 
-	0x60, 0x01, 0x48, 0x85, 0x68, 0x00, 0x7a, 0x00, 
-	0x49, 0x81, 0x69, 0x09, 0x1a, 0x41, 0x48, 0x80, 
-	0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, 0x4b, 0x7d, 
-	0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, 
-	0x43, 0x11, 0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, 
-	0x48, 0x79, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 
-	0x23, 0x02, 0x43, 0x19, 0x60, 0x01, 0x07, 0x88, 
-	0x48, 0x75, 0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, 
-	0x40, 0x88, 0xf0, 0x0b, 0xfe, 0x85, 0xe0, 0x02, 
-	0x48, 0x74, 0x49, 0x71, 0x61, 0xc8, 0xe0, 0xb6, 
-	0x48, 0x6f, 0x69, 0x00, 0x28, 0x00, 0xd0, 0x62, 
-	0x48, 0x6d, 0x6e, 0x00, 0x68, 0x00, 0x49, 0x6c, 
-	0x68, 0xc9, 0x70, 0x08, 0x48, 0x6a, 0x68, 0xc0, 
-	0x30, 0x01, 0x49, 0x69, 0x60, 0xc8, 0x48, 0x68, 
-	0x69, 0x00, 0x38, 0x01, 0x49, 0x66, 0x61, 0x08, 
-	0x48, 0x65, 0x69, 0x00, 0x28, 0x00, 0xd1, 0x4d, 
-	0x48, 0x63, 0x6a, 0x00, 0x28, 0x01, 0xd1, 0x49, 
-	0x48, 0x63, 0x68, 0x00, 0x7a, 0x40, 0x49, 0x60, 
-	0x6d, 0x09, 0x68, 0x09, 0x4b, 0x62, 0x40, 0x19, 
-	0x07, 0xc0, 0x0d, 0x40, 0x43, 0x08, 0x49, 0x5c, 
-	0x6d, 0x09, 0x60, 0x08, 0x05, 0x40, 0x0f, 0xc0, 
-	0x20, 0xff, 0x30, 0x01, 0x49, 0x58, 0x61, 0xc8, 
-	0x48, 0x57, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x57, 
-	0x40, 0x18, 0x49, 0x55, 0x6d, 0x09, 0x60, 0x08, 
-	0x04, 0xc0, 0x48, 0x53, 0x6f, 0xc0, 0x68, 0x80, 
-	0x68, 0x01, 0x02, 0x09, 0x0a, 0x09, 0x4a, 0x50, 
-	0x6a, 0x52, 0x06, 0x12, 0x43, 0x11, 0x60, 0x01, 
-	0x48, 0x4f, 0x68, 0x00, 0x7a, 0x00, 0x49, 0x4c, 
-	0x69, 0x09, 0x1a, 0x41, 0x48, 0x4a, 0x6f, 0xc0, 
-	0x68, 0x80, 0x68, 0x02, 0x4b, 0x47, 0x40, 0x1a, 
-	0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, 0x43, 0x11, 
-	0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, 0x48, 0x44, 
-	0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x23, 0x01, 
-	0x43, 0x19, 0x60, 0x01, 0x07, 0xc8, 0x48, 0x40, 
-	0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, 0x40, 0x88, 
-	0xf0, 0x0b, 0xfe, 0x1a, 0xe0, 0x4f, 0x48, 0x3c, 
-	0x6a, 0x00, 0x38, 0x01, 0x49, 0x3a, 0x62, 0x08, 
-	0x48, 0x39, 0x6a, 0x40, 0x30, 0x01, 0x49, 0x38, 
-	0x62, 0x48, 0x48, 0x39, 0x68, 0x00, 0x30, 0x0c, 
-	0x49, 0x37, 0x60, 0x08, 0x48, 0x36, 0x68, 0x00, 
-	0x78, 0x00, 0x49, 0x33, 0x61, 0x88, 0x48, 0x34, 
-	0x68, 0x00, 0x7a, 0x00, 0x49, 0x30, 0x61, 0x08, 
-	0x48, 0x31, 0x68, 0x00, 0x68, 0x40, 0x49, 0x2e, 
-	0x60, 0xc8, 0x48, 0x2d, 0x69, 0x80, 0x07, 0xc0, 
-	0x0f, 0xc0, 0xd0, 0x01, 0x48, 0x2f, 0xe0, 0x01, 
-	0x20, 0x01, 0x02, 0x40, 0x49, 0x28, 0x61, 0xc8, 
-	0x48, 0x27, 0x6d, 0x00, 0x68, 0x00, 0x23, 0x01, 
-	0x03, 0x5b, 0x43, 0x18, 0x49, 0x24, 0x6d, 0x09, 
-	0x60, 0x08, 0x04, 0x80, 0x48, 0x22, 0x6d, 0x40, 
-	0x68, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x49, 0x20, 
-	0x69, 0x89, 0x08, 0x49, 0x06, 0x09, 0x0e, 0x09, 
-	0x43, 0x08, 0x49, 0x1d, 0x6d, 0x49, 0x60, 0x08, 
-	0x06, 0x00, 0x48, 0x1b, 0x6d, 0x00, 0x68, 0x00, 
-	0x4b, 0x1f, 0x40, 0x18, 0x49, 0x18, 0x69, 0x89, 
-	0x07, 0xc9, 0x0c, 0x49, 0x43, 0x08, 0x49, 0x16, 
-	0x6d, 0x09, 0x60, 0x08, 0x04, 0x40, 0xe0, 0x01, 
-	0xe0, 0x00, 0xe7, 0xff, 0x48, 0x12, 0x6c, 0x80, 
-	0x68, 0x00, 0x49, 0x11, 0x6e, 0x49, 0x60, 0x08, 
-	0x48, 0x0f, 0x6d, 0x40, 0x68, 0x00, 0x49, 0x0e, 
-	0x6f, 0x09, 0x60, 0x08, 0x48, 0x0c, 0x6d, 0x00, 
-	0x68, 0x00, 0x49, 0x0b, 0x6e, 0xc9, 0x60, 0x08, 
-	0x48, 0x09, 0x6c, 0xc0, 0x68, 0x00, 0x23, 0x08, 
-	0x43, 0x18, 0x49, 0x07, 0x6c, 0xc9, 0x60, 0x08, 
-	0x07, 0x00, 0x48, 0x05, 0x6c, 0xc0, 0x68, 0x00, 
-	0x49, 0x03, 0x6e, 0x89, 0x60, 0x08, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 
-	0x2e, 0x08, 0x1f, 0x1c, 0xff, 0xff, 0xef, 0xff, 
-	0x2e, 0x08, 0x60, 0x54, 0x00, 0x00, 0x02, 0x03, 
-	0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0x02, 0x01, 
-	0xff, 0xff, 0xbf, 0xff, 0xb4, 0x80, 0x49, 0x2e, 
-	0x20, 0x00, 0x28, 0x08, 0xd3, 0x04, 0xe0, 0x06, 
-	0x1c, 0x42, 0x06, 0x10, 0x0e, 0x00, 0xe7, 0xf8, 
-	0x23, 0x00, 0xc1, 0x08, 0xe7, 0xf8, 0x4a, 0x29, 
-	0x6f, 0xd2, 0x68, 0x12, 0x4b, 0x27, 0x6d, 0x9b, 
-	0x68, 0x1b, 0x0a, 0x1b, 0x02, 0x1b, 0x06, 0x12, 
-	0x0e, 0x12, 0x43, 0x1a, 0x4b, 0x23, 0x6d, 0x9b, 
-	0x60, 0x1a, 0x06, 0x12, 0x0e, 0x12, 0x4a, 0x21, 
-	0x6f, 0xd2, 0x68, 0x52, 0x4b, 0x1f, 0x6d, 0x1b, 
-	0x68, 0x1f, 0x23, 0x01, 0x03, 0xdb, 0x43, 0x9f, 
-	0x1c, 0x3b, 0x07, 0xd2, 0x0c, 0x12, 0x43, 0x1a, 
-	0x4b, 0x1a, 0x6d, 0x1b, 0x60, 0x1a, 0x04, 0x12, 
-	0x0f, 0xd2, 0x4a, 0x18, 0x6f, 0xd2, 0x69, 0x12, 
-	0x4b, 0x16, 0x6d, 0xdb, 0x68, 0x1b, 0x0c, 0x1b, 
-	0x04, 0x1b, 0x04, 0x12, 0x0c, 0x12, 0x43, 0x1a, 
-	0x4b, 0x12, 0x6d, 0xdb, 0x60, 0x1a, 0x04, 0x12, 
-	0x0c, 0x12, 0x4a, 0x10, 0x6d, 0x12, 0x68, 0x12, 
-	0x23, 0x01, 0x02, 0x5b, 0x43, 0x1a, 0x4b, 0x0d, 
-	0x6d, 0x1b, 0x60, 0x1a, 0x05, 0x92, 0x4a, 0x0b, 
-	0x6d, 0x12, 0x68, 0x12, 0x4b, 0x09, 0x6e, 0xdb, 
-	0x60, 0x1a, 0x4a, 0x08, 0x6d, 0x92, 0x68, 0x12, 
-	0x4b, 0x06, 0x6f, 0x5b, 0x60, 0x1a, 0x4a, 0x05, 
-	0x6d, 0xd2, 0x68, 0x12, 0x4b, 0x03, 0x6f, 0x9b, 
-	0x60, 0x1a, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x1f, 0x44, 0x2e, 0x08, 0x1f, 0x1c, 
-	0xb5, 0x90, 0x1c, 0x07, 0x1c, 0x0c, 0x2f, 0x22, 
-	0xd1, 0x07, 0x2c, 0x3f, 0xd8, 0x01, 0x2c, 0x01, 
-	0xd2, 0x03, 0x20, 0x38, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0x01, 0x49, 0x13, 0x70, 0x08, 
-	0x23, 0x01, 0x03, 0xdb, 0x42, 0x9f, 0xd0, 0x02, 
-	0x4b, 0x11, 0x42, 0x9f, 0xd1, 0x04, 0x48, 0x11, 
-	0x60, 0x07, 0x20, 0x00, 0xe7, 0xee, 0xe0, 0x18, 
-	0x2f, 0xff, 0xd1, 0x0b, 0x21, 0x00, 0x43, 0xc9, 
-	0x20, 0x0d, 0xf0, 0x00, 0xf8, 0x1d, 0x48, 0x0c, 
-	0x68, 0x01, 0x48, 0x0c, 0x68, 0x00, 0xf0, 0x00, 
-	0xf8, 0x43, 0xe0, 0x07, 0x1c, 0x21, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf8, 0x3e, 0x48, 0x07, 0x60, 0x07, 
-	0x48, 0x05, 0x60, 0x04, 0x20, 0x00, 0xe7, 0xd5, 
-	0xe7, 0xd4, 0xe7, 0xd3, 0x2e, 0x08, 0x60, 0x7c, 
-	0x00, 0x00, 0x80, 0x0f, 0xcc, 0x00, 0x05, 0x00, 
-	0x2e, 0x08, 0x60, 0x78, 0x2e, 0x08, 0x1f, 0x9c, 
-	0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0a, 0x4b, 0x13, 
-	0x68, 0x5b, 0x1c, 0x18, 0x21, 0x00, 0x29, 0x02, 
-	0xdb, 0x04, 0xe0, 0x1a, 0x1c, 0x4b, 0x06, 0x19, 
-	0x0e, 0x09, 0xe7, 0xf8, 0x23, 0x0d, 0x06, 0x9b, 
-	0x1a, 0xc4, 0x29, 0x00, 0xd1, 0x01, 0x60, 0x27, 
-	0xe0, 0x05, 0x23, 0x01, 0x42, 0xda, 0xd0, 0x01, 
-	0x60, 0x22, 0xe0, 0x00, 0xe0, 0x09, 0x1d, 0x05, 
-	0x23, 0x05, 0x02, 0x1b, 0x42, 0x9d, 0xdb, 0x02, 
-	0x20, 0x01, 0x02, 0x80, 0xe0, 0x00, 0x30, 0x04, 
-	0xe7, 0xe4, 0x4b, 0x02, 0x60, 0x58, 0xbc, 0xb0, 
-	0x47, 0x70, 0x00, 0x00, 0xcc, 0x00, 0x0f, 0x00, 
-	0xb5, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0x05, 0x20, 
-	0x0d, 0x00, 0x23, 0xff, 0x33, 0x04, 0x42, 0x98, 
-	0xd0, 0x50, 0xdc, 0x18, 0x28, 0x10, 0xd0, 0x2d, 
-	0xdc, 0x08, 0x28, 0x01, 0xd0, 0x23, 0x28, 0x02, 
-	0xd0, 0x1e, 0x28, 0x04, 0xd0, 0x1f, 0x28, 0x08, 
-	0xd0, 0x1d, 0xe0, 0x76, 0x28, 0x12, 0xd0, 0x1d, 
-	0x28, 0x22, 0xd0, 0x3a, 0x23, 0xff, 0x33, 0x02, 
-	0x42, 0x98, 0xd0, 0x24, 0x23, 0xff, 0x33, 0x03, 
-	0x42, 0x98, 0xd0, 0x29, 0xe0, 0x69, 0x38, 0xff, 
-	0x38, 0x05, 0x28, 0x08, 0xd2, 0x65, 0xa3, 0x02, 
-	0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x35, 0x3c, 0x41, 0x4f, 0x56, 0x4b, 0x5d, 0x46, 
-	0x20, 0x00, 0x49, 0x32, 0x63, 0x48, 0x48, 0x31, 
-	0x62, 0x04, 0xe0, 0x5c, 0x20, 0x01, 0x49, 0x2f, 
-	0x63, 0x48, 0xe0, 0x58, 0x20, 0x00, 0x49, 0x2e, 
-	0x67, 0x08, 0x21, 0x00, 0x43, 0xc9, 0x20, 0x10, 
-	0xf7, 0xff, 0xff, 0x92, 0xe0, 0x4f, 0x20, 0x01, 
-	0x49, 0x29, 0x67, 0x08, 0x21, 0x00, 0x43, 0xc9, 
-	0x20, 0x10, 0xf7, 0xff, 0xff, 0x89, 0xe0, 0x46, 
-	0x20, 0x02, 0x49, 0x25, 0x67, 0x08, 0x21, 0x00, 
-	0x43, 0xc9, 0x20, 0x10, 0xf7, 0xff, 0xff, 0x80, 
-	0xe0, 0x3d, 0x1c, 0x39, 0x20, 0x22, 0xf7, 0xff, 
-	0xff, 0x7b, 0xe0, 0x38, 0x48, 0x1e, 0x65, 0xc7, 
-	0x21, 0x01, 0x20, 0x35, 0xf7, 0xff, 0xff, 0x74, 
-	0xe0, 0x31, 0x48, 0x1b, 0x65, 0xc7, 0x21, 0x02, 
-	0x20, 0x35, 0xf7, 0xff, 0xff, 0x6d, 0xe0, 0x2a, 
-	0x21, 0x00, 0x20, 0x35, 0xf7, 0xff, 0xff, 0x68, 
-	0xe0, 0x25, 0x21, 0x03, 0x20, 0x35, 0xf7, 0xff, 
-	0xff, 0x63, 0xe0, 0x20, 0x21, 0x04, 0x20, 0x35, 
-	0xf7, 0xff, 0xff, 0x5e, 0xe0, 0x1b, 0x20, 0x00, 
-	0x49, 0x0f, 0x65, 0xc8, 0xe0, 0x17, 0x48, 0x0e, 
-	0x66, 0x07, 0x21, 0x01, 0x20, 0x36, 0xf7, 0xff, 
-	0xff, 0x53, 0xe0, 0x10, 0x48, 0x0a, 0x66, 0x07, 
-	0x21, 0x02, 0x20, 0x36, 0xf7, 0xff, 0xff, 0x4c, 
-	0xe0, 0x09, 0x20, 0x00, 0x49, 0x06, 0x66, 0x08, 
-	0xe0, 0x05, 0x1c, 0x20, 0x21, 0x00, 0x43, 0xc9, 
-	0xf7, 0xff, 0xff, 0x42, 0xe7, 0xff, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0xcc, 0x00, 0x0f, 0x80, 
-	0xcc, 0x00, 0x05, 0x00, 0xb4, 0xb0, 0x1c, 0x04, 
-	0x1c, 0x0f, 0x1c, 0x13, 0x06, 0x38, 0x0e, 0x00, 
-	0x06, 0x19, 0x0e, 0x09, 0x29, 0x01, 0xd0, 0x08, 
-	0x22, 0x00, 0x4d, 0x09, 0x60, 0x2a, 0x22, 0x00, 
-	0x43, 0xd2, 0x4d, 0x08, 0x68, 0x2d, 0x60, 0x2a, 
-	0xe0, 0x08, 0x4a, 0x07, 0x68, 0x12, 0x60, 0x14, 
-	0x4a, 0x04, 0x68, 0x12, 0x60, 0x10, 0x22, 0x01, 
-	0x4d, 0x01, 0x60, 0x2a, 0xbc, 0xb0, 0x47, 0x70, 
-	0xcc, 0x00, 0x0d, 0x00, 0x2e, 0x08, 0x60, 0x70, 
-	0x2e, 0x08, 0x60, 0x6c, 0xb5, 0xf3, 0xb0, 0x81, 
-	0x99, 0x02, 0x06, 0x08, 0x16, 0x00, 0x90, 0x00, 
-	0xb0, 0x85, 0x20, 0x00, 0x90, 0x01, 0x9c, 0x06, 
-	0x1d, 0xe6, 0x36, 0x05, 0xcc, 0x20, 0x07, 0xa8, 
-	0x0f, 0x80, 0x06, 0x00, 0x16, 0x00, 0x90, 0x00, 
-	0x08, 0xad, 0x3d, 0x03, 0xcc, 0x80, 0x08, 0xb8, 
-	0x00, 0x80, 0x19, 0x86, 0xcc, 0x02, 0x91, 0x04, 
-	0x99, 0x04, 0x08, 0x89, 0x91, 0x04, 0x20, 0x03, 
-	0x05, 0x80, 0x21, 0x35, 0x06, 0x49, 0x60, 0x08, 
-	0x48, 0x46, 0x68, 0x01, 0x08, 0x89, 0x00, 0x89, 
-	0x60, 0x01, 0x48, 0x45, 0x90, 0x03, 0x20, 0x00, 
-	0x90, 0x02, 0x98, 0x02, 0x42, 0xa8, 0xd3, 0x04, 
-	0xe0, 0x08, 0x98, 0x02, 0x30, 0x01, 0x90, 0x02, 
-	0xe7, 0xf7, 0xcc, 0x02, 0x98, 0x03, 0xc0, 0x02, 
-	0x90, 0x03, 0xe7, 0xf6, 0x98, 0x00, 0x28, 0x00, 
-	0xd0, 0x03, 0xcc, 0x02, 0x98, 0x03, 0xc0, 0x02, 
-	0x90, 0x03, 0x20, 0x00, 0x49, 0x39, 0x65, 0x88, 
-	0x9f, 0x04, 0x2f, 0x00, 0xd8, 0x02, 0xe0, 0x05, 
-	0x3f, 0x01, 0xe7, 0xfa, 0xce, 0x02, 0x48, 0x35, 
-	0x64, 0x81, 0xe7, 0xf9, 0x20, 0x00, 0x49, 0x34, 
-	0x60, 0x48, 0x20, 0x00, 0x21, 0x35, 0x06, 0x49, 
-	0x60, 0x08, 0x20, 0x00, 0x49, 0x2f, 0x66, 0x88, 
-	0x20, 0x00, 0x21, 0x35, 0x06, 0x49, 0x61, 0x88, 
-	0x20, 0x01, 0x49, 0x2c, 0x64, 0xc8, 0x48, 0x2c, 
-	0x68, 0x40, 0x28, 0x00, 0xd1, 0x0e, 0x27, 0x00, 
-	0x2f, 0x64, 0xd3, 0x02, 0xe0, 0x02, 0x37, 0x01, 
-	0xe7, 0xfa, 0xe7, 0xfc, 0x98, 0x01, 0x1c, 0x41, 
-	0x91, 0x01, 0x4b, 0x26, 0x42, 0x98, 0xdb, 0x00, 
-	0xe0, 0x00, 0xe7, 0xec, 0x48, 0x24, 0x68, 0x01, 
-	0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 0x48, 0x23, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x03, 0x48, 0x21, 
-	0x68, 0x40, 0x28, 0x00, 0xd1, 0x0b, 0x48, 0x20, 
-	0x68, 0x40, 0x4b, 0x19, 0x18, 0xc0, 0x49, 0x1d, 
-	0x60, 0x08, 0x48, 0x1d, 0x68, 0x80, 0x4b, 0x16, 
-	0x18, 0xc0, 0x49, 0x1a, 0x60, 0x48, 0x48, 0x19, 
-	0x68, 0x00, 0x21, 0x33, 0x06, 0x49, 0x65, 0x48, 
-	0x48, 0x16, 0x68, 0x40, 0x21, 0x33, 0x06, 0x49, 
-	0x65, 0x88, 0x48, 0x14, 0x68, 0x40, 0x21, 0x33, 
-	0x06, 0x49, 0x66, 0x88, 0x48, 0x11, 0x68, 0x00, 
-	0x21, 0x33, 0x06, 0x49, 0x66, 0x48, 0x20, 0x03, 
-	0x21, 0x33, 0x06, 0x49, 0x67, 0x08, 0x20, 0x00, 
-	0x49, 0x0e, 0x68, 0x09, 0x70, 0x08, 0x21, 0x00, 
-	0x20, 0x0d, 0xf7, 0xff, 0xfe, 0x2d, 0xb0, 0x05, 
-	0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x66, 0x00, 0x00, 0x70, 
-	0xcc, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x80, 
-	0xcc, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x27, 0x10, 
-	0x6a, 0x00, 0x00, 0x10, 0x2e, 0x08, 0x7c, 0x1c, 
-	0xcc, 0x00, 0x0f, 0x80, 0x2e, 0x08, 0x94, 0xa4, 
-	0x1c, 0x01, 0xb0, 0x81, 0x48, 0x27, 0x22, 0x00, 
-	0x92, 0x00, 0x9a, 0x00, 0x2a, 0x16, 0xdb, 0x04, 
-	0xe0, 0x09, 0x9a, 0x00, 0x32, 0x01, 0x92, 0x00, 
-	0xe7, 0xf7, 0x68, 0x02, 0x9b, 0x00, 0x00, 0x9b, 
-	0x50, 0xca, 0x30, 0x04, 0xe7, 0xf5, 0x48, 0x20, 
-	0x22, 0x00, 0x92, 0x00, 0x9a, 0x00, 0x2a, 0x0b, 
-	0xdb, 0x04, 0xe0, 0x0a, 0x9a, 0x00, 0x32, 0x01, 
-	0x92, 0x00, 0xe7, 0xf7, 0x68, 0x03, 0x9a, 0x00, 
-	0x00, 0x92, 0x18, 0x52, 0x65, 0x93, 0x30, 0x04, 
-	0xe7, 0xf4, 0x48, 0x18, 0x22, 0x00, 0x92, 0x00, 
-	0x9a, 0x00, 0x2a, 0x11, 0xdb, 0x04, 0xe0, 0x0b, 
-	0x9a, 0x00, 0x32, 0x01, 0x92, 0x00, 0xe7, 0xf7, 
-	0x68, 0x03, 0x9a, 0x00, 0x00, 0x92, 0x18, 0x52, 
-	0x32, 0x80, 0x60, 0x53, 0x30, 0x04, 0xe7, 0xf3, 
-	0x48, 0x0f, 0x22, 0x02, 0x92, 0x00, 0x9a, 0x00, 
-	0x2a, 0x05, 0xdb, 0x04, 0xe0, 0x0b, 0x9a, 0x00, 
-	0x32, 0x01, 0x92, 0x00, 0xe7, 0xf7, 0x68, 0x02, 
-	0x9b, 0x00, 0x00, 0x9b, 0x18, 0x5b, 0x33, 0x80, 
-	0x60, 0x5a, 0x30, 0x04, 0xe7, 0xf3, 0x4a, 0x07, 
-	0x6c, 0x12, 0x1d, 0xcb, 0x33, 0x79, 0x61, 0xda, 
-	0xb0, 0x01, 0x47, 0x70, 0xcc, 0x00, 0x05, 0x20, 
-	0xcc, 0x00, 0x0c, 0x00, 0xcc, 0x00, 0x0c, 0x5c, 
-	0xcc, 0x00, 0x0c, 0xa0, 0xcc, 0x00, 0x0c, 0x80, 
-	0xb4, 0xf0, 0x1c, 0x06, 0x1c, 0x0f, 0x1c, 0x14, 
-	0x1c, 0x1d, 0x06, 0x29, 0x0e, 0x09, 0x2c, 0x1f, 
-	0xdb, 0x02, 0x20, 0xaf, 0xbc, 0xf0, 0x47, 0x70, 
-	0x4b, 0x0b, 0x40, 0x1f, 0x48, 0x0b, 0x68, 0x00, 
-	0x60, 0x06, 0x29, 0x01, 0xd1, 0x07, 0x48, 0x0a, 
-	0x68, 0x02, 0x43, 0x3a, 0x60, 0x02, 0x20, 0x80, 
-	0x6e, 0x00, 0x60, 0x04, 0xe0, 0x05, 0x29, 0x02, 
-	0xd1, 0x03, 0x48, 0x05, 0x68, 0x02, 0x43, 0xba, 
-	0x60, 0x02, 0x20, 0x00, 0xe7, 0xe6, 0xe7, 0xe5, 
-	0xff, 0xff, 0xf8, 0xff, 0x2e, 0x08, 0x60, 0x74, 
-	0xcc, 0x00, 0x02, 0x20, 0xb5, 0xf3, 0xb0, 0x81, 
-	0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 
-	0x99, 0x02, 0x06, 0x0e, 0x0e, 0x36, 0x48, 0x1a, 
-	0x6f, 0x00, 0x23, 0x02, 0x40, 0x18, 0xd0, 0x0d, 
-	0x20, 0x33, 0x06, 0x40, 0x6d, 0x80, 0x21, 0x33, 
-	0x06, 0x49, 0x6d, 0x49, 0x1a, 0x41, 0x48, 0x14, 
-	0x6d, 0xc0, 0x4a, 0x13, 0x6d, 0x92, 0x1a, 0x80, 
-	0x18, 0x0d, 0xe0, 0x06, 0x20, 0x33, 0x06, 0x40, 
-	0x6d, 0x80, 0x21, 0x33, 0x06, 0x49, 0x6d, 0x49, 
-	0x1a, 0x45, 0x98, 0x00, 0x43, 0x68, 0x1c, 0x01, 
-	0x20, 0x64, 0xf0, 0x07, 0xfb, 0x43, 0x1c, 0x04, 
-	0x43, 0x6e, 0x1c, 0x31, 0x20, 0x64, 0xf0, 0x07, 
-	0xfb, 0x3d, 0x1c, 0x07, 0x08, 0xa4, 0x00, 0xa4, 
-	0x08, 0xbf, 0x00, 0xbf, 0x48, 0x05, 0x64, 0x84, 
-	0x48, 0x04, 0x64, 0xc7, 0xb0, 0x01, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x66, 0x00, 0x00, 0x80, 0xcc, 0x00, 0x0c, 0x80, 
-	0xb5, 0xf7, 0x9a, 0x02, 0x06, 0x15, 0x0e, 0x2d, 
-	0xb0, 0x82, 0x27, 0x00, 0x2d, 0x1f, 0xdb, 0x05, 
-	0x20, 0xaf, 0xb0, 0x02, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2f, 0x00, 0xd1, 0x0d, 
-	0x48, 0x19, 0x69, 0x80, 0x28, 0x00, 0xd0, 0x00, 
-	0xe7, 0xfa, 0x20, 0x02, 0x49, 0x16, 0x61, 0x88, 
-	0x48, 0x15, 0x69, 0x80, 0x28, 0x02, 0xd1, 0x00, 
-	0x27, 0xff, 0xe7, 0xef, 0x4c, 0x13, 0x94, 0x00, 
-	0x20, 0x01, 0x02, 0x40, 0x90, 0x01, 0x22, 0x00, 
-	0x99, 0x03, 0xb4, 0x06, 0x06, 0x2b, 0x16, 0x1b, 
-	0x9a, 0x03, 0x99, 0x04, 0x1c, 0x20, 0xf0, 0x01, 
-	0xff, 0x75, 0xb0, 0x02, 0x1c, 0x06, 0x2e, 0xd2, 
-	0xd1, 0x06, 0x20, 0x00, 0x49, 0x08, 0x61, 0x88, 
-	0x20, 0xd2, 0xb0, 0x02, 0xe7, 0xd2, 0xe0, 0x08, 
-	0x20, 0x00, 0x99, 0x00, 0x60, 0x08, 0x20, 0x00, 
-	0x49, 0x03, 0x61, 0x88, 0x20, 0x00, 0xb0, 0x02, 
-	0xe7, 0xc8, 0xb0, 0x02, 0xe7, 0xc6, 0x00, 0x00, 
-	0xcc, 0x00, 0x0f, 0x80, 0xcc, 0x00, 0x06, 0x00, 
-	0xb5, 0xff, 0x9f, 0x09, 0xb0, 0x81, 0x9b, 0x01, 
-	0x06, 0x18, 0x0e, 0x00, 0x9b, 0x02, 0x06, 0x19, 
-	0x0e, 0x09, 0x9b, 0x03, 0x06, 0x1b, 0x0e, 0x1b, 
-	0x93, 0x00, 0x9b, 0x04, 0x06, 0x1a, 0x0e, 0x12, 
-	0x06, 0x3d, 0x0e, 0x2d, 0x2d, 0x01, 0xd1, 0x07, 
-	0x4c, 0x1c, 0x68, 0x26, 0x23, 0x01, 0x02, 0x9b, 
-	0x43, 0x9e, 0x1c, 0x33, 0x60, 0x23, 0xe0, 0x07, 
-	0x2d, 0x02, 0xd1, 0x05, 0x4c, 0x17, 0x68, 0x26, 
-	0x23, 0x01, 0x02, 0x9b, 0x43, 0x33, 0x60, 0x23, 
-	0x28, 0x00, 0xd1, 0x03, 0x23, 0x00, 0x4c, 0x14, 
-	0x61, 0xe3, 0xe0, 0x04, 0x28, 0x01, 0xd1, 0x02, 
-	0x23, 0x01, 0x4c, 0x11, 0x61, 0xe3, 0x29, 0x00, 
-	0xd1, 0x03, 0x23, 0x00, 0x4c, 0x0e, 0x65, 0xa3, 
-	0xe0, 0x04, 0x29, 0x01, 0xd1, 0x02, 0x23, 0x01, 
-	0x4c, 0x0b, 0x65, 0xa3, 0x2a, 0x00, 0xd1, 0x03, 
-	0x23, 0x02, 0x4c, 0x09, 0x66, 0xe3, 0xe0, 0x04, 
-	0x2a, 0x01, 0xd1, 0x02, 0x23, 0x03, 0x4c, 0x06, 
-	0x66, 0xe3, 0x9b, 0x00, 0x4c, 0x04, 0x67, 0x23, 
-	0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0xcc, 0x00, 0x02, 0x20, 
-	0xcc, 0x00, 0x0f, 0x80, 0xb5, 0xf0, 0x1c, 0x05, 
-	0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x2e, 0x0e, 0x36, 
-	0xb0, 0x84, 0x48, 0x15, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x04, 0x20, 0x39, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x01, 0xd1, 0x0a, 
-	0x94, 0x00, 0x97, 0x01, 0x48, 0x0f, 0x90, 0x02, 
-	0x48, 0x0f, 0x90, 0x03, 0x46, 0x68, 0x21, 0x01, 
-	0xf0, 0x00, 0xfd, 0x1a, 0xe0, 0x0f, 0x20, 0x00, 
-	0x90, 0x00, 0x20, 0x00, 0x90, 0x01, 0x48, 0x09, 
-	0x90, 0x02, 0x48, 0x09, 0x90, 0x03, 0x46, 0x68, 
-	0x21, 0x01, 0xf0, 0x00, 0xfd, 0x0d, 0x21, 0x00, 
-	0x20, 0x02, 0xf7, 0xff, 0xfc, 0x85, 0x20, 0x00, 
-	0xb0, 0x04, 0xe7, 0xdc, 0xb0, 0x04, 0xe7, 0xda, 
-	0x2e, 0x08, 0x7c, 0xbc, 0x00, 0x00, 0x02, 0xcf, 
-	0x00, 0x00, 0x02, 0x3f, 0xb4, 0xb0, 0x1c, 0x05, 
-	0x1c, 0x0c, 0x1c, 0x17, 0x48, 0x14, 0x6c, 0x00, 
-	0x1c, 0x01, 0x48, 0x13, 0x6f, 0x80, 0x23, 0x09, 
-	0x01, 0x9b, 0x42, 0x98, 0xd1, 0x12, 0x20, 0x02, 
-	0x40, 0x20, 0xd0, 0x0c, 0x2d, 0x02, 0xd1, 0x0a, 
-	0x2f, 0x03, 0xd1, 0x00, 0x31, 0x04, 0x2f, 0x03, 
-	0xd2, 0x05, 0x07, 0xe0, 0x0f, 0xc0, 0xd0, 0x01, 
-	0x31, 0x05, 0xe0, 0x00, 0x31, 0x08, 0x2d, 0x02, 
-	0xd9, 0x00, 0x21, 0x12, 0x00, 0x48, 0x18, 0x40, 
-	0x30, 0x01, 0x10, 0x40, 0x21, 0x2d, 0x02, 0x09, 
-	0x43, 0x41, 0x48, 0x03, 0x69, 0x40, 0x18, 0x09, 
-	0x1c, 0x08, 0xbc, 0xb0, 0x47, 0x70, 0xe7, 0xfc, 
-	0xcc, 0x00, 0x0f, 0x80, 0x48, 0x07, 0x6a, 0xc0, 
-	0x1c, 0x01, 0x00, 0x48, 0x18, 0x40, 0x30, 0x01, 
-	0x10, 0x40, 0x21, 0x2d, 0x02, 0x09, 0x43, 0x41, 
-	0x48, 0x03, 0x69, 0x40, 0x18, 0x09, 0x1c, 0x08, 
-	0x47, 0x70, 0xe7, 0xfd, 0xcc, 0x00, 0x00, 0x00, 
-	0xcc, 0x00, 0x0f, 0x80, 0x48, 0x07, 0x68, 0x80, 
-	0x28, 0x00, 0xd1, 0x03, 0x48, 0x06, 0x69, 0x00, 
-	0x1c, 0x01, 0xe0, 0x02, 0x48, 0x04, 0x68, 0xc0, 
-	0x1c, 0x01, 0x4b, 0x02, 0x18, 0xc9, 0x1c, 0x08, 
-	0x47, 0x70, 0xe7, 0xfd, 0xcc, 0x00, 0x00, 0x00, 
-	0xcc, 0x00, 0x0f, 0x80, 0xb5, 0x90, 0x1c, 0x04, 
-	0x1c, 0x0f, 0x48, 0x06, 0x6c, 0x40, 0x60, 0x20, 
-	0x48, 0x04, 0x6c, 0x80, 0x60, 0x38, 0xf7, 0xff, 
-	0xff, 0xe1, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0xe7, 0xfb, 0x00, 0x00, 0xcc, 0x00, 0x02, 0x00, 
-	0xb5, 0xf0, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, 
-	0xf7, 0xff, 0xff, 0xd4, 0x1c, 0x06, 0x2d, 0x00, 
-	0xd0, 0x01, 0x2c, 0x00, 0xd1, 0x03, 0x20, 0x3a, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x08, 0x78, 
-	0x00, 0x40, 0xd0, 0x01, 0x20, 0x3a, 0xe7, 0xf7, 
-	0x20, 0x00, 0x49, 0x0d, 0x66, 0x88, 0x48, 0x0d, 
-	0x68, 0x01, 0x23, 0x12, 0x43, 0x19, 0x60, 0x01, 
-	0x48, 0x0b, 0x63, 0x45, 0x48, 0x0a, 0x63, 0x84, 
-	0x20, 0x01, 0x49, 0x09, 0x62, 0x48, 0x48, 0x09, 
-	0x68, 0x01, 0x23, 0x01, 0x40, 0x59, 0x60, 0x01, 
-	0x48, 0x05, 0x63, 0xc7, 0x48, 0x02, 0x60, 0x46, 
-	0x20, 0x00, 0xe7, 0xdd, 0xe7, 0xdc, 0x00, 0x00, 
-	0xcc, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x0f, 0x48, 
-	0xcc, 0x00, 0x00, 0x80, 0xcc, 0x00, 0x00, 0x08, 
-	0xb4, 0xf0, 0x1c, 0x07, 0x1c, 0x0c, 0x1c, 0x16, 
-	0x1c, 0x1d, 0x48, 0x10, 0x6a, 0x00, 0x28, 0x10, 
-	0xd0, 0x02, 0x20, 0x3b, 0xbc, 0xf0, 0x47, 0x70, 
-	0x48, 0x0d, 0x68, 0x00, 0x60, 0x38, 0x68, 0x38, 
-	0x4b, 0x0b, 0x18, 0xc0, 0x60, 0x38, 0x48, 0x0b, 
-	0x6b, 0x40, 0x60, 0x30, 0x48, 0x09, 0x6b, 0x80, 
-	0x60, 0x28, 0x48, 0x09, 0x6c, 0x80, 0x23, 0x10, 
-	0x40, 0x18, 0xd0, 0x02, 0x20, 0x02, 0x60, 0x20, 
-	0xe0, 0x01, 0x20, 0x01, 0x60, 0x20, 0x20, 0x00, 
-	0xe7, 0xe4, 0xe7, 0xe3, 0xcc, 0x00, 0x05, 0x00, 
-	0xcc, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x80, 
-	0xcc, 0x00, 0x0f, 0x00, 0xb4, 0xf0, 0x1c, 0x05, 
-	0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x2a, 0x0e, 0x12, 
-	0x06, 0x21, 0x0e, 0x09, 0x2f, 0x00, 0xd1, 0x30, 
-	0xb0, 0x81, 0x46, 0x6f, 0x2a, 0x00, 0xd0, 0x06, 
-	0x2a, 0x08, 0xd0, 0x0d, 0x2a, 0x10, 0xd0, 0x14, 
-	0x2a, 0x18, 0xd0, 0x1b, 0xe0, 0x23, 0x20, 0x00, 
-	0x70, 0x38, 0x20, 0x00, 0x70, 0x78, 0x20, 0x0c, 
-	0x70, 0xb8, 0x20, 0x00, 0x70, 0xf8, 0xe0, 0x1b, 
-	0x20, 0x00, 0x70, 0x38, 0x20, 0x08, 0x70, 0x78, 
-	0x20, 0x1c, 0x70, 0xb8, 0x20, 0x00, 0x70, 0xf8, 
-	0xe0, 0x12, 0x20, 0x00, 0x70, 0x38, 0x20, 0x10, 
-	0x70, 0x78, 0x20, 0x0c, 0x70, 0xb8, 0x20, 0x00, 
-	0x70, 0xf8, 0xe0, 0x09, 0x20, 0x00, 0x70, 0x38, 
-	0x20, 0x18, 0x70, 0x78, 0x20, 0x1c, 0x70, 0xb8, 
-	0x20, 0x00, 0x70, 0xf8, 0xe0, 0x00, 0xe7, 0xff, 
-	0xb0, 0x01, 0x23, 0x00, 0x56, 0xf8, 0x23, 0x39, 
-	0x06, 0x5b, 0x60, 0x18, 0x23, 0x01, 0x56, 0xf8, 
-	0x23, 0x39, 0x06, 0x5b, 0x61, 0xd8, 0x29, 0x00, 
-	0xd1, 0x06, 0x48, 0x0e, 0x68, 0x06, 0x23, 0x20, 
-	0x43, 0x9e, 0x1c, 0x33, 0x60, 0x03, 0xe0, 0x06, 
-	0x29, 0x20, 0xd1, 0x04, 0x48, 0x09, 0x68, 0x06, 
-	0x23, 0x20, 0x43, 0x33, 0x60, 0x03, 0x23, 0x02, 
-	0x56, 0xf8, 0x23, 0x39, 0x06, 0x5b, 0x60, 0x58, 
-	0x23, 0x03, 0x56, 0xf8, 0x4b, 0x04, 0x63, 0x18, 
-	0x20, 0x00, 0x23, 0x39, 0x06, 0x5b, 0x64, 0x98, 
-	0xbc, 0xf0, 0x47, 0x70, 0x72, 0x00, 0x00, 0x1c, 
-	0x72, 0x00, 0x01, 0x00, 0xb4, 0xb0, 0x1c, 0x07, 
-	0x1c, 0x0d, 0x1c, 0x14, 0x06, 0x29, 0x0e, 0x09, 
-	0x06, 0x22, 0x0e, 0x12, 0xb0, 0x84, 0x29, 0x33, 
-	0xdc, 0x01, 0x2a, 0x0f, 0xdd, 0x03, 0x20, 0xff, 
-	0xb0, 0x04, 0xbc, 0xb0, 0x47, 0x70, 0x20, 0x39, 
-	0x06, 0x40, 0x63, 0x41, 0x20, 0x10, 0x43, 0x10, 
-	0x23, 0x39, 0x06, 0x5b, 0x63, 0x98, 0x20, 0x39, 
-	0x06, 0x40, 0x68, 0x00, 0x90, 0x03, 0x98, 0x03, 
-	0x23, 0x9c, 0x43, 0xdb, 0x40, 0x18, 0x90, 0x03, 
-	0x20, 0x39, 0x06, 0x40, 0x68, 0x40, 0x90, 0x01, 
-	0x98, 0x01, 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 
-	0x90, 0x01, 0x06, 0x38, 0x0e, 0x00, 0xd0, 0x29, 
-	0x20, 0x10, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x03, 
-	0x23, 0x80, 0x43, 0x18, 0x90, 0x03, 0x20, 0x08, 
-	0x40, 0x38, 0xd0, 0x03, 0x98, 0x03, 0x23, 0x10, 
-	0x43, 0x18, 0x90, 0x03, 0x20, 0x04, 0x40, 0x38, 
-	0xd0, 0x04, 0x98, 0x03, 0x23, 0x08, 0x43, 0x18, 
-	0x90, 0x03, 0xe0, 0x0c, 0x20, 0x02, 0x40, 0x38, 
-	0xd0, 0x04, 0x98, 0x03, 0x23, 0x0c, 0x43, 0x18, 
-	0x90, 0x03, 0xe0, 0x04, 0x98, 0x03, 0x23, 0x0c, 
-	0x43, 0xdb, 0x40, 0x18, 0x90, 0x03, 0x20, 0x20, 
-	0x40, 0x38, 0xd0, 0x03, 0x98, 0x01, 0x23, 0x20, 
-	0x43, 0x18, 0x90, 0x01, 0x98, 0x03, 0x23, 0x39, 
-	0x06, 0x5b, 0x60, 0x18, 0x98, 0x01, 0x23, 0x39, 
-	0x06, 0x5b, 0x60, 0x58, 0x20, 0x39, 0x06, 0x40, 
-	0x6a, 0x00, 0x90, 0x00, 0x98, 0x00, 0x23, 0xf0, 
-	0x43, 0xdb, 0x43, 0x18, 0x90, 0x00, 0x20, 0xff, 
-	0x02, 0x00, 0x40, 0x38, 0xd0, 0x27, 0x20, 0xff, 
-	0x30, 0x01, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, 
-	0x23, 0xfe, 0x40, 0x18, 0x90, 0x00, 0x20, 0x01, 
-	0x02, 0x40, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, 
-	0x23, 0xfd, 0x40, 0x18, 0x90, 0x00, 0x20, 0x01, 
-	0x02, 0x80, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, 
-	0x23, 0xfb, 0x40, 0x18, 0x90, 0x00, 0x20, 0x01, 
-	0x02, 0xc0, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, 
-	0x23, 0xf7, 0x40, 0x18, 0x90, 0x00, 0x20, 0x01, 
-	0x03, 0x00, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, 
-	0x23, 0xf0, 0x40, 0x18, 0x90, 0x00, 0x98, 0x00, 
-	0x23, 0x39, 0x06, 0x5b, 0x62, 0x18, 0x20, 0x39, 
-	0x06, 0x40, 0x69, 0xc0, 0x90, 0x02, 0x98, 0x02, 
-	0x08, 0x40, 0x00, 0x40, 0x90, 0x02, 0x20, 0x39, 
-	0x06, 0x40, 0x6a, 0xc0, 0x90, 0x00, 0x98, 0x00, 
-	0x23, 0x1c, 0x43, 0xdb, 0x40, 0x18, 0x90, 0x00, 
-	0x20, 0x39, 0x06, 0x40, 0x6b, 0x80, 0x90, 0x03, 
-	0x98, 0x03, 0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, 
-	0x90, 0x03, 0x20, 0x39, 0x06, 0x40, 0x6b, 0xc0, 
-	0x90, 0x01, 0x98, 0x01, 0x09, 0x00, 0x01, 0x00, 
-	0x90, 0x01, 0x48, 0x4a, 0x40, 0x38, 0xd0, 0x45, 
-	0x20, 0x01, 0x04, 0x00, 0x40, 0x38, 0xd0, 0x03, 
-	0x98, 0x02, 0x23, 0x01, 0x43, 0x18, 0x90, 0x02, 
-	0x20, 0x01, 0x05, 0xc0, 0x40, 0x38, 0xd0, 0x03, 
-	0x98, 0x00, 0x23, 0x10, 0x43, 0x18, 0x90, 0x00, 
-	0x20, 0x07, 0x04, 0x40, 0x40, 0x38, 0x23, 0x01, 
-	0x04, 0x5b, 0x42, 0x98, 0xd0, 0x08, 0x23, 0x01, 
-	0x04, 0x9b, 0x42, 0x98, 0xd0, 0x07, 0x23, 0x01, 
-	0x04, 0xdb, 0x42, 0x98, 0xd0, 0x08, 0xe0, 0x0c, 
-	0x98, 0x00, 0x90, 0x00, 0xe0, 0x0a, 0x98, 0x00, 
-	0x23, 0x04, 0x43, 0x18, 0x90, 0x00, 0xe0, 0x05, 
-	0x98, 0x00, 0x23, 0x0c, 0x43, 0x18, 0x90, 0x00, 
-	0xe0, 0x00, 0xe7, 0xff, 0x20, 0x01, 0x05, 0x80, 
-	0x40, 0x38, 0xd0, 0x03, 0x98, 0x03, 0x23, 0x10, 
-	0x43, 0x18, 0x90, 0x03, 0x20, 0x01, 0x05, 0x00, 
-	0x40, 0x38, 0xd0, 0x03, 0x98, 0x01, 0x23, 0x08, 
-	0x43, 0x18, 0x90, 0x01, 0x20, 0x01, 0x05, 0x40, 
-	0x40, 0x38, 0xd0, 0x03, 0x98, 0x01, 0x23, 0x07, 
-	0x43, 0x18, 0x90, 0x01, 0x98, 0x03, 0x23, 0x39, 
-	0x06, 0x5b, 0x63, 0x98, 0x98, 0x02, 0x23, 0x39, 
-	0x06, 0x5b, 0x61, 0xd8, 0x98, 0x01, 0x23, 0x39, 
-	0x06, 0x5b, 0x63, 0xd8, 0x98, 0x00, 0x23, 0x39, 
-	0x06, 0x5b, 0x62, 0xd8, 0x20, 0x39, 0x06, 0x40, 
-	0x68, 0x80, 0x90, 0x03, 0x98, 0x03, 0x08, 0x80, 
-	0x00, 0x80, 0x90, 0x03, 0x0f, 0x38, 0x07, 0x00, 
-	0xd0, 0x26, 0x20, 0x01, 0x07, 0x00, 0x40, 0x38, 
-	0x23, 0x01, 0x07, 0x1b, 0x42, 0x98, 0xd1, 0x04, 
-	0x98, 0x03, 0x23, 0x02, 0x43, 0x18, 0x90, 0x03, 
-	0xe0, 0x07, 0x20, 0x00, 0x42, 0x80, 0xd1, 0x04, 
-	0x98, 0x03, 0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, 
-	0x90, 0x03, 0x20, 0x01, 0x07, 0x40, 0x40, 0x38, 
-	0x23, 0x01, 0x07, 0x5b, 0x42, 0x98, 0xd1, 0x04, 
-	0x98, 0x03, 0x23, 0x01, 0x43, 0x18, 0x90, 0x03, 
-	0xe0, 0x06, 0x20, 0x00, 0x42, 0x80, 0xd1, 0x03, 
-	0x98, 0x03, 0x08, 0x40, 0x00, 0x40, 0x90, 0x03, 
-	0x98, 0x03, 0x23, 0x39, 0x06, 0x5b, 0x60, 0x98, 
-	0x20, 0x00, 0xb0, 0x04, 0xe6, 0xc1, 0xb0, 0x04, 
-	0xe6, 0xbf, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 
-	0x48, 0x02, 0x69, 0xc0, 0x06, 0x00, 0x16, 0x00, 
-	0x47, 0x70, 0xe7, 0xfd, 0x72, 0x00, 0x01, 0x00, 
-	0xb5, 0xf7, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x23, 
-	0x16, 0x18, 0x06, 0x3b, 0x16, 0x19, 0x9b, 0x02, 
-	0x06, 0x1a, 0x0e, 0x12, 0x2a, 0x00, 0xd1, 0x0b, 
-	0x23, 0x39, 0x06, 0x5b, 0x60, 0xd8, 0x23, 0x39, 
-	0x06, 0x5b, 0x61, 0x19, 0x4d, 0x0b, 0x68, 0x2e, 
-	0x23, 0x01, 0x43, 0x33, 0x60, 0x2b, 0xe0, 0x0c, 
-	0x2a, 0x01, 0xd1, 0x0a, 0x23, 0x39, 0x06, 0x5b, 
-	0x61, 0x58, 0x23, 0x39, 0x06, 0x5b, 0x61, 0x99, 
-	0x4d, 0x04, 0x68, 0x2e, 0x23, 0x02, 0x43, 0x33, 
-	0x60, 0x2b, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x72, 0x00, 0x00, 0x08, 
-	0xb4, 0x90, 0x1c, 0x01, 0x20, 0x92, 0x4b, 0x4b, 
-	0x60, 0x18, 0x20, 0x92, 0x4b, 0x4a, 0x60, 0x18, 
-	0x20, 0x10, 0x4b, 0x4a, 0x60, 0x18, 0x20, 0x00, 
-	0x4b, 0x48, 0x60, 0x58, 0x48, 0x48, 0x4b, 0x47, 
-	0x60, 0x98, 0x22, 0x00, 0x2a, 0x10, 0xdb, 0x02, 
-	0xe0, 0x07, 0x32, 0x01, 0xe7, 0xfa, 0x20, 0x00, 
-	0x43, 0xc0, 0x00, 0x93, 0x4c, 0x42, 0x50, 0xe0, 
-	0xe7, 0xf7, 0x20, 0x00, 0x43, 0xc0, 0x00, 0x93, 
-	0x4c, 0x3f, 0x50, 0xe0, 0x22, 0x00, 0x2a, 0x08, 
-	0xdb, 0x02, 0xe0, 0x08, 0x32, 0x01, 0xe7, 0xfa, 
-	0x20, 0x00, 0x43, 0xc0, 0x00, 0x94, 0x4b, 0x3b, 
-	0x18, 0xe3, 0x64, 0x18, 0xe7, 0xf6, 0x22, 0x00, 
-	0x2a, 0x20, 0xdb, 0x02, 0xe0, 0x08, 0x32, 0x01, 
-	0xe7, 0xfa, 0x20, 0x00, 0x43, 0xc0, 0x00, 0x94, 
-	0x4b, 0x35, 0x18, 0xe3, 0x60, 0x18, 0xe7, 0xf6, 
-	0x22, 0x00, 0x2a, 0x19, 0xdb, 0x02, 0xe0, 0x06, 
-	0x32, 0x01, 0xe7, 0xfa, 0x20, 0x00, 0x00, 0x93, 
-	0x4c, 0x30, 0x50, 0xe0, 0xe7, 0xf8, 0x20, 0x00, 
-	0x4b, 0x2f, 0x60, 0x18, 0x20, 0x39, 0x06, 0x40, 
-	0x69, 0xc0, 0x27, 0x18, 0x40, 0x07, 0x2f, 0x00, 
-	0xd0, 0x03, 0x48, 0x2c, 0x4b, 0x2c, 0x60, 0x18, 
-	0xe0, 0x03, 0x20, 0xff, 0x30, 0xe0, 0x4b, 0x2a, 
-	0x60, 0x18, 0x20, 0x00, 0x4b, 0x29, 0x60, 0x18, 
-	0x20, 0x00, 0x4b, 0x28, 0x60, 0x58, 0x48, 0x28, 
-	0x4b, 0x26, 0x60, 0x98, 0x48, 0x24, 0x68, 0x00, 
-	0x4b, 0x24, 0x60, 0xd8, 0x48, 0x25, 0x60, 0x01, 
-	0x20, 0x0d, 0x06, 0xc0, 0x61, 0xc1, 0x20, 0x05, 
-	0x02, 0x00, 0x23, 0x0d, 0x06, 0xdb, 0x60, 0x18, 
-	0x48, 0x21, 0x23, 0x0d, 0x06, 0xdb, 0x60, 0x58, 
-	0x48, 0x1f, 0x4b, 0x16, 0x63, 0x98, 0x20, 0x00, 
-	0x23, 0x0d, 0x06, 0xdb, 0x60, 0x98, 0x20, 0x00, 
-	0x23, 0x0d, 0x06, 0xdb, 0x61, 0x18, 0x48, 0x1b, 
-	0x23, 0x0d, 0x06, 0xdb, 0x61, 0x98, 0x20, 0x01, 
-	0x23, 0x0d, 0x06, 0xdb, 0x60, 0xd8, 0x48, 0x18, 
-	0x23, 0x0d, 0x06, 0xdb, 0x63, 0x18, 0x48, 0x17, 
-	0x23, 0x0d, 0x06, 0xdb, 0x63, 0x58, 0x20, 0x00, 
-	0x4b, 0x15, 0x60, 0x18, 0x48, 0x11, 0x4b, 0x15, 
-	0x60, 0x18, 0x20, 0x00, 0xbc, 0x90, 0x47, 0x70, 
-	0xe7, 0xfc, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0xc4, 
-	0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7d, 0x94, 
-	0x2e, 0x08, 0x7c, 0xcc, 0x68, 0x00, 0x0d, 0x00, 
-	0x68, 0x00, 0x04, 0x00, 0x2e, 0x08, 0x7c, 0x58, 
-	0x2e, 0x08, 0x7c, 0xbc, 0x00, 0x00, 0x02, 0x3f, 
-	0x2e, 0x08, 0x60, 0x80, 0x2e, 0x08, 0x7d, 0xa0, 
-	0x00, 0x00, 0x02, 0xcf, 0x2e, 0x08, 0x60, 0x84, 
-	0x00, 0xf0, 0x29, 0x6d, 0x3f, 0xff, 0xff, 0xff, 
-	0x00, 0x80, 0x10, 0x80, 0x00, 0x80, 0xeb, 0x80, 
-	0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x5e, 0x4c, 
-	0xb5, 0xff, 0xb0, 0x85, 0x20, 0x39, 0x06, 0x40, 
-	0x69, 0xc0, 0x23, 0x18, 0x40, 0x18, 0x90, 0x00, 
-	0x98, 0x00, 0x28, 0x00, 0xd0, 0x03, 0x48, 0x5a, 
-	0x4b, 0x5a, 0x60, 0x18, 0xe0, 0x03, 0x20, 0xff, 
-	0x30, 0xe0, 0x4b, 0x58, 0x60, 0x18, 0x9c, 0x06, 
-	0x9f, 0x07, 0x22, 0x00, 0x21, 0x00, 0x98, 0x05, 
-	0x38, 0x0c, 0x28, 0x06, 0xd2, 0x0c, 0xa3, 0x02, 
-	0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x04, 0x03, 0x06, 0x04, 0x03, 0x06, 0x32, 0x01, 
-	0x32, 0x01, 0xe0, 0x02, 0x3a, 0x01, 0xe0, 0x00, 
-	0xe7, 0xff, 0x98, 0x05, 0x38, 0x0b, 0x28, 0x08, 
-	0xd2, 0x15, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, 
-	0x44, 0x9f, 0x1c, 0x00, 0x0a, 0x04, 0x04, 0x04, 
-	0x0a, 0x0a, 0x0a, 0x04, 0x25, 0x2d, 0x01, 0x2d, 
-	0x48, 0x44, 0x68, 0x00, 0x1c, 0x46, 0xe0, 0x0e, 
-	0x48, 0x43, 0x6c, 0x40, 0x1c, 0x05, 0x48, 0x43, 
-	0x68, 0x40, 0x1c, 0x06, 0xe0, 0x07, 0x21, 0xff, 
-	0x1c, 0x08, 0xb0, 0x05, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xe7, 0xff, 0x2d, 0x00, 
-	0xd0, 0x01, 0x2e, 0x00, 0xd1, 0x04, 0x25, 0x2d, 
-	0x01, 0x2d, 0x48, 0x38, 0x68, 0x00, 0x1c, 0x46, 
-	0x29, 0xff, 0xd1, 0x02, 0x1c, 0x08, 0xb0, 0x05, 
-	0xe7, 0xec, 0x1e, 0x68, 0x90, 0x02, 0x1e, 0x70, 
-	0x90, 0x01, 0x23, 0x01, 0x42, 0xda, 0xd1, 0x08, 
-	0x42, 0x50, 0x40, 0x85, 0x1c, 0x2b, 0x1e, 0x5d, 
-	0x42, 0x50, 0x40, 0x86, 0x1c, 0x33, 0x1e, 0x5e, 
-	0xe0, 0x05, 0x41, 0x15, 0x1c, 0x28, 0x1e, 0x45, 
-	0x41, 0x16, 0x1c, 0x30, 0x1e, 0x46, 0x07, 0xe0, 
-	0x0f, 0xc0, 0xd0, 0x02, 0x21, 0x80, 0x08, 0x64, 
-	0x00, 0x64, 0x07, 0xf8, 0x0f, 0xc0, 0xd0, 0x02, 
-	0x21, 0x80, 0x08, 0x7f, 0x00, 0x7f, 0x19, 0x60, 
-	0x90, 0x04, 0x19, 0xb8, 0x90, 0x03, 0x2c, 0x00, 
-	0xda, 0x01, 0x21, 0x80, 0x24, 0x00, 0x98, 0x04, 
-	0x28, 0x01, 0xda, 0x02, 0x21, 0x80, 0x20, 0x01, 
-	0x90, 0x04, 0x4b, 0x1f, 0x42, 0x9c, 0xdb, 0x01, 
-	0x21, 0x80, 0x4c, 0x1e, 0x98, 0x04, 0x4b, 0x1c, 
-	0x42, 0x98, 0xdd, 0x02, 0x21, 0x80, 0x48, 0x1a, 
-	0x90, 0x04, 0x2f, 0x00, 0xda, 0x01, 0x21, 0x80, 
-	0x27, 0x00, 0x98, 0x03, 0x28, 0x01, 0xda, 0x02, 
-	0x21, 0x80, 0x20, 0x01, 0x90, 0x03, 0x48, 0x11, 
-	0x68, 0x00, 0x42, 0x87, 0xd3, 0x03, 0x21, 0x80, 
-	0x48, 0x0e, 0x68, 0x00, 0x1e, 0x47, 0x98, 0x03, 
-	0x4b, 0x0c, 0x68, 0x1b, 0x42, 0x98, 0xd9, 0x03, 
-	0x21, 0x80, 0x48, 0x0a, 0x68, 0x00, 0x90, 0x03, 
-	0x9b, 0x08, 0x60, 0x1c, 0x9b, 0x08, 0x60, 0x5f, 
-	0x98, 0x04, 0x9b, 0x08, 0x60, 0x98, 0x98, 0x03, 
-	0x9b, 0x08, 0x60, 0xd8, 0x1c, 0x08, 0xb0, 0x05, 
-	0xe7, 0x88, 0xb0, 0x05, 0xe7, 0x86, 0x00, 0x00, 
-	0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x60, 0x80, 
-	0xcc, 0x00, 0x02, 0x00, 0xcc, 0x00, 0x0c, 0x00, 
-	0x00, 0x00, 0x02, 0xcf, 0x00, 0x00, 0x02, 0xce, 
-	0xb5, 0xf0, 0x1c, 0x07, 0x1c, 0x0c, 0xb0, 0x81, 
-	0x2c, 0x0b, 0xdb, 0x19, 0x2c, 0x12, 0xdc, 0x17, 
-	0x68, 0xbe, 0x68, 0xf9, 0x91, 0x00, 0x68, 0x7a, 
-	0x1c, 0x3b, 0x68, 0x39, 0x1c, 0x20, 0xf7, 0xff, 
-	0xff, 0x23, 0x1c, 0x05, 0x68, 0xb8, 0x42, 0xb0, 
-	0xd0, 0x00, 0x25, 0x80, 0x68, 0xf8, 0x99, 0x00, 
-	0x42, 0x88, 0xd0, 0x00, 0x25, 0x80, 0x1c, 0x28, 
-	0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x25, 0x00, 0x68, 0x38, 0x28, 0x00, 0xda, 0x02, 
-	0x25, 0x80, 0x20, 0x00, 0x60, 0x38, 0x68, 0x78, 
-	0x28, 0x00, 0xda, 0x02, 0x25, 0x80, 0x20, 0x00, 
-	0x60, 0x78, 0x68, 0x38, 0x07, 0xc0, 0x0f, 0xc0, 
-	0xd0, 0x04, 0x25, 0x80, 0x68, 0x38, 0x08, 0x40, 
-	0x00, 0x40, 0x60, 0x38, 0x68, 0xb8, 0x07, 0xc0, 
-	0x0f, 0xc0, 0xd1, 0x09, 0x25, 0x80, 0x68, 0xb8, 
-	0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x01, 0x68, 0xb8, 
-	0xe0, 0x01, 0x68, 0xb8, 0x38, 0x01, 0x60, 0xb8, 
-	0x68, 0xb8, 0x68, 0x39, 0x42, 0x88, 0xdc, 0x03, 
-	0x25, 0x80, 0x68, 0x38, 0x30, 0x01, 0x60, 0xb8, 
-	0x68, 0x78, 0x68, 0xf9, 0x42, 0x88, 0xdb, 0x03, 
-	0x25, 0x80, 0x68, 0x78, 0x30, 0x01, 0x60, 0xf8, 
-	0x1c, 0x28, 0xb0, 0x01, 0xe7, 0xc5, 0xb0, 0x01, 
-	0xe7, 0xc3, 0x1c, 0x02, 0x21, 0x18, 0xe0, 0x00, 
-	0x31, 0x01, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd, 
-	0xb4, 0xf0, 0x1c, 0x07, 0x1c, 0x0a, 0xb0, 0x81, 
-	0x68, 0xb8, 0x68, 0x3b, 0x1a, 0xc0, 0x1c, 0x46, 
-	0x68, 0xf8, 0x68, 0x7b, 0x1a, 0xc0, 0x30, 0x01, 
-	0x90, 0x00, 0x00, 0x90, 0x4b, 0x15, 0x58, 0x1c, 
-	0x98, 0x00, 0x43, 0x46, 0x1c, 0x35, 0x07, 0xa0, 
-	0x0f, 0x80, 0x1c, 0x29, 0x40, 0x81, 0x2a, 0x0b, 
-	0xdb, 0x01, 0x2a, 0x12, 0xdd, 0x01, 0x2a, 0x13, 
-	0xd1, 0x01, 0x21, 0x00, 0xe0, 0x0a, 0x2a, 0x09, 
-	0xd0, 0x01, 0x2a, 0x0a, 0xd1, 0x03, 0x00, 0x69, 
-	0x19, 0x49, 0x00, 0xc9, 0xe0, 0x02, 0x2a, 0x08, 
-	0xd1, 0x00, 0x01, 0x29, 0x20, 0x04, 0x40, 0x20, 
-	0xd0, 0x00, 0x08, 0x49, 0x09, 0x4c, 0x06, 0xc8, 
-	0x0e, 0xc0, 0xd0, 0x00, 0x34, 0x01, 0x1c, 0x20, 
-	0xb0, 0x01, 0xbc, 0xf0, 0x47, 0x70, 0xb0, 0x01, 
-	0xe7, 0xfb, 0x00, 0x00, 0x2e, 0x03, 0x3a, 0x04, 
-	0xb4, 0x80, 0x23, 0x00, 0x22, 0x01, 0x21, 0x00, 
-	0x29, 0x08, 0xdb, 0x02, 0xe0, 0x09, 0x31, 0x01, 
-	0xe7, 0xfa, 0x00, 0x88, 0x4f, 0x05, 0x58, 0x38, 
-	0x28, 0x00, 0xd0, 0x00, 0x43, 0x13, 0x00, 0x52, 
-	0xe7, 0xf5, 0x1c, 0x18, 0xbc, 0x80, 0x47, 0x70, 
-	0xe7, 0xfc, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x58, 
-	0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x81, 0x20, 0x39, 
-	0x06, 0x40, 0x69, 0xc0, 0x23, 0x18, 0x40, 0x18, 
-	0x90, 0x00, 0x98, 0x00, 0x28, 0x00, 0xd0, 0x03, 
-	0x48, 0x32, 0x49, 0x33, 0x60, 0x08, 0xe0, 0x03, 
-	0x20, 0xff, 0x30, 0xe0, 0x49, 0x30, 0x60, 0x08, 
-	0x24, 0x00, 0x99, 0x01, 0x48, 0x2f, 0xf7, 0xfc, 
-	0xfa, 0x1f, 0x48, 0x2e, 0x68, 0x00, 0x28, 0x00, 
-	0xda, 0x03, 0x20, 0x00, 0x49, 0x2b, 0x60, 0x08, 
-	0x24, 0x80, 0x48, 0x2a, 0x68, 0x40, 0x28, 0x00, 
-	0xda, 0x03, 0x20, 0x00, 0x49, 0x27, 0x60, 0x48, 
-	0x24, 0x80, 0x48, 0x26, 0x68, 0x80, 0x4b, 0x26, 
-	0x42, 0x98, 0xdd, 0x03, 0x48, 0x24, 0x49, 0x23, 
-	0x60, 0x88, 0x24, 0x80, 0x48, 0x21, 0x68, 0xc0, 
-	0x49, 0x1f, 0x68, 0x09, 0x42, 0x88, 0xd9, 0x04, 
-	0x48, 0x1d, 0x68, 0x00, 0x49, 0x1d, 0x60, 0xc8, 
-	0x24, 0x80, 0x48, 0x1e, 0x68, 0x00, 0x28, 0x00, 
-	0xd1, 0x27, 0x2f, 0x01, 0xd1, 0x25, 0x48, 0x19, 
-	0x68, 0x06, 0x48, 0x18, 0x68, 0x45, 0x23, 0xff, 
-	0x33, 0x68, 0x42, 0x9e, 0xdd, 0x01, 0x26, 0xff, 
-	0x36, 0x68, 0x48, 0x13, 0x68, 0x00, 0x08, 0x40, 
-	0x42, 0xa8, 0xd2, 0x02, 0x48, 0x10, 0x68, 0x00, 
-	0x08, 0x45, 0x48, 0x13, 0x49, 0x13, 0x65, 0x48, 
-	0x48, 0x13, 0x43, 0x70, 0x23, 0x01, 0x04, 0x1b, 
-	0x18, 0xc0, 0x14, 0x40, 0x49, 0x0f, 0x65, 0x88, 
-	0x20, 0x00, 0x49, 0x0e, 0x65, 0xc8, 0x48, 0x0d, 
-	0x66, 0x05, 0x1c, 0x38, 0x21, 0x00, 0xf7, 0xfe, 
-	0xff, 0x13, 0x1c, 0x20, 0xb0, 0x01, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 
-	0xe7, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3f, 
-	0x2e, 0x08, 0x60, 0x80, 0x2e, 0x08, 0x7d, 0xa0, 
-	0x00, 0x00, 0x02, 0xcf, 0x2e, 0x08, 0x7c, 0xbc, 
-	0x00, 0x00, 0x07, 0xfa, 0xcc, 0x00, 0x00, 0x00, 
-	0x00, 0x0b, 0x60, 0xb6, 0xb5, 0xf0, 0x1c, 0x04, 
-	0x1c, 0x0f, 0xb0, 0x81, 0x1c, 0x26, 0x69, 0x30, 
-	0x90, 0x00, 0x98, 0x00, 0x28, 0x13, 0xd1, 0x04, 
-	0x20, 0x75, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x68, 0xf5, 0x68, 0x38, 0x08, 0x40, 
-	0x00, 0x40, 0x60, 0x38, 0x68, 0x78, 0x08, 0x40, 
-	0x00, 0x40, 0x60, 0x78, 0x68, 0xb8, 0x07, 0xc0, 
-	0x0f, 0xc0, 0xd1, 0x02, 0x68, 0xb8, 0x38, 0x01, 
-	0x60, 0xb8, 0x68, 0xf8, 0x07, 0xc0, 0x0f, 0xc0, 
-	0xd1, 0x02, 0x68, 0xf8, 0x38, 0x01, 0x60, 0xf8, 
-	0x1d, 0xf0, 0x30, 0x49, 0x1c, 0x39, 0xf7, 0xfc, 
-	0xf9, 0x8b, 0x48, 0x1c, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, 
-	0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, 
-	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
-	0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x01, 
-	0xe7, 0xcc, 0x49, 0x13, 0x20, 0x91, 0xf0, 0x13, 
-	0xfb, 0x0d, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 
-	0xf0, 0x05, 0xfa, 0xf4, 0xe7, 0xf5, 0x00, 0xa8, 
-	0x49, 0x0e, 0x58, 0x08, 0x42, 0xa0, 0xd0, 0x05, 
-	0x20, 0x92, 0x49, 0x0b, 0x60, 0x08, 0x20, 0xff, 
-	0xb0, 0x01, 0xe7, 0xb7, 0x48, 0x0a, 0x68, 0x00, 
-	0x42, 0xa0, 0xd1, 0x03, 0x1c, 0x39, 0x1c, 0x20, 
-	0xf0, 0x00, 0xf8, 0x10, 0x20, 0x92, 0x49, 0x04, 
-	0x60, 0x08, 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xa9, 
-	0xb0, 0x01, 0xe7, 0xa7, 0x2e, 0x08, 0x94, 0x84, 
-	0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58, 
-	0x2e, 0x08, 0x7c, 0xbc, 0xb5, 0xf3, 0x1c, 0x0f, 
-	0xb0, 0x9b, 0x20, 0x39, 0x06, 0x40, 0x69, 0xc0, 
-	0x23, 0x18, 0x40, 0x18, 0x90, 0x01, 0x98, 0x01, 
-	0x28, 0x00, 0xd0, 0x03, 0x48, 0xf8, 0x49, 0xf9, 
-	0x60, 0x08, 0xe0, 0x03, 0x20, 0xff, 0x30, 0xe0, 
-	0x49, 0xf6, 0x60, 0x08, 0x20, 0xff, 0x30, 0x01, 
-	0x90, 0x06, 0x98, 0x1b, 0x90, 0x1a, 0x98, 0x1a, 
-	0x69, 0x05, 0x98, 0x1a, 0x68, 0xc0, 0x90, 0x19, 
-	0x48, 0xf1, 0x68, 0x00, 0x99, 0x1b, 0x42, 0x88, 
-	0xd1, 0x73, 0x20, 0x02, 0x90, 0x08, 0x2d, 0x0c, 
-	0xd0, 0x01, 0x2d, 0x0f, 0xd1, 0x02, 0x20, 0x04, 
-	0x90, 0x08, 0xe0, 0x0c, 0x2d, 0x0d, 0xd0, 0x01, 
-	0x2d, 0x10, 0xd1, 0x02, 0x20, 0x08, 0x90, 0x08, 
-	0xe0, 0x05, 0x2d, 0x0e, 0xd0, 0x01, 0x2d, 0x11, 
-	0xd1, 0x01, 0x20, 0x01, 0x90, 0x08, 0x68, 0xf8, 
-	0x68, 0x79, 0x1a, 0x40, 0x1c, 0x44, 0x2d, 0x0b, 
-	0xd0, 0x05, 0x2d, 0x0f, 0xd0, 0x03, 0x2d, 0x10, 
-	0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x11, 0x48, 0xdf, 
-	0x6c, 0x40, 0x1c, 0x06, 0x48, 0xdd, 0x6c, 0x81, 
-	0x91, 0x07, 0x2e, 0x00, 0xd0, 0x02, 0x99, 0x07, 
-	0x29, 0x00, 0xd1, 0x05, 0x26, 0x2d, 0x01, 0x36, 
-	0x48, 0xd6, 0x68, 0x00, 0x1c, 0x41, 0x91, 0x07, 
-	0xe0, 0x05, 0x26, 0x2d, 0x01, 0x36, 0x48, 0xd3, 
-	0x68, 0x00, 0x1c, 0x41, 0x91, 0x07, 0x49, 0xd4, 
-	0xa8, 0x15, 0xf7, 0xfc, 0xf8, 0xe9, 0x98, 0x17, 
-	0x1e, 0x71, 0x42, 0x88, 0xdd, 0x01, 0x1e, 0x70, 
-	0x90, 0x17, 0x98, 0x18, 0x99, 0x07, 0x39, 0x01, 
-	0x42, 0x88, 0xdd, 0x02, 0x99, 0x07, 0x1e, 0x48, 
-	0x90, 0x18, 0x98, 0x18, 0x99, 0x16, 0x1a, 0x40, 
-	0x00, 0x40, 0x1c, 0x81, 0x98, 0x08, 0xf0, 0x06, 
-	0xfb, 0xd3, 0x90, 0x0a, 0x98, 0x0a, 0x42, 0x84, 
-	0xdd, 0x00, 0x9c, 0x0a, 0x48, 0xc5, 0x6f, 0x00, 
-	0x90, 0x02, 0x20, 0x00, 0x90, 0x05, 0x98, 0x02, 
-	0x28, 0x02, 0xd0, 0x02, 0x98, 0x02, 0x28, 0x03, 
-	0xd1, 0x3a, 0x48, 0xc1, 0x6b, 0x00, 0x90, 0x04, 
-	0x48, 0xbe, 0x6e, 0xc1, 0x91, 0x03, 0x98, 0x04, 
-	0x99, 0x03, 0x42, 0x88, 0xdd, 0x21, 0x20, 0xc0, 
-	0x90, 0x06, 0x1d, 0x20, 0x28, 0x00, 0xda, 0x02, 
-	0xe0, 0x00, 0xe1, 0x8e, 0x30, 0x07, 0x10, 0xc0, 
-	0x90, 0x05, 0x98, 0x04, 0x28, 0x03, 0xd0, 0x14, 
-	0x99, 0x03, 0x29, 0x03, 0xd1, 0x07, 0x20, 0xcd, 
-	0x90, 0x06, 0x1d, 0x61, 0x20, 0x0a, 0xf0, 0x06, 
-	0xfb, 0xa3, 0x90, 0x05, 0xe0, 0x09, 0x98, 0x02, 
-	0x28, 0x02, 0xd1, 0x06, 0x20, 0x9a, 0x90, 0x06, 
-	0x1c, 0xa1, 0x20, 0x05, 0xf0, 0x06, 0xfb, 0x98, 
-	0x90, 0x05, 0x98, 0x06, 0x28, 0x9a, 0xd0, 0x02, 
-	0x98, 0x06, 0x28, 0xcd, 0xd1, 0x08, 0x2d, 0x0e, 
-	0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x04, 0x20, 0x00, 
-	0x90, 0x05, 0x20, 0xff, 0x30, 0x01, 0x90, 0x06, 
-	0x2d, 0x12, 0xd1, 0x0b, 0x48, 0x9d, 0x68, 0x00, 
-	0x30, 0x01, 0x42, 0xa0, 0xd1, 0x06, 0x68, 0x78, 
-	0x28, 0x00, 0xd1, 0x03, 0x20, 0x01, 0x49, 0x9f, 
-	0x63, 0x48, 0xe0, 0x02, 0x20, 0x00, 0x49, 0x9d, 
-	0x63, 0x48, 0x98, 0x0a, 0x99, 0x06, 0x43, 0x48, 
-	0x28, 0x00, 0xda, 0x00, 0x30, 0xff, 0x12, 0x00, 
-	0x42, 0xa0, 0xdd, 0x04, 0x20, 0x00, 0x90, 0x05, 
-	0x20, 0xff, 0x30, 0x01, 0x90, 0x06, 0x68, 0x78, 
-	0x99, 0x05, 0x18, 0x40, 0x60, 0x78, 0x1c, 0x39, 
-	0xa8, 0x11, 0xf7, 0xfc, 0xf8, 0x61, 0x1c, 0x29, 
-	0xa8, 0x11, 0xf7, 0xff, 0xfd, 0x71, 0x98, 0x12, 
-	0x49, 0x88, 0x68, 0x09, 0x39, 0x01, 0x42, 0x88, 
-	0xd1, 0x00, 0x24, 0x00, 0x99, 0x15, 0x91, 0x0d, 
-	0x98, 0x16, 0x90, 0x0f, 0x21, 0x00, 0x91, 0x10, 
-	0x68, 0x38, 0x28, 0x00, 0xda, 0x08, 0x68, 0x38, 
-	0x99, 0x08, 0x43, 0x48, 0x42, 0x41, 0x29, 0x00, 
-	0xda, 0x00, 0x31, 0x01, 0x10, 0x49, 0x91, 0x10, 
-	0x68, 0x78, 0x28, 0x00, 0xda, 0x0d, 0x68, 0x78, 
-	0x99, 0x08, 0x43, 0x48, 0x28, 0x00, 0xda, 0x00, 
-	0x30, 0x01, 0x10, 0x40, 0x02, 0x01, 0x98, 0x06, 
-	0xf0, 0x06, 0xfb, 0x36, 0x99, 0x0f, 0x1a, 0x08, 
-	0x90, 0x0f, 0x98, 0x18, 0x99, 0x0f, 0x42, 0x88, 
-	0xdc, 0x02, 0x98, 0x18, 0x30, 0x01, 0x90, 0x0f, 
-	0x98, 0x17, 0x99, 0x0d, 0x1a, 0x40, 0x30, 0x01, 
-	0x90, 0x0e, 0x98, 0x18, 0x99, 0x0f, 0x1a, 0x40, 
-	0x30, 0x01, 0x90, 0x09, 0x98, 0x09, 0x00, 0x41, 
-	0x98, 0x08, 0xf0, 0x06, 0xfb, 0x1d, 0x99, 0x06, 
-	0x43, 0x48, 0x28, 0x00, 0xda, 0x00, 0x30, 0xff, 
-	0x12, 0x00, 0x90, 0x09, 0x68, 0xb8, 0x68, 0x39, 
-	0x1a, 0x40, 0x1c, 0x41, 0x91, 0x0c, 0x98, 0x17, 
-	0x99, 0x15, 0x1a, 0x40, 0x00, 0x40, 0x1c, 0x81, 
-	0x98, 0x08, 0xf0, 0x06, 0xfb, 0x09, 0x90, 0x0b, 
-	0x98, 0x0b, 0x4b, 0x65, 0x40, 0x18, 0x90, 0x0b, 
-	0x98, 0x0b, 0x99, 0x08, 0x43, 0x48, 0x28, 0x00, 
-	0xda, 0x00, 0x30, 0x01, 0x10, 0x40, 0x90, 0x0e, 
-	0x99, 0x0c, 0x98, 0x0b, 0x42, 0x81, 0xdd, 0x01, 
-	0x98, 0x0b, 0x90, 0x0c, 0x99, 0x0c, 0x4b, 0x5c, 
-	0x40, 0x19, 0x91, 0x0c, 0x98, 0x0c, 0x28, 0x00, 
-	0xdd, 0x05, 0x68, 0x38, 0x99, 0x0c, 0x18, 0x40, 
-	0x38, 0x01, 0x90, 0x13, 0xe0, 0x02, 0x68, 0x38, 
-	0x30, 0x01, 0x90, 0x13, 0x98, 0x13, 0x28, 0x01, 
-	0xda, 0x01, 0x20, 0x01, 0x90, 0x13, 0x98, 0x13, 
-	0x4b, 0x52, 0x42, 0x98, 0xdd, 0x01, 0x48, 0x51, 
-	0x90, 0x13, 0x99, 0x06, 0x43, 0x4c, 0x1c, 0x20, 
-	0x28, 0x00, 0xda, 0x00, 0x30, 0xff, 0x12, 0x04, 
-	0x98, 0x0a, 0x42, 0x84, 0xdd, 0x00, 0x9c, 0x0a, 
-	0x2c, 0x02, 0xda, 0x00, 0x24, 0x02, 0x68, 0x78, 
-	0x19, 0x00, 0x38, 0x01, 0x90, 0x14, 0x98, 0x14, 
-	0x28, 0x01, 0xda, 0x01, 0x20, 0x01, 0x90, 0x14, 
-	0x98, 0x14, 0x49, 0x3c, 0x68, 0x09, 0x42, 0x88, 
-	0xd9, 0x02, 0x48, 0x3a, 0x68, 0x00, 0x90, 0x14, 
-	0x98, 0x12, 0x49, 0x38, 0x68, 0x09, 0x39, 0x01, 
-	0x42, 0x88, 0xd9, 0x03, 0x48, 0x35, 0x68, 0x00, 
-	0x38, 0x01, 0x90, 0x12, 0x98, 0x09, 0x28, 0x04, 
-	0xdb, 0x01, 0x2c, 0x04, 0xda, 0x01, 0x20, 0x00, 
-	0x90, 0x0e, 0x98, 0x0e, 0x28, 0x03, 0xdb, 0x02, 
-	0x98, 0x0c, 0x28, 0x04, 0xda, 0x09, 0x20, 0x00, 
-	0x90, 0x0e, 0x48, 0x35, 0x90, 0x11, 0x48, 0x33, 
-	0x90, 0x13, 0x20, 0x00, 0x90, 0x12, 0x20, 0x01, 
-	0x90, 0x14, 0x21, 0x00, 0x91, 0x00, 0x98, 0x08, 
-	0x28, 0x01, 0xd1, 0x16, 0x98, 0x0e, 0x99, 0x10, 
-	0x1a, 0x40, 0x00, 0x40, 0x4b, 0x2b, 0x42, 0x98, 
-	0xdd, 0x0b, 0x98, 0x0e, 0x99, 0x10, 0x1a, 0x40, 
-	0x00, 0x40, 0x23, 0x2d, 0x01, 0x1b, 0x1a, 0xc1, 
-	0x29, 0x00, 0xda, 0x00, 0x31, 0x01, 0x10, 0x49, 
-	0x91, 0x00, 0x98, 0x0e, 0x42, 0xb0, 0xdd, 0x00, 
-	0x96, 0x0e, 0x99, 0x10, 0x42, 0xb1, 0xdd, 0x00, 
-	0x96, 0x10, 0x1c, 0x30, 0x21, 0x01, 0x07, 0x49, 
-	0xf0, 0x06, 0xfa, 0x76, 0x99, 0x0d, 0x43, 0x48, 
-	0x23, 0x01, 0x04, 0x1b, 0x18, 0xc0, 0x14, 0x40, 
-	0x49, 0x1c, 0x65, 0x88, 0x1c, 0x30, 0x21, 0x01, 
-	0x07, 0x49, 0xf0, 0x06, 0xfa, 0x69, 0x99, 0x10, 
-	0x43, 0x48, 0x23, 0x01, 0x04, 0x1b, 0x18, 0xc0, 
-	0x14, 0x40, 0x49, 0x16, 0x65, 0xc8, 0x1c, 0x30, 
-	0x21, 0x01, 0x07, 0x49, 0xf0, 0x06, 0xfa, 0x5c, 
-	0x99, 0x0e, 0x43, 0x48, 0x23, 0x01, 0x04, 0x1b, 
-	0x18, 0xc0, 0x14, 0x40, 0x49, 0x0f, 0x65, 0x48, 
-	0x99, 0x07, 0x1f, 0x08, 0x99, 0x0f, 0x42, 0x88, 
-	0xdc, 0x1b, 0x99, 0x07, 0x1f, 0x08, 0xe0, 0x17, 
-	0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x60, 0x80, 
-	0x2e, 0x08, 0x7c, 0xbc, 0xcc, 0x00, 0x02, 0x00, 
-	0x2e, 0x08, 0x7d, 0xa0, 0xcc, 0x00, 0x0f, 0x80, 
-	0xcc, 0x00, 0x00, 0x80, 0xcc, 0x00, 0x01, 0x00, 
-	0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x02, 0xcf, 
-	0x00, 0x00, 0x02, 0xce, 0xcc, 0x00, 0x00, 0x00, 
-	0x90, 0x0f, 0x98, 0x0f, 0x49, 0x0d, 0x66, 0x08, 
-	0x1c, 0x30, 0x21, 0x01, 0x07, 0x49, 0xf0, 0x06, 
-	0xfa, 0x2b, 0x99, 0x00, 0x43, 0x48, 0x23, 0x01, 
-	0x04, 0x1b, 0x18, 0xc0, 0x14, 0x40, 0x49, 0x07, 
-	0x66, 0x48, 0xa9, 0x11, 0x1c, 0x38, 0xf7, 0xfb, 
-	0xff, 0x1f, 0x20, 0x00, 0xb0, 0x1b, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x1b, 
-	0xe7, 0xf9, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 
-	0xb4, 0xb0, 0x1c, 0x02, 0x1c, 0x0f, 0x2a, 0x00, 
-	0xd1, 0x02, 0x20, 0x01, 0xbc, 0xb0, 0x47, 0x70, 
-	0x2f, 0x01, 0xd1, 0x20, 0x20, 0x00, 0x23, 0x00, 
-	0x4d, 0x13, 0x62, 0x2b, 0x23, 0x00, 0x4d, 0x12, 
-	0x62, 0xab, 0x4b, 0x12, 0x68, 0x9b, 0x1c, 0x1c, 
-	0x4b, 0x11, 0x6e, 0xdb, 0x1c, 0x19, 0x2c, 0x02, 
-	0xd0, 0x01, 0x29, 0x02, 0xd1, 0x01, 0x20, 0x08, 
-	0xe0, 0x00, 0x20, 0x07, 0x79, 0x13, 0x2b, 0x00, 
-	0xd0, 0x01, 0x23, 0x10, 0x43, 0x18, 0x4b, 0x08, 
-	0x62, 0x58, 0x79, 0x55, 0x23, 0x80, 0x43, 0x2b, 
-	0x4d, 0x05, 0x62, 0xab, 0xe0, 0x05, 0x48, 0x07, 
-	0x68, 0x05, 0x23, 0x80, 0x43, 0x9d, 0x1c, 0x2b, 
-	0x60, 0x03, 0x20, 0x00, 0xe7, 0xd2, 0xe7, 0xd1, 
-	0x72, 0x00, 0x01, 0x00, 0xcc, 0x00, 0x0c, 0x00, 
-	0xcc, 0x00, 0x0f, 0x80, 0x72, 0x00, 0x01, 0x28, 
-	0xb5, 0xff, 0x9f, 0x09, 0xb0, 0x81, 0x98, 0x01, 
-	0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 0x99, 0x02, 
-	0x06, 0x0c, 0x0e, 0x24, 0x98, 0x03, 0x06, 0x02, 
-	0x0e, 0x12, 0x9b, 0x04, 0x06, 0x1d, 0x0e, 0x2d, 
-	0x2f, 0x01, 0xd1, 0x1b, 0x20, 0x00, 0x4b, 0x14, 
-	0x62, 0x18, 0x20, 0x00, 0x4b, 0x12, 0x62, 0x98, 
-	0x98, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x01, 0x23, 
-	0x43, 0x18, 0x06, 0x01, 0x0e, 0x09, 0x48, 0x0e, 
-	0x62, 0x41, 0x07, 0x50, 0x0f, 0x40, 0x07, 0x6b, 
-	0x0f, 0x5b, 0x00, 0xdb, 0x43, 0x18, 0x06, 0x01, 
-	0x0e, 0x09, 0x20, 0x80, 0x43, 0x08, 0x4b, 0x08, 
-	0x62, 0x98, 0xe0, 0x05, 0x48, 0x07, 0x68, 0x06, 
-	0x23, 0x80, 0x43, 0x9e, 0x1c, 0x33, 0x60, 0x03, 
-	0x20, 0x00, 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, 
-	0x72, 0x00, 0x01, 0x00, 0x72, 0x00, 0x01, 0x28, 
-	0xb5, 0xf1, 0x98, 0x00, 0x06, 0x07, 0x0e, 0x3f, 
-	0xb0, 0x81, 0x2f, 0x1f, 0xdb, 0x05, 0x20, 0xb3, 
-	0xb0, 0x01, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x48, 0x62, 0x23, 0x80, 0x68, 0x1b, 
-	0x60, 0x18, 0x48, 0x61, 0x23, 0x80, 0x6b, 0x1b, 
-	0x60, 0x18, 0x48, 0x60, 0x23, 0x80, 0x6b, 0x5b, 
-	0x60, 0x18, 0x48, 0x5f, 0x23, 0x80, 0x6b, 0x9b, 
-	0x60, 0x18, 0x20, 0x01, 0x40, 0xb8, 0x4b, 0x59, 
-	0x60, 0x18, 0x20, 0x00, 0x4b, 0x57, 0x71, 0x18, 
-	0x20, 0x00, 0x4b, 0x56, 0x71, 0x58, 0x48, 0x55, 
-	0x68, 0x00, 0x4b, 0x58, 0x60, 0x58, 0x48, 0x58, 
-	0x4b, 0x56, 0x60, 0x98, 0x48, 0x57, 0x4b, 0x55, 
-	0x60, 0xd8, 0x20, 0xff, 0x30, 0x01, 0x4b, 0x53, 
-	0x62, 0x18, 0x20, 0xff, 0x30, 0x01, 0x4b, 0x51, 
-	0x62, 0x58, 0x20, 0x03, 0x4b, 0x52, 0x75, 0x18, 
-	0x20, 0x0e, 0x4b, 0x51, 0x75, 0x58, 0x20, 0x04, 
-	0x4b, 0x4f, 0x75, 0x98, 0x20, 0x03, 0x4b, 0x4e, 
-	0x75, 0xd8, 0x20, 0x00, 0x4b, 0x4d, 0x60, 0x18, 
-	0x20, 0x00, 0x4b, 0x4d, 0x60, 0x18, 0x20, 0x0d, 
-	0x23, 0x19, 0x06, 0x9b, 0x63, 0x18, 0x22, 0x00, 
-	0x2a, 0x20, 0xdb, 0x04, 0xe0, 0x21, 0x1c, 0x50, 
-	0x06, 0x02, 0x0e, 0x12, 0xe7, 0xf8, 0x25, 0x00, 
-	0x00, 0x93, 0x4e, 0x46, 0x50, 0xf5, 0x25, 0xff, 
-	0x4b, 0x45, 0x54, 0x9d, 0x01, 0x15, 0x4b, 0x45, 
-	0x18, 0xec, 0x01, 0x15, 0x4b, 0x44, 0x18, 0xe8, 
-	0x25, 0x00, 0xc4, 0x20, 0x25, 0x00, 0xc4, 0x20, 
-	0x25, 0x00, 0xc4, 0x20, 0x25, 0x00, 0xc4, 0x20, 
-	0x25, 0x00, 0xc0, 0x20, 0x25, 0x00, 0xc0, 0x20, 
-	0x25, 0x00, 0xc0, 0x20, 0x25, 0x00, 0xc0, 0x20, 
-	0xe7, 0xdd, 0x21, 0x00, 0x29, 0x20, 0xdb, 0x04, 
-	0xe0, 0x0b, 0x1c, 0x48, 0x04, 0x01, 0x0c, 0x09, 
-	0xe7, 0xf8, 0x23, 0x00, 0x00, 0x88, 0x4c, 0x2a, 
-	0x50, 0x23, 0x23, 0x00, 0x48, 0x35, 0x54, 0x43, 
-	0xe7, 0xf3, 0x4c, 0x35, 0x94, 0x00, 0x22, 0x00, 
-	0x2a, 0x10, 0xdb, 0x04, 0xe0, 0x0f, 0x1c, 0x50, 
-	0x06, 0x02, 0x0e, 0x12, 0xe7, 0xf8, 0x20, 0x00, 
-	0x00, 0x93, 0x4c, 0x30, 0x50, 0xe0, 0x23, 0xff, 
-	0x48, 0x2f, 0x54, 0x83, 0x20, 0x00, 0x00, 0x93, 
-	0x9c, 0x00, 0x50, 0xe0, 0xe7, 0xef, 0x21, 0x00, 
-	0x23, 0xff, 0x33, 0x01, 0x42, 0x99, 0xdb, 0x04, 
-	0xe0, 0x2a, 0x1c, 0x48, 0x04, 0x01, 0x0c, 0x09, 
-	0xe7, 0xf6, 0x23, 0x00, 0x00, 0x88, 0x4c, 0x1a, 
-	0x50, 0x23, 0x20, 0x00, 0x00, 0x8b, 0x4c, 0x18, 
-	0x19, 0x1c, 0x23, 0x01, 0x02, 0x9b, 0x18, 0xe3, 
-	0x60, 0x18, 0x20, 0x00, 0x4b, 0x14, 0x18, 0x5c, 
-	0x23, 0x01, 0x02, 0xdb, 0x18, 0xe3, 0x70, 0x18, 
-	0x20, 0x00, 0x00, 0x8b, 0x4c, 0x11, 0x50, 0xe0, 
-	0x20, 0x00, 0x00, 0x8b, 0x4c, 0x0f, 0x19, 0x1c, 
-	0x23, 0x01, 0x02, 0x9b, 0x18, 0xe3, 0x60, 0x18, 
-	0x20, 0x00, 0x4b, 0x0c, 0x18, 0x5c, 0x23, 0x01, 
-	0x02, 0xdb, 0x18, 0xe3, 0x70, 0x18, 0xe7, 0xd4, 
-	0x20, 0x00, 0xb0, 0x01, 0xe7, 0x39, 0xb0, 0x01, 
-	0xe7, 0x37, 0x00, 0x00, 0x2e, 0x08, 0x72, 0xec, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x72, 0x90, 
-	0x2e, 0x08, 0x72, 0x9c, 0x9e, 0x00, 0x04, 0x80, 
-	0x2e, 0x08, 0x60, 0x90, 0x2e, 0x08, 0x69, 0x90, 
-	0x9e, 0x00, 0x04, 0xa0, 0x2e, 0x08, 0x5e, 0xdc, 
-	0x2e, 0x08, 0x5e, 0xe0, 0x2e, 0x08, 0x5e, 0xe4, 
-	0x2e, 0x08, 0x5f, 0xa4, 0x64, 0x00, 0x08, 0x00, 
-	0x64, 0x00, 0x10, 0x00, 0x2e, 0x08, 0x7b, 0xf4, 
-	0x9e, 0x00, 0x04, 0xb8, 0x2e, 0x08, 0x5f, 0x64, 
-	0x2e, 0x08, 0x5f, 0xc4, 0xb4, 0xb0, 0x1c, 0x07, 
-	0x1c, 0x0a, 0x06, 0x11, 0x0e, 0x09, 0x29, 0x20, 
-	0xdb, 0x02, 0x20, 0xa2, 0xbc, 0xb0, 0x47, 0x70, 
-	0x00, 0x88, 0x4b, 0x0a, 0x58, 0x18, 0x1c, 0x05, 
-	0xd1, 0x01, 0x20, 0xb0, 0xe7, 0xf6, 0x68, 0xe8, 
-	0x1c, 0x04, 0xd1, 0x01, 0x20, 0xb6, 0xe7, 0xf1, 
-	0x68, 0x60, 0x00, 0x43, 0x18, 0x18, 0x01, 0x80, 
-	0x08, 0x80, 0x60, 0x38, 0x20, 0x00, 0xe7, 0xe9, 
-	0xe7, 0xe8, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x5c, 
-	0xb5, 0xff, 0xb0, 0x82, 0x9a, 0x04, 0x06, 0x11, 
-	0x0e, 0x09, 0x91, 0x00, 0x9b, 0x05, 0x06, 0x18, 
-	0x0e, 0x00, 0x90, 0x01, 0xb0, 0x83, 0x99, 0x03, 
-	0x29, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x05, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x98, 0x05, 0x28, 0x00, 0xd0, 0x64, 0x98, 0x05, 
-	0x23, 0x0d, 0x06, 0x9b, 0x42, 0xd8, 0xd3, 0x02, 
-	0x20, 0xb4, 0xb0, 0x05, 0xe7, 0xf0, 0x99, 0x06, 
-	0x23, 0xff, 0x33, 0x81, 0x42, 0x99, 0xd2, 0x02, 
-	0x20, 0xb5, 0xb0, 0x05, 0xe7, 0xe8, 0x99, 0x03, 
-	0x00, 0x88, 0x49, 0x2c, 0x58, 0x08, 0x90, 0x02, 
-	0x28, 0x00, 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x05, 
-	0xe7, 0xde, 0x99, 0x06, 0x00, 0x88, 0x1f, 0xc1, 
-	0x39, 0x05, 0x91, 0x00, 0x9e, 0x05, 0x98, 0x05, 
-	0x1d, 0xc5, 0x35, 0x05, 0x60, 0x35, 0x99, 0x06, 
-	0x60, 0x71, 0x20, 0x00, 0x60, 0xb0, 0x98, 0x04, 
-	0x28, 0x10, 0xd1, 0x0a, 0x98, 0x02, 0x68, 0x84, 
-	0x98, 0x02, 0x30, 0x18, 0x90, 0x01, 0x1c, 0x2a, 
-	0x99, 0x00, 0x98, 0x01, 0xf0, 0x00, 0xfc, 0x86, 
-	0xe0, 0x25, 0x98, 0x04, 0x28, 0x20, 0xd1, 0x1f, 
-	0x98, 0x02, 0x68, 0xc0, 0x1c, 0x07, 0xd1, 0x02, 
-	0x20, 0xb6, 0xb0, 0x05, 0xe7, 0xb8, 0x78, 0xb8, 
-	0x08, 0x40, 0x00, 0x40, 0x70, 0xb8, 0x69, 0x3c, 
-	0x1d, 0xf8, 0x30, 0x05, 0x90, 0x01, 0x68, 0xb8, 
-	0x28, 0x00, 0xd1, 0x00, 0x60, 0xbd, 0x1c, 0x2a, 
-	0x99, 0x00, 0x98, 0x01, 0xf0, 0x00, 0xfc, 0x6a, 
-	0x68, 0x79, 0x18, 0x40, 0x60, 0x78, 0x78, 0x78, 
-	0x99, 0x03, 0xf0, 0x00, 0xf8, 0xb9, 0xe0, 0x02, 
-	0x20, 0xbc, 0xb0, 0x05, 0xe7, 0x9c, 0x68, 0xa0, 
-	0x28, 0x00, 0xd0, 0x01, 0x68, 0xa4, 0xe7, 0xfa, 
-	0x60, 0xa6, 0x20, 0x00, 0xb0, 0x05, 0xe7, 0x93, 
-	0x20, 0xb4, 0xb0, 0x05, 0xe7, 0x90, 0xb0, 0x03, 
-	0xb0, 0x02, 0xe7, 0x8d, 0x2e, 0x08, 0x5e, 0x5c, 
-	0xb5, 0xff, 0xb0, 0x81, 0x9a, 0x03, 0x06, 0x16, 
-	0x0e, 0x36, 0x9b, 0x04, 0x06, 0x18, 0x0e, 0x00, 
-	0x90, 0x00, 0xb0, 0x83, 0x27, 0x00, 0x2e, 0x20, 
-	0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x04, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0xb0, 
-	0x49, 0x45, 0x58, 0x08, 0x1c, 0x04, 0xd1, 0x02, 
-	0x20, 0xb0, 0xb0, 0x04, 0xe7, 0xf3, 0x78, 0xe0, 
-	0x28, 0x00, 0xd1, 0x73, 0x98, 0x03, 0x28, 0x20, 
-	0xd1, 0x19, 0x68, 0xe0, 0x1c, 0x07, 0xd1, 0x02, 
-	0x20, 0xb6, 0xb0, 0x04, 0xe7, 0xe7, 0x69, 0x38, 
-	0x49, 0x3c, 0x60, 0x48, 0x48, 0x3b, 0x68, 0x40, 
-	0x68, 0x00, 0x60, 0xb8, 0x1d, 0xf8, 0x30, 0x05, 
-	0x90, 0x02, 0x20, 0x01, 0x90, 0x00, 0x48, 0x37, 
-	0x68, 0x40, 0x68, 0x40, 0x00, 0x80, 0x1f, 0xc1, 
-	0x39, 0x19, 0x91, 0x01, 0xe0, 0x1d, 0x98, 0x03, 
-	0x28, 0x10, 0xd1, 0x17, 0x68, 0xa0, 0x49, 0x31, 
-	0x60, 0x48, 0x48, 0x30, 0x68, 0x40, 0x68, 0x00, 
-	0x61, 0x20, 0x48, 0x2e, 0x68, 0x40, 0x68, 0x00, 
-	0x61, 0x60, 0x1d, 0xe0, 0x30, 0x11, 0x90, 0x02, 
-	0x48, 0x2a, 0x68, 0x40, 0x68, 0x40, 0x00, 0x80, 
-	0x1f, 0xc1, 0x39, 0x21, 0x91, 0x01, 0x20, 0x00, 
-	0x90, 0x00, 0xe0, 0x02, 0x20, 0xbc, 0xb0, 0x04, 
-	0xe7, 0xb5, 0x48, 0x24, 0x68, 0x40, 0x68, 0x80, 
-	0x28, 0x00, 0xd0, 0x37, 0x25, 0x00, 0x48, 0x21, 
-	0x68, 0x40, 0x68, 0x02, 0x99, 0x01, 0x98, 0x02, 
-	0xf0, 0x00, 0xfb, 0xe8, 0x19, 0x45, 0x48, 0x1d, 
-	0x68, 0x40, 0x49, 0x1c, 0x60, 0x08, 0x48, 0x1b, 
-	0x68, 0x00, 0x68, 0x80, 0x49, 0x19, 0x60, 0x48, 
-	0x48, 0x18, 0x68, 0x40, 0x68, 0x40, 0x00, 0x80, 
-	0x1f, 0xc1, 0x39, 0x05, 0x91, 0x01, 0x48, 0x15, 
-	0x68, 0x40, 0x68, 0x80, 0x28, 0x00, 0xd1, 0xe2, 
-	0x20, 0x00, 0x49, 0x12, 0x68, 0x09, 0x60, 0x88, 
-	0x48, 0x10, 0x68, 0x40, 0x99, 0x04, 0x60, 0x08, 
-	0x48, 0x0e, 0x68, 0x40, 0x68, 0x40, 0x99, 0x05, 
-	0x60, 0x08, 0x98, 0x00, 0x28, 0x00, 0xd0, 0x06, 
-	0x60, 0x7d, 0x78, 0x78, 0x1c, 0x31, 0xf0, 0x00, 
-	0xf8, 0x13, 0xe0, 0x00, 0xe0, 0x05, 0x20, 0x00, 
-	0xb0, 0x04, 0xe7, 0x78, 0x20, 0xb4, 0xb0, 0x04, 
-	0xe7, 0x75, 0x20, 0xbc, 0xb0, 0x04, 0xe7, 0x72, 
-	0xb0, 0x03, 0xb0, 0x01, 0xe7, 0x6f, 0x00, 0x00, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x60, 0x88, 
-	0xb5, 0xf3, 0x98, 0x00, 0x06, 0x02, 0x0e, 0x12, 
-	0x99, 0x01, 0x06, 0x0c, 0x0e, 0x24, 0xb0, 0x81, 
-	0x2c, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x01, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x00, 0xa0, 0x4b, 0x14, 0x58, 0x18, 0x1c, 0x05, 
-	0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x01, 0xe7, 0xf3, 
-	0x68, 0xe8, 0x1c, 0x01, 0xd1, 0x02, 0x20, 0xb6, 
-	0xb0, 0x01, 0xe7, 0xed, 0x11, 0x10, 0x06, 0x00, 
-	0x0e, 0x00, 0x90, 0x00, 0x28, 0x00, 0xd1, 0x04, 
-	0x68, 0x48, 0x40, 0xd0, 0x06, 0x07, 0x0e, 0x3f, 
-	0xe0, 0x09, 0x68, 0x48, 0x07, 0x16, 0x0f, 0x36, 
-	0x40, 0xf0, 0x68, 0x4e, 0x40, 0xd6, 0x1c, 0x33, 
-	0x18, 0xc0, 0x06, 0x07, 0x0e, 0x3f, 0x70, 0x0f, 
-	0x70, 0x4a, 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xd3, 
-	0xb0, 0x01, 0xe7, 0xd1, 0x2e, 0x08, 0x5e, 0x5c, 
-	0xb4, 0xb0, 0x1c, 0x03, 0x1c, 0x0a, 0x06, 0x11, 
-	0x0e, 0x09, 0x29, 0x20, 0xdb, 0x02, 0x20, 0xa2, 
-	0xbc, 0xb0, 0x47, 0x70, 0x00, 0x88, 0x4d, 0x08, 
-	0x58, 0x28, 0x1c, 0x04, 0xd1, 0x01, 0x20, 0xb0, 
-	0xe7, 0xf6, 0x68, 0xe0, 0x1c, 0x07, 0xd1, 0x01, 
-	0x20, 0xb6, 0xe7, 0xf1, 0x78, 0x78, 0x70, 0x18, 
-	0x20, 0x00, 0xe7, 0xed, 0xe7, 0xec, 0x00, 0x00, 
-	0x2e, 0x08, 0x5e, 0x5c, 0xb5, 0xf3, 0xb0, 0x81, 
-	0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 
-	0x99, 0x02, 0x06, 0x0d, 0x0e, 0x2d, 0xb0, 0x86, 
-	0x20, 0x00, 0x90, 0x00, 0x2d, 0x20, 0xdd, 0x05, 
-	0x20, 0xa2, 0xb0, 0x07, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0xa8, 0x49, 0xa2, 
-	0x58, 0x08, 0x90, 0x04, 0x28, 0x00, 0xd1, 0x02, 
-	0x20, 0xb0, 0xb0, 0x07, 0xe7, 0xf2, 0x00, 0xa8, 
-	0x49, 0x9e, 0x68, 0x09, 0x18, 0x40, 0x90, 0x05, 
-	0x00, 0xe8, 0x1b, 0x40, 0x00, 0x80, 0x49, 0x9c, 
-	0x68, 0x09, 0x18, 0x46, 0x98, 0x06, 0x28, 0x00, 
-	0xd0, 0x73, 0x28, 0x01, 0xd0, 0x4f, 0x28, 0x02, 
-	0xd0, 0x00, 0xe1, 0x1d, 0x98, 0x04, 0x69, 0x00, 
-	0x60, 0x70, 0x98, 0x04, 0x78, 0x40, 0x06, 0xc0, 
-	0x0e, 0xc0, 0x90, 0x02, 0x98, 0x02, 0x28, 0x13, 
-	0xd0, 0x16, 0x27, 0x00, 0x2f, 0x20, 0xdb, 0x04, 
-	0xe0, 0x11, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 
-	0xe7, 0xf8, 0x48, 0x8e, 0x5d, 0xc0, 0x42, 0xa8, 
-	0xd1, 0x08, 0x00, 0xb8, 0x49, 0x8c, 0x58, 0x08, 
-	0x30, 0x01, 0x78, 0x01, 0x23, 0x80, 0x43, 0xdb, 
-	0x40, 0x19, 0x70, 0x01, 0xe7, 0xed, 0xe0, 0x1e, 
-	0x27, 0x00, 0x2f, 0x10, 0xdb, 0x04, 0xe0, 0x1a, 
-	0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, 
-	0x48, 0x84, 0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x11, 
-	0x00, 0xb8, 0x49, 0x83, 0x58, 0x08, 0x30, 0x01, 
-	0x78, 0x01, 0x23, 0x80, 0x43, 0xdb, 0x40, 0x19, 
-	0x70, 0x01, 0x98, 0x00, 0x30, 0x01, 0x06, 0x00, 
-	0x0e, 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, 0x02, 
-	0xd1, 0x00, 0xe0, 0x00, 0xe7, 0xe4, 0x88, 0x30, 
-	0x4b, 0x7a, 0x40, 0x18, 0x80, 0x30, 0x98, 0x05, 
-	0x68, 0x00, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, 
-	0x99, 0x05, 0x60, 0x08, 0xe0, 0xd3, 0x98, 0x05, 
-	0x68, 0x00, 0x4b, 0x75, 0x40, 0x18, 0x99, 0x05, 
-	0x60, 0x08, 0x20, 0x00, 0x60, 0xb0, 0x20, 0x00, 
-	0x70, 0xf0, 0x20, 0x00, 0x60, 0xf0, 0x98, 0x04, 
-	0x78, 0x40, 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x02, 
-	0x98, 0x02, 0x28, 0x13, 0xd0, 0x16, 0x27, 0x00, 
-	0x2f, 0x20, 0xdb, 0x04, 0xe0, 0x11, 0x1c, 0x78, 
-	0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, 0x48, 0x63, 
-	0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x08, 0x00, 0xb8, 
-	0xe0, 0x00, 0xe0, 0x27, 0x49, 0x60, 0x58, 0x0c, 
-	0x78, 0x60, 0x23, 0x80, 0x43, 0x18, 0x70, 0x60, 
-	0xe7, 0xed, 0xe0, 0x1e, 0x27, 0x00, 0x2f, 0x10, 
-	0xdb, 0x04, 0xe0, 0x1a, 0x1c, 0x78, 0x06, 0x07, 
-	0x0e, 0x3f, 0xe7, 0xf8, 0x48, 0x59, 0x5d, 0xc0, 
-	0x42, 0xa8, 0xd1, 0x11, 0x00, 0xb8, 0x49, 0x58, 
-	0x58, 0x08, 0x30, 0x01, 0x78, 0x01, 0x23, 0x80, 
-	0x43, 0xdb, 0x40, 0x19, 0x70, 0x01, 0x98, 0x00, 
-	0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 
-	0x98, 0x00, 0x28, 0x02, 0xd1, 0x00, 0xe0, 0x00, 
-	0xe7, 0xe4, 0xe0, 0x88, 0x98, 0x05, 0x68, 0x00, 
-	0x4b, 0x4f, 0x40, 0x18, 0x99, 0x05, 0x60, 0x08, 
-	0x20, 0x00, 0x60, 0xb0, 0x20, 0x00, 0x70, 0xf0, 
-	0x20, 0x00, 0x60, 0xf0, 0x98, 0x04, 0x78, 0x40, 
-	0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x02, 0x98, 0x04, 
-	0x78, 0x40, 0x21, 0x20, 0x40, 0x01, 0x91, 0x03, 
-	0x98, 0x02, 0x28, 0x13, 0xd0, 0x4c, 0x27, 0x00, 
-	0x2f, 0x20, 0xdb, 0x04, 0xe0, 0x47, 0x1c, 0x78, 
-	0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, 0x48, 0x3b, 
-	0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x3e, 0x00, 0xb8, 
-	0x49, 0x39, 0x58, 0x0c, 0x20, 0x80, 0x70, 0x60, 
-	0x99, 0x03, 0x1c, 0x20, 0xf7, 0xfd, 0xfb, 0x30, 
-	0x78, 0xa0, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x28, 
-	0x6a, 0xe0, 0x22, 0x00, 0x92, 0x01, 0x99, 0x01, 
-	0x29, 0x08, 0xdb, 0x06, 0xe0, 0x1f, 0x99, 0x01, 
-	0x31, 0x01, 0x06, 0x09, 0x0e, 0x09, 0x91, 0x01, 
-	0xe7, 0xf5, 0x99, 0x01, 0x00, 0x89, 0x18, 0x09, 
-	0x68, 0x49, 0x9a, 0x01, 0x00, 0x92, 0x18, 0x12, 
-	0x64, 0x51, 0x22, 0x00, 0x99, 0x01, 0x00, 0x89, 
-	0x18, 0x09, 0x62, 0x4a, 0x99, 0x01, 0x00, 0x89, 
-	0x18, 0x09, 0x6c, 0x49, 0x29, 0x00, 0xd0, 0x05, 
-	0x9a, 0x01, 0x21, 0x80, 0x41, 0x11, 0x88, 0x02, 
-	0x43, 0x11, 0x80, 0x01, 0xe7, 0xdf, 0x88, 0x01, 
-	0x80, 0x41, 0x78, 0xa0, 0x23, 0x20, 0x40, 0x18, 
-	0xd0, 0x04, 0x98, 0x04, 0x68, 0xc1, 0x1c, 0x20, 
-	0xf0, 0x00, 0xfa, 0x3d, 0xe7, 0xb7, 0xe0, 0x1e, 
-	0x27, 0x00, 0x2f, 0x10, 0xdb, 0x04, 0xe0, 0x1a, 
-	0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, 
-	0x48, 0x16, 0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x11, 
-	0x00, 0xb8, 0x49, 0x15, 0x58, 0x0c, 0x20, 0x80, 
-	0x70, 0x60, 0x99, 0x03, 0x1c, 0x20, 0xf7, 0xfd, 
-	0xfa, 0xe3, 0x98, 0x00, 0x30, 0x01, 0x06, 0x00, 
-	0x0e, 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, 0x02, 
-	0xd1, 0x00, 0xe0, 0x00, 0xe7, 0xe4, 0xe0, 0x02, 
-	0x20, 0xbc, 0xb0, 0x07, 0xe6, 0xbe, 0x98, 0x06, 
-	0x99, 0x04, 0x70, 0xc8, 0x20, 0x00, 0xb0, 0x07, 
-	0xe6, 0xb8, 0xb0, 0x06, 0xb0, 0x01, 0xe6, 0xb5, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5d, 0xcc, 
-	0x2e, 0x08, 0x5d, 0xc4, 0x2e, 0x08, 0x5f, 0xa4, 
-	0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x5f, 0xc4, 
-	0x2e, 0x08, 0x5f, 0x64, 0xff, 0xff, 0xfb, 0xff, 
-	0xff, 0xff, 0xdf, 0xff, 0xb4, 0x90, 0x1c, 0x03, 
-	0x1c, 0x0a, 0x06, 0x11, 0x0e, 0x09, 0x29, 0x20, 
-	0xdd, 0x02, 0x20, 0xa2, 0xbc, 0x90, 0x47, 0x70, 
-	0x00, 0x88, 0x4c, 0x05, 0x58, 0x20, 0x1c, 0x07, 
-	0xd1, 0x01, 0x20, 0xb0, 0xe7, 0xf6, 0x78, 0xf8, 
-	0x70, 0x18, 0x20, 0x00, 0xe7, 0xf2, 0xe7, 0xf1, 
-	0x2e, 0x08, 0x5e, 0x5c, 0xb4, 0x90, 0x1c, 0x02, 
-	0x1c, 0x0f, 0x06, 0x38, 0x16, 0x04, 0x2a, 0x02, 
-	0xda, 0x02, 0x20, 0x00, 0xbc, 0x90, 0x47, 0x70, 
-	0x2c, 0x01, 0xd1, 0x01, 0x21, 0x28, 0xe0, 0x09, 
-	0x2c, 0x02, 0xd1, 0x01, 0x21, 0x20, 0xe0, 0x05, 
-	0x2c, 0x00, 0xd1, 0x01, 0x21, 0x0c, 0xe0, 0x01, 
-	0x20, 0x00, 0xe7, 0xef, 0x00, 0x50, 0x18, 0x80, 
-	0x01, 0x80, 0x18, 0x41, 0x1c, 0xc8, 0x08, 0x81, 
-	0x1c, 0x08, 0xe7, 0xe7, 0xe7, 0xe6, 0xb5, 0xf7, 
-	0x1c, 0x07, 0xb0, 0x81, 0x9a, 0x03, 0x06, 0x11, 
-	0x0e, 0x09, 0x91, 0x00, 0xb0, 0x84, 0x99, 0x04, 
-	0x29, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x05, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x99, 0x04, 0x00, 0x88, 0x49, 0x29, 0x58, 0x08, 
-	0x1c, 0x06, 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x05, 
-	0xe7, 0xf2, 0x2f, 0x00, 0xd1, 0x02, 0x20, 0xb4, 
-	0xb0, 0x05, 0xe7, 0xed, 0x4b, 0x24, 0x42, 0x9f, 
-	0xd1, 0x0a, 0x78, 0xf0, 0x28, 0x00, 0xd0, 0x02, 
-	0x20, 0xbc, 0xb0, 0x05, 0xe7, 0xe4, 0x20, 0x00, 
-	0x60, 0xf0, 0x20, 0x00, 0xb0, 0x05, 0xe7, 0xdf, 
-	0x68, 0xf0, 0x28, 0x00, 0xd0, 0x02, 0x20, 0xb4, 
-	0xb0, 0x05, 0xe7, 0xd9, 0x99, 0x06, 0x00, 0x88, 
-	0x1f, 0xc1, 0x39, 0x19, 0x91, 0x02, 0x20, 0xff, 
-	0x30, 0x81, 0x90, 0x01, 0x99, 0x02, 0x98, 0x01, 
-	0x42, 0x81, 0xda, 0x02, 0x20, 0xb5, 0xb0, 0x05, 
-	0xe7, 0xca, 0x1c, 0x3c, 0x60, 0xf4, 0x37, 0x14, 
-	0x1c, 0x3d, 0x37, 0x0c, 0x60, 0x2f, 0x99, 0x06, 
-	0x60, 0x69, 0x20, 0x00, 0x60, 0xa8, 0x97, 0x03, 
-	0x20, 0x00, 0x60, 0xe0, 0x1d, 0xe0, 0x30, 0x05, 
-	0x9a, 0x03, 0x99, 0x02, 0xf0, 0x00, 0xf9, 0x56, 
-	0x90, 0x00, 0x20, 0x00, 0x70, 0xa0, 0x98, 0x00, 
-	0x60, 0x60, 0x9a, 0x03, 0x60, 0xa2, 0x61, 0x25, 
-	0x99, 0x04, 0x20, 0x54, 0xf7, 0xff, 0xfd, 0xa0, 
-	0xb0, 0x05, 0xe7, 0xa9, 0xb0, 0x04, 0xb0, 0x01, 
-	0xe7, 0xa6, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x5c, 
-	0x00, 0x00, 0xff, 0xff, 0xb5, 0xff, 0xb0, 0x83, 
-	0x9a, 0x05, 0x06, 0x11, 0x0e, 0x09, 0x91, 0x00, 
-	0x9b, 0x06, 0x06, 0x18, 0x0e, 0x00, 0x90, 0x01, 
-	0x98, 0x0c, 0x06, 0x01, 0x0e, 0x09, 0x91, 0x02, 
-	0xb0, 0x85, 0x99, 0x05, 0x29, 0x20, 0xdb, 0x05, 
-	0x20, 0xa2, 0xb0, 0x08, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x98, 0x08, 0x28, 0x00, 
-	0xd1, 0x02, 0x20, 0xb4, 0xb0, 0x08, 0xe7, 0xf5, 
-	0x99, 0x05, 0x00, 0xc8, 0x1a, 0x40, 0x00, 0x80, 
-	0x49, 0x83, 0x68, 0x09, 0x18, 0x47, 0x98, 0x08, 
-	0x4b, 0x82, 0x42, 0x98, 0xd1, 0x73, 0x99, 0x05, 
-	0x00, 0x88, 0x49, 0x81, 0x58, 0x08, 0x1c, 0x05, 
-	0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x08, 0xe7, 0xe1, 
-	0x68, 0xe8, 0x28, 0x00, 0xd1, 0x02, 0x78, 0xe8, 
-	0x28, 0x00, 0xd0, 0x02, 0x20, 0xbc, 0xb0, 0x08, 
-	0xe7, 0xd8, 0x78, 0xa8, 0x28, 0x00, 0xd0, 0x54, 
-	0x20, 0x00, 0x42, 0x80, 0xd0, 0x1d, 0x24, 0x00, 
-	0x2c, 0x20, 0xdb, 0x04, 0xe0, 0x18, 0x1c, 0x60, 
-	0x06, 0x04, 0x0e, 0x24, 0xe7, 0xf8, 0x48, 0x73, 
-	0x5d, 0x00, 0x99, 0x05, 0x42, 0x88, 0xd1, 0x0e, 
-	0x20, 0x01, 0x40, 0xa0, 0x43, 0xc0, 0x49, 0x70, 
-	0x68, 0x09, 0x40, 0x08, 0x49, 0x6e, 0x60, 0x08, 
-	0x20, 0x00, 0x00, 0xa1, 0x4a, 0x6d, 0x50, 0x50, 
-	0x20, 0xff, 0x49, 0x6a, 0x55, 0x08, 0xe7, 0xe6, 
-	0xe0, 0x33, 0x4a, 0x6b, 0x92, 0x03, 0x7e, 0x38, 
-	0x1c, 0x06, 0x28, 0xff, 0xd0, 0x14, 0x20, 0x00, 
-	0x00, 0xb1, 0x4a, 0x68, 0x50, 0x50, 0x20, 0x01, 
-	0x40, 0xb0, 0x43, 0xc0, 0x49, 0x66, 0x68, 0x09, 
-	0x40, 0x08, 0x49, 0x65, 0x60, 0x08, 0x20, 0xff, 
-	0x76, 0x38, 0x21, 0xff, 0x48, 0x63, 0x55, 0x81, 
-	0x21, 0x00, 0x00, 0xb0, 0x9a, 0x03, 0x50, 0x11, 
-	0x7e, 0x78, 0x1c, 0x06, 0x28, 0xff, 0xd0, 0x14, 
-	0x21, 0x00, 0x00, 0xb0, 0x4a, 0x5b, 0x50, 0x11, 
-	0x20, 0x01, 0x40, 0xb0, 0x43, 0xc0, 0x49, 0x5a, 
-	0x68, 0x09, 0x40, 0x08, 0x49, 0x58, 0x60, 0x08, 
-	0x20, 0xff, 0x76, 0x78, 0x20, 0xff, 0x49, 0x51, 
-	0x55, 0x88, 0x21, 0x00, 0x00, 0xb0, 0x9a, 0x03, 
-	0x50, 0x11, 0x20, 0x00, 0x99, 0x05, 0x00, 0x89, 
-	0x4a, 0x4b, 0x50, 0x50, 0x24, 0x00, 0x2c, 0x0c, 
-	0xdb, 0x06, 0xe0, 0x09, 0xe0, 0x00, 0xe0, 0x0e, 
-	0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, 0xe7, 0xf6, 
-	0x20, 0x00, 0x19, 0x39, 0x73, 0x08, 0xe7, 0xf7, 
-	0x20, 0x00, 0x83, 0x38, 0x20, 0x00, 0x70, 0xf8, 
-	0x20, 0x00, 0xb0, 0x08, 0xe7, 0x66, 0x99, 0x05, 
-	0x00, 0x88, 0x49, 0x3f, 0x58, 0x08, 0x28, 0x00, 
-	0xd0, 0x02, 0x20, 0xb0, 0xb0, 0x08, 0xe7, 0x5d, 
-	0x99, 0x07, 0x29, 0x11, 0xdb, 0x02, 0x99, 0x07, 
-	0x29, 0x13, 0xdd, 0x02, 0x20, 0xb1, 0xb0, 0x08, 
-	0xe7, 0x54, 0x99, 0x09, 0x00, 0x88, 0x1f, 0xc1, 
-	0x39, 0x21, 0x91, 0x01, 0x20, 0xff, 0x30, 0x81, 
-	0x90, 0x00, 0x99, 0x01, 0x98, 0x00, 0x42, 0x81, 
-	0xda, 0x02, 0x20, 0xb5, 0xb0, 0x08, 0xe7, 0x45, 
-	0x9d, 0x08, 0x98, 0x08, 0x30, 0x1c, 0x90, 0x08, 
-	0x98, 0x08, 0x90, 0x04, 0x98, 0x08, 0x30, 0x0c, 
-	0x90, 0x08, 0x98, 0x08, 0x90, 0x02, 0x9a, 0x02, 
-	0x98, 0x04, 0x60, 0x02, 0x99, 0x09, 0x98, 0x04, 
-	0x60, 0x41, 0x20, 0x00, 0x99, 0x04, 0x60, 0x88, 
-	0x20, 0x00, 0x61, 0xa8, 0x1d, 0xe8, 0x30, 0x11, 
-	0x9a, 0x02, 0x99, 0x01, 0xf0, 0x00, 0xf8, 0x56, 
-	0x20, 0x00, 0x70, 0x28, 0x98, 0x06, 0x99, 0x07, 
-	0x43, 0x08, 0x70, 0x68, 0x20, 0x00, 0x70, 0xa8, 
-	0x20, 0x02, 0x70, 0xe8, 0x20, 0x00, 0x71, 0x28, 
-	0x98, 0x04, 0x60, 0xa8, 0x20, 0x00, 0x60, 0xe8, 
-	0x9a, 0x02, 0x61, 0x2a, 0x9a, 0x02, 0x61, 0x6a, 
-	0x99, 0x05, 0x00, 0x88, 0x49, 0x16, 0x50, 0x0d, 
-	0x20, 0x00, 0x60, 0xf8, 0x88, 0x38, 0x4b, 0x1c, 
-	0x40, 0x18, 0x80, 0x38, 0x20, 0x00, 0x60, 0xb8, 
-	0x9a, 0x02, 0x60, 0x7a, 0x98, 0x06, 0x99, 0x07, 
-	0x43, 0x08, 0x70, 0xb8, 0x24, 0x00, 0x2c, 0x0c, 
-	0xdb, 0x04, 0xe0, 0x07, 0x1c, 0x60, 0x06, 0x04, 
-	0x0e, 0x24, 0xe7, 0xf8, 0x20, 0x00, 0x19, 0x39, 
-	0x74, 0x08, 0xe7, 0xf7, 0x20, 0x00, 0x83, 0x38, 
-	0x20, 0x00, 0x70, 0xf8, 0x20, 0xff, 0x76, 0x38, 
-	0x20, 0xff, 0x76, 0x78, 0x20, 0x00, 0xb0, 0x08, 
-	0xe6, 0xec, 0xb0, 0x05, 0xb0, 0x03, 0xe6, 0xe9, 
-	0x2e, 0x08, 0x5d, 0xc4, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5f, 0xa4, 
-	0x2e, 0x08, 0x5e, 0xdc, 0x2e, 0x08, 0x5e, 0xe4, 
-	0x9e, 0x00, 0x04, 0xb8, 0x2e, 0x08, 0x5f, 0x64, 
-	0x2e, 0x08, 0x5e, 0xe0, 0x2e, 0x08, 0x5f, 0xc4, 
-	0xff, 0xff, 0xfb, 0xff, 0xb4, 0x90, 0x1c, 0x04, 
-	0x1c, 0x0f, 0x1c, 0x13, 0x21, 0x00, 0x68, 0x22, 
-	0x2a, 0x00, 0xd0, 0x00, 0x60, 0x13, 0x1d, 0xd8, 
-	0x30, 0xb9, 0x60, 0x18, 0x33, 0xc0, 0x31, 0x01, 
-	0x3f, 0xc0, 0x2f, 0xc0, 0xd8, 0xf7, 0x20, 0x00, 
-	0x60, 0x18, 0x60, 0x23, 0x31, 0x01, 0x1c, 0x08, 
-	0xbc, 0x90, 0x47, 0x70, 0xe7, 0xfc, 0xb4, 0x90, 
-	0x1c, 0x03, 0x1c, 0x0a, 0x6b, 0x18, 0x68, 0xd1, 
-	0x68, 0x07, 0x2f, 0x00, 0xd0, 0x0c, 0x68, 0x07, 
-	0x60, 0x0f, 0x68, 0x41, 0x68, 0x57, 0x68, 0x84, 
-	0x19, 0x3f, 0x60, 0x57, 0x27, 0x00, 0x60, 0x07, 
-	0x27, 0x00, 0x60, 0x47, 0x27, 0x00, 0x60, 0x87, 
-	0x6a, 0xc7, 0x2f, 0x00, 0xd0, 0x0c, 0x6a, 0xc7, 
-	0x60, 0x0f, 0x6b, 0x01, 0x68, 0x57, 0x6b, 0x44, 
-	0x19, 0x3f, 0x60, 0x57, 0x27, 0x00, 0x62, 0xc7, 
-	0x27, 0x00, 0x63, 0x07, 0x27, 0x00, 0x63, 0x47, 
-	0x60, 0xd1, 0xbc, 0x90, 0x47, 0x70, 0xe7, 0xfc, 
-	0x20, 0x00, 0x49, 0x01, 0x70, 0x08, 0x47, 0x70, 
-	0x2e, 0x08, 0x7c, 0x14, 0xb5, 0xff, 0xb0, 0x82, 
-	0x9b, 0x05, 0x06, 0x18, 0x16, 0x00, 0x90, 0x00, 
-	0x98, 0x0c, 0x06, 0x01, 0x16, 0x09, 0x91, 0x01, 
-	0x98, 0x00, 0x28, 0x1f, 0xdd, 0x05, 0x20, 0xaf, 
-	0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x48, 0x37, 0x78, 0x00, 0x28, 0x00, 
-	0xd0, 0x03, 0x20, 0xd2, 0xb0, 0x02, 0xe7, 0xf4, 
-	0xe0, 0x64, 0x20, 0xff, 0x49, 0x32, 0x70, 0x08, 
-	0x49, 0x32, 0x98, 0x00, 0xf0, 0x09, 0xfa, 0xca, 
-	0x9a, 0x04, 0x2a, 0x00, 0xd9, 0x52, 0x20, 0xff, 
-	0x49, 0x2f, 0x70, 0x08, 0x9d, 0x02, 0x98, 0x0b, 
-	0x99, 0x01, 0x18, 0x44, 0x99, 0x01, 0x20, 0xc0, 
-	0x1a, 0x40, 0x9a, 0x04, 0x42, 0x90, 0xd9, 0x01, 
-	0x9f, 0x04, 0xe0, 0x02, 0x99, 0x01, 0x20, 0xc0, 
-	0x1a, 0x47, 0x1c, 0x3a, 0x1c, 0x21, 0x1c, 0x28, 
-	0x23, 0xfe, 0xf0, 0x05, 0xfa, 0xa5, 0x1c, 0x06, 
-	0x2e, 0xd0, 0xd1, 0x0a, 0x20, 0x03, 0xf0, 0x04, 
-	0xf9, 0xa9, 0x1c, 0x3a, 0x1c, 0x21, 0x1c, 0x28, 
-	0x23, 0xfe, 0xf0, 0x05, 0xfa, 0x99, 0x1c, 0x06, 
-	0xe7, 0xf2, 0x98, 0x02, 0x19, 0xc0, 0x90, 0x02, 
-	0x9a, 0x04, 0x1b, 0xd2, 0x92, 0x04, 0x9d, 0x0b, 
-	0x9c, 0x03, 0x9b, 0x00, 0x1c, 0x3a, 0x1c, 0x21, 
-	0x1c, 0x28, 0xf0, 0x05, 0xfa, 0x89, 0x1c, 0x06, 
-	0x2e, 0xd0, 0xd1, 0x0a, 0x20, 0x03, 0xf0, 0x04, 
-	0xf9, 0x8d, 0x9b, 0x00, 0x1c, 0x3a, 0x1c, 0x21, 
-	0x1c, 0x28, 0xf0, 0x05, 0xfa, 0x7d, 0x1c, 0x06, 
-	0xe7, 0xf2, 0x99, 0x03, 0x29, 0x20, 0xd3, 0x04, 
-	0x99, 0x01, 0x18, 0x78, 0x99, 0x03, 0x18, 0x41, 
-	0x91, 0x03, 0x48, 0x0b, 0x78, 0x00, 0x28, 0x00, 
-	0xd0, 0x03, 0x20, 0x03, 0xf0, 0x04, 0xf9, 0x76, 
-	0xe7, 0xf7, 0xe7, 0xa9, 0x20, 0x00, 0x49, 0x04, 
-	0x70, 0x08, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0x90, 
-	0xb0, 0x02, 0xe7, 0x8e, 0xe7, 0x8d, 0x00, 0x00, 
-	0x2e, 0x08, 0x1f, 0xa0, 0x2e, 0x01, 0x35, 0x35, 
-	0x2e, 0x08, 0x7c, 0x14, 0xb5, 0xff, 0x1c, 0x0f, 
-	0x9a, 0x02, 0x06, 0x14, 0x0e, 0x24, 0x9b, 0x03, 
-	0x06, 0x1d, 0x0e, 0x2d, 0x2c, 0x1f, 0xdb, 0x04, 
-	0x20, 0xb3, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x04, 0x3a, 0x0c, 0x12, 0x2d, 0x01, 
-	0xd1, 0x73, 0x20, 0x01, 0x03, 0x40, 0x40, 0x10, 
-	0xd0, 0x0a, 0x4b, 0x6f, 0x40, 0x1a, 0x48, 0x6f, 
-	0x68, 0x00, 0x68, 0x00, 0x23, 0x02, 0x43, 0xdb, 
-	0x40, 0x18, 0x4b, 0x6c, 0x68, 0x1b, 0x60, 0x18, 
-	0x20, 0x01, 0x02, 0x40, 0x40, 0x10, 0xd0, 0x0a, 
-	0x4b, 0x69, 0x40, 0x1a, 0x48, 0x67, 0x68, 0x00, 
-	0x68, 0x00, 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 
-	0x4b, 0x64, 0x68, 0x1b, 0x60, 0x18, 0x20, 0x01, 
-	0x05, 0x00, 0x40, 0x38, 0xd0, 0x08, 0x48, 0x63, 
-	0x68, 0x00, 0x69, 0x80, 0x23, 0x01, 0x05, 0x1b, 
-	0x43, 0x18, 0x4b, 0x60, 0x68, 0x1b, 0x61, 0x98, 
-	0x20, 0x01, 0x05, 0x40, 0x40, 0x38, 0xd0, 0x08, 
-	0x48, 0x5c, 0x68, 0x00, 0x69, 0x80, 0x23, 0x01, 
-	0x05, 0x5b, 0x43, 0x18, 0x4b, 0x59, 0x68, 0x1b, 
-	0x61, 0x98, 0x0a, 0x12, 0x48, 0x55, 0x68, 0x00, 
-	0x68, 0x00, 0x43, 0x90, 0x4b, 0x53, 0x68, 0x1b, 
-	0x60, 0x18, 0x48, 0x52, 0x68, 0x00, 0x68, 0x00, 
-	0x4b, 0x53, 0x65, 0x18, 0x48, 0x51, 0x68, 0x00, 
-	0x77, 0x04, 0x20, 0x09, 0x04, 0x80, 0x40, 0x38, 
-	0xd0, 0x35, 0x21, 0x00, 0x29, 0x20, 0xdb, 0x04, 
-	0xe0, 0x31, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, 
-	0xe7, 0xf8, 0x20, 0x01, 0x40, 0x88, 0x9b, 0x00, 
-	0x40, 0x18, 0xd0, 0x27, 0x20, 0x01, 0x05, 0x40, 
-	0x40, 0x38, 0xd0, 0x0e, 0x00, 0xc8, 0x1a, 0x40, 
-	0x00, 0x80, 0x4b, 0x46, 0x68, 0x1b, 0x5a, 0x18, 
-	0x23, 0xff, 0x33, 0x01, 0x43, 0x18, 0x00, 0xcb, 
-	0x1a, 0x5b, 0x00, 0x9b, 0x4e, 0x41, 0x68, 0x36, 
-	0x52, 0xf0, 0x20, 0x01, 0x04, 0x80, 0x40, 0x38, 
-	0xd0, 0x10, 0x00, 0xc8, 0x1a, 0x40, 0x00, 0x80, 
-	0xe0, 0x00, 0xe0, 0x0d, 0x4b, 0x3b, 0x68, 0x1b, 
-	0x5a, 0x18, 0x23, 0x01, 0x02, 0x5b, 0x43, 0x18, 
-	0x00, 0xcb, 0x1a, 0x5b, 0x00, 0x9b, 0x4e, 0x37, 
-	0x68, 0x36, 0x52, 0xf0, 0xe7, 0xcd, 0xe0, 0x5c, 
-	0x2d, 0x02, 0xd1, 0x5a, 0x0a, 0x12, 0x48, 0x2f, 
-	0x68, 0x00, 0x68, 0x00, 0x43, 0x10, 0x4b, 0x2d, 
-	0x68, 0x1b, 0x60, 0x18, 0x48, 0x2b, 0x68, 0x00, 
-	0x68, 0x00, 0x4b, 0x2d, 0x65, 0x18, 0x20, 0x01, 
-	0x05, 0x00, 0x40, 0x38, 0xd0, 0x07, 0x48, 0x29, 
-	0x68, 0x00, 0x69, 0x80, 0x4b, 0x2a, 0x40, 0x18, 
-	0x4b, 0x26, 0x68, 0x1b, 0x61, 0x98, 0x20, 0x01, 
-	0x05, 0x40, 0x40, 0x38, 0xd0, 0x07, 0x48, 0x23, 
-	0x68, 0x00, 0x69, 0x80, 0x4b, 0x25, 0x40, 0x18, 
-	0x4b, 0x20, 0x68, 0x1b, 0x61, 0x98, 0x21, 0x00, 
-	0x29, 0x20, 0xdb, 0x04, 0xe0, 0x31, 0x1c, 0x48, 
-	0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x20, 0x09, 
-	0x04, 0x80, 0x40, 0x38, 0xd0, 0x28, 0x20, 0x01, 
-	0x40, 0x88, 0x9b, 0x00, 0x40, 0x18, 0xd0, 0x23, 
-	0x20, 0x01, 0x05, 0x40, 0x40, 0x38, 0xd0, 0x0d, 
-	0x00, 0xc8, 0x1a, 0x40, 0x00, 0x80, 0x4b, 0x15, 
-	0x68, 0x1b, 0x5a, 0x18, 0x4b, 0x16, 0x40, 0x18, 
-	0x00, 0xcb, 0x1a, 0x5b, 0x00, 0x9b, 0x4e, 0x11, 
-	0x68, 0x36, 0x52, 0xf0, 0x20, 0x01, 0x04, 0x80, 
-	0x40, 0x38, 0xd0, 0x0d, 0x00, 0xc8, 0x1a, 0x40, 
-	0x00, 0x80, 0x4b, 0x0c, 0x68, 0x1b, 0x5a, 0x18, 
-	0x4b, 0x05, 0x40, 0x18, 0x00, 0xcb, 0x1a, 0x5b, 
-	0x00, 0x9b, 0x4e, 0x08, 0x68, 0x36, 0x52, 0xf0, 
-	0xe7, 0xcd, 0x20, 0x00, 0xe7, 0x15, 0xe7, 0x14, 
-	0xff, 0xff, 0xfd, 0xff, 0x2e, 0x08, 0x7c, 0x18, 
-	0xff, 0xff, 0xdf, 0xff, 0x2e, 0x08, 0x5e, 0x0c, 
-	0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x5d, 0xc4, 
-	0xff, 0xef, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 
-	0xff, 0xff, 0xfe, 0xff, 0xb5, 0x80, 0x1c, 0x07, 
-	0x48, 0x17, 0x68, 0x01, 0x20, 0x00, 0xf0, 0x12, 
-	0xf8, 0x69, 0x60, 0x38, 0x48, 0x14, 0x68, 0x00, 
-	0x1d, 0x01, 0x20, 0x00, 0xf0, 0x12, 0xf8, 0x62, 
-	0x60, 0x78, 0x48, 0x11, 0x68, 0x00, 0x1d, 0xc1, 
-	0x31, 0x05, 0x20, 0x00, 0xf0, 0x12, 0xf8, 0x5a, 
-	0x60, 0xf8, 0x48, 0x0d, 0x68, 0x00, 0x1d, 0xc1, 
-	0x31, 0x09, 0x20, 0x00, 0xf0, 0x12, 0xf8, 0x52, 
-	0x61, 0x38, 0x48, 0x09, 0x68, 0x00, 0x1d, 0xc1, 
-	0x31, 0x0d, 0x20, 0x00, 0xf0, 0x12, 0xf8, 0x4a, 
-	0x61, 0x78, 0x48, 0x05, 0x68, 0x00, 0x1d, 0xc1, 
-	0x31, 0x01, 0x20, 0x00, 0xf0, 0x12, 0xf8, 0x42, 
-	0x60, 0xb8, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x5e, 0x0c, 0xb5, 0xf0, 0x1c, 0x07, 
-	0xb0, 0x82, 0x26, 0x00, 0x89, 0xb8, 0x23, 0x08, 
-	0x40, 0x18, 0xd0, 0x08, 0x48, 0x59, 0x6e, 0xc2, 
-	0x48, 0x58, 0x6f, 0x01, 0x48, 0x57, 0x6a, 0x00, 
-	0xf7, 0xfd, 0xff, 0x5c, 0x1c, 0x06, 0x89, 0xb8, 
-	0x23, 0x10, 0x40, 0x18, 0xd0, 0x02, 0x48, 0x53, 
-	0x69, 0x40, 0x1c, 0x06, 0x89, 0xb8, 0x07, 0xc0, 
-	0x0f, 0xc0, 0xd0, 0x21, 0x48, 0x50, 0x68, 0xc0, 
-	0x90, 0x00, 0x68, 0x78, 0x02, 0x40, 0x99, 0x00, 
-	0x1a, 0x08, 0x90, 0x01, 0x98, 0x01, 0x21, 0x33, 
-	0x06, 0x49, 0x65, 0xc8, 0x98, 0x00, 0x21, 0x33, 
-	0x06, 0x49, 0x66, 0x08, 0x98, 0x01, 0x49, 0x48, 
-	0x60, 0x88, 0x98, 0x00, 0x49, 0x46, 0x60, 0xc8, 
-	0x20, 0x01, 0x21, 0x33, 0x06, 0x49, 0x66, 0xc8, 
-	0x20, 0x00, 0x21, 0x33, 0x06, 0x49, 0x66, 0xc8, 
-	0x89, 0xb8, 0x23, 0x02, 0x43, 0x18, 0x81, 0xb8, 
-	0x89, 0xb8, 0x23, 0x02, 0x40, 0x18, 0xd0, 0x3e, 
-	0x48, 0x3d, 0x68, 0x80, 0x1f, 0xc4, 0x3c, 0xff, 
-	0x3c, 0xfa, 0x68, 0x38, 0x02, 0x40, 0x1a, 0x25, 
-	0x48, 0x38, 0x60, 0x45, 0x48, 0x37, 0x60, 0x84, 
-	0x20, 0x33, 0x06, 0x40, 0x65, 0x45, 0x20, 0x33, 
-	0x06, 0x40, 0x65, 0x84, 0x1b, 0x60, 0x38, 0xc0, 
-	0x21, 0x33, 0x06, 0x49, 0x66, 0x88, 0x21, 0x00, 
-	0x48, 0x32, 0xf7, 0xfd, 0xfb, 0x89, 0x48, 0x32, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x00, 0xe7, 0xfa, 
-	0x48, 0x30, 0x68, 0x01, 0x23, 0xff, 0x33, 0x01, 
-	0x43, 0x19, 0x60, 0x01, 0x48, 0x2e, 0x6d, 0x80, 
-	0x49, 0x2d, 0x65, 0x88, 0x48, 0x2c, 0x6b, 0xc0, 
-	0x23, 0x01, 0x07, 0x9b, 0x40, 0x18, 0xd0, 0x00, 
-	0xe7, 0xf8, 0x20, 0x33, 0x06, 0x40, 0x66, 0x45, 
-	0x20, 0x33, 0x06, 0x40, 0x66, 0x84, 0x21, 0x00, 
-	0x20, 0xff, 0xf7, 0xfd, 0xfb, 0x69, 0x48, 0x20, 
-	0x60, 0x05, 0x48, 0x1f, 0x60, 0x44, 0x89, 0xb8, 
-	0x23, 0x04, 0x40, 0x18, 0xd0, 0x21, 0x68, 0xb8, 
-	0x28, 0x00, 0xd1, 0x06, 0x48, 0x1f, 0x68, 0x01, 
-	0x23, 0x02, 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, 
-	0xe0, 0x17, 0x69, 0x38, 0x49, 0x1a, 0x65, 0x88, 
-	0x69, 0x38, 0x68, 0xb9, 0x02, 0x49, 0x18, 0x40, 
-	0x49, 0x17, 0x65, 0xc8, 0x20, 0x03, 0x02, 0x00, 
-	0x49, 0x15, 0x67, 0x48, 0x20, 0x02, 0x49, 0x14, 
-	0x67, 0x88, 0x20, 0x40, 0x49, 0x12, 0x66, 0x08, 
-	0x48, 0x12, 0x68, 0x01, 0x23, 0x02, 0x43, 0x19, 
-	0x60, 0x01, 0x20, 0x33, 0x06, 0x40, 0x6d, 0x40, 
-	0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 0x60, 0x38, 
-	0x20, 0x33, 0x06, 0x40, 0x6d, 0xc0, 0x23, 0x0d, 
-	0x06, 0x9b, 0x1a, 0xc0, 0x60, 0x78, 0x48, 0x0a, 
-	0x43, 0x30, 0x60, 0xb8, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xcc, 0x00, 0x0f, 0x80, 
-	0x2e, 0x08, 0x7c, 0x1c, 0x00, 0x00, 0x80, 0x0f, 
-	0xcc, 0x00, 0x05, 0x00, 0x66, 0x00, 0x00, 0xe0, 
-	0x66, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, 0xf0, 
-	0xcc, 0x00, 0x00, 0x00, 0xb5, 0xf3, 0x1c, 0x02, 
-	0xb0, 0x81, 0x68, 0x93, 0x68, 0x54, 0x21, 0x00, 
-	0x1d, 0xd8, 0x30, 0xb9, 0x1b, 0x00, 0x06, 0x05, 
-	0x0e, 0x2d, 0x2d, 0x12, 0xda, 0x12, 0x21, 0x00, 
-	0x42, 0xa9, 0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x48, 
-	0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x78, 0x26, 
-	0x34, 0x01, 0x98, 0x02, 0x54, 0x46, 0xe7, 0xf6, 
-	0x68, 0x1b, 0x1d, 0x18, 0x90, 0x00, 0x98, 0x00, 
-	0x78, 0x80, 0x18, 0xc4, 0x1c, 0x0f, 0x2f, 0x12, 
-	0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x78, 0x06, 0x07, 
-	0x0e, 0x3f, 0xe7, 0xf8, 0x78, 0x26, 0x34, 0x01, 
-	0x98, 0x02, 0x55, 0xc6, 0xe7, 0xf6, 0x20, 0x00, 
-	0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, 0xb4, 0xf0, 
-	0x1c, 0x07, 0x1c, 0x0d, 0x1c, 0x14, 0xb0, 0x82, 
-	0x20, 0x00, 0x70, 0x20, 0x78, 0x78, 0x23, 0x80, 
-	0x40, 0x18, 0xd0, 0x03, 0x20, 0xb1, 0xb0, 0x02, 
-	0xbc, 0xf0, 0x47, 0x70, 0x78, 0xba, 0x20, 0x40, 
-	0x40, 0x10, 0xd0, 0x2a, 0x07, 0x12, 0x0f, 0x12, 
-	0x07, 0xd0, 0x0f, 0xc0, 0xd0, 0x25, 0x20, 0x40, 
-	0x70, 0x20, 0x35, 0x0a, 0x21, 0x00, 0x1d, 0xf8, 
-	0x30, 0x0d, 0x90, 0x01, 0x1d, 0xf8, 0x30, 0x1d, 
-	0x90, 0x00, 0x21, 0x00, 0x29, 0x08, 0xdb, 0x04, 
-	0xe0, 0x14, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, 
-	0xe7, 0xf8, 0x78, 0x2e, 0x35, 0x01, 0x98, 0x00, 
-	0x78, 0x03, 0x30, 0x01, 0x90, 0x00, 0x40, 0x33, 
-	0x98, 0x01, 0x78, 0x06, 0x30, 0x01, 0x90, 0x01, 
-	0x42, 0xb3, 0xd0, 0x02, 0x20, 0x00, 0x70, 0x20, 
-	0xe0, 0x00, 0xe7, 0xea, 0x20, 0x00, 0xb0, 0x02, 
-	0xe7, 0xce, 0x20, 0xb1, 0xb0, 0x02, 0xe7, 0xcb, 
-	0xb0, 0x02, 0xe7, 0xc9, 0xb5, 0xf7, 0x1c, 0x07, 
-	0xb0, 0x8d, 0x20, 0x00, 0x9a, 0x0f, 0x70, 0x10, 
-	0x78, 0x78, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x05, 
-	0x20, 0xb1, 0xb0, 0x0d, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x78, 0xb8, 0x90, 0x05, 
-	0x98, 0x05, 0x23, 0x40, 0x40, 0x18, 0xd0, 0x73, 
-	0x98, 0x05, 0x07, 0x00, 0x0f, 0x00, 0x90, 0x05, 
-	0x98, 0x05, 0x23, 0x02, 0x40, 0x18, 0xd1, 0x03, 
-	0x98, 0x05, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x68, 
-	0x99, 0x0e, 0x79, 0x48, 0x23, 0x3e, 0x40, 0x18, 
-	0x90, 0x0c, 0x78, 0xf8, 0x90, 0x04, 0x98, 0x04, 
-	0x01, 0x00, 0x4b, 0x81, 0x18, 0xc0, 0x90, 0x02, 
-	0x98, 0x02, 0x68, 0x00, 0x90, 0x01, 0x78, 0x7c, 
-	0x23, 0xbf, 0x40, 0x1c, 0x23, 0xfe, 0x40, 0x1c, 
-	0x20, 0x00, 0x90, 0x03, 0x98, 0x01, 0x06, 0x00, 
-	0x0e, 0x00, 0x99, 0x0c, 0x42, 0x88, 0xd0, 0x08, 
-	0x06, 0x20, 0x0e, 0x00, 0x24, 0x01, 0x43, 0x04, 
-	0x20, 0x01, 0x90, 0x03, 0x23, 0xdf, 0x40, 0x1c, 
-	0xe0, 0x06, 0x20, 0x02, 0x40, 0x20, 0xd0, 0x03, 
-	0x70, 0x7c, 0x20, 0x00, 0xb0, 0x0d, 0xe7, 0xbd, 
-	0x23, 0xfd, 0x40, 0x1c, 0x98, 0x05, 0x23, 0x04, 
-	0x40, 0x18, 0xd0, 0x73, 0x6a, 0xfd, 0x98, 0x03, 
-	0x28, 0x00, 0xd0, 0x14, 0x26, 0x00, 0x2e, 0x08, 
-	0xdb, 0x04, 0xe0, 0x0e, 0x1c, 0x70, 0x06, 0x06, 
-	0x0e, 0x36, 0xe7, 0xf8, 0x00, 0xb0, 0x19, 0x40, 
-	0x68, 0x40, 0x00, 0xb1, 0x19, 0x49, 0x64, 0x48, 
-	0x20, 0x00, 0x00, 0xb1, 0x19, 0x49, 0x62, 0x48, 
-	0xe7, 0xf0, 0x88, 0x28, 0x80, 0x68, 0x20, 0x20, 
-	0x40, 0x20, 0xd1, 0x3e, 0x99, 0x0e, 0x79, 0xc8, 
-	0x09, 0x40, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x0a, 
-	0x99, 0x0e, 0x79, 0xc8, 0x06, 0xc0, 0x0e, 0xc0, 
-	0x90, 0x09, 0x98, 0x0a, 0x30, 0x01, 0x06, 0x06, 
-	0x0e, 0x36, 0x2e, 0x08, 0xdb, 0x04, 0xe0, 0x10, 
-	0x1c, 0x70, 0x06, 0x06, 0x0e, 0x36, 0xe7, 0xf8, 
-	0x20, 0x00, 0x00, 0xb1, 0x19, 0x49, 0xe0, 0x01, 
-	0xe0, 0x9d, 0xe0, 0x9c, 0x64, 0x48, 0x88, 0x68, 
-	0x21, 0x80, 0x41, 0x31, 0x43, 0x88, 0x80, 0x68, 
-	0xe7, 0xee, 0x98, 0x0a, 0x00, 0x80, 0x19, 0x40, 
-	0x6c, 0x41, 0x98, 0x09, 0x00, 0x80, 0x4a, 0x4b, 
-	0x58, 0x10, 0x40, 0x08, 0x99, 0x0a, 0x00, 0x89, 
-	0x19, 0x49, 0x64, 0x48, 0x06, 0x20, 0x0e, 0x00, 
-	0x24, 0x20, 0x43, 0x04, 0x98, 0x01, 0x0a, 0x00, 
-	0x02, 0x00, 0x90, 0x01, 0x98, 0x01, 0x99, 0x0c, 
-	0x43, 0x08, 0x90, 0x01, 0x98, 0x01, 0x99, 0x02, 
-	0x60, 0x08, 0x78, 0x38, 0x23, 0x80, 0x40, 0x18, 
-	0xd0, 0x19, 0x99, 0x0e, 0x7b, 0x08, 0x07, 0x42, 
-	0x0f, 0x52, 0x92, 0x07, 0x99, 0x0e, 0x7b, 0x08, 
-	0x08, 0xc0, 0x06, 0x02, 0x0e, 0x12, 0x92, 0x08, 
-	0x1d, 0xe9, 0x31, 0x3d, 0x91, 0x06, 0x99, 0x06, 
-	0x9a, 0x08, 0x5c, 0x88, 0x49, 0x36, 0x9a, 0x07, 
-	0x5c, 0x89, 0xe0, 0x00, 0xe0, 0x4e, 0x40, 0x08, 
-	0x99, 0x06, 0x9a, 0x08, 0x54, 0x88, 0x99, 0x0e, 
-	0x79, 0x88, 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x00, 
-	0x98, 0x00, 0x49, 0x30, 0x40, 0xc1, 0x91, 0x00, 
-	0x99, 0x0e, 0x79, 0x88, 0x09, 0x40, 0x06, 0x02, 
-	0x0e, 0x12, 0x92, 0x0b, 0x9a, 0x0b, 0x00, 0x90, 
-	0x19, 0x40, 0x6c, 0x40, 0x99, 0x00, 0x40, 0x08, 
-	0xd0, 0x33, 0x06, 0x20, 0x0e, 0x00, 0x24, 0x40, 
-	0x43, 0x04, 0x9a, 0x0b, 0x00, 0x90, 0x19, 0x40, 
-	0x6c, 0x40, 0x99, 0x00, 0x40, 0x41, 0x00, 0x90, 
-	0x19, 0x40, 0x64, 0x41, 0x9a, 0x0b, 0x00, 0x90, 
-	0x19, 0x40, 0x6a, 0x40, 0x99, 0x00, 0x43, 0x01, 
-	0x00, 0x90, 0x19, 0x40, 0x62, 0x41, 0x9a, 0x0b, 
-	0x00, 0x90, 0x19, 0x40, 0x6c, 0x40, 0x28, 0x00, 
-	0xd1, 0x17, 0x88, 0x68, 0x9a, 0x0b, 0x21, 0x80, 
-	0x41, 0x11, 0x43, 0x88, 0x80, 0x68, 0x88, 0x68, 
-	0x28, 0x00, 0xd1, 0x0e, 0x06, 0x20, 0x0e, 0x00, 
-	0x24, 0x02, 0x43, 0x04, 0x23, 0xfe, 0x40, 0x1c, 
-	0x98, 0x0c, 0x30, 0x02, 0x06, 0x00, 0x0e, 0x00, 
-	0x90, 0x0c, 0x98, 0x0c, 0x23, 0x3e, 0x40, 0x18, 
-	0x90, 0x0c, 0xe0, 0x0a, 0x06, 0x20, 0x0e, 0x00, 
-	0x24, 0x40, 0x43, 0x04, 0x23, 0xfe, 0x40, 0x1c, 
-	0x98, 0x0c, 0x1c, 0x41, 0x98, 0x04, 0xf0, 0x00, 
-	0xf8, 0x13, 0x9a, 0x0f, 0x70, 0x14, 0x70, 0x7c, 
-	0x20, 0x00, 0xb0, 0x0d, 0xe6, 0xe2, 0x20, 0xb1, 
-	0xb0, 0x0d, 0xe6, 0xdf, 0xb0, 0x0d, 0xe6, 0xdd, 
-	0x64, 0x00, 0x08, 0x00, 0x2e, 0x08, 0x20, 0x10, 
-	0x2e, 0x08, 0x20, 0x90, 0x80, 0x00, 0x00, 0x00, 
-	0xb5, 0xf3, 0x98, 0x00, 0x06, 0x07, 0x0e, 0x3f, 
-	0x99, 0x01, 0x06, 0x0e, 0x0e, 0x36, 0x00, 0xf8, 
-	0x4b, 0x13, 0x18, 0xc5, 0x01, 0x38, 0x4b, 0x13, 
-	0x18, 0xc4, 0x01, 0x38, 0x4b, 0x12, 0x18, 0xc2, 
-	0x68, 0x10, 0x23, 0x40, 0x43, 0xdb, 0x40, 0x18, 
-	0x60, 0x10, 0x2e, 0x3e, 0xdc, 0x15, 0x68, 0x20, 
-	0x1c, 0x01, 0x0a, 0x09, 0x02, 0x09, 0x43, 0x31, 
-	0x60, 0x21, 0x68, 0x28, 0x1c, 0x01, 0x0a, 0x09, 
-	0x02, 0x09, 0x23, 0x3e, 0x43, 0x19, 0x60, 0x29, 
-	0x68, 0x10, 0x23, 0x40, 0x43, 0x18, 0x60, 0x10, 
-	0x20, 0x00, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0xbd, 0xe7, 0xf9, 0xe7, 0xf8, 
-	0x64, 0x00, 0x10, 0x00, 0x64, 0x00, 0x08, 0x00, 
-	0x64, 0x00, 0x08, 0x08, 0xb5, 0xf3, 0xb0, 0x93, 
-	0x98, 0x13, 0x69, 0x00, 0x90, 0x01, 0x98, 0x01, 
-	0x78, 0x40, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x05, 
-	0x20, 0xbe, 0xb0, 0x13, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x98, 0x01, 0x78, 0x80, 
-	0x90, 0x08, 0x98, 0x08, 0x23, 0x40, 0x40, 0x18, 
-	0xd0, 0x73, 0x98, 0x08, 0x23, 0x20, 0x40, 0x18, 
-	0xd0, 0x6f, 0x98, 0x01, 0x6b, 0x07, 0x98, 0x01, 
-	0x79, 0xc0, 0x00, 0x80, 0x49, 0x76, 0x58, 0x08, 
-	0x90, 0x00, 0x98, 0x00, 0x68, 0xc0, 0x1c, 0x06, 
-	0xd1, 0x02, 0x20, 0xb6, 0xb0, 0x13, 0xe7, 0xe1, 
-	0x78, 0xb0, 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x02, 
-	0x20, 0xb6, 0xb0, 0x13, 0xe7, 0xda, 0xa9, 0x11, 
-	0x1c, 0x30, 0xf0, 0x00, 0xf9, 0x2b, 0x90, 0x02, 
-	0x98, 0x11, 0x28, 0x00, 0xd1, 0x02, 0x98, 0x02, 
-	0xb0, 0x13, 0xe7, 0xcf, 0x98, 0x11, 0x90, 0x0e, 
-	0x20, 0x01, 0x90, 0x0b, 0x98, 0x13, 0x88, 0x40, 
-	0x90, 0x0d, 0x98, 0x13, 0x68, 0x40, 0x90, 0x06, 
-	0x98, 0x13, 0x68, 0x81, 0x91, 0x10, 0x99, 0x10, 
-	0x1d, 0xc8, 0x30, 0xb9, 0x90, 0x05, 0x98, 0x05, 
-	0x99, 0x06, 0x1a, 0x40, 0x04, 0x04, 0x0c, 0x24, 
-	0x99, 0x14, 0x79, 0x88, 0x90, 0x03, 0x98, 0x03, 
-	0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x0a, 0x98, 0x0a, 
-	0x49, 0x5a, 0x40, 0xc1, 0x91, 0x0a, 0x98, 0x03, 
-	0x09, 0x40, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x09, 
-	0x98, 0x09, 0x00, 0x80, 0x19, 0xc0, 0x6b, 0x80, 
-	0x99, 0x0a, 0x40, 0x08, 0xd0, 0x02, 0x20, 0xb1, 
-	0xb0, 0x13, 0xe7, 0x9f, 0x20, 0xb8, 0x90, 0x0c, 
-	0x98, 0x11, 0x30, 0x08, 0x90, 0x04, 0x20, 0x00, 
-	0x90, 0x07, 0x98, 0x07, 0x28, 0x00, 0xd0, 0x10, 
-	0x99, 0x10, 0x68, 0x09, 0x91, 0x10, 0x99, 0x10, 
-	0x1d, 0x08, 0x90, 0x12, 0x98, 0x12, 0x78, 0x80, 
-	0x99, 0x10, 0x18, 0x40, 0x90, 0x06, 0x98, 0x12, 
-	0x78, 0x81, 0x20, 0xc0, 0x1a, 0x40, 0x04, 0x04, 
-	0x0c, 0x24, 0x98, 0x0d, 0x42, 0x84, 0xdb, 0x05, 
-	0xe0, 0x00, 0xe0, 0x7c, 0x9c, 0x0d, 0x20, 0x00, 
-	0x90, 0x0d, 0xe0, 0x06, 0x98, 0x0d, 0x1b, 0x00, 
-	0x04, 0x00, 0x0c, 0x00, 0x90, 0x0d, 0x20, 0x01, 
-	0x90, 0x07, 0x98, 0x0c, 0x42, 0xa0, 0xda, 0x2e, 
-	0x25, 0x00, 0x98, 0x0c, 0x42, 0x85, 0xdb, 0x04, 
-	0xe0, 0x0c, 0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, 
-	0xe7, 0xf7, 0x98, 0x06, 0x78, 0x01, 0x30, 0x01, 
-	0x90, 0x06, 0x98, 0x04, 0x70, 0x01, 0x30, 0x01, 
-	0x90, 0x04, 0xe7, 0xf2, 0x98, 0x0c, 0x1a, 0x20, 
-	0x04, 0x04, 0x0c, 0x24, 0xa9, 0x11, 0x1c, 0x30, 
-	0xf0, 0x00, 0xf8, 0xac, 0x90, 0x02, 0x98, 0x11, 
-	0x28, 0x00, 0xd1, 0x08, 0x98, 0x0e, 0x60, 0xb0, 
-	0x68, 0x70, 0x99, 0x0b, 0x18, 0x40, 0x60, 0x70, 
-	0x98, 0x02, 0xb0, 0x13, 0xe7, 0x4a, 0x98, 0x0b, 
-	0x30, 0x01, 0x90, 0x0b, 0x20, 0xb8, 0x90, 0x0c, 
-	0x98, 0x11, 0x30, 0x08, 0x90, 0x04, 0x25, 0x00, 
-	0x42, 0xa5, 0xdb, 0x04, 0xe0, 0x0c, 0x1c, 0x68, 
-	0x06, 0x05, 0x0e, 0x2d, 0xe7, 0xf8, 0x98, 0x06, 
-	0x78, 0x01, 0x30, 0x01, 0x90, 0x06, 0x98, 0x04, 
-	0x70, 0x01, 0x30, 0x01, 0x90, 0x04, 0xe7, 0xf2, 
-	0x98, 0x0c, 0x1b, 0x00, 0x04, 0x00, 0x0c, 0x00, 
-	0x90, 0x0c, 0x98, 0x0d, 0x28, 0x00, 0xd1, 0x90, 
-	0x6b, 0x39, 0x91, 0x0f, 0x6a, 0xf8, 0x28, 0x00, 
-	0xd1, 0x02, 0x98, 0x0e, 0x62, 0xf8, 0xe0, 0x05, 
-	0x98, 0x0e, 0x99, 0x0f, 0x60, 0x08, 0x98, 0x0e, 
-	0x6d, 0xb9, 0x60, 0x08, 0x98, 0x09, 0x00, 0x80, 
-	0x19, 0xc0, 0x6b, 0x80, 0x99, 0x0a, 0x43, 0x01, 
-	0x98, 0x09, 0x00, 0x80, 0x19, 0xc0, 0x63, 0x81, 
-	0x6b, 0x78, 0x99, 0x0b, 0x18, 0x40, 0x63, 0x78, 
-	0x20, 0x00, 0x99, 0x11, 0x60, 0x08, 0x98, 0x11, 
-	0x63, 0x38, 0x98, 0x0e, 0x30, 0x04, 0x65, 0xb8, 
-	0x98, 0x02, 0xb0, 0x13, 0xe7, 0x02, 0x20, 0xb1, 
-	0xb0, 0x13, 0xe6, 0xff, 0xb0, 0x13, 0xe6, 0xfd, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x80, 0x00, 0x00, 0x00, 
-	0xb4, 0xf0, 0x1c, 0x01, 0x78, 0x88, 0x23, 0x20, 
-	0x40, 0x18, 0xd0, 0x42, 0x79, 0xc8, 0x00, 0x80, 
-	0x4b, 0x21, 0x58, 0x1d, 0x6b, 0x0a, 0x68, 0xef, 
-	0x68, 0x10, 0x28, 0x00, 0xd0, 0x17, 0x68, 0xfe, 
-	0x68, 0x10, 0x60, 0x30, 0x68, 0x50, 0x60, 0xf8, 
-	0x68, 0x78, 0x68, 0x93, 0x18, 0xc0, 0x60, 0x78, 
-	0x20, 0x00, 0x60, 0x10, 0x20, 0x00, 0x60, 0x50, 
-	0x20, 0x00, 0x60, 0x90, 0x68, 0x78, 0x78, 0x3b, 
-	0x42, 0x98, 0xd9, 0x04, 0x78, 0xb8, 0x23, 0x02, 
-	0x43, 0xdb, 0x40, 0x18, 0x70, 0xb8, 0x6a, 0xd0, 
-	0x60, 0x10, 0x6b, 0x10, 0x60, 0x50, 0x6b, 0x50, 
-	0x60, 0x90, 0x24, 0x00, 0x2c, 0x08, 0xdb, 0x04, 
-	0xe0, 0x0e, 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, 
-	0xe7, 0xf8, 0x00, 0xa0, 0x18, 0x80, 0x6b, 0x80, 
-	0x00, 0xa3, 0x18, 0x9b, 0x60, 0xd8, 0x23, 0x00, 
-	0x00, 0xa0, 0x18, 0x80, 0x63, 0x83, 0xe7, 0xf0, 
-	0x20, 0x00, 0x62, 0xd0, 0x20, 0x00, 0x63, 0x10, 
-	0x20, 0x00, 0x63, 0x50, 0x20, 0x00, 0xbc, 0xf0, 
-	0x47, 0x70, 0x20, 0xb1, 0xe7, 0xfb, 0xe7, 0xfa, 
-	0x2e, 0x08, 0x5e, 0x5c, 0xb4, 0x90, 0x1c, 0x02, 
-	0x1c, 0x0f, 0x78, 0x14, 0x68, 0x90, 0x1c, 0x01, 
-	0xd1, 0x08, 0x20, 0x00, 0x60, 0x38, 0x78, 0x90, 
-	0x23, 0x01, 0x43, 0x18, 0x70, 0x90, 0x20, 0xb7, 
-	0xbc, 0x90, 0x47, 0x70, 0x68, 0x08, 0x60, 0x90, 
-	0x20, 0x00, 0x60, 0x48, 0x60, 0x39, 0x68, 0x50, 
-	0x38, 0x01, 0x60, 0x50, 0x68, 0x50, 0x42, 0xa0, 
-	0xd1, 0x02, 0x20, 0xbf, 0xe7, 0xf0, 0xe0, 0x01, 
-	0x20, 0x00, 0xe7, 0xed, 0xe7, 0xec, 0x00, 0x00, 
-	0x1c, 0x01, 0x22, 0x00, 0x6a, 0x50, 0x68, 0x02, 
-	0x60, 0x0a, 0x4a, 0x05, 0x6f, 0xd2, 0x60, 0x8a, 
-	0x4a, 0x04, 0x68, 0x12, 0x60, 0x4a, 0x22, 0x1d, 
-	0x02, 0x92, 0x68, 0x12, 0x60, 0xca, 0x47, 0x70, 
-	0xcc, 0x00, 0x0f, 0x80, 0x2e, 0x08, 0x1f, 0xa4, 
-	0x1c, 0x01, 0x48, 0x02, 0x60, 0x01, 0x20, 0x00, 
-	0x47, 0x70, 0xe7, 0xfd, 0x66, 0x00, 0x01, 0x00, 
-	0x1c, 0x01, 0x20, 0x33, 0x06, 0x40, 0x62, 0x01, 
-	0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, 
-	0x20, 0x33, 0x06, 0x40, 0x6a, 0xc0, 0x23, 0x7f, 
-	0x03, 0x9b, 0x40, 0x18, 0x03, 0x8a, 0x43, 0x10, 
-	0x22, 0x33, 0x06, 0x52, 0x62, 0xd0, 0x20, 0x00, 
-	0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, 0x20, 0x33, 
-	0x06, 0x40, 0x6a, 0xc0, 0x23, 0x03, 0x03, 0x1b, 
-	0x40, 0x18, 0x43, 0x08, 0x22, 0x33, 0x06, 0x52, 
-	0x62, 0xd0, 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 
-	0x1c, 0x01, 0x06, 0x0a, 0x0e, 0x12, 0x2a, 0x00, 
-	0xd0, 0x06, 0x20, 0x33, 0x06, 0x40, 0x6a, 0xc0, 
-	0x23, 0x01, 0x05, 0x5b, 0x43, 0x18, 0xe0, 0x04, 
-	0x20, 0x33, 0x06, 0x40, 0x6a, 0xc0, 0x4b, 0x04, 
-	0x40, 0x18, 0x23, 0x33, 0x06, 0x5b, 0x62, 0xd8, 
-	0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x00, 0x00, 
-	0xff, 0xdf, 0xff, 0xff, 0x48, 0x04, 0x69, 0x80, 
-	0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x01, 0x20, 0xff, 
-	0x47, 0x70, 0x20, 0x00, 0xe7, 0xfc, 0xe7, 0xfb, 
-	0x66, 0x00, 0x00, 0x80, 0xb4, 0x80, 0x1c, 0x01, 
-	0x06, 0x0f, 0x0e, 0x3f, 0x4a, 0x08, 0x2f, 0x00, 
-	0xd0, 0x03, 0x68, 0x10, 0x23, 0x01, 0x43, 0x18, 
-	0xe0, 0x02, 0x68, 0x10, 0x08, 0x40, 0x00, 0x40, 
-	0x68, 0x13, 0x43, 0x18, 0x60, 0x10, 0x20, 0x00, 
-	0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, 0x00, 0x00, 
-	0x66, 0x00, 0x00, 0x98, 0xb4, 0x80, 0x1c, 0x07, 
-	0x1c, 0x0a, 0x4b, 0x06, 0x40, 0x1a, 0x4b, 0x06, 
-	0x40, 0x1f, 0x0b, 0x10, 0x02, 0x39, 0x43, 0x08, 
-	0x49, 0x04, 0x61, 0xc8, 0x20, 0x00, 0xbc, 0x80, 
-	0x47, 0x70, 0xe7, 0xfc, 0x01, 0xff, 0xf0, 0x00, 
-	0x00, 0xff, 0xf0, 0x00, 0x66, 0x00, 0x00, 0x80, 
-	0x48, 0x01, 0x69, 0xc0, 0x47, 0x70, 0xe7, 0xfd, 
-	0x66, 0x00, 0x00, 0x80, 0x1c, 0x01, 0x48, 0x07, 
-	0x68, 0x02, 0x4b, 0x07, 0x40, 0x1a, 0x60, 0x02, 
-	0x23, 0x01, 0x05, 0x9b, 0x42, 0x99, 0xd1, 0x03, 
-	0x48, 0x02, 0x68, 0x02, 0x43, 0x0a, 0x60, 0x02, 
-	0x47, 0x70, 0x00, 0x00, 0x66, 0x00, 0x00, 0x2c, 
-	0xff, 0xbf, 0xff, 0xff, 0x1c, 0x01, 0x20, 0x33, 
-	0x06, 0x40, 0x67, 0x41, 0x47, 0x70, 0x1c, 0x01, 
-	0x20, 0x33, 0x06, 0x40, 0x67, 0x81, 0x47, 0x70, 
-	0xb5, 0x90, 0x4c, 0x21, 0x20, 0x01, 0x60, 0x20, 
-	0xf0, 0x11, 0xfb, 0x6a, 0x48, 0x1f, 0x69, 0x84, 
-	0x27, 0x00, 0x2f, 0x04, 0xd3, 0x04, 0xe0, 0x06, 
-	0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, 
-	0x21, 0x00, 0xc4, 0x02, 0xe7, 0xf8, 0x20, 0x00, 
-	0x49, 0x18, 0x69, 0x49, 0x60, 0x08, 0x20, 0x00, 
-	0x49, 0x16, 0x69, 0x49, 0x60, 0x48, 0x20, 0x00, 
-	0x49, 0x14, 0x69, 0x49, 0x60, 0x88, 0x20, 0x00, 
-	0x49, 0x12, 0x69, 0x49, 0x60, 0xc8, 0x20, 0x00, 
-	0x49, 0x10, 0x69, 0x49, 0x61, 0x08, 0x20, 0x00, 
-	0x49, 0x0e, 0x69, 0x49, 0x61, 0x48, 0x20, 0x00, 
-	0x49, 0x0c, 0x69, 0x49, 0x61, 0x88, 0x20, 0x00, 
-	0x49, 0x0a, 0x69, 0x49, 0x61, 0xc8, 0x20, 0x00, 
-	0x49, 0x08, 0x69, 0x49, 0x62, 0x08, 0x20, 0x00, 
-	0x49, 0x06, 0x69, 0x49, 0x62, 0x48, 0x20, 0x18, 
-	0x49, 0x04, 0x69, 0x49, 0x62, 0x88, 0x20, 0x00, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xe7, 0xfb, 
-	0x70, 0x00, 0x00, 0x38, 0x2e, 0x08, 0x1f, 0xa8, 
-	0xb5, 0xff, 0x1c, 0x0f, 0xb0, 0x81, 0x9c, 0x01, 
-	0x69, 0x20, 0x28, 0x08, 0xd1, 0x01, 0x08, 0x7f, 
-	0x00, 0x7f, 0x6b, 0xa0, 0x9a, 0x03, 0x43, 0x50, 
-	0x19, 0xc6, 0x69, 0x20, 0x00, 0x80, 0x49, 0x34, 
-	0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x00, 
-	0x08, 0x76, 0x69, 0x20, 0x00, 0x80, 0x49, 0x31, 
-	0x58, 0x08, 0x43, 0x70, 0x90, 0x00, 0x69, 0xa0, 
-	0x99, 0x00, 0x09, 0x49, 0x18, 0x45, 0x6b, 0xe0, 
-	0x28, 0x00, 0xd1, 0x02, 0x03, 0x28, 0x0b, 0x00, 
-	0xe0, 0x01, 0x02, 0x28, 0x0a, 0x00, 0x1c, 0x05, 
-	0xf0, 0x11, 0xfb, 0x08, 0xf0, 0x11, 0xfa, 0xe4, 
-	0x48, 0x27, 0x69, 0x80, 0x68, 0x00, 0x08, 0xc0, 
-	0x00, 0xc0, 0x49, 0x25, 0x69, 0x89, 0x60, 0x08, 
-	0x07, 0x40, 0x48, 0x23, 0x69, 0x80, 0x68, 0x00, 
-	0x01, 0x40, 0x09, 0x40, 0x49, 0x20, 0x69, 0x89, 
-	0x60, 0x08, 0x6b, 0xe0, 0x49, 0x1e, 0x69, 0x89, 
-	0x68, 0x09, 0x4b, 0x1e, 0x40, 0x19, 0x07, 0xc0, 
-	0x0c, 0x80, 0x43, 0x08, 0x49, 0x1a, 0x69, 0x89, 
-	0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 0x1c, 0x21, 
-	0x1c, 0x20, 0xf0, 0x00, 0xfe, 0x51, 0x48, 0x16, 
-	0x69, 0xc0, 0x68, 0x00, 0x4b, 0x16, 0x40, 0x18, 
-	0x02, 0x29, 0x0a, 0x09, 0x00, 0x89, 0x43, 0x08, 
-	0x49, 0x11, 0x69, 0xc9, 0x60, 0x08, 0x01, 0x80, 
-	0x48, 0x0f, 0x69, 0xc0, 0x68, 0x00, 0x01, 0x40, 
-	0x09, 0x40, 0x99, 0x00, 0x06, 0xc9, 0x43, 0x08, 
-	0x49, 0x0b, 0x69, 0xc9, 0x60, 0x08, 0x99, 0x04, 
-	0x1c, 0x20, 0x22, 0x00, 0xf0, 0x00, 0xfe, 0xbc, 
-	0xf0, 0x00, 0xff, 0x9d, 0xf0, 0x11, 0xfa, 0xda, 
-	0x20, 0x00, 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, 
-	0x2e, 0x03, 0x3a, 0x04, 0x2e, 0x03, 0x3a, 0x54, 
-	0x2e, 0x08, 0x1f, 0xa8, 0xff, 0xff, 0xdf, 0xff, 
-	0xfc, 0x00, 0x00, 0x03, 0xb5, 0xff, 0x1c, 0x0f, 
-	0xb0, 0x81, 0x9c, 0x01, 0x69, 0x20, 0x28, 0x08, 
-	0xd1, 0x01, 0x08, 0x7f, 0x00, 0x7f, 0x6b, 0xa0, 
-	0x9a, 0x03, 0x43, 0x50, 0x19, 0xc6, 0x69, 0x20, 
-	0x00, 0x80, 0x49, 0x37, 0x58, 0x08, 0x23, 0x04, 
-	0x40, 0x18, 0xd0, 0x00, 0x08, 0x76, 0x69, 0x20, 
-	0x00, 0x80, 0x49, 0x34, 0x58, 0x08, 0x43, 0x70, 
-	0x90, 0x00, 0x69, 0xa0, 0x99, 0x00, 0x09, 0x49, 
-	0x18, 0x45, 0x6b, 0xe0, 0x28, 0x00, 0xd1, 0x02, 
-	0x03, 0x28, 0x0b, 0x00, 0xe0, 0x01, 0x02, 0x28, 
-	0x0a, 0x00, 0x1c, 0x05, 0xf0, 0x11, 0xfa, 0x86, 
-	0xf0, 0x11, 0xfa, 0x62, 0x48, 0x2a, 0x69, 0x80, 
-	0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, 0x23, 0x01, 
-	0x43, 0x18, 0x49, 0x27, 0x69, 0x89, 0x60, 0x08, 
-	0x07, 0x40, 0x6b, 0xe0, 0x49, 0x24, 0x69, 0x89, 
-	0x68, 0x09, 0x4b, 0x24, 0x40, 0x19, 0x07, 0xc0, 
-	0x0c, 0x80, 0x43, 0x08, 0x49, 0x20, 0x69, 0x89, 
-	0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 0x48, 0x1e, 
-	0x69, 0x80, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, 
-	0x99, 0x00, 0x06, 0xc9, 0x43, 0x01, 0x48, 0x1a, 
-	0x69, 0x80, 0x60, 0x01, 0x1c, 0x21, 0x1c, 0x20, 
-	0xf0, 0x00, 0xfd, 0xca, 0x48, 0x16, 0x69, 0xc0, 
-	0x68, 0x00, 0x4b, 0x17, 0x40, 0x18, 0x02, 0x29, 
-	0x0a, 0x09, 0x00, 0x89, 0x43, 0x08, 0x49, 0x12, 
-	0x69, 0xc9, 0x60, 0x08, 0x01, 0x80, 0x48, 0x10, 
-	0x69, 0xc0, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, 
-	0x49, 0x0d, 0x69, 0xc9, 0x60, 0x08, 0xf0, 0x00, 
-	0xff, 0x1e, 0xf0, 0x11, 0xfa, 0x39, 0x48, 0x0a, 
-	0x6b, 0x81, 0x1c, 0x20, 0xf0, 0x00, 0xfe, 0xf0, 
-	0x9b, 0x04, 0x60, 0x18, 0xf0, 0x11, 0xfa, 0x52, 
-	0x20, 0x00, 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, 
-	0x2e, 0x03, 0x3a, 0x04, 0x2e, 0x03, 0x3a, 0x54, 
-	0x2e, 0x08, 0x1f, 0xa8, 0xff, 0xff, 0xdf, 0xff, 
-	0xfc, 0x00, 0x00, 0x03, 0xb5, 0xff, 0x1c, 0x0c, 
-	0x1c, 0x1f, 0xb0, 0x83, 0x9d, 0x03, 0x6b, 0x28, 
-	0x6a, 0xa9, 0x1a, 0x40, 0x30, 0x01, 0x90, 0x00, 
-	0x19, 0xe0, 0x99, 0x00, 0x42, 0x88, 0xd9, 0x01, 
-	0x98, 0x00, 0x1b, 0x07, 0x69, 0x28, 0x28, 0x08, 
-	0xd1, 0x02, 0x08, 0x7f, 0x08, 0x64, 0x00, 0x64, 
-	0x6b, 0xa8, 0x9a, 0x05, 0x43, 0x50, 0x19, 0x01, 
-	0x91, 0x01, 0x69, 0x28, 0x00, 0x80, 0x49, 0x38, 
-	0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x02, 
-	0x99, 0x01, 0x08, 0x49, 0x91, 0x01, 0x69, 0x28, 
-	0x00, 0x80, 0x49, 0x34, 0x58, 0x08, 0x99, 0x01, 
-	0x43, 0x48, 0x90, 0x02, 0x69, 0xa8, 0x99, 0x02, 
-	0x09, 0x49, 0x18, 0x46, 0x6b, 0xe8, 0x28, 0x00, 
-	0xd1, 0x02, 0x03, 0x30, 0x0b, 0x00, 0xe0, 0x01, 
-	0x02, 0x30, 0x0a, 0x00, 0x1c, 0x06, 0xf0, 0x11, 
-	0xf9, 0xed, 0xf0, 0x11, 0xf9, 0xc9, 0x48, 0x2a, 
-	0x69, 0x80, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, 
-	0x49, 0x27, 0x69, 0x89, 0x60, 0x08, 0x48, 0x26, 
-	0x69, 0x80, 0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, 
-	0x23, 0x02, 0x43, 0x18, 0x49, 0x22, 0x69, 0x89, 
-	0x60, 0x08, 0x07, 0x40, 0x6b, 0xe8, 0x49, 0x20, 
-	0x69, 0x89, 0x68, 0x09, 0x4b, 0x1f, 0x40, 0x19, 
-	0x07, 0xc0, 0x0c, 0x80, 0x43, 0x08, 0x49, 0x1c, 
-	0x69, 0x89, 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 
-	0x1c, 0x29, 0x1c, 0x28, 0xf0, 0x00, 0xfd, 0x34, 
-	0x48, 0x17, 0x69, 0xc0, 0x68, 0x00, 0x4b, 0x18, 
-	0x40, 0x18, 0x02, 0x31, 0x0a, 0x09, 0x00, 0x89, 
-	0x43, 0x08, 0x49, 0x13, 0x69, 0xc9, 0x60, 0x08, 
-	0x01, 0x80, 0x48, 0x11, 0x69, 0xc0, 0x68, 0x00, 
-	0x01, 0x40, 0x09, 0x40, 0x99, 0x02, 0x06, 0xc9, 
-	0x43, 0x08, 0x49, 0x0d, 0x69, 0xc9, 0x60, 0x08, 
-	0x99, 0x0c, 0x1c, 0x28, 0x22, 0x02, 0xf0, 0x00, 
-	0xfd, 0x9f, 0x48, 0x09, 0x69, 0x40, 0x62, 0x07, 
-	0xf0, 0x00, 0xfe, 0x7d, 0xf0, 0x11, 0xf9, 0xba, 
-	0x20, 0x00, 0xb0, 0x03, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb0, 0x03, 0xe7, 0xf9, 
-	0x2e, 0x03, 0x3a, 0x04, 0x2e, 0x03, 0x3a, 0x54, 
-	0x2e, 0x08, 0x1f, 0xa8, 0xff, 0xff, 0xdf, 0xff, 
-	0xfc, 0x00, 0x00, 0x03, 0xb5, 0xff, 0xb0, 0x81, 
-	0x9f, 0x01, 0x6b, 0x78, 0x6a, 0xf9, 0x1a, 0x40, 
-	0x30, 0x01, 0x90, 0x00, 0x9a, 0x03, 0x9b, 0x04, 
-	0x18, 0xd0, 0x99, 0x00, 0x42, 0x88, 0xd9, 0x03, 
-	0x98, 0x00, 0x9a, 0x03, 0x1a, 0x83, 0x93, 0x04, 
-	0x69, 0x38, 0x28, 0x08, 0xd1, 0x03, 0x99, 0x02, 
-	0x08, 0x49, 0x00, 0x49, 0x91, 0x02, 0x6b, 0xb8, 
-	0x9a, 0x03, 0x43, 0x50, 0x99, 0x02, 0x18, 0x45, 
-	0x69, 0x38, 0x00, 0x80, 0x49, 0x3c, 0x58, 0x08, 
-	0x23, 0x04, 0x40, 0x18, 0xd0, 0x00, 0x08, 0x6d, 
-	0x69, 0x38, 0x00, 0x80, 0x49, 0x39, 0x58, 0x08, 
-	0x1c, 0x06, 0x43, 0x6e, 0x69, 0xb8, 0x09, 0x71, 
-	0x18, 0x44, 0x6b, 0xf8, 0x28, 0x00, 0xd1, 0x02, 
-	0x03, 0x20, 0x0b, 0x00, 0xe0, 0x01, 0x02, 0x20, 
-	0x0a, 0x00, 0x1c, 0x04, 0xf0, 0x11, 0xf9, 0x56, 
-	0xf0, 0x11, 0xf9, 0x32, 0x48, 0x30, 0x69, 0x80, 
-	0x68, 0x00, 0x01, 0x40, 0x09, 0x40, 0x49, 0x2e, 
-	0x69, 0x89, 0x60, 0x08, 0x48, 0x2c, 0x69, 0x80, 
-	0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, 0x23, 0x03, 
-	0x43, 0x18, 0x49, 0x29, 0x69, 0x89, 0x60, 0x08, 
-	0x07, 0x40, 0x6b, 0xf8, 0x49, 0x26, 0x69, 0x89, 
-	0x68, 0x09, 0x4b, 0x26, 0x40, 0x19, 0x07, 0xc0, 
-	0x0c, 0x80, 0x43, 0x08, 0x49, 0x22, 0x69, 0x89, 
-	0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 0x1c, 0x39, 
-	0x1c, 0x38, 0xf0, 0x00, 0xfc, 0x9d, 0x99, 0x0a, 
-	0x1c, 0x38, 0x22, 0x03, 0xf0, 0x00, 0xfd, 0x20, 
-	0x69, 0xf8, 0x49, 0x1b, 0x69, 0x49, 0x61, 0x08, 
-	0x48, 0x19, 0x69, 0xc0, 0x68, 0x00, 0x4b, 0x1a, 
-	0x40, 0x18, 0x02, 0x21, 0x0a, 0x09, 0x00, 0x89, 
-	0x43, 0x08, 0x49, 0x15, 0x69, 0xc9, 0x60, 0x08, 
-	0x01, 0x80, 0x48, 0x13, 0x69, 0xc0, 0x68, 0x00, 
-	0x01, 0x40, 0x09, 0x40, 0x06, 0xf1, 0x43, 0x08, 
-	0x49, 0x0f, 0x69, 0xc9, 0x60, 0x08, 0x48, 0x0e, 
-	0x69, 0x40, 0x61, 0x84, 0x06, 0xf0, 0x0e, 0xc0, 
-	0x49, 0x0b, 0x69, 0x49, 0x61, 0x48, 0x9b, 0x04, 
-	0x48, 0x09, 0x69, 0x40, 0x62, 0x43, 0xf0, 0x00, 
-	0xfd, 0xda, 0xf0, 0x11, 0xf9, 0x17, 0x20, 0x00, 
-	0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, 0x00, 0x00, 
-	0x2e, 0x03, 0x3a, 0x04, 0x2e, 0x03, 0x3a, 0x54, 
-	0x2e, 0x08, 0x1f, 0xa8, 0xff, 0xff, 0xdf, 0xff, 
-	0xfc, 0x00, 0x00, 0x03, 0xb5, 0xf3, 0xb0, 0x86, 
-	0x9f, 0x06, 0x99, 0x07, 0x68, 0x8c, 0x99, 0x07, 
-	0x68, 0xc8, 0x90, 0x03, 0x99, 0x07, 0x68, 0x0d, 
-	0x99, 0x07, 0x68, 0x49, 0x91, 0x02, 0x6b, 0x78, 
-	0x6a, 0xf9, 0x1a, 0x40, 0x30, 0x01, 0x90, 0x01, 
-	0x6b, 0x38, 0x6a, 0xb9, 0x1a, 0x40, 0x30, 0x01, 
-	0x90, 0x00, 0x99, 0x02, 0x98, 0x03, 0x18, 0x08, 
-	0x99, 0x01, 0x42, 0x88, 0xd9, 0x03, 0x98, 0x01, 
-	0x99, 0x02, 0x1a, 0x40, 0x90, 0x03, 0x19, 0x28, 
-	0x99, 0x00, 0x42, 0x88, 0xd9, 0x01, 0x98, 0x00, 
-	0x1b, 0x44, 0x69, 0x38, 0x28, 0x08, 0xd1, 0x02, 
-	0x08, 0x64, 0x08, 0x6d, 0x00, 0x6d, 0x6b, 0xb8, 
-	0x99, 0x02, 0x43, 0x48, 0x19, 0x41, 0x91, 0x04, 
-	0x69, 0x38, 0x00, 0x80, 0x49, 0x41, 0x58, 0x08, 
-	0x23, 0x04, 0x40, 0x18, 0xd0, 0x02, 0x99, 0x04, 
-	0x08, 0x49, 0x91, 0x04, 0x69, 0x38, 0x00, 0x80, 
-	0x49, 0x3d, 0x58, 0x08, 0x99, 0x04, 0x43, 0x48, 
-	0x90, 0x05, 0x69, 0xb8, 0x99, 0x05, 0x09, 0x49, 
-	0x18, 0x46, 0x6b, 0xf8, 0x28, 0x00, 0xd1, 0x02, 
-	0x03, 0x30, 0x0b, 0x00, 0xe0, 0x01, 0x02, 0x30, 
-	0x0a, 0x00, 0x1c, 0x06, 0xf0, 0x11, 0xf8, 0x9a, 
-	0xf0, 0x11, 0xf8, 0x76, 0x48, 0x33, 0x69, 0x80, 
-	0x68, 0x00, 0x01, 0x40, 0x09, 0x40, 0x49, 0x31, 
-	0x69, 0x89, 0x60, 0x08, 0x48, 0x2f, 0x69, 0x80, 
-	0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, 0x23, 0x04, 
-	0x43, 0x18, 0x49, 0x2c, 0x69, 0x89, 0x60, 0x08, 
-	0x07, 0x40, 0x48, 0x2a, 0x69, 0xc0, 0x68, 0x00, 
-	0x01, 0x40, 0x09, 0x40, 0x99, 0x05, 0x06, 0xc9, 
-	0x43, 0x08, 0x49, 0x26, 0x69, 0xc9, 0x60, 0x08, 
-	0x48, 0x24, 0x69, 0xc0, 0x68, 0x00, 0x4b, 0x24, 
-	0x40, 0x18, 0x02, 0x31, 0x0a, 0x09, 0x00, 0x89, 
-	0x43, 0x08, 0x49, 0x20, 0x69, 0xc9, 0x60, 0x08, 
-	0x01, 0x80, 0x1c, 0x39, 0x1c, 0x38, 0xf0, 0x00, 
-	0xfb, 0xd7, 0x6b, 0xf8, 0x49, 0x1b, 0x69, 0x89, 
-	0x68, 0x09, 0x4b, 0x1c, 0x40, 0x19, 0x07, 0xc0, 
-	0x0c, 0x80, 0x43, 0x08, 0x49, 0x17, 0x69, 0x89, 
-	0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 0x99, 0x07, 
-	0x69, 0x09, 0x1c, 0x38, 0x22, 0x04, 0xf0, 0x00, 
-	0xfc, 0x4b, 0x69, 0xf8, 0x49, 0x11, 0x69, 0x49, 
-	0x61, 0x08, 0x98, 0x05, 0x06, 0xc0, 0x0e, 0xc0, 
-	0x49, 0x0e, 0x69, 0x49, 0x61, 0x48, 0x48, 0x0d, 
-	0x69, 0x40, 0x61, 0x86, 0x48, 0x0b, 0x69, 0x40, 
-	0x62, 0x04, 0x98, 0x03, 0x49, 0x09, 0x69, 0x49, 
-	0x62, 0x48, 0xf0, 0x00, 0xfd, 0x18, 0xf0, 0x11, 
-	0xf8, 0x55, 0x20, 0x00, 0xb0, 0x06, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x06, 
-	0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x03, 0x3a, 0x04, 
-	0x2e, 0x03, 0x3a, 0x54, 0x2e, 0x08, 0x1f, 0xa8, 
-	0xfc, 0x00, 0x00, 0x03, 0xff, 0xff, 0xdf, 0xff, 
-	0xb5, 0xff, 0x9d, 0x09, 0xb0, 0x81, 0x98, 0x0b, 
-	0x06, 0x02, 0x0e, 0x12, 0x92, 0x00, 0xb0, 0x93, 
-	0x98, 0x14, 0x90, 0x12, 0x99, 0x15, 0x91, 0x11, 
-	0xaf, 0x0c, 0x1c, 0x38, 0x9a, 0x16, 0xca, 0x5e, 
-	0xc0, 0x5e, 0x68, 0x39, 0x91, 0x04, 0x68, 0x79, 
-	0x91, 0x03, 0x98, 0x12, 0x99, 0x11, 0x42, 0x88, 
-	0xd1, 0x73, 0x99, 0x03, 0x42, 0x8d, 0xd9, 0x71, 
-	0x68, 0xb8, 0x90, 0x01, 0x68, 0xf8, 0x90, 0x02, 
-	0x99, 0x11, 0x6b, 0x48, 0x6a, 0xc9, 0x1a, 0x40, 
-	0x1c, 0x44, 0x99, 0x11, 0x6b, 0x08, 0x6a, 0x89, 
-	0x1a, 0x40, 0x30, 0x01, 0x90, 0x00, 0x98, 0x02, 
-	0x18, 0x28, 0x42, 0xa0, 0xd9, 0x01, 0x1b, 0x61, 
-	0x91, 0x02, 0x9b, 0x17, 0x98, 0x01, 0x18, 0x18, 
-	0x99, 0x00, 0x42, 0x88, 0xd9, 0x03, 0x98, 0x00, 
-	0x9b, 0x17, 0x1a, 0xc0, 0x90, 0x01, 0x98, 0x01, 
-	0x60, 0xb8, 0x98, 0x02, 0x60, 0xf8, 0x98, 0x12, 
-	0x69, 0xc0, 0x90, 0x0a, 0x98, 0x12, 0x6b, 0x80, 
-	0x99, 0x03, 0x43, 0x48, 0x99, 0x04, 0x18, 0x41, 
-	0x91, 0x05, 0x98, 0x12, 0x69, 0x00, 0x00, 0x80, 
-	0x49, 0x48, 0x58, 0x08, 0x99, 0x05, 0x43, 0x48, 
-	0x90, 0x0b, 0x98, 0x12, 0x69, 0x80, 0x99, 0x0b, 
-	0x09, 0x49, 0x18, 0x41, 0x91, 0x07, 0x98, 0x0a, 
-	0x99, 0x02, 0x43, 0x48, 0x90, 0x0b, 0x98, 0x0b, 
-	0x09, 0x40, 0x99, 0x07, 0x18, 0x40, 0x90, 0x06, 
-	0x98, 0x06, 0x0b, 0xc0, 0x99, 0x07, 0x0b, 0xc9, 
-	0x1a, 0x40, 0x90, 0x09, 0x98, 0x09, 0x28, 0x00, 
-	0xd0, 0x56, 0x9e, 0x02, 0x98, 0x06, 0x04, 0x40, 
-	0x0c, 0x40, 0x01, 0x41, 0x91, 0x08, 0x99, 0x08, 
-	0x98, 0x0a, 0xf0, 0x04, 0xf9, 0x17, 0x1c, 0x04, 
-	0x2c, 0x00, 0xd1, 0x00, 0x34, 0x01, 0x99, 0x03, 
-	0x98, 0x02, 0x18, 0x08, 0x1b, 0x00, 0x60, 0x78, 
-	0x60, 0xfc, 0x98, 0x02, 0x18, 0x28, 0x1b, 0x05, 
-	0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19, 
-	0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, 0xf0, 0x00, 
-	0xf8, 0x57, 0xb0, 0x02, 0x1b, 0x36, 0x98, 0x09, 
-	0xe0, 0x01, 0xe0, 0x3c, 0xe0, 0x3b, 0x38, 0x01, 
-	0x90, 0x09, 0x98, 0x09, 0x28, 0x00, 0xd0, 0x1a, 
-	0x98, 0x0a, 0x21, 0x01, 0x03, 0x09, 0xf0, 0x04, 
-	0xf8, 0xf1, 0x1c, 0x04, 0x68, 0x78, 0x1b, 0x80, 
-	0x60, 0x78, 0x60, 0xfc, 0x68, 0xf8, 0x1a, 0x2d, 
-	0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19, 
-	0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, 0xf0, 0x00, 
-	0xf8, 0x37, 0xb0, 0x02, 0x1b, 0x36, 0x98, 0x09, 
-	0x38, 0x01, 0x90, 0x09, 0xe7, 0xe1, 0x68, 0x78, 
-	0x1b, 0x80, 0x60, 0x78, 0x60, 0xfe, 0x68, 0xf8, 
-	0x1a, 0x2d, 0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, 
-	0x9b, 0x19, 0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, 
-	0xf0, 0x00, 0xf8, 0x22, 0xb0, 0x02, 0xe0, 0x09, 
-	0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19, 
-	0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, 0xf0, 0x00, 
-	0xf8, 0x17, 0xb0, 0x02, 0xe0, 0x09, 0x9a, 0x13, 
-	0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19, 0x1c, 0x3a, 
-	0x99, 0x17, 0x98, 0x16, 0xf0, 0x00, 0xf8, 0xb8, 
-	0xb0, 0x02, 0x20, 0x00, 0xb0, 0x14, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x13, 
-	0xb0, 0x01, 0xe7, 0xf8, 0x2e, 0x03, 0x3a, 0x54, 
-	0xb5, 0xff, 0x9d, 0x09, 0xb0, 0x81, 0x98, 0x0b, 
-	0x06, 0x02, 0x0e, 0x12, 0x92, 0x00, 0xb0, 0x92, 
-	0x98, 0x13, 0x90, 0x11, 0x99, 0x14, 0x91, 0x10, 
-	0xaf, 0x0b, 0x1c, 0x38, 0x9a, 0x15, 0xca, 0x5e, 
-	0xc0, 0x5e, 0x68, 0x38, 0x90, 0x03, 0x68, 0x78, 
-	0x90, 0x02, 0x68, 0xb8, 0x90, 0x00, 0x68, 0xf9, 
-	0x91, 0x01, 0x98, 0x11, 0x69, 0xc0, 0x90, 0x09, 
-	0x99, 0x10, 0x6b, 0x88, 0x43, 0x68, 0x9b, 0x16, 
-	0x18, 0xc1, 0x91, 0x04, 0x99, 0x10, 0x69, 0x08, 
-	0x00, 0x80, 0x49, 0x42, 0x58, 0x08, 0x99, 0x04, 
-	0x43, 0x48, 0x90, 0x0a, 0x99, 0x10, 0x69, 0x88, 
-	0x99, 0x0a, 0x09, 0x49, 0x18, 0x40, 0x90, 0x06, 
-	0x98, 0x09, 0x99, 0x01, 0x43, 0x48, 0x90, 0x0a, 
-	0x98, 0x0a, 0x09, 0x40, 0x99, 0x06, 0x18, 0x40, 
-	0x90, 0x05, 0x98, 0x05, 0x0b, 0xc0, 0x99, 0x06, 
-	0x0b, 0xc9, 0x1a, 0x40, 0x90, 0x08, 0x98, 0x08, 
-	0x28, 0x00, 0xd0, 0x53, 0x9e, 0x01, 0x98, 0x05, 
-	0x04, 0x40, 0x0c, 0x40, 0x01, 0x41, 0x91, 0x07, 
-	0x99, 0x07, 0x98, 0x09, 0xf0, 0x04, 0xf8, 0x5e, 
-	0x1c, 0x04, 0x2c, 0x00, 0xd1, 0x00, 0x34, 0x01, 
-	0x98, 0x02, 0x99, 0x01, 0x18, 0x40, 0x1b, 0x00, 
-	0x60, 0x78, 0x60, 0xfc, 0x99, 0x01, 0x18, 0x68, 
-	0x1b, 0x05, 0x9a, 0x12, 0x1c, 0x29, 0xb4, 0x06, 
-	0x9b, 0x18, 0x1c, 0x3a, 0x99, 0x16, 0x98, 0x15, 
-	0xf0, 0x00, 0xf8, 0x4a, 0xb0, 0x02, 0x1b, 0x36, 
-	0x98, 0x08, 0x38, 0x01, 0x90, 0x08, 0x98, 0x08, 
-	0x28, 0x00, 0xd0, 0x1a, 0x98, 0x09, 0x21, 0x01, 
-	0x03, 0x09, 0xf0, 0x04, 0xf8, 0x3b, 0x1c, 0x04, 
-	0x68, 0x78, 0x1b, 0x80, 0x60, 0x78, 0x60, 0xfc, 
-	0x68, 0xf8, 0x1a, 0x2d, 0x9a, 0x12, 0x1c, 0x29, 
-	0xb4, 0x06, 0x9b, 0x18, 0x1c, 0x3a, 0x99, 0x16, 
-	0x98, 0x15, 0xf0, 0x00, 0xf8, 0x2d, 0xb0, 0x02, 
-	0x1b, 0x36, 0x98, 0x08, 0x38, 0x01, 0x90, 0x08, 
-	0xe7, 0xe1, 0x68, 0x78, 0x1b, 0x80, 0x60, 0x78, 
-	0x60, 0xfe, 0x68, 0xf8, 0x1a, 0x2d, 0x9a, 0x12, 
-	0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x18, 0x1c, 0x3a, 
-	0x99, 0x16, 0x98, 0x15, 0xf0, 0x00, 0xf8, 0x18, 
-	0xb0, 0x02, 0xe0, 0x09, 0x9a, 0x12, 0x1c, 0x29, 
-	0xb4, 0x06, 0x9b, 0x18, 0x1c, 0x3a, 0x99, 0x16, 
-	0x98, 0x15, 0xf0, 0x00, 0xf8, 0x0d, 0xb0, 0x02, 
-	0x20, 0x00, 0xb0, 0x13, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb0, 0x12, 0xb0, 0x01, 
-	0xe7, 0xf8, 0x00, 0x00, 0x2e, 0x03, 0x3a, 0x54, 
-	0xb5, 0xff, 0xb0, 0x81, 0x98, 0x0b, 0x06, 0x02, 
-	0x0e, 0x12, 0x92, 0x00, 0xb0, 0x8e, 0x9f, 0x0f, 
-	0x9c, 0x10, 0x9a, 0x11, 0x68, 0x10, 0x90, 0x07, 
-	0x9a, 0x11, 0x68, 0x50, 0x90, 0x06, 0x9a, 0x11, 
-	0x68, 0x91, 0x91, 0x08, 0x9a, 0x11, 0x68, 0xd0, 
-	0x90, 0x09, 0x6b, 0x60, 0x6a, 0xe1, 0x1a, 0x40, 
-	0x30, 0x01, 0x90, 0x01, 0x6b, 0x20, 0x6a, 0xa1, 
-	0x1a, 0x40, 0x30, 0x01, 0x90, 0x00, 0x99, 0x18, 
-	0x98, 0x09, 0x18, 0x08, 0x99, 0x01, 0x42, 0x88, 
-	0xd9, 0x03, 0x98, 0x01, 0x99, 0x18, 0x1a, 0x41, 
-	0x91, 0x09, 0x9b, 0x12, 0x99, 0x08, 0x18, 0x58, 
-	0x99, 0x00, 0x42, 0x88, 0xd9, 0x03, 0x98, 0x00, 
-	0x9b, 0x12, 0x1a, 0xc1, 0x91, 0x08, 0x22, 0x00, 
-	0x92, 0x05, 0x42, 0xa7, 0xd1, 0x20, 0x99, 0x18, 
-	0x98, 0x06, 0x42, 0x81, 0xd9, 0x0c, 0x22, 0x02, 
-	0x92, 0x05, 0x99, 0x06, 0x98, 0x09, 0x18, 0x08, 
-	0x1e, 0x41, 0x91, 0x06, 0x99, 0x18, 0x98, 0x09, 
-	0x18, 0x08, 0x1e, 0x41, 0x91, 0x18, 0xe0, 0x0f, 
-	0x9b, 0x12, 0x98, 0x07, 0x42, 0x83, 0xd9, 0x0b, 
-	0x22, 0x01, 0x92, 0x05, 0x98, 0x07, 0x99, 0x08, 
-	0x18, 0x40, 0x38, 0x01, 0x90, 0x07, 0x9b, 0x12, 
-	0x99, 0x08, 0x18, 0x58, 0x1e, 0x43, 0x93, 0x12, 
-	0x69, 0x38, 0x28, 0x08, 0xd1, 0x0a, 0x99, 0x08, 
-	0x08, 0x49, 0x91, 0x08, 0x98, 0x07, 0x08, 0x40, 
-	0x00, 0x40, 0x90, 0x07, 0x9b, 0x12, 0x08, 0x5b, 
-	0x00, 0x5b, 0x93, 0x12, 0x69, 0x38, 0x00, 0x80, 
-	0x49, 0xc6, 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 
-	0x08, 0x80, 0x90, 0x03, 0x69, 0x20, 0x00, 0x80, 
-	0x49, 0xc2, 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 
-	0x08, 0x80, 0x90, 0x02, 0x6b, 0xb8, 0x99, 0x06, 
-	0x43, 0x48, 0x99, 0x07, 0x18, 0x41, 0x91, 0x04, 
-	0x98, 0x03, 0x28, 0x00, 0xd0, 0x02, 0x99, 0x04, 
-	0x08, 0x49, 0x91, 0x04, 0x69, 0x38, 0x00, 0x80, 
-	0x49, 0xb9, 0x58, 0x08, 0x99, 0x04, 0x1c, 0x06, 
-	0x43, 0x4e, 0x6b, 0xa0, 0x99, 0x18, 0x43, 0x48, 
-	0x9b, 0x12, 0x18, 0xc1, 0x91, 0x04, 0x98, 0x02, 
-	0x28, 0x00, 0xd0, 0x02, 0x99, 0x04, 0x08, 0x49, 
-	0x91, 0x04, 0x69, 0x20, 0x00, 0x80, 0x49, 0xb0, 
-	0x58, 0x08, 0x99, 0x04, 0x1c, 0x05, 0x43, 0x4d, 
-	0x9a, 0x05, 0x2a, 0x01, 0xd1, 0x3d, 0x69, 0x38, 
-	0x28, 0x08, 0xd0, 0x3a, 0x69, 0x38, 0x28, 0x09, 
-	0xd0, 0x02, 0x69, 0x38, 0x28, 0x0a, 0xd1, 0x0a, 
-	0x36, 0x10, 0x69, 0xb8, 0x09, 0x71, 0x18, 0x41, 
-	0x91, 0x0b, 0x06, 0xf0, 0x0e, 0xc0, 0x1d, 0xc1, 
-	0x31, 0x01, 0x91, 0x0a, 0xe0, 0x0b, 0x69, 0xb8, 
-	0x09, 0x71, 0x18, 0x41, 0x91, 0x0b, 0x69, 0x38, 
-	0x00, 0x80, 0x49, 0x9f, 0x58, 0x08, 0x19, 0x86, 
-	0x06, 0xf1, 0x0e, 0xc9, 0x91, 0x0a, 0x69, 0x20, 
-	0x28, 0x09, 0xd0, 0x02, 0x69, 0x20, 0x28, 0x0a, 
-	0xd1, 0x0a, 0x35, 0x10, 0x69, 0xa0, 0x09, 0x69, 
-	0x18, 0x41, 0x91, 0x0d, 0x06, 0xe8, 0x0e, 0xc0, 
-	0x1d, 0xc1, 0x31, 0x01, 0x91, 0x0c, 0xe0, 0x0b, 
-	0x69, 0xa0, 0x09, 0x69, 0x18, 0x41, 0x91, 0x0d, 
-	0x69, 0x20, 0x00, 0x80, 0x49, 0x90, 0x58, 0x08, 
-	0x19, 0x45, 0x06, 0xe9, 0x0e, 0xc9, 0x91, 0x0c, 
-	0xe0, 0x0d, 0x69, 0xb8, 0x09, 0x71, 0x18, 0x41, 
-	0x91, 0x0b, 0x69, 0xa0, 0x09, 0x69, 0x18, 0x41, 
-	0x91, 0x0d, 0x06, 0xf1, 0x0e, 0xc9, 0x91, 0x0a, 
-	0x06, 0xe9, 0x0e, 0xc9, 0x91, 0x0c, 0x6b, 0xf8, 
-	0x28, 0x00, 0xd1, 0x03, 0x99, 0x0b, 0x03, 0x09, 
-	0x0b, 0x09, 0xe0, 0x02, 0x99, 0x0b, 0x02, 0x09, 
-	0x0a, 0x09, 0x91, 0x0b, 0x6b, 0xe0, 0x28, 0x00, 
-	0xd1, 0x03, 0x99, 0x0d, 0x03, 0x09, 0x0b, 0x09, 
-	0xe0, 0x02, 0x99, 0x0d, 0x02, 0x09, 0x0a, 0x09, 
-	0x91, 0x0d, 0xf0, 0x10, 0xfd, 0x9b, 0xf0, 0x10, 
-	0xfd, 0x77, 0x48, 0x7a, 0x69, 0x80, 0x68, 0x00, 
-	0x08, 0xc0, 0x00, 0xc0, 0x23, 0x05, 0x43, 0x18, 
-	0x49, 0x76, 0x69, 0x89, 0x60, 0x08, 0x07, 0x40, 
-	0x1c, 0x21, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xf8, 
-	0x98, 0x03, 0x28, 0x00, 0xd0, 0x18, 0x98, 0x02, 
-	0x28, 0x00, 0xd0, 0x15, 0x48, 0x6f, 0x69, 0x80, 
-	0x68, 0x00, 0x23, 0x08, 0x43, 0xdb, 0x40, 0x18, 
-	0x49, 0x6c, 0x69, 0x89, 0x60, 0x08, 0x07, 0x00, 
-	0x48, 0x6a, 0x69, 0x80, 0x68, 0x00, 0x4b, 0x6a, 
-	0x40, 0x18, 0x49, 0x68, 0x69, 0x89, 0x60, 0x08, 
-	0x05, 0xc0, 0x99, 0x08, 0x08, 0x49, 0x91, 0x08, 
-	0x6b, 0xf8, 0x49, 0x64, 0x69, 0x89, 0x68, 0x09, 
-	0x4b, 0x64, 0x40, 0x19, 0x07, 0xc0, 0x0c, 0x40, 
-	0x43, 0x08, 0x49, 0x60, 0x69, 0x89, 0x60, 0x08, 
-	0x04, 0x40, 0x0f, 0xc0, 0x6b, 0xe0, 0x49, 0x5d, 
-	0x69, 0x89, 0x68, 0x09, 0x4b, 0x5e, 0x40, 0x19, 
-	0x07, 0xc0, 0x0c, 0x80, 0x43, 0x08, 0x49, 0x59, 
-	0x69, 0x89, 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 
-	0x68, 0x38, 0x28, 0x00, 0xd0, 0x0d, 0x79, 0x38, 
-	0x49, 0x54, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x57, 
-	0x40, 0x19, 0x03, 0xc0, 0x43, 0x08, 0x49, 0x51, 
-	0x69, 0x89, 0x60, 0x08, 0x02, 0x40, 0x0e, 0x00, 
-	0xe0, 0x0d, 0x6a, 0x78, 0x78, 0x00, 0x49, 0x4d, 
-	0x69, 0x89, 0x68, 0x09, 0x4b, 0x4f, 0x40, 0x19, 
-	0x03, 0xc0, 0x43, 0x08, 0x49, 0x49, 0x69, 0x89, 
-	0x60, 0x08, 0x02, 0x40, 0x0e, 0x00, 0x69, 0x20, 
-	0x00, 0x80, 0x49, 0x45, 0x58, 0x08, 0x99, 0x08, 
-	0x43, 0x48, 0x28, 0x40, 0xd9, 0x01, 0x21, 0x00, 
-	0xe0, 0x00, 0x21, 0x01, 0x1c, 0x08, 0x49, 0x41, 
-	0x69, 0x89, 0x68, 0x09, 0x4b, 0x44, 0x40, 0x19, 
-	0x07, 0xc2, 0x09, 0x52, 0x43, 0x11, 0x4a, 0x3d, 
-	0x69, 0x92, 0x60, 0x11, 0x01, 0x49, 0x0f, 0xc9, 
-	0x49, 0x3a, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x3f, 
-	0x40, 0x19, 0x9a, 0x05, 0x07, 0x92, 0x0f, 0x92, 
-	0x05, 0xd2, 0x43, 0x11, 0x4a, 0x35, 0x69, 0x92, 
-	0x60, 0x11, 0x01, 0xc9, 0x49, 0x33, 0x69, 0x89, 
-	0x68, 0x09, 0x4b, 0x39, 0x40, 0x19, 0x9a, 0x0e, 
-	0x07, 0xd2, 0x09, 0x92, 0x43, 0x11, 0x4a, 0x2f, 
-	0x69, 0x92, 0x60, 0x11, 0x01, 0x89, 0x69, 0xf9, 
-	0x4a, 0x2c, 0x69, 0x52, 0x60, 0x11, 0x49, 0x2b, 
-	0x69, 0x89, 0x68, 0x09, 0x01, 0x49, 0x09, 0x49, 
-	0x9a, 0x0a, 0x06, 0xd2, 0x43, 0x11, 0x4a, 0x27, 
-	0x69, 0x92, 0x60, 0x11, 0x99, 0x0a, 0x4a, 0x25, 
-	0x69, 0x52, 0x60, 0x51, 0x99, 0x0b, 0x4a, 0x23, 
-	0x69, 0x52, 0x60, 0x91, 0x99, 0x0b, 0x4a, 0x21, 
-	0x69, 0x52, 0x60, 0xd1, 0x69, 0xe1, 0x4a, 0x1f, 
-	0x69, 0x52, 0x61, 0x11, 0x49, 0x1d, 0x69, 0xc9, 
-	0x68, 0x09, 0x01, 0x49, 0x09, 0x49, 0x9a, 0x0c, 
-	0x06, 0xd2, 0x43, 0x11, 0x4a, 0x19, 0x69, 0xd2, 
-	0x60, 0x11, 0x99, 0x0c, 0x4a, 0x17, 0x69, 0x52, 
-	0x61, 0x51, 0x99, 0x0d, 0x4a, 0x15, 0x69, 0x52, 
-	0x61, 0x91, 0x99, 0x0d, 0x4a, 0x13, 0x69, 0x52, 
-	0x61, 0xd1, 0x99, 0x09, 0x4a, 0x11, 0x69, 0x52, 
-	0x62, 0x51, 0x99, 0x08, 0x4a, 0x0f, 0x69, 0x52, 
-	0x62, 0x11, 0x68, 0x38, 0x28, 0x00, 0xd0, 0x05, 
-	0x48, 0x14, 0x68, 0x01, 0x23, 0x01, 0x43, 0x19, 
-	0x60, 0x01, 0xe0, 0x02, 0x48, 0x11, 0x21, 0x00, 
-	0x60, 0x01, 0xf0, 0x00, 0xf9, 0x8c, 0xf0, 0x10, 
-	0xfc, 0xc9, 0x20, 0x00, 0xb0, 0x0f, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x0e, 
-	0xb0, 0x01, 0xe7, 0xf8, 0x2e, 0x03, 0x3a, 0x04, 
-	0x2e, 0x03, 0x3a, 0x54, 0x2e, 0x08, 0x1f, 0xa8, 
-	0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xbf, 0xff, 
-	0xff, 0xff, 0xdf, 0xff, 0xff, 0x80, 0x7f, 0xff, 
-	0xfb, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 
-	0xfd, 0xff, 0xff, 0xff, 0x68, 0x00, 0x00, 0x40, 
-	0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x69, 0x38, 
-	0x00, 0x80, 0x49, 0x3c, 0x58, 0x08, 0x23, 0x18, 
-	0x40, 0x18, 0x08, 0xc0, 0x49, 0x3a, 0x69, 0x89, 
-	0x68, 0x09, 0x23, 0xc0, 0x43, 0xdb, 0x40, 0x19, 
-	0x07, 0x80, 0x0f, 0x80, 0x01, 0x80, 0x43, 0x08, 
-	0x49, 0x35, 0x69, 0x89, 0x60, 0x08, 0x06, 0x00, 
-	0x0f, 0x80, 0x69, 0x38, 0x00, 0x80, 0x49, 0x31, 
-	0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 0x08, 0x80, 
-	0x49, 0x2f, 0x69, 0x89, 0x68, 0x09, 0x23, 0x08, 
-	0x43, 0xdb, 0x40, 0x19, 0x07, 0xc0, 0x0f, 0x00, 
-	0x43, 0x08, 0x49, 0x2b, 0x69, 0x89, 0x60, 0x08, 
-	0x07, 0x00, 0x0f, 0xc0, 0x69, 0x38, 0x00, 0x80, 
-	0x49, 0x26, 0x58, 0x08, 0x49, 0x26, 0x69, 0x89, 
-	0x68, 0x09, 0x23, 0x30, 0x43, 0xdb, 0x40, 0x19, 
-	0x07, 0x80, 0x0f, 0x80, 0x01, 0x00, 0x43, 0x08, 
-	0x49, 0x21, 0x69, 0x89, 0x60, 0x08, 0x06, 0x80, 
-	0x0f, 0x80, 0x69, 0x10, 0x00, 0x80, 0x49, 0x1d, 
-	0x58, 0x08, 0x23, 0x18, 0x40, 0x18, 0x08, 0xc0, 
-	0x49, 0x1b, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x1b, 
-	0x40, 0x19, 0x07, 0x80, 0x0f, 0x80, 0x02, 0xc0, 
-	0x43, 0x08, 0x49, 0x17, 0x69, 0x89, 0x60, 0x08, 
-	0x04, 0xc0, 0x0f, 0x80, 0x69, 0x10, 0x00, 0x80, 
-	0x49, 0x12, 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 
-	0x08, 0x80, 0x49, 0x11, 0x69, 0x89, 0x68, 0x09, 
-	0x4b, 0x11, 0x40, 0x19, 0x07, 0xc0, 0x0d, 0xc0, 
-	0x43, 0x08, 0x49, 0x0d, 0x69, 0x89, 0x60, 0x08, 
-	0x05, 0xc0, 0x0f, 0xc0, 0x69, 0x10, 0x00, 0x80, 
-	0x49, 0x08, 0x58, 0x08, 0x49, 0x08, 0x69, 0x89, 
-	0x68, 0x09, 0x4b, 0x0a, 0x40, 0x19, 0x07, 0x80, 
-	0x0f, 0x80, 0x02, 0x40, 0x43, 0x08, 0x49, 0x04, 
-	0x69, 0x89, 0x60, 0x08, 0x05, 0x40, 0x0f, 0x80, 
-	0xbc, 0x80, 0x47, 0x70, 0x2e, 0x03, 0x3a, 0x04, 
-	0x2e, 0x08, 0x1f, 0xa8, 0xff, 0xff, 0xe7, 0xff, 
-	0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf9, 0xff, 
-	0xb4, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x15, 
-	0x2d, 0x00, 0xd0, 0x06, 0x2d, 0x02, 0xd0, 0x21, 
-	0x2d, 0x03, 0xd0, 0x02, 0x2d, 0x04, 0xd0, 0x1d, 
-	0xe0, 0xa3, 0x69, 0x20, 0x28, 0x0b, 0xd2, 0x14, 
-	0xa3, 0x01, 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 
-	0x05, 0x07, 0x09, 0x0b, 0x05, 0x07, 0x09, 0x0b, 
-	0x0d, 0x0e, 0x0e, 0x00, 0x07, 0xff, 0xe0, 0x09, 
-	0x07, 0xbf, 0xe0, 0x07, 0x07, 0x3f, 0xe0, 0x05, 
-	0x06, 0x3f, 0xe0, 0x03, 0xe0, 0x02, 0x02, 0x3f, 
-	0xe0, 0x00, 0xe7, 0xff, 0x48, 0x46, 0x6a, 0x00, 
-	0x60, 0x07, 0xe0, 0x86, 0x69, 0x20, 0x28, 0x0b, 
-	0xd2, 0x73, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, 
-	0x44, 0x9f, 0x1c, 0x00, 0x06, 0x15, 0x24, 0x33, 
-	0x06, 0x15, 0x24, 0x33, 0x41, 0x45, 0x45, 0x00, 
-	0x01, 0xff, 0x48, 0x3d, 0x6a, 0x40, 0x68, 0x00, 
-	0x4b, 0x3c, 0x40, 0x18, 0x06, 0x39, 0x0e, 0x09, 
-	0x00, 0x89, 0x43, 0x08, 0x49, 0x38, 0x6a, 0x49, 
-	0x60, 0x08, 0x05, 0x80, 0xe0, 0x69, 0x01, 0xbf, 
-	0x48, 0x35, 0x6a, 0x40, 0x68, 0x00, 0x4b, 0x35, 
-	0x40, 0x18, 0x06, 0x39, 0x0e, 0x09, 0x00, 0x89, 
-	0x43, 0x08, 0x49, 0x31, 0x6a, 0x49, 0x60, 0x08, 
-	0x05, 0x80, 0xe0, 0x5a, 0x01, 0x3f, 0x48, 0x2e, 
-	0x6a, 0x40, 0x68, 0x00, 0x4b, 0x2d, 0x40, 0x18, 
-	0x06, 0x39, 0x0e, 0x09, 0x00, 0x89, 0x43, 0x08, 
-	0x49, 0x29, 0x6a, 0x49, 0x60, 0x08, 0x05, 0x80, 
-	0xe0, 0x4b, 0x48, 0x27, 0x6a, 0x40, 0x68, 0x00, 
-	0x4b, 0x26, 0x40, 0x18, 0x06, 0x39, 0x0e, 0x09, 
-	0x00, 0x89, 0x43, 0x08, 0x49, 0x22, 0x6a, 0x49, 
-	0x60, 0x08, 0x05, 0x80, 0xe0, 0x3d, 0x48, 0x20, 
-	0x6a, 0x00, 0x60, 0x07, 0xe0, 0x39, 0x48, 0x1e, 
-	0x6a, 0x40, 0x68, 0x00, 0x4b, 0x1d, 0x40, 0x18, 
-	0x06, 0x39, 0x0e, 0x09, 0x00, 0x89, 0x43, 0x08, 
-	0x49, 0x19, 0x6a, 0x49, 0x60, 0x08, 0x05, 0x80, 
-	0x48, 0x17, 0x6a, 0x40, 0x68, 0x00, 0x4b, 0x18, 
-	0x40, 0x18, 0x21, 0xff, 0x02, 0x09, 0x40, 0x39, 
-	0x00, 0x89, 0x43, 0x08, 0x49, 0x12, 0x6a, 0x49, 
-	0x60, 0x08, 0x03, 0x80, 0x48, 0x10, 0x6a, 0x40, 
-	0x68, 0x00, 0x4b, 0x12, 0x40, 0x18, 0x21, 0xff, 
-	0x04, 0x09, 0x40, 0x39, 0x00, 0x89, 0x43, 0x01, 
-	0x48, 0x0b, 0x6a, 0x40, 0x60, 0x01, 0x01, 0x88, 
-	0xe0, 0x00, 0xe0, 0x0d, 0x48, 0x08, 0x6a, 0x40, 
-	0x68, 0x00, 0x01, 0x80, 0x09, 0x80, 0x21, 0x3f, 
-	0x06, 0x09, 0x40, 0x39, 0x00, 0x89, 0x43, 0x08, 
-	0x49, 0x03, 0x6a, 0x49, 0x60, 0x08, 0xe0, 0x00, 
-	0xe7, 0xff, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x1f, 0xa8, 0xff, 0xff, 0xfc, 0x03, 
-	0xff, 0xfc, 0x03, 0xff, 0xfc, 0x03, 0xff, 0xff, 
-	0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x69, 0x38, 
-	0x28, 0x0b, 0xd2, 0x1a, 0xa3, 0x01, 0x5c, 0x1b, 
-	0x00, 0x5b, 0x44, 0x9f, 0x05, 0x08, 0x0b, 0x0e, 
-	0x05, 0x08, 0x0b, 0x0e, 0x11, 0x13, 0x13, 0x00, 
-	0x68, 0x10, 0x0f, 0xc1, 0xe0, 0x0f, 0x68, 0x10, 
-	0x0f, 0x81, 0xe0, 0x0c, 0x68, 0x10, 0x0f, 0x01, 
-	0xe0, 0x09, 0x68, 0x10, 0x0e, 0x01, 0xe0, 0x06, 
-	0x68, 0x11, 0xe0, 0x04, 0x68, 0x10, 0x0a, 0x01, 
-	0xe0, 0x01, 0x68, 0x11, 0xe7, 0xff, 0x1c, 0x08, 
-	0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, 0x48, 0x14, 
-	0x69, 0x80, 0x68, 0x00, 0x49, 0x12, 0x6a, 0x89, 
-	0x60, 0x08, 0x48, 0x11, 0x69, 0xc0, 0x68, 0x00, 
-	0x49, 0x0f, 0x6a, 0xc9, 0x60, 0x08, 0x48, 0x0e, 
-	0x6a, 0x00, 0x68, 0x00, 0x49, 0x0c, 0x6b, 0x09, 
-	0x60, 0x08, 0x48, 0x0b, 0x6a, 0x40, 0x68, 0x00, 
-	0x49, 0x09, 0x6b, 0x49, 0x60, 0x08, 0x20, 0x01, 
-	0x49, 0x07, 0x6b, 0xc9, 0x60, 0x08, 0x20, 0x00, 
-	0x49, 0x06, 0x60, 0x08, 0x20, 0x00, 0x49, 0x05, 
-	0x60, 0x48, 0x20, 0x00, 0x49, 0x03, 0x60, 0x88, 
-	0x20, 0x00, 0x49, 0x02, 0x60, 0xc8, 0x47, 0x70, 
-	0x2e, 0x08, 0x1f, 0xa8, 0x2e, 0x08, 0x1f, 0xac, 
-	0xb4, 0x90, 0x1c, 0x01, 0x29, 0x00, 0xd1, 0x02, 
-	0x20, 0x8d, 0xbc, 0x90, 0x47, 0x70, 0x4c, 0x08, 
-	0x1c, 0x0f, 0x22, 0x00, 0x23, 0xff, 0x33, 0x01, 
-	0x42, 0x9a, 0xd3, 0x02, 0xe0, 0x04, 0x32, 0x01, 
-	0xe7, 0xf8, 0xcf, 0x08, 0xc4, 0x08, 0xe7, 0xfa, 
-	0x20, 0x00, 0xe7, 0xee, 0xe7, 0xed, 0x00, 0x00, 
-	0x68, 0x00, 0x18, 0x00, 0xb4, 0x90, 0x1c, 0x04, 
-	0x1c, 0x0f, 0x1c, 0x13, 0x06, 0x1a, 0x0e, 0x12, 
-	0x1c, 0x21, 0x60, 0x0f, 0x71, 0x0a, 0x20, 0x00, 
-	0xbc, 0x90, 0x47, 0x70, 0xe7, 0xfc, 0x00, 0x00, 
-	0xb5, 0x00, 0x48, 0x1d, 0x69, 0x00, 0x23, 0x04, 
-	0x40, 0x18, 0xd0, 0x19, 0x48, 0x1a, 0x69, 0x00, 
-	0x23, 0x02, 0x40, 0x18, 0xd0, 0x09, 0x48, 0x18, 
-	0x69, 0x40, 0x49, 0x18, 0x68, 0x09, 0x60, 0x08, 
-	0x20, 0x01, 0x49, 0x17, 0x68, 0x09, 0x70, 0x08, 
-	0xe0, 0x03, 0x20, 0x00, 0x49, 0x14, 0x68, 0x09, 
-	0x70, 0x08, 0x48, 0x14, 0x78, 0x01, 0x20, 0x01, 
-	0x40, 0x88, 0xf0, 0x07, 0xfb, 0x65, 0xe0, 0x18, 
-	0x48, 0x11, 0x6a, 0x80, 0x23, 0x02, 0x40, 0x18, 
-	0xd0, 0x13, 0x48, 0x0f, 0x6a, 0x80, 0x07, 0xc0, 
-	0x0f, 0xc0, 0xd0, 0x04, 0x20, 0xfe, 0x49, 0x0d, 
-	0x68, 0x09, 0x70, 0x08, 0xe0, 0x03, 0x20, 0x0e, 
-	0x49, 0x0a, 0x68, 0x09, 0x70, 0x08, 0x48, 0x0a, 
-	0x78, 0x01, 0x20, 0x01, 0x40, 0x88, 0xf0, 0x07, 
-	0xfb, 0x4b, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x6e, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x7c, 0x2c, 
-	0x2e, 0x08, 0x7c, 0x30, 0x2e, 0x08, 0x7c, 0x34, 
-	0x6e, 0x00, 0x0e, 0x00, 0x2e, 0x08, 0x7c, 0x38, 
-	0x2e, 0x08, 0x7c, 0x3c, 0xb5, 0xf0, 0x1c, 0x05, 
-	0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x2e, 0x0e, 0x36, 
-	0x2e, 0x1f, 0xdd, 0x03, 0x20, 0xaf, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x49, 0x08, 0x20, 0x0d, 
-	0xf0, 0x07, 0xfb, 0x3c, 0x48, 0x07, 0x60, 0x04, 
-	0x20, 0x00, 0x49, 0x06, 0x68, 0x09, 0x70, 0x08, 
-	0x48, 0x05, 0x60, 0x07, 0x48, 0x05, 0x70, 0x06, 
-	0x20, 0x00, 0xe7, 0xec, 0xe7, 0xeb, 0x00, 0x00, 
-	0x2e, 0x01, 0x53, 0xed, 0x2e, 0x08, 0x7c, 0x30, 
-	0x2e, 0x08, 0x7c, 0x2c, 0x2e, 0x08, 0x7c, 0x34, 
-	0xb5, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x25, 
-	0x0e, 0x2d, 0x2d, 0x1f, 0xdd, 0x03, 0x20, 0xaf, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x49, 0x07, 
-	0x20, 0x0d, 0xf0, 0x07, 0xfb, 0x17, 0x48, 0x06, 
-	0x60, 0x07, 0x20, 0x00, 0x49, 0x04, 0x68, 0x09, 
-	0x70, 0x08, 0x48, 0x04, 0x70, 0x05, 0x20, 0x00, 
-	0xe7, 0xee, 0xe7, 0xed, 0x2e, 0x01, 0x53, 0xed, 
-	0x2e, 0x08, 0x7c, 0x38, 0x2e, 0x08, 0x7c, 0x3c, 
-	0xb4, 0xb0, 0x1c, 0x01, 0x4a, 0x35, 0x23, 0x01, 
-	0x60, 0x13, 0x4a, 0x35, 0x1c, 0x0f, 0x68, 0x3d, 
-	0xc2, 0x20, 0x88, 0x8d, 0xc2, 0x20, 0x88, 0xcb, 
-	0x60, 0x13, 0x68, 0x8c, 0x2c, 0x00, 0xd0, 0x57, 
-	0x4a, 0x30, 0x1c, 0x27, 0x20, 0x00, 0x28, 0x13, 
-	0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, 
-	0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x2c, 
-	0x1d, 0xe7, 0x37, 0x45, 0x20, 0x00, 0x28, 0x0b, 
-	0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, 
-	0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x27, 
-	0x1d, 0xe7, 0x37, 0x71, 0x20, 0x00, 0x28, 0x07, 
-	0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, 
-	0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x22, 
-	0x1d, 0xe7, 0x37, 0x8d, 0x20, 0x00, 0x28, 0x09, 
-	0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, 
-	0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x1d, 
-	0x1d, 0xe7, 0x37, 0xb1, 0x20, 0x00, 0x28, 0x09, 
-	0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, 
-	0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x68, 0x0d, 
-	0x23, 0x01, 0x02, 0x9b, 0x40, 0x2b, 0xd0, 0x17, 
-	0x4a, 0x15, 0x1d, 0xe7, 0x37, 0xd5, 0x20, 0x00, 
-	0x28, 0x09, 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 
-	0xe7, 0xfa, 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 
-	0x4a, 0x10, 0x1d, 0xe7, 0x37, 0xf9, 0x20, 0x00, 
-	0x28, 0x09, 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 
-	0xe7, 0xfa, 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 
-	0x4a, 0x02, 0x23, 0x00, 0x60, 0x13, 0xbc, 0xb0, 
-	0x47, 0x70, 0x00, 0x00, 0x6e, 0x00, 0x0c, 0x0c, 
-	0x6e, 0x00, 0x0c, 0x00, 0x6e, 0x00, 0x08, 0x00, 
-	0x6e, 0x00, 0x08, 0x50, 0x6e, 0x00, 0x08, 0x80, 
-	0x6e, 0x00, 0x08, 0xa0, 0x6e, 0x00, 0x08, 0xd0, 
-	0x6e, 0x00, 0x09, 0x00, 0x6e, 0x00, 0x09, 0x30, 
-	0xb4, 0xf0, 0x1c, 0x01, 0x69, 0x08, 0x06, 0xc0, 
-	0x0e, 0xc0, 0x28, 0x01, 0xdb, 0x04, 0x69, 0x08, 
-	0x06, 0xc0, 0x0e, 0xc0, 0x28, 0x0a, 0xdd, 0x02, 
-	0x20, 0xc3, 0xbc, 0xf0, 0x47, 0x70, 0x69, 0x08, 
-	0x05, 0x80, 0x0e, 0xc0, 0x28, 0x01, 0xdb, 0x04, 
-	0x69, 0x08, 0x05, 0x80, 0x0e, 0xc0, 0x28, 0x0a, 
-	0xdd, 0x01, 0x20, 0xc4, 0xe7, 0xf1, 0x48, 0x4f, 
-	0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0xd1, 0x01, 
-	0x20, 0xc0, 0xe7, 0xea, 0x68, 0x08, 0x07, 0x00, 
-	0x0f, 0xc0, 0x4b, 0x4b, 0x70, 0x18, 0x4f, 0x49, 
-	0x1c, 0x0c, 0x22, 0x00, 0x2a, 0x04, 0xd3, 0x02, 
-	0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 
-	0xc7, 0x08, 0xe7, 0xfa, 0x4f, 0x45, 0x69, 0x08, 
-	0x06, 0xc0, 0x0e, 0xc0, 0x00, 0x43, 0x18, 0x18, 
-	0x38, 0x03, 0x69, 0x0b, 0x05, 0x9b, 0x0e, 0xde, 
-	0x00, 0x73, 0x19, 0x9b, 0x3b, 0x03, 0x01, 0x5b, 
-	0x43, 0x18, 0x60, 0x38, 0x4f, 0x3e, 0x69, 0x48, 
-	0x60, 0x38, 0x4f, 0x3e, 0x69, 0x88, 0x05, 0x40, 
-	0x0d, 0x40, 0x69, 0x8b, 0x02, 0x9b, 0x0d, 0x5b, 
-	0x02, 0xdb, 0x43, 0x18, 0x60, 0x38, 0x69, 0xcd, 
-	0x2d, 0x00, 0xd0, 0x63, 0x4f, 0x38, 0x1c, 0x2c, 
-	0x22, 0x00, 0x2a, 0x09, 0xd3, 0x02, 0xe0, 0x04, 
-	0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, 
-	0xe7, 0xfa, 0x4f, 0x34, 0x1d, 0xec, 0x34, 0x1d, 
-	0x22, 0x00, 0x2a, 0x09, 0xd3, 0x02, 0xe0, 0x04, 
-	0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, 
-	0xe7, 0xfa, 0x4f, 0x2f, 0x1d, 0xec, 0x34, 0x41, 
-	0x22, 0x00, 0x2a, 0x09, 0xd3, 0x02, 0xe0, 0x04, 
-	0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, 
-	0xe7, 0xfa, 0x4f, 0x2a, 0x1d, 0xec, 0x34, 0x65, 
-	0x22, 0x00, 0x2a, 0x09, 0xd3, 0x02, 0xe0, 0x04, 
-	0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, 
-	0xe7, 0xfa, 0x4f, 0x25, 0x1d, 0xec, 0x34, 0x89, 
-	0x22, 0x00, 0x2a, 0x05, 0xd3, 0x02, 0xe0, 0x04, 
-	0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, 
-	0xe7, 0xfa, 0x4f, 0x20, 0x1d, 0xec, 0x34, 0x9d, 
-	0x22, 0x00, 0x2a, 0x05, 0xd3, 0x02, 0xe0, 0x04, 
-	0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, 
-	0xe7, 0xfa, 0x68, 0x08, 0x23, 0x01, 0x02, 0x9b, 
-	0x40, 0x18, 0xd0, 0x17, 0x4f, 0x18, 0x1d, 0xec, 
-	0x34, 0xb1, 0x22, 0x00, 0x2a, 0x05, 0xd3, 0x02, 
-	0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 
-	0xc7, 0x08, 0xe7, 0xfa, 0x4f, 0x13, 0x1d, 0xec, 
-	0x34, 0xc5, 0x22, 0x00, 0x2a, 0x05, 0xd3, 0x02, 
-	0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 
-	0xc7, 0x08, 0xe7, 0xfa, 0x20, 0x00, 0xe7, 0x54, 
-	0xe7, 0x53, 0x00, 0x00, 0x6e, 0x00, 0x0e, 0x00, 
-	0x2e, 0x08, 0x7c, 0x3d, 0x6e, 0x00, 0x0e, 0x10, 
-	0x6e, 0x00, 0x0e, 0x14, 0x6e, 0x00, 0x0e, 0x18, 
-	0x6e, 0x00, 0x0a, 0x00, 0x6e, 0x00, 0x0a, 0x24, 
-	0x6e, 0x00, 0x0a, 0x48, 0x6e, 0x00, 0x0a, 0x90, 
-	0x6e, 0x00, 0x0a, 0xc0, 0x6e, 0x00, 0x0a, 0xe4, 
-	0x6e, 0x00, 0x09, 0xc0, 0x6e, 0x00, 0x09, 0xe4, 
-	0x1c, 0x01, 0x48, 0x0c, 0x78, 0x00, 0x28, 0x00, 
-	0xd0, 0x01, 0x20, 0xc1, 0x47, 0x70, 0x48, 0x0a, 
-	0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0xd1, 0x01, 
-	0x20, 0xc0, 0xe7, 0xf7, 0x20, 0x00, 0x4b, 0x06, 
-	0x61, 0x58, 0x4a, 0x06, 0x68, 0x08, 0x60, 0x10, 
-	0x4a, 0x05, 0x68, 0x48, 0x60, 0x10, 0x20, 0x00, 
-	0xe7, 0xec, 0xe7, 0xeb, 0x2e, 0x08, 0x7c, 0x3d, 
-	0x6e, 0x00, 0x0e, 0x00, 0x6e, 0x00, 0x0e, 0x20, 
-	0x6e, 0x00, 0x0e, 0x24, 0x48, 0x09, 0x78, 0x00, 
-	0x28, 0x00, 0xd0, 0x01, 0x20, 0xc1, 0x47, 0x70, 
-	0x48, 0x07, 0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 
-	0xd0, 0x01, 0x20, 0xc2, 0xe7, 0xf7, 0x20, 0x01, 
-	0x49, 0x03, 0x61, 0x48, 0x20, 0x00, 0xe7, 0xf2, 
-	0xe7, 0xf1, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x3d, 
-	0x6e, 0x00, 0x0e, 0x00, 0xb5, 0xff, 0x1c, 0x04, 
-	0x1c, 0x0d, 0x1c, 0x17, 0x9e, 0x09, 0x20, 0x00, 
-	0x60, 0x30, 0x48, 0x13, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x07, 0x9b, 0x03, 0x2b, 0x00, 0xd1, 0x04, 
-	0x20, 0x8a, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x23, 0xff, 0x33, 0x01, 0x42, 0x9c, 
-	0xdd, 0x01, 0x20, 0x87, 0xe7, 0xf5, 0x19, 0x28, 
-	0x23, 0xff, 0x33, 0x01, 0x42, 0x98, 0xd9, 0x01, 
-	0x20, 0x88, 0xe7, 0xee, 0x68, 0x79, 0x1c, 0x20, 
-	0x80, 0x48, 0x70, 0x0d, 0x9b, 0x03, 0x60, 0x4b, 
-	0x68, 0x78, 0x60, 0xc8, 0x68, 0x38, 0x60, 0x88, 
-	0x60, 0x31, 0x20, 0x00, 0xe7, 0xe1, 0xe7, 0xe0, 
-	0x2e, 0x08, 0x60, 0x84, 0x1c, 0x03, 0x1c, 0x0a, 
-	0x1c, 0x19, 0x68, 0xc8, 0x60, 0x50, 0x68, 0x88, 
-	0x60, 0x10, 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 
-	0xb5, 0xf3, 0xb0, 0x87, 0x21, 0x00, 0x91, 0x06, 
-	0x26, 0x00, 0x98, 0x07, 0xf0, 0x00, 0xfa, 0xcb, 
-	0x90, 0x03, 0x9c, 0x07, 0x9d, 0x08, 0x88, 0x69, 
-	0x91, 0x04, 0x98, 0x03, 0x99, 0x04, 0x42, 0x88, 
-	0xd0, 0x09, 0x48, 0xbb, 0x68, 0x00, 0x28, 0x00, 
-	0xd1, 0x05, 0x20, 0xff, 0xb0, 0x07, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x78, 0x28, 
-	0x90, 0x05, 0x99, 0x04, 0x23, 0xff, 0x33, 0x01, 
-	0x42, 0x99, 0xdd, 0x02, 0x20, 0xff, 0xb0, 0x07, 
-	0xe7, 0xf1, 0x98, 0x05, 0x99, 0x04, 0x18, 0x40, 
-	0x23, 0xff, 0x33, 0x01, 0x42, 0x98, 0xdd, 0x02, 
-	0x20, 0xff, 0xb0, 0x07, 0xe7, 0xe7, 0x48, 0xad, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x0a, 0x68, 0xa0, 
-	0x23, 0x01, 0x06, 0x1b, 0x40, 0x18, 0xd0, 0x05, 
-	0x68, 0x68, 0x28, 0x00, 0xd1, 0x02, 0x20, 0x8a, 
-	0xb0, 0x07, 0xe7, 0xd8, 0x62, 0x65, 0x69, 0x60, 
-	0x4b, 0xa5, 0x40, 0x18, 0x99, 0x05, 0x06, 0x09, 
-	0x0e, 0x09, 0x04, 0x09, 0x43, 0x08, 0x61, 0x60, 
-	0x02, 0x00, 0x68, 0xe0, 0x90, 0x00, 0x48, 0x9e, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x06, 0x98, 0x00, 
-	0x28, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 
-	0x20, 0x00, 0xe0, 0x05, 0x98, 0x00, 0x28, 0x08, 
-	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
-	0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x07, 
-	0xe7, 0xb5, 0x48, 0x94, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x1e, 0x48, 0x91, 0x68, 0x00, 0x28, 0x00, 
-	0xd1, 0x1a, 0x68, 0xa0, 0x02, 0x00, 0x0e, 0x00, 
-	0x06, 0x01, 0x0e, 0x09, 0x91, 0x06, 0x99, 0x04, 
-	0x29, 0x04, 0xd0, 0x06, 0x29, 0x10, 0xd0, 0x07, 
-	0x23, 0xff, 0x33, 0x01, 0x42, 0x99, 0xd0, 0x06, 
-	0xe0, 0x08, 0x26, 0xff, 0x36, 0x01, 0xe0, 0x07, 
-	0x26, 0x01, 0x02, 0x76, 0xe0, 0x04, 0x26, 0x03, 
-	0x02, 0x36, 0xe0, 0x01, 0x26, 0x00, 0xe7, 0xff, 
-	0x49, 0x84, 0x20, 0x91, 0xf0, 0x0f, 0xff, 0xca, 
-	0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, 
-	0xff, 0xb1, 0xe7, 0xf5, 0x98, 0x00, 0x00, 0x80, 
-	0x49, 0x7f, 0x58, 0x08, 0x99, 0x07, 0x42, 0x88, 
-	0xd0, 0x05, 0x20, 0x92, 0x49, 0x7b, 0x60, 0x08, 
-	0x20, 0xff, 0xb0, 0x07, 0xe7, 0x7b, 0x48, 0x77, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x73, 0x48, 0x74, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x6f, 0x98, 0x00, 
-	0xf0, 0x02, 0xfe, 0xd6, 0x28, 0x00, 0xd0, 0x6a, 
-	0xb0, 0x82, 0x49, 0x74, 0x20, 0x91, 0xf0, 0x0f, 
-	0xff, 0xa5, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 
-	0xf0, 0x02, 0xff, 0x25, 0x20, 0x92, 0x49, 0x6f, 
-	0x60, 0x08, 0x20, 0x01, 0x49, 0x6e, 0x68, 0x09, 
-	0x60, 0x08, 0x27, 0x00, 0x20, 0x00, 0x90, 0x00, 
-	0x98, 0x00, 0x28, 0x00, 0xd1, 0x15, 0x2f, 0x07, 
-	0xd2, 0x13, 0x6a, 0xe0, 0x05, 0x81, 0x0d, 0x89, 
-	0x1c, 0x38, 0x37, 0x01, 0x00, 0x83, 0x18, 0x18, 
-	0x00, 0xc0, 0x4a, 0x65, 0x68, 0x12, 0x18, 0x80, 
-	0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 
-	0x42, 0x81, 0xd1, 0x01, 0x20, 0x01, 0x90, 0x00, 
-	0xe7, 0xe6, 0x98, 0x00, 0x28, 0x00, 0xd1, 0x14, 
-	0x2f, 0x18, 0xd2, 0x12, 0x6a, 0xe0, 0x05, 0x81, 
-	0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 0x23, 0x4c, 
-	0x43, 0x58, 0x4a, 0x59, 0x68, 0x12, 0x18, 0x80, 
-	0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x69, 0x40, 
-	0x42, 0x81, 0xd1, 0x01, 0x20, 0x01, 0x90, 0x00, 
-	0xe7, 0xe7, 0x3f, 0x01, 0x2f, 0x07, 0xd2, 0x10, 
-	0x00, 0xb8, 0x19, 0xc0, 0x00, 0xc0, 0x49, 0x50, 
-	0x68, 0x09, 0x18, 0x40, 0x23, 0x2b, 0x01, 0x5b, 
-	0x18, 0xc0, 0x1c, 0x21, 0xf0, 0x02, 0xfb, 0x38, 
-	0x48, 0x4b, 0x68, 0x00, 0xf0, 0x02, 0xfe, 0xee, 
-	0xe0, 0x46, 0x2f, 0x18, 0xd2, 0x44, 0x20, 0x4c, 
-	0x43, 0x78, 0x49, 0x47, 0x68, 0x09, 0x18, 0x40, 
-	0x38, 0xff, 0x38, 0xff, 0x38, 0x0a, 0x1c, 0x21, 
-	0xf0, 0x02, 0xfb, 0x26, 0x20, 0x4c, 0x43, 0x78, 
-	0x49, 0x41, 0x68, 0x09, 0xe0, 0x00, 0xe0, 0x48, 
-	0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x82, 
-	0x6f, 0xc0, 0x28, 0x00, 0xd0, 0x17, 0x20, 0x4c, 
-	0x43, 0x78, 0x49, 0x3b, 0x68, 0x09, 0x18, 0x40, 
-	0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x68, 0x00, 
-	0x04, 0x00, 0x0c, 0x00, 0xd0, 0x0b, 0x20, 0x4c, 
-	0x43, 0x78, 0x49, 0x35, 0x68, 0x09, 0x18, 0x40, 
-	0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x68, 0x00, 
-	0x0c, 0x00, 0x04, 0x00, 0xd1, 0x0a, 0x20, 0x02, 
-	0x21, 0x4c, 0x43, 0x79, 0x4a, 0x2e, 0x68, 0x12, 
-	0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 0x39, 0x82, 
-	0x67, 0x48, 0xe0, 0x09, 0x20, 0x03, 0x21, 0x4c, 
-	0x43, 0x79, 0x4a, 0x29, 0x68, 0x12, 0x18, 0x89, 
-	0x39, 0xff, 0x39, 0xff, 0x39, 0x82, 0x67, 0x48, 
-	0x49, 0x24, 0x20, 0x91, 0xf0, 0x0f, 0xff, 0x06, 
-	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x22, 
-	0x68, 0x00, 0x90, 0x01, 0x48, 0x21, 0x68, 0x00, 
-	0x49, 0x1f, 0x60, 0x08, 0x98, 0x01, 0x49, 0x1f, 
-	0x60, 0x08, 0x20, 0x92, 0x49, 0x1b, 0x60, 0x08, 
-	0xb0, 0x02, 0x48, 0x15, 0x68, 0x00, 0x28, 0x00, 
-	0xd1, 0x1d, 0x98, 0x00, 0x01, 0x00, 0x4b, 0x1a, 
-	0x18, 0xc1, 0x91, 0x01, 0x1d, 0xe0, 0x30, 0x0d, 
-	0x90, 0x02, 0x98, 0x02, 0x68, 0x00, 0x99, 0x01, 
-	0x60, 0x08, 0x48, 0x0e, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x0d, 0x68, 0x68, 0x08, 0x80, 0x99, 0x06, 
-	0x00, 0x89, 0x4b, 0x12, 0x18, 0xc9, 0x67, 0x08, 
-	0x98, 0x05, 0x43, 0x30, 0x99, 0x06, 0x00, 0x89, 
-	0x4b, 0x0f, 0x18, 0xc9, 0x61, 0x08, 0x20, 0x92, 
-	0x49, 0x06, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x07, 
-	0xe6, 0x91, 0xb0, 0x07, 0xe6, 0x8f, 0x00, 0x00, 
-	0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x60, 0x84, 
-	0xff, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x7c, 0xc0, 
-	0x2e, 0x08, 0x7c, 0x58, 0x2e, 0x08, 0x94, 0x88, 
-	0x2e, 0x08, 0x7d, 0xb4, 0x2e, 0x08, 0x7d, 0xb8, 
-	0x68, 0x00, 0x0c, 0x00, 0x68, 0x00, 0x0e, 0x00, 
-	0x68, 0x00, 0x0e, 0x80, 0x1c, 0x01, 0x1c, 0x0a, 
-	0x6a, 0x53, 0x1c, 0x18, 0x47, 0x70, 0xe7, 0xfd, 
-	0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x82, 0x48, 0x2b, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x20, 0x8a, 
-	0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x98, 0x02, 0x90, 0x01, 0x98, 0x01, 
-	0x88, 0x44, 0x98, 0x01, 0x78, 0x06, 0x23, 0xff, 
-	0x33, 0x01, 0x42, 0x9c, 0xdd, 0x02, 0x20, 0xff, 
-	0xb0, 0x02, 0xe7, 0xee, 0x19, 0x30, 0x23, 0xff, 
-	0x33, 0x01, 0x42, 0x98, 0xdd, 0x02, 0x20, 0xff, 
-	0xb0, 0x02, 0xe7, 0xe6, 0x49, 0x1c, 0x20, 0x91, 
-	0xf0, 0x0f, 0xfe, 0x88, 0x28, 0x92, 0xd0, 0x03, 
-	0x20, 0x01, 0xf0, 0x01, 0xfe, 0x6f, 0xe7, 0xf5, 
-	0x2c, 0x10, 0xda, 0x0d, 0x25, 0x00, 0x42, 0xa5, 
-	0xdb, 0x02, 0xe0, 0x08, 0x35, 0x01, 0xe7, 0xfa, 
-	0xcf, 0x01, 0x19, 0x71, 0x00, 0x89, 0x4b, 0x13, 
-	0x18, 0xc9, 0x60, 0x08, 0xe7, 0xf6, 0xe0, 0x15, 
-	0x4a, 0x11, 0x43, 0x22, 0x92, 0x00, 0x20, 0x91, 
-	0x49, 0x10, 0x60, 0x08, 0x00, 0xb0, 0x4b, 0x0d, 
-	0x18, 0xc1, 0x9a, 0x00, 0x1c, 0x38, 0x23, 0x02, 
-	0xf0, 0x00, 0xfa, 0xfe, 0x28, 0x00, 0xd0, 0x00, 
-	0xe7, 0xf4, 0x48, 0x0a, 0x68, 0x00, 0x28, 0x92, 
-	0xd0, 0x00, 0xe7, 0xfa, 0x20, 0x92, 0x49, 0x04, 
-	0x60, 0x08, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xb0, 
-	0xb0, 0x02, 0xe7, 0xae, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x7c, 0xc4, 0x68, 0x00, 0x08, 0x00, 
-	0xf0, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0xc8, 
-	0x21, 0x04, 0xe0, 0x00, 0x31, 0x01, 0x1c, 0x08, 
-	0x47, 0x70, 0xe7, 0xfd, 0xb5, 0xf3, 0x1c, 0x0f, 
-	0xb0, 0x82, 0x48, 0x2b, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x05, 0x20, 0x8a, 0xb0, 0x02, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x02, 
-	0x90, 0x01, 0x98, 0x01, 0x88, 0x44, 0x98, 0x01, 
-	0x78, 0x06, 0x23, 0xff, 0x33, 0x01, 0x42, 0x9c, 
-	0xdd, 0x02, 0x20, 0xff, 0xb0, 0x02, 0xe7, 0xee, 
-	0x19, 0x30, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, 
-	0xdd, 0x02, 0x20, 0xff, 0xb0, 0x02, 0xe7, 0xe6, 
-	0x49, 0x1c, 0x20, 0x91, 0xf0, 0x0f, 0xfe, 0x1e, 
-	0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, 
-	0xfe, 0x05, 0xe7, 0xf5, 0x2c, 0x10, 0xda, 0x0d, 
-	0x25, 0x00, 0x42, 0xa5, 0xdb, 0x02, 0xe0, 0x08, 
-	0x35, 0x01, 0xe7, 0xfa, 0x19, 0x70, 0x00, 0x80, 
-	0x4b, 0x13, 0x18, 0xc0, 0x68, 0x01, 0xc7, 0x02, 
-	0xe7, 0xf6, 0xe0, 0x15, 0x4a, 0x11, 0x43, 0x22, 
-	0x92, 0x00, 0x20, 0x91, 0x49, 0x10, 0x60, 0x08, 
-	0x00, 0xb0, 0x4b, 0x0d, 0x18, 0xc0, 0x9a, 0x00, 
-	0x1c, 0x39, 0x23, 0x02, 0xf0, 0x00, 0xfa, 0x94, 
-	0x28, 0x00, 0xd0, 0x00, 0xe7, 0xf4, 0x48, 0x0a, 
-	0x68, 0x00, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xfa, 
-	0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 0x20, 0x00, 
-	0xb0, 0x02, 0xe7, 0xb0, 0xb0, 0x02, 0xe7, 0xae, 
-	0x2e, 0x08, 0x60, 0x84, 0x2e, 0x08, 0x7c, 0xc4, 
-	0x68, 0x00, 0x08, 0x00, 0xf0, 0x00, 0x00, 0x00, 
-	0x2e, 0x08, 0x7c, 0xc8, 0xb5, 0xf7, 0x9a, 0x02, 
-	0x06, 0x15, 0x0e, 0x2d, 0x9c, 0x00, 0x88, 0x66, 
-	0x42, 0xb5, 0xdd, 0x04, 0x20, 0xff, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x78, 0x20, 
-	0x19, 0x40, 0x06, 0x07, 0x0e, 0x3f, 0x23, 0xff, 
-	0x33, 0x01, 0x42, 0x9f, 0xdd, 0x01, 0x20, 0xff, 
-	0xe7, 0xf1, 0x49, 0x0a, 0x20, 0x91, 0xf0, 0x0f, 
-	0xfd, 0xc5, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 
-	0xf0, 0x01, 0xfd, 0xac, 0xe7, 0xf5, 0x99, 0x01, 
-	0x00, 0xb8, 0x4b, 0x05, 0x18, 0xc0, 0x60, 0x01, 
-	0x20, 0x92, 0x49, 0x02, 0x60, 0x08, 0x20, 0x00, 
-	0xe7, 0xdd, 0xe7, 0xdc, 0x2e, 0x08, 0x7c, 0xc4, 
-	0x68, 0x00, 0x08, 0x00, 0xb5, 0xf7, 0x9a, 0x02, 
-	0x06, 0x14, 0x0e, 0x24, 0x9f, 0x00, 0x88, 0x7d, 
-	0x78, 0x38, 0x19, 0x00, 0x06, 0x06, 0x0e, 0x36, 
-	0x42, 0xac, 0xdd, 0x04, 0x20, 0xff, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x49, 0x0b, 
-	0x20, 0x91, 0xf0, 0x0f, 0xfd, 0x9b, 0x28, 0x92, 
-	0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, 0xfd, 0x82, 
-	0xe7, 0xf5, 0x00, 0xb0, 0x4b, 0x06, 0x18, 0xc0, 
-	0x68, 0x00, 0x99, 0x01, 0x60, 0x08, 0x20, 0x92, 
-	0x49, 0x02, 0x60, 0x08, 0x20, 0x00, 0xe7, 0xe6, 
-	0xe7, 0xe5, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0xc4, 
-	0x68, 0x00, 0x08, 0x00, 0x1c, 0x01, 0x1c, 0x0a, 
-	0x88, 0x50, 0x47, 0x70, 0xe7, 0xfd, 0xb4, 0x80, 
-	0x1c, 0x01, 0x1c, 0x0f, 0x69, 0x3a, 0x2a, 0x08, 
-	0xd2, 0x12, 0xa3, 0x02, 0x5c, 0x9b, 0x00, 0x5b, 
-	0x44, 0x9f, 0x1c, 0x00, 0x04, 0x07, 0x09, 0x0b, 
-	0x04, 0x07, 0x09, 0x0b, 0x20, 0x02, 0xbc, 0x80, 
-	0x47, 0x70, 0x20, 0x04, 0xe7, 0xfb, 0x20, 0x10, 
-	0xe7, 0xf9, 0x20, 0xff, 0x30, 0x01, 0xe7, 0xf6, 
-	0x20, 0x00, 0xe7, 0xf4, 0xe7, 0xf3, 0xb5, 0xf3, 
-	0x98, 0x00, 0x06, 0x05, 0x0e, 0x2d, 0x48, 0x89, 
-	0x68, 0x00, 0x28, 0x00, 0xd1, 0x04, 0x20, 0x8b, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x48, 0x85, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x04, 
-	0x2d, 0x17, 0xdd, 0x02, 0x20, 0x8c, 0xe7, 0xf3, 
-	0xe0, 0xfe, 0x2d, 0x07, 0xdd, 0x01, 0x20, 0x8c, 
-	0xe7, 0xee, 0x49, 0x80, 0x20, 0x91, 0xf0, 0x0f, 
-	0xfd, 0x45, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 
-	0xf0, 0x01, 0xfd, 0x2c, 0xe7, 0xf5, 0x1c, 0x28, 
-	0xf7, 0xf8, 0xfc, 0xd8, 0x1c, 0x04, 0x2c, 0x00, 
-	0xd0, 0x09, 0x68, 0xa0, 0x4b, 0x78, 0x40, 0x18, 
-	0x99, 0x01, 0x07, 0xc9, 0x09, 0xc9, 0x43, 0x08, 
-	0x60, 0xa0, 0x01, 0xc0, 0xe0, 0x04, 0x20, 0x92, 
-	0x49, 0x72, 0x60, 0x08, 0x20, 0xff, 0xe7, 0xcf, 
-	0x48, 0x6f, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x11, 
-	0x99, 0x01, 0x29, 0x00, 0xd0, 0x06, 0x48, 0x6f, 
-	0x21, 0x01, 0x40, 0xa9, 0x68, 0x02, 0x43, 0x11, 
-	0x60, 0x01, 0xe0, 0x06, 0x48, 0x6b, 0x21, 0x01, 
-	0x40, 0xa9, 0x43, 0xc9, 0x68, 0x02, 0x40, 0x11, 
-	0x60, 0x01, 0xe0, 0xbf, 0x68, 0xe0, 0xf0, 0x02, 
-	0xfc, 0x3b, 0x28, 0x00, 0xd0, 0x73, 0xb0, 0x81, 
-	0x49, 0x65, 0x20, 0x91, 0xf0, 0x0f, 0xfd, 0x0a, 
-	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x02, 
-	0xfc, 0x8a, 0x20, 0x92, 0x49, 0x60, 0x60, 0x08, 
-	0x20, 0x01, 0x49, 0x60, 0x68, 0x09, 0x60, 0x08, 
-	0x27, 0x00, 0x26, 0x00, 0x2e, 0x00, 0xd1, 0x14, 
-	0x2f, 0x07, 0xd2, 0x12, 0x6a, 0xe0, 0x05, 0x81, 
-	0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 0x00, 0x83, 
-	0x18, 0x18, 0x00, 0xc0, 0x4a, 0x57, 0x68, 0x12, 
-	0x18, 0x80, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 
-	0x6f, 0xc0, 0x42, 0x81, 0xd1, 0x00, 0x26, 0x01, 
-	0xe7, 0xe8, 0x2e, 0x00, 0xd1, 0x13, 0x2f, 0x18, 
-	0xd2, 0x11, 0x6a, 0xe0, 0x05, 0x81, 0x0d, 0x89, 
-	0x1c, 0x38, 0x37, 0x01, 0x23, 0x4c, 0x43, 0x58, 
-	0x4a, 0x4c, 0x68, 0x12, 0x18, 0x80, 0x38, 0xff, 
-	0x38, 0xff, 0x38, 0x02, 0x69, 0x40, 0x42, 0x81, 
-	0xd1, 0x00, 0x26, 0x01, 0xe7, 0xe9, 0x3f, 0x01, 
-	0x2f, 0x07, 0xd2, 0x32, 0x99, 0x02, 0x29, 0x00, 
-	0xd0, 0x16, 0x00, 0xb8, 0x19, 0xc0, 0x00, 0xc0, 
-	0x49, 0x42, 0x68, 0x09, 0x18, 0x40, 0x23, 0x05, 
-	0x02, 0x1b, 0x18, 0xc0, 0x6e, 0x80, 0x4b, 0x40, 
-	0x43, 0x18, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 
-	0x4a, 0x3c, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, 
-	0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0xe0, 0x17, 
-	0x00, 0xb8, 0x19, 0xc0, 0x00, 0xc0, 0x49, 0x37, 
-	0x68, 0x09, 0x18, 0x40, 0x23, 0x05, 0x02, 0x1b, 
-	0x18, 0xc0, 0x6e, 0x80, 0x04, 0x00, 0x0c, 0x00, 
-	0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x31, 
-	0x68, 0x12, 0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, 
-	0x18, 0xc9, 0x66, 0x88, 0xe0, 0x00, 0xe0, 0x45, 
-	0xe0, 0x2b, 0x99, 0x02, 0x29, 0x00, 0xd0, 0x14, 
-	0x20, 0x4c, 0x43, 0x78, 0x49, 0x29, 0x68, 0x09, 
-	0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 
-	0x68, 0x00, 0x4b, 0x27, 0x43, 0x18, 0x21, 0x4c, 
-	0x43, 0x79, 0x4a, 0x24, 0x68, 0x12, 0x18, 0x89, 
-	0x39, 0xff, 0x39, 0xff, 0x39, 0x02, 0x60, 0x08, 
-	0xe0, 0x13, 0x20, 0x4c, 0x43, 0x78, 0x49, 0x1f, 
-	0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 
-	0x38, 0x02, 0x68, 0x00, 0x04, 0x00, 0x0c, 0x00, 
-	0x21, 0x4c, 0x43, 0x79, 0x4a, 0x19, 0x68, 0x12, 
-	0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 0x39, 0x02, 
-	0x60, 0x08, 0x48, 0x16, 0x68, 0x00, 0xf0, 0x02, 
-	0xfc, 0x05, 0x49, 0x13, 0x20, 0x91, 0xf0, 0x0f, 
-	0xfc, 0x65, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 
-	0x48, 0x10, 0x68, 0x00, 0x90, 0x00, 0x48, 0x11, 
-	0x68, 0x00, 0x49, 0x0e, 0x60, 0x08, 0x98, 0x00, 
-	0x49, 0x0e, 0x60, 0x08, 0x20, 0x92, 0x49, 0x0a, 
-	0x60, 0x08, 0xb0, 0x01, 0x20, 0x92, 0x49, 0x05, 
-	0x60, 0x08, 0x20, 0x00, 0xe6, 0xf4, 0xe6, 0xf3, 
-	0xe6, 0xf2, 0x00, 0x00, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc4, 
-	0xfe, 0xff, 0xff, 0xff, 0x68, 0x00, 0x00, 0x20, 
-	0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4, 
-	0xff, 0xff, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0xb8, 
-	0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x26, 
-	0x0e, 0x36, 0x48, 0x0f, 0x68, 0x00, 0x28, 0x00, 
-	0xd1, 0x03, 0x20, 0x8b, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x2e, 0x07, 0xdd, 0x01, 0x20, 0x8c, 
-	0xe7, 0xf8, 0x1c, 0x30, 0xf7, 0xf8, 0xfb, 0xc2, 
-	0x1c, 0x05, 0x2d, 0x00, 0xd0, 0x04, 0x68, 0xa8, 
-	0x01, 0xc0, 0x0f, 0xc0, 0x60, 0x38, 0xe0, 0x04, 
-	0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 0x20, 0xff, 
-	0xe7, 0xe8, 0x20, 0x00, 0xe7, 0xe6, 0xe7, 0xe5, 
-	0x2e, 0x08, 0x60, 0x84, 0x2e, 0x08, 0x7c, 0xc4, 
-	0xb5, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x25, 
-	0x0e, 0x2d, 0x48, 0x20, 0x68, 0x00, 0x28, 0x00, 
-	0xd1, 0x03, 0x20, 0x8b, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x48, 0x1d, 0x68, 0x00, 0x28, 0x01, 
-	0xd1, 0x04, 0x2d, 0x17, 0xdd, 0x02, 0x20, 0x8c, 
-	0xe7, 0xf4, 0xe0, 0x2d, 0x2d, 0x07, 0xdd, 0x01, 
-	0x20, 0x8c, 0xe7, 0xef, 0x48, 0x16, 0x68, 0x00, 
-	0x28, 0x00, 0xd0, 0x01, 0x20, 0xff, 0xe7, 0xe9, 
-	0x49, 0x14, 0x20, 0x91, 0xf0, 0x0f, 0xfb, 0xee, 
-	0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, 
-	0xfb, 0xd5, 0xe7, 0xf5, 0x2f, 0x00, 0xd0, 0x08, 
-	0x48, 0x0f, 0x1d, 0xe9, 0x31, 0x01, 0x22, 0x01, 
-	0x40, 0x8a, 0x68, 0x01, 0x43, 0x11, 0x60, 0x01, 
-	0xe0, 0x08, 0x48, 0x0b, 0x1d, 0xea, 0x32, 0x01, 
-	0x21, 0x01, 0x40, 0x91, 0x43, 0xc9, 0x68, 0x02, 
-	0x40, 0x11, 0x60, 0x01, 0x20, 0x92, 0x49, 0x05, 
-	0x60, 0x08, 0x20, 0x00, 0xe7, 0xc6, 0xe7, 0xc5, 
-	0xe7, 0xc4, 0x00, 0x00, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc4, 
-	0x68, 0x00, 0x00, 0x20, 0xb4, 0x90, 0x1c, 0x07, 
-	0x1c, 0x0a, 0x06, 0x39, 0x0e, 0x09, 0x48, 0x10, 
-	0x68, 0x00, 0x28, 0x00, 0xd1, 0x02, 0x20, 0x8b, 
-	0xbc, 0x90, 0x47, 0x70, 0x29, 0x07, 0xdd, 0x01, 
-	0x20, 0x8c, 0xe7, 0xf9, 0x48, 0x0b, 0x68, 0x00, 
-	0x28, 0x00, 0xd0, 0x01, 0x20, 0xff, 0xe7, 0xf3, 
-	0x1d, 0xc8, 0x30, 0x01, 0x24, 0x01, 0x40, 0x84, 
-	0x1c, 0x23, 0x20, 0x0d, 0x06, 0xc0, 0x6a, 0x00, 
-	0x40, 0x18, 0x1d, 0xcc, 0x34, 0x01, 0x40, 0xe0, 
-	0x60, 0x10, 0x20, 0x00, 0xe7, 0xe4, 0xe7, 0xe3, 
-	0x2e, 0x08, 0x60, 0x84, 0x2e, 0x08, 0x94, 0x84, 
-	0xb5, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x25, 
-	0x0e, 0x2d, 0x48, 0x13, 0x68, 0x00, 0x28, 0x00, 
-	0xd1, 0x03, 0x20, 0x8b, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x2d, 0x07, 0xdd, 0x01, 0x20, 0x8c, 
-	0xe7, 0xf8, 0x48, 0x0e, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x01, 0x20, 0xff, 0xe7, 0xf2, 0x49, 0x0c, 
-	0x20, 0x91, 0xf0, 0x0f, 0xfb, 0x7f, 0x28, 0x92, 
-	0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, 0xfb, 0x66, 
-	0xe7, 0xf5, 0x08, 0xb8, 0x00, 0xa9, 0x4b, 0x07, 
-	0x18, 0xc9, 0x67, 0x08, 0x20, 0x92, 0x49, 0x04, 
-	0x60, 0x08, 0x20, 0x00, 0xe7, 0xde, 0xe7, 0xdd, 
-	0x2e, 0x08, 0x60, 0x84, 0x2e, 0x08, 0x94, 0x84, 
-	0x2e, 0x08, 0x7c, 0xc4, 0x68, 0x00, 0x0e, 0x00, 
-	0xb4, 0xf0, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, 
-	0x1c, 0x1e, 0x04, 0x3f, 0x0c, 0x3f, 0x1c, 0x39, 
-	0x29, 0x00, 0xd8, 0x02, 0xe0, 0x04, 0x39, 0x01, 
-	0xe7, 0xfa, 0xcd, 0x04, 0xc4, 0x04, 0xe7, 0xfa, 
-	0x20, 0x92, 0x4a, 0x03, 0x60, 0x10, 0x20, 0x00, 
-	0xbc, 0xf0, 0x47, 0x70, 0xe7, 0xfc, 0x00, 0x00, 
-	0x2e, 0x08, 0x7c, 0xc8, 0x20, 0x00, 0x6b, 0x00, 
-	0x49, 0x63, 0x60, 0x08, 0x20, 0x00, 0x6b, 0x40, 
-	0x49, 0x62, 0x60, 0x08, 0x48, 0x62, 0x49, 0x63, 
-	0x60, 0x08, 0x48, 0x63, 0x49, 0x63, 0x60, 0x08, 
-	0x20, 0x00, 0x6a, 0xc0, 0x49, 0x62, 0x60, 0x08, 
-	0x48, 0x62, 0x49, 0x63, 0x60, 0x08, 0x48, 0x63, 
-	0x49, 0x63, 0x60, 0x08, 0x48, 0x63, 0x49, 0x64, 
-	0x60, 0x08, 0x20, 0x00, 0x6b, 0x80, 0x49, 0x63, 
-	0x60, 0x08, 0x20, 0x00, 0x6b, 0xc0, 0x49, 0x62, 
-	0x60, 0x08, 0x20, 0x00, 0x6c, 0x00, 0x49, 0x61, 
-	0x60, 0x08, 0x20, 0x00, 0x6c, 0x40, 0x49, 0x60, 
-	0x60, 0x08, 0x20, 0x00, 0x6c, 0x80, 0x49, 0x5f, 
-	0x60, 0x08, 0x20, 0x00, 0x6c, 0xc0, 0x49, 0x5e, 
-	0x60, 0x08, 0x20, 0x00, 0x6e, 0xc0, 0x49, 0x5d, 
-	0x60, 0x08, 0x20, 0x80, 0x6d, 0x00, 0x49, 0x5c, 
-	0x60, 0x08, 0x20, 0x80, 0x6d, 0x40, 0x49, 0x5b, 
-	0x60, 0x08, 0x20, 0x80, 0x6d, 0x80, 0x49, 0x5a, 
-	0x60, 0x08, 0x20, 0x00, 0x6d, 0x00, 0x49, 0x59, 
-	0x60, 0x08, 0x20, 0x00, 0x6d, 0x40, 0x49, 0x58, 
-	0x60, 0x08, 0x20, 0x00, 0x6d, 0x80, 0x49, 0x57, 
-	0x60, 0x08, 0x20, 0x00, 0x6d, 0xc0, 0x49, 0x56, 
-	0x60, 0x08, 0x20, 0x80, 0x6a, 0xc0, 0x49, 0x55, 
-	0x60, 0x08, 0x20, 0x80, 0x6d, 0xc0, 0x49, 0x54, 
-	0x60, 0x08, 0x20, 0x80, 0x6c, 0xc0, 0x49, 0x53, 
-	0x60, 0x08, 0x20, 0x80, 0x68, 0x40, 0x49, 0x52, 
-	0x60, 0x08, 0x20, 0x80, 0x68, 0x80, 0x49, 0x51, 
-	0x60, 0x08, 0x20, 0x80, 0x68, 0xc0, 0x49, 0x50, 
-	0x60, 0x08, 0x20, 0x80, 0x69, 0x00, 0x49, 0x4f, 
-	0x60, 0x08, 0x20, 0x80, 0x69, 0x40, 0x49, 0x4e, 
-	0x60, 0x08, 0x20, 0x80, 0x69, 0x80, 0x49, 0x4d, 
-	0x60, 0x08, 0x20, 0x80, 0x69, 0xc0, 0x49, 0x4c, 
-	0x60, 0x08, 0x20, 0x80, 0x6a, 0x00, 0x49, 0x4b, 
-	0x60, 0x08, 0x20, 0x80, 0x6a, 0x40, 0x49, 0x4a, 
-	0x60, 0x08, 0x20, 0x80, 0x6a, 0x80, 0x49, 0x49, 
-	0x60, 0x08, 0x20, 0x00, 0x6f, 0x00, 0x49, 0x48, 
-	0x60, 0x08, 0x20, 0x00, 0x6f, 0x40, 0x49, 0x47, 
-	0x60, 0x08, 0x20, 0x80, 0x6c, 0x40, 0x49, 0x46, 
-	0x60, 0x08, 0x20, 0x80, 0x6c, 0x80, 0x49, 0x45, 
-	0x60, 0x08, 0x20, 0x80, 0x6e, 0x40, 0x49, 0x44, 
-	0x60, 0x08, 0x20, 0x80, 0x6e, 0x80, 0x49, 0x43, 
-	0x60, 0x08, 0x20, 0x00, 0x49, 0x42, 0x60, 0x08, 
-	0x20, 0x00, 0x49, 0x41, 0x60, 0x48, 0x48, 0x41, 
-	0x49, 0x3f, 0x60, 0x88, 0x48, 0x40, 0x49, 0x3e, 
-	0x60, 0xc8, 0x20, 0xff, 0x30, 0x01, 0x68, 0x40, 
-	0x49, 0x3e, 0x60, 0x08, 0x20, 0x80, 0x6e, 0xc0, 
-	0x49, 0x3d, 0x60, 0x08, 0x20, 0x80, 0x6f, 0x00, 
-	0x49, 0x3c, 0x60, 0x08, 0x20, 0x80, 0x6f, 0x40, 
-	0x49, 0x3b, 0x60, 0x08, 0x20, 0x80, 0x6f, 0x80, 
-	0x49, 0x3a, 0x60, 0x08, 0x20, 0x80, 0x6f, 0xc0, 
-	0x49, 0x39, 0x60, 0x08, 0x20, 0xff, 0x30, 0x01, 
-	0x68, 0x80, 0x49, 0x38, 0x60, 0x08, 0x47, 0x70, 
-	0x2e, 0x08, 0x5d, 0xbc, 0x2e, 0x08, 0x5d, 0xc0, 
-	0x64, 0x00, 0x05, 0x00, 0x2e, 0x08, 0x5d, 0xc8, 
-	0x64, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x5d, 0xcc, 
-	0x2e, 0x08, 0x5d, 0xc4, 0x64, 0x00, 0x04, 0x00, 
-	0x2e, 0x08, 0x5d, 0xd0, 0x9e, 0x00, 0x00, 0x00, 
-	0x2e, 0x08, 0x5d, 0xe8, 0x9e, 0x00, 0x05, 0x00, 
-	0x2e, 0x08, 0x5d, 0xd4, 0x2e, 0x08, 0x94, 0x9c, 
-	0x2e, 0x08, 0x94, 0xa0, 0x2e, 0x08, 0x94, 0xa4, 
-	0x2e, 0x08, 0x94, 0xa8, 0x2e, 0x08, 0x5d, 0xd8, 
-	0x2e, 0x08, 0x5d, 0xdc, 0x2e, 0x08, 0x5d, 0xec, 
-	0x2e, 0x08, 0x5d, 0xf0, 0x2e, 0x08, 0x5d, 0xf4, 
-	0x2e, 0x08, 0x5d, 0xf8, 0x2e, 0x08, 0x5d, 0xe0, 
-	0x2e, 0x08, 0x5d, 0xe4, 0x2e, 0x08, 0x60, 0x6c, 
-	0x2e, 0x08, 0x60, 0x70, 0x2e, 0x08, 0x5d, 0xfc, 
-	0x2e, 0x08, 0x5e, 0x00, 0x2e, 0x08, 0x5e, 0x2c, 
-	0x2e, 0x08, 0x5e, 0x04, 0x2e, 0x08, 0x5e, 0x08, 
-	0x2e, 0x08, 0x5e, 0x0c, 0x2e, 0x08, 0x5e, 0x10, 
-	0x2e, 0x08, 0x5e, 0x14, 0x2e, 0x08, 0x5e, 0x18, 
-	0x2e, 0x08, 0x5e, 0x1c, 0x2e, 0x08, 0x5e, 0x20, 
-	0x2e, 0x08, 0x5e, 0x24, 0x2e, 0x08, 0x5e, 0x28, 
-	0x2e, 0x08, 0x5d, 0xb0, 0x2e, 0x08, 0x5d, 0xb4, 
-	0x2e, 0x08, 0x7c, 0x44, 0x2e, 0x08, 0x5e, 0x54, 
-	0x2e, 0x08, 0x5e, 0x34, 0x2e, 0x08, 0x60, 0x74, 
-	0x2e, 0x08, 0x7c, 0x1c, 0xcc, 0x1f, 0xe0, 0x00, 
-	0xcc, 0x1f, 0xfe, 0x00, 0x2e, 0x08, 0x5e, 0x40, 
-	0x2e, 0x08, 0x5e, 0x58, 0x2e, 0x08, 0x5e, 0x38, 
-	0x2e, 0x08, 0x5e, 0x3c, 0x2e, 0x08, 0x7c, 0x40, 
-	0x2e, 0x08, 0x7c, 0x18, 0x2e, 0x08, 0x5e, 0x48, 
-	0x49, 0x4f, 0x68, 0x0a, 0x23, 0x04, 0x43, 0x1a, 
-	0x60, 0x0a, 0x21, 0xff, 0x4a, 0x4d, 0x68, 0x12, 
-	0x32, 0x40, 0x72, 0x11, 0x21, 0xff, 0x4a, 0x4b, 
-	0x68, 0x12, 0x32, 0x40, 0x76, 0x11, 0x21, 0xff, 
-	0x4a, 0x48, 0x68, 0x12, 0x32, 0x60, 0x72, 0x11, 
-	0x21, 0xff, 0x4a, 0x46, 0x68, 0x12, 0x32, 0x20, 
-	0x72, 0x11, 0x21, 0xff, 0x4a, 0x43, 0x68, 0x12, 
-	0x32, 0x20, 0x76, 0x11, 0x21, 0xff, 0x4a, 0x41, 
-	0x68, 0x12, 0x32, 0x60, 0x76, 0x11, 0x21, 0x00, 
-	0x4a, 0x3e, 0x68, 0x12, 0x32, 0x40, 0x72, 0x91, 
-	0x21, 0x00, 0x4a, 0x3c, 0x68, 0x12, 0x32, 0x40, 
-	0x76, 0x91, 0x21, 0x00, 0x4a, 0x39, 0x68, 0x12, 
-	0x32, 0x60, 0x72, 0x91, 0x21, 0x00, 0x4a, 0x37, 
-	0x68, 0x12, 0x32, 0x20, 0x72, 0x91, 0x21, 0x00, 
-	0x4a, 0x34, 0x68, 0x12, 0x32, 0x20, 0x76, 0x91, 
-	0x21, 0x00, 0x4a, 0x32, 0x68, 0x12, 0x32, 0x60, 
-	0x76, 0x91, 0x21, 0x00, 0x4a, 0x2f, 0x68, 0x12, 
-	0x32, 0x80, 0x70, 0xd1, 0x21, 0x00, 0x4a, 0x2d, 
-	0x68, 0x12, 0x32, 0x80, 0x70, 0x51, 0x21, 0x00, 
-	0x4a, 0x2a, 0x68, 0x12, 0x32, 0x80, 0x70, 0x91, 
-	0x21, 0x00, 0x4a, 0x29, 0x60, 0x11, 0x21, 0x00, 
-	0x4a, 0x28, 0x64, 0x11, 0x21, 0x03, 0x4a, 0x28, 
-	0x61, 0x11, 0x49, 0x28, 0x68, 0x0a, 0x4b, 0x28, 
-	0x43, 0x1a, 0x60, 0x0a, 0x49, 0x26, 0x22, 0x33, 
-	0x06, 0x52, 0x60, 0x51, 0x21, 0x00, 0x4a, 0x25, 
-	0x70, 0x11, 0x21, 0x00, 0x4a, 0x23, 0x70, 0x51, 
-	0x21, 0x00, 0x4a, 0x22, 0x70, 0x91, 0x21, 0x00, 
-	0x4a, 0x20, 0x70, 0xd1, 0x21, 0x00, 0x4a, 0x1f, 
-	0x71, 0x11, 0x21, 0x00, 0x4a, 0x1d, 0x71, 0x51, 
-	0x21, 0x00, 0x4a, 0x1c, 0x71, 0x91, 0x21, 0x00, 
-	0x4a, 0x1a, 0x71, 0xd1, 0x21, 0x00, 0x4a, 0x19, 
-	0x72, 0x11, 0x21, 0x00, 0x4a, 0x17, 0x72, 0x51, 
-	0x21, 0x00, 0x4a, 0x16, 0x72, 0x91, 0x21, 0x00, 
-	0x4a, 0x14, 0x72, 0xd1, 0x21, 0x00, 0x4a, 0x13, 
-	0x73, 0x11, 0x21, 0xff, 0x4a, 0x11, 0x70, 0x11, 
-	0x21, 0x00, 0x4a, 0x10, 0x70, 0x11, 0x21, 0x00, 
-	0x4a, 0x0e, 0x70, 0x51, 0x20, 0x00, 0x28, 0x20, 
-	0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x41, 0x06, 0x08, 
-	0x0e, 0x00, 0xe7, 0xf8, 0x21, 0xff, 0x4a, 0x03, 
-	0x68, 0x12, 0x54, 0x11, 0xe7, 0xf6, 0x47, 0x70, 
-	0x66, 0x00, 0x01, 0x18, 0x2e, 0x08, 0x7c, 0x44, 
-	0x9e, 0x00, 0x0a, 0x00, 0x9e, 0x00, 0x0a, 0x80, 
-	0x66, 0x00, 0x01, 0x00, 0x66, 0x00, 0x00, 0x08, 
-	0x23, 0x48, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x48, 
-	0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x06, 0x39, 
-	0x0e, 0x09, 0x29, 0x05, 0xd2, 0x40, 0xa3, 0x02, 
-	0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x03, 0x14, 0x07, 0x0d, 0x13, 0x00, 0x78, 0x10, 
-	0x4b, 0x1f, 0x70, 0x18, 0xe0, 0x38, 0x78, 0x50, 
-	0x4b, 0x1e, 0x68, 0x1b, 0x33, 0x80, 0x71, 0x58, 
-	0xe0, 0x32, 0x78, 0x10, 0x4b, 0x1b, 0x68, 0x1b, 
-	0x33, 0x80, 0x71, 0x18, 0xe0, 0x2c, 0xe0, 0x2b, 
-	0x78, 0x10, 0x4b, 0x17, 0x70, 0x18, 0x78, 0x50, 
-	0x4b, 0x15, 0x70, 0x58, 0x78, 0x90, 0x4b, 0x14, 
-	0x70, 0x98, 0x78, 0xd0, 0x4b, 0x12, 0x70, 0xd8, 
-	0x79, 0x10, 0x4b, 0x11, 0x71, 0x18, 0x79, 0x50, 
-	0x4b, 0x0f, 0x71, 0x58, 0x79, 0x90, 0x4b, 0x0e, 
-	0x71, 0x98, 0x79, 0xd0, 0x4b, 0x0c, 0x71, 0xd8, 
-	0x7a, 0x10, 0x4b, 0x0b, 0x72, 0x18, 0x7a, 0x50, 
-	0x4b, 0x09, 0x72, 0x58, 0x7a, 0x90, 0x4b, 0x08, 
-	0x72, 0x98, 0x7a, 0xd0, 0x4b, 0x06, 0x72, 0xd8, 
-	0x7b, 0x10, 0x4b, 0x05, 0x73, 0x18, 0xe0, 0x03, 
-	0x20, 0x4a, 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xff, 
-	0x20, 0x00, 0xe7, 0xfa, 0xe7, 0xf9, 0x00, 0x00, 
-	0x2e, 0x08, 0x7c, 0x48, 0x2e, 0x08, 0x7c, 0x44, 
-	0xb5, 0xf3, 0x1c, 0x07, 0x06, 0x3e, 0x0e, 0x36, 
-	0x99, 0x01, 0x06, 0x0c, 0x0e, 0x24, 0x2e, 0x20, 
-	0xdb, 0x04, 0x20, 0xa2, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2c, 0x02, 0xd0, 0x03, 
-	0x2c, 0x03, 0xd0, 0x01, 0x2c, 0x04, 0xd1, 0x0b, 
-	0x48, 0xb8, 0x68, 0x00, 0x30, 0x20, 0x7a, 0x80, 
-	0x28, 0x00, 0xd1, 0x39, 0x48, 0xb5, 0x68, 0x00, 
-	0x30, 0x20, 0x7e, 0x80, 0x28, 0x00, 0xd1, 0x33, 
-	0x2c, 0x00, 0xd1, 0x17, 0x48, 0xb1, 0x68, 0x00, 
-	0x30, 0x40, 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x2b, 
-	0x48, 0xae, 0x68, 0x00, 0x30, 0x40, 0x7e, 0x80, 
-	0x28, 0x00, 0xd1, 0x25, 0x48, 0xab, 0x68, 0x00, 
-	0x30, 0x60, 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x1f, 
-	0x48, 0xa8, 0x68, 0x00, 0x30, 0x20, 0x7e, 0x80, 
-	0x28, 0x00, 0xd1, 0x19, 0x2c, 0x01, 0xd1, 0x19, 
-	0x48, 0xa4, 0x68, 0x00, 0x30, 0x40, 0x7a, 0x80, 
-	0x28, 0x00, 0xd1, 0x11, 0x48, 0xa1, 0x68, 0x00, 
-	0x30, 0x40, 0x7e, 0x80, 0x28, 0x00, 0xd1, 0x0b, 
-	0x48, 0x9e, 0x68, 0x00, 0x30, 0x60, 0x7a, 0x80, 
-	0x28, 0x00, 0xd1, 0x05, 0x48, 0x9b, 0x68, 0x00, 
-	0x30, 0x20, 0x7a, 0x80, 0x28, 0x00, 0xd0, 0x01, 
-	0x20, 0x49, 0xe7, 0xb3, 0x48, 0x97, 0x68, 0x00, 
-	0x55, 0x84, 0x2c, 0xff, 0xd0, 0x73, 0x20, 0x01, 
-	0x49, 0x95, 0x60, 0x48, 0x2c, 0x05, 0xd2, 0x6f, 
-	0xa3, 0x01, 0x5d, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 
-	0x02, 0x34, 0x30, 0x30, 0x30, 0x00, 0x20, 0x02, 
-	0x49, 0x90, 0x61, 0x88, 0x48, 0x90, 0x6a, 0xc0, 
-	0x49, 0x90, 0x60, 0x08, 0x48, 0x90, 0x68, 0x01, 
-	0x23, 0x01, 0x07, 0x5b, 0x43, 0x19, 0x60, 0x01, 
-	0x48, 0x8e, 0x49, 0x8b, 0x62, 0xc8, 0x48, 0x8c, 
-	0x68, 0x01, 0x4b, 0x8d, 0x40, 0x19, 0x60, 0x01, 
-	0x20, 0x01, 0x21, 0x31, 0x06, 0x49, 0x61, 0x88, 
-	0x20, 0x15, 0x21, 0x31, 0x06, 0x49, 0x61, 0x08, 
-	0x20, 0x0f, 0x21, 0x31, 0x06, 0x49, 0x61, 0xc8, 
-	0x20, 0x0c, 0x21, 0x31, 0x06, 0x49, 0x61, 0xc8, 
-	0x20, 0x54, 0x21, 0x31, 0x06, 0x49, 0x62, 0xc8, 
-	0x20, 0x37, 0x21, 0x31, 0x06, 0x49, 0x60, 0x88, 
-	0xe0, 0x56, 0x20, 0x00, 0x49, 0x79, 0x61, 0x88, 
-	0xe0, 0x52, 0x20, 0x01, 0x49, 0x77, 0x61, 0x88, 
-	0x20, 0x01, 0x49, 0x7c, 0x62, 0x88, 0x48, 0x7c, 
-	0x78, 0x00, 0x06, 0x80, 0x0e, 0x80, 0x02, 0x80, 
-	0x49, 0x79, 0x78, 0x49, 0x07, 0xc9, 0x0d, 0x89, 
-	0x43, 0x08, 0x49, 0x77, 0x78, 0x89, 0x07, 0xc9, 
-	0x0d, 0xc9, 0x43, 0x08, 0x49, 0x74, 0x78, 0xc9, 
-	0x07, 0x89, 0x0f, 0x89, 0x01, 0x89, 0x43, 0x08, 
-	0x49, 0x71, 0x79, 0x09, 0x07, 0x89, 0x0f, 0x89, 
-	0x01, 0x09, 0x43, 0x08, 0x49, 0x6e, 0x79, 0x49, 
-	0x07, 0x89, 0x0f, 0x89, 0x00, 0x89, 0x43, 0x08, 
-	0x49, 0x6b, 0x79, 0x89, 0x07, 0x89, 0x0f, 0x89, 
-	0x43, 0x08, 0x49, 0x68, 0x62, 0x08, 0x48, 0x68, 
-	0x79, 0xc0, 0x07, 0xc0, 0x0e, 0x40, 0x49, 0x66, 
-	0x7a, 0x09, 0x07, 0xc9, 0xe0, 0x01, 0xe0, 0x21, 
-	0xe0, 0x18, 0x0e, 0xc9, 0x43, 0x08, 0x49, 0x62, 
-	0x7a, 0x49, 0x07, 0xc9, 0x0f, 0x09, 0x43, 0x08, 
-	0x49, 0x5f, 0x7a, 0x89, 0x07, 0xc9, 0x0f, 0x49, 
-	0x43, 0x08, 0x49, 0x5d, 0x7a, 0xc9, 0x07, 0xc9, 
-	0x0f, 0x89, 0x43, 0x08, 0x49, 0x5a, 0x7b, 0x09, 
-	0x07, 0xc9, 0x0f, 0xc9, 0x43, 0x08, 0x49, 0x57, 
-	0x62, 0x48, 0xe0, 0x01, 0x20, 0x4a, 0xe7, 0x1d, 
-	0x48, 0x51, 0x68, 0x01, 0x4b, 0x55, 0x40, 0x19, 
-	0x60, 0x01, 0xe0, 0x8f, 0x48, 0x49, 0x68, 0x00, 
-	0x30, 0x80, 0x78, 0xc0, 0x28, 0x00, 0xd0, 0x08, 
-	0x22, 0x00, 0xb4, 0x04, 0x1c, 0x30, 0x23, 0x00, 
-	0x22, 0x00, 0x49, 0x4f, 0xf7, 0xf4, 0xfc, 0x10, 
-	0xb0, 0x01, 0x20, 0x00, 0x49, 0x42, 0x60, 0x48, 
-	0x48, 0x45, 0x68, 0x01, 0x4b, 0x4b, 0x43, 0x19, 
-	0x60, 0x01, 0x48, 0x4a, 0x21, 0x33, 0x06, 0x49, 
-	0x60, 0x48, 0x48, 0x49, 0x68, 0x01, 0x23, 0x04, 
-	0x43, 0x19, 0x60, 0x01, 0x2c, 0x00, 0xd1, 0x0e, 
-	0x48, 0x3c, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x0a, 
-	0x48, 0x3a, 0x68, 0x00, 0x49, 0x38, 0x62, 0xc8, 
-	0x20, 0x00, 0x49, 0x38, 0x60, 0x08, 0x20, 0x00, 
-	0x21, 0x31, 0x06, 0x49, 0x61, 0x88, 0x20, 0x00, 
-	0x49, 0x30, 0x68, 0x09, 0x31, 0x80, 0x70, 0x48, 
-	0x20, 0x00, 0x49, 0x2e, 0x68, 0x09, 0x31, 0x80, 
-	0x70, 0x88, 0x20, 0x00, 0x49, 0x39, 0x60, 0x08, 
-	0x20, 0x00, 0x49, 0x39, 0x64, 0x08, 0x20, 0x03, 
-	0x49, 0x2a, 0x61, 0x08, 0x25, 0x00, 0x2d, 0x20, 
-	0xd3, 0x02, 0xe0, 0x06, 0x35, 0x01, 0xe7, 0xfa, 
-	0x20, 0xff, 0x49, 0x24, 0x68, 0x09, 0x55, 0x48, 
-	0xe7, 0xf8, 0x20, 0xff, 0x49, 0x21, 0x68, 0x09, 
-	0x31, 0x40, 0x72, 0x08, 0x20, 0xff, 0x49, 0x1f, 
-	0x68, 0x09, 0x31, 0x40, 0x76, 0x08, 0x20, 0xff, 
-	0x49, 0x1c, 0x68, 0x09, 0x31, 0x60, 0x72, 0x08, 
-	0x20, 0xff, 0x49, 0x1a, 0x68, 0x09, 0x31, 0x20, 
-	0x72, 0x08, 0x20, 0xff, 0x49, 0x17, 0x68, 0x09, 
-	0x31, 0x20, 0x76, 0x08, 0x20, 0xff, 0x49, 0x15, 
-	0x68, 0x09, 0x31, 0x60, 0x76, 0x08, 0x20, 0x00, 
-	0x49, 0x12, 0x68, 0x09, 0x31, 0x40, 0x72, 0x88, 
-	0x20, 0x00, 0x49, 0x10, 0x68, 0x09, 0x31, 0x40, 
-	0x76, 0x88, 0x20, 0x00, 0x49, 0x0d, 0x68, 0x09, 
-	0x31, 0x60, 0x72, 0x88, 0x20, 0x00, 0x49, 0x0b, 
-	0x68, 0x09, 0x31, 0x20, 0x72, 0x88, 0x20, 0x00, 
-	0x49, 0x08, 0x68, 0x09, 0x31, 0x20, 0x76, 0x88, 
-	0x20, 0x00, 0x49, 0x06, 0x68, 0x09, 0x31, 0x60, 
-	0x76, 0x88, 0x20, 0x00, 0x49, 0x03, 0x68, 0x09, 
-	0x31, 0x80, 0x70, 0xc8, 0x20, 0x00, 0xe6, 0x85, 
-	0xe6, 0x84, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x44, 
-	0x62, 0x00, 0x03, 0x00, 0x66, 0x00, 0x01, 0x00, 
-	0xa0, 0x00, 0x0d, 0x80, 0x2e, 0x08, 0x20, 0x08, 
-	0x66, 0x00, 0x00, 0x08, 0x2e, 0x01, 0x8b, 0xa8, 
-	0xdf, 0xff, 0xff, 0xff, 0x62, 0x01, 0x00, 0x00, 
-	0x2e, 0x08, 0x7c, 0x48, 0xfc, 0xb7, 0xff, 0xff, 
-	0x00, 0x00, 0xff, 0xff, 0x23, 0x48, 0x00, 0x00, 
-	0x66, 0x00, 0x01, 0x18, 0x9e, 0x00, 0x0a, 0x00, 
-	0x9e, 0x00, 0x0a, 0x80, 0xb5, 0xf7, 0x1c, 0x17, 
-	0x98, 0x00, 0x06, 0x02, 0x0e, 0x12, 0x99, 0x01, 
-	0x06, 0x0d, 0x0e, 0x2d, 0x48, 0x6a, 0x68, 0x00, 
-	0x5c, 0x81, 0x2a, 0x20, 0xdb, 0x04, 0x20, 0xa2, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x29, 0xff, 0xd1, 0x01, 0x20, 0x4b, 0xe7, 0xf7, 
-	0x48, 0x64, 0x69, 0x80, 0x28, 0x00, 0xd1, 0x03, 
-	0x29, 0x04, 0xd1, 0x01, 0x20, 0x58, 0xe7, 0xef, 
-	0x48, 0x60, 0x69, 0x80, 0x28, 0x00, 0xd1, 0x03, 
-	0x29, 0x02, 0xd0, 0x01, 0x29, 0x03, 0xd1, 0x0b, 
-	0x48, 0x5c, 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, 
-	0x29, 0x00, 0xd1, 0x05, 0x48, 0x59, 0x69, 0x80, 
-	0x28, 0x01, 0xd1, 0x03, 0x29, 0x01, 0xd0, 0x01, 
-	0x20, 0x4d, 0xe7, 0xd9, 0x29, 0x02, 0xd1, 0x05, 
-	0x48, 0x53, 0x68, 0x00, 0x30, 0x40, 0x7a, 0x80, 
-	0x28, 0x00, 0xd1, 0x17, 0x29, 0x03, 0xd1, 0x05, 
-	0x48, 0x4f, 0x68, 0x00, 0x30, 0x40, 0x7e, 0x80, 
-	0x28, 0x00, 0xd1, 0x0f, 0x29, 0x00, 0xd1, 0x05, 
-	0x48, 0x4b, 0x68, 0x00, 0x30, 0x20, 0x7a, 0x80, 
-	0x28, 0x00, 0xd1, 0x07, 0x29, 0x01, 0xd1, 0x07, 
-	0x48, 0x47, 0x68, 0x00, 0x30, 0x20, 0x7e, 0x80, 
-	0x28, 0x00, 0xd0, 0x01, 0x20, 0x4e, 0xe7, 0xb7, 
-	0x68, 0x78, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x4c, 
-	0xe7, 0xb2, 0x23, 0x01, 0x01, 0x08, 0x4e, 0x40, 
-	0x68, 0x36, 0x19, 0x80, 0x30, 0x20, 0x72, 0x83, 
-	0x2d, 0x01, 0xd1, 0x0b, 0x20, 0x33, 0x06, 0x40, 
-	0x6e, 0x40, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 
-	0x00, 0xd3, 0x4e, 0x3b, 0x68, 0x36, 0x19, 0x9b, 
-	0x60, 0x58, 0xe0, 0x12, 0x2d, 0x02, 0xd1, 0x0a, 
-	0x48, 0x38, 0x6c, 0xc0, 0x23, 0x0d, 0x06, 0x9b, 
-	0x1a, 0xc3, 0x00, 0xd0, 0x4e, 0x34, 0x68, 0x36, 
-	0x19, 0x80, 0x60, 0x43, 0xe0, 0x05, 0x68, 0x3b, 
-	0x00, 0xd0, 0x4e, 0x31, 0x68, 0x36, 0x19, 0x80, 
-	0x60, 0x43, 0x68, 0x3b, 0x01, 0x08, 0x4e, 0x2c, 
-	0x68, 0x36, 0x19, 0x80, 0x62, 0x03, 0x68, 0x7b, 
-	0x01, 0x08, 0x4e, 0x29, 0x68, 0x36, 0x19, 0x80, 
-	0x62, 0x43, 0x01, 0x08, 0x4b, 0x26, 0x68, 0x1b, 
-	0x18, 0xc0, 0x62, 0xc7, 0x01, 0x08, 0x4b, 0x24, 
-	0x68, 0x1b, 0x18, 0xc0, 0x30, 0x20, 0x72, 0x45, 
-	0x01, 0x08, 0x4b, 0x21, 0x68, 0x1b, 0x18, 0xc0, 
-	0x30, 0x20, 0x72, 0x02, 0x20, 0x00, 0x60, 0x78, 
-	0x20, 0x00, 0x72, 0x78, 0x20, 0x00, 0x4b, 0x20, 
-	0x60, 0x18, 0x20, 0x00, 0x4b, 0x1f, 0x64, 0x18, 
-	0x01, 0x08, 0x4b, 0x19, 0x68, 0x1b, 0x18, 0xc0, 
-	0x6a, 0x40, 0x28, 0xbc, 0xdd, 0x01, 0x24, 0xbc, 
-	0xe0, 0x04, 0x01, 0x08, 0x4b, 0x14, 0x68, 0x1b, 
-	0x18, 0xc0, 0x6a, 0x44, 0x48, 0x18, 0x60, 0x04, 
-	0x29, 0x01, 0xd1, 0x14, 0x20, 0x01, 0x4b, 0x17, 
-	0x62, 0x98, 0x48, 0x17, 0x68, 0x03, 0x04, 0x1b, 
-	0x0c, 0x1b, 0x60, 0x03, 0x48, 0x14, 0x04, 0x23, 
-	0x68, 0x06, 0x43, 0x33, 0x60, 0x03, 0x48, 0x13, 
-	0x68, 0x06, 0x23, 0x20, 0x43, 0x33, 0x60, 0x03, 
-	0x20, 0x01, 0x4b, 0x0e, 0x63, 0x18, 0x48, 0x07, 
-	0x69, 0x80, 0x28, 0x00, 0xd1, 0x04, 0x48, 0x0e, 
-	0x68, 0x06, 0x23, 0x28, 0x43, 0x33, 0x60, 0x03, 
-	0x20, 0x00, 0xe7, 0x31, 0xe7, 0x30, 0x00, 0x00, 
-	0x2e, 0x08, 0x7c, 0x44, 0x66, 0x00, 0x01, 0x00, 
-	0x2e, 0x08, 0x5d, 0xd4, 0x66, 0x00, 0x00, 0x80, 
-	0x9e, 0x00, 0x0a, 0x00, 0x9e, 0x00, 0x0a, 0x80, 
-	0x62, 0x00, 0x03, 0x00, 0x62, 0x01, 0x00, 0x00, 
-	0x62, 0x01, 0x00, 0x20, 0x62, 0x01, 0x00, 0x24, 
-	0x64, 0x00, 0x00, 0x60, 0xb5, 0xf3, 0x1c, 0x0f, 
-	0x98, 0x00, 0x06, 0x06, 0x0e, 0x36, 0xb0, 0x82, 
-	0x4d, 0x68, 0x49, 0x69, 0x91, 0x01, 0x48, 0x69, 
-	0x68, 0x00, 0x5d, 0x84, 0x2e, 0x20, 0xdb, 0x05, 
-	0x20, 0xa2, 0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2c, 0xff, 0xd1, 0x02, 
-	0x20, 0x4b, 0xb0, 0x02, 0xe7, 0xf6, 0x48, 0x62, 
-	0x69, 0x80, 0x28, 0x00, 0xd1, 0x05, 0x2c, 0x02, 
-	0xd0, 0x03, 0x2c, 0x03, 0xd0, 0x01, 0x2c, 0x04, 
-	0xd1, 0x0b, 0x48, 0x5d, 0x69, 0x80, 0x28, 0x02, 
-	0xd1, 0x01, 0x2c, 0x00, 0xd1, 0x05, 0x48, 0x5a, 
-	0x69, 0x80, 0x28, 0x01, 0xd1, 0x04, 0x2c, 0x01, 
-	0xd0, 0x02, 0x20, 0x4d, 0xb0, 0x02, 0xe7, 0xdd, 
-	0x48, 0x54, 0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, 
-	0x28, 0x00, 0xd0, 0x02, 0x20, 0x4f, 0xb0, 0x02, 
-	0xe7, 0xd4, 0x48, 0x50, 0x68, 0x00, 0x30, 0x80, 
-	0x78, 0xc0, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x50, 
-	0xb0, 0x02, 0xe7, 0xcb, 0x68, 0x78, 0x28, 0x00, 
-	0xd1, 0x02, 0x20, 0x4c, 0xb0, 0x02, 0xe7, 0xc5, 
-	0x2c, 0x04, 0xd1, 0x08, 0x68, 0x79, 0x20, 0xbc, 
-	0xf0, 0x01, 0xff, 0xac, 0x29, 0x00, 0xd0, 0x02, 
-	0x20, 0x59, 0xb0, 0x02, 0xe7, 0xba, 0x48, 0x43, 
-	0x68, 0x00, 0x30, 0x80, 0x78, 0x80, 0x21, 0x01, 
-	0x40, 0x81, 0x48, 0x41, 0x68, 0x40, 0x40, 0x08, 
-	0x07, 0x80, 0x0f, 0x80, 0xd0, 0x02, 0x20, 0x51, 
-	0xb0, 0x02, 0xe7, 0xab, 0x20, 0x33, 0x06, 0x40, 
-	0x6b, 0x80, 0x90, 0x00, 0x23, 0x04, 0x40, 0x18, 
-	0xd0, 0x02, 0x20, 0x52, 0xb0, 0x02, 0xe7, 0xa1, 
-	0x2c, 0x00, 0xd1, 0x04, 0x48, 0x37, 0x68, 0x01, 
-	0x23, 0xfd, 0x40, 0x19, 0x60, 0x01, 0x20, 0x01, 
-	0x49, 0x32, 0x68, 0x09, 0x31, 0x60, 0x76, 0x88, 
-	0x68, 0x38, 0x49, 0x30, 0x68, 0x09, 0x67, 0x08, 
-	0x68, 0x78, 0x49, 0x2e, 0x68, 0x09, 0x67, 0x48, 
-	0x48, 0x2c, 0x68, 0x00, 0x67, 0xc7, 0x20, 0x00, 
-	0x49, 0x2a, 0x68, 0x09, 0x31, 0x60, 0x76, 0x48, 
-	0x48, 0x28, 0x68, 0x00, 0x30, 0x60, 0x76, 0x06, 
-	0x20, 0x00, 0x60, 0x78, 0x20, 0x00, 0x72, 0x78, 
-	0x48, 0x24, 0x68, 0x00, 0x5d, 0x80, 0x28, 0x01, 
-	0xd1, 0x02, 0x20, 0x01, 0x49, 0x24, 0x62, 0x88, 
-	0x98, 0x00, 0x01, 0x00, 0x19, 0x45, 0x48, 0x1f, 
-	0x68, 0x00, 0x6f, 0x40, 0x28, 0xbc, 0xdd, 0x07, 
-	0x48, 0x20, 0x60, 0xa8, 0x20, 0xbc, 0x49, 0x1b, 
-	0x68, 0x09, 0x31, 0x80, 0x70, 0x08, 0xe0, 0x0d, 
-	0x48, 0x18, 0x68, 0x00, 0x6f, 0x40, 0x23, 0x01, 
-	0x07, 0x9b, 0x43, 0x18, 0x60, 0xa8, 0x48, 0x15, 
-	0x68, 0x00, 0x6f, 0x40, 0x49, 0x13, 0x68, 0x09, 
-	0x31, 0x80, 0x70, 0x08, 0x48, 0x11, 0x68, 0x00, 
-	0x30, 0x80, 0x78, 0x80, 0x00, 0x43, 0x18, 0x18, 
-	0x01, 0x80, 0x99, 0x01, 0x18, 0x41, 0x91, 0x01, 
-	0x48, 0x0c, 0x68, 0x00, 0x6f, 0x00, 0x60, 0x28, 
-	0x99, 0x01, 0x1d, 0x08, 0x60, 0x68, 0x20, 0x01, 
-	0x06, 0x00, 0x60, 0xe8, 0x99, 0x00, 0x20, 0x01, 
-	0x40, 0x88, 0x21, 0x33, 0x06, 0x49, 0x63, 0x48, 
-	0x20, 0x00, 0xb0, 0x02, 0xe7, 0x3a, 0xb0, 0x02, 
-	0xe7, 0x38, 0x00, 0x00, 0x9e, 0x00, 0x09, 0x80, 
-	0x9e, 0x00, 0x0b, 0x80, 0x2e, 0x08, 0x7c, 0x44, 
-	0x66, 0x00, 0x01, 0x00, 0x62, 0x00, 0x00, 0x1c, 
-	0x62, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0xbc, 
-	0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x81, 0x98, 0x01, 
-	0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 0xb0, 0x82, 
-	0x48, 0xf9, 0x68, 0x00, 0x99, 0x02, 0x5c, 0x44, 
-	0x98, 0x02, 0x28, 0x20, 0xdb, 0x05, 0x20, 0xa2, 
-	0xb0, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x2c, 0xff, 0xd1, 0x02, 0x20, 0x4b, 
-	0xb0, 0x03, 0xe7, 0xf6, 0x48, 0xf1, 0x69, 0x80, 
-	0x28, 0x00, 0xd1, 0x05, 0x2c, 0x02, 0xd0, 0x03, 
-	0x2c, 0x03, 0xd0, 0x01, 0x2c, 0x04, 0xd1, 0x0b, 
-	0x48, 0xec, 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, 
-	0x2c, 0x00, 0xd1, 0x05, 0x48, 0xe9, 0x69, 0x80, 
-	0x28, 0x01, 0xd1, 0x04, 0x2c, 0x01, 0xd0, 0x02, 
-	0x20, 0x4d, 0xb0, 0x03, 0xe7, 0xdd, 0x48, 0xe4, 
-	0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, 
-	0xd0, 0x02, 0x20, 0x4f, 0xb0, 0x03, 0xe7, 0xd4, 
-	0x68, 0x78, 0x28, 0x00, 0xd1, 0x02, 0x20, 0x4c, 
-	0xb0, 0x03, 0xe7, 0xce, 0x2c, 0x04, 0xd1, 0x08, 
-	0x68, 0x79, 0x20, 0xbc, 0xf0, 0x01, 0xfe, 0xce, 
-	0x29, 0x00, 0xd0, 0x02, 0x20, 0x59, 0xb0, 0x03, 
-	0xe7, 0xc3, 0x48, 0xd7, 0x68, 0x00, 0x30, 0x80, 
-	0x78, 0xc0, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x50, 
-	0xb0, 0x03, 0xe7, 0xba, 0x2c, 0x00, 0xd1, 0x04, 
-	0x48, 0xd3, 0x68, 0x01, 0x23, 0xfd, 0x40, 0x19, 
-	0x60, 0x01, 0x48, 0xd2, 0x68, 0x01, 0x23, 0x8d, 
-	0x05, 0x9b, 0x43, 0x19, 0x60, 0x01, 0x48, 0xd0, 
-	0x21, 0x33, 0x06, 0x49, 0x60, 0x48, 0x20, 0x01, 
-	0x49, 0xc9, 0x68, 0x09, 0x31, 0x60, 0x76, 0x88, 
-	0x68, 0x38, 0x49, 0xc7, 0x68, 0x09, 0x67, 0x08, 
-	0x68, 0x78, 0x49, 0xc5, 0x68, 0x09, 0x67, 0x48, 
-	0x48, 0xc3, 0x68, 0x00, 0x67, 0xc7, 0x20, 0x00, 
-	0x49, 0xc1, 0x68, 0x09, 0x31, 0x60, 0x76, 0x48, 
-	0x98, 0x02, 0x49, 0xbf, 0x68, 0x09, 0x31, 0x60, 
-	0x76, 0x08, 0x20, 0x00, 0x49, 0xbc, 0x68, 0x09, 
-	0x6f, 0xc9, 0x60, 0x48, 0x20, 0x00, 0x49, 0xba, 
-	0x68, 0x09, 0x6f, 0xc9, 0x72, 0x48, 0x48, 0xb8, 
-	0x68, 0x00, 0x99, 0x02, 0x5c, 0x40, 0x28, 0x01, 
-	0xd1, 0x02, 0x20, 0x01, 0x49, 0xb9, 0x62, 0x88, 
-	0x48, 0xb3, 0x68, 0x00, 0x30, 0x80, 0x78, 0x81, 
-	0x20, 0x01, 0x40, 0x88, 0x49, 0xb1, 0x68, 0x49, 
-	0x40, 0x08, 0x07, 0x80, 0x0f, 0x80, 0xd0, 0x1b, 
-	0x20, 0x00, 0x49, 0xad, 0x68, 0x09, 0x31, 0x60, 
-	0x76, 0x88, 0x20, 0x51, 0x49, 0xaa, 0x68, 0x09, 
-	0x6f, 0xc9, 0x72, 0x48, 0x48, 0xa8, 0x68, 0x00, 
-	0x6f, 0xc0, 0x7a, 0x00, 0x28, 0xff, 0xd0, 0x07, 
-	0x48, 0xa5, 0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x01, 
-	0x20, 0x01, 0x40, 0x88, 0xf0, 0x05, 0xfd, 0xb0, 
-	0x20, 0x51, 0xb0, 0x03, 0xe7, 0x55, 0xe1, 0x6c, 
-	0x20, 0x33, 0x06, 0x40, 0x6b, 0x81, 0x91, 0x00, 
-	0x99, 0x00, 0x20, 0x04, 0x40, 0x08, 0xd0, 0x07, 
-	0x20, 0x04, 0xf0, 0x00, 0xfc, 0xb3, 0x20, 0x33, 
-	0x06, 0x40, 0x6b, 0x81, 0x91, 0x00, 0xe7, 0xf3, 
-	0x4d, 0x9d, 0x99, 0x00, 0x01, 0x08, 0x19, 0x45, 
-	0x48, 0x95, 0x68, 0x00, 0x6f, 0x40, 0x28, 0xbc, 
-	0xdd, 0x07, 0x48, 0x9a, 0x60, 0xa8, 0x20, 0xbc, 
-	0x49, 0x91, 0x68, 0x09, 0x31, 0x80, 0x70, 0x08, 
-	0xe0, 0x0d, 0x48, 0x8f, 0x68, 0x00, 0x6f, 0x40, 
-	0x23, 0x01, 0x07, 0x9b, 0x43, 0x18, 0x60, 0xa8, 
-	0x48, 0x8b, 0x68, 0x00, 0x6f, 0x40, 0x49, 0x8a, 
-	0x68, 0x09, 0x31, 0x80, 0x70, 0x08, 0x48, 0x90, 
-	0x90, 0x01, 0x48, 0x87, 0x68, 0x00, 0x30, 0x80, 
-	0x78, 0x80, 0x00, 0x43, 0x18, 0x18, 0x01, 0x80, 
-	0x99, 0x01, 0x18, 0x40, 0x90, 0x01, 0x48, 0x82, 
-	0x68, 0x00, 0x6f, 0x00, 0x60, 0x28, 0x98, 0x01, 
-	0x30, 0x04, 0x60, 0x68, 0x20, 0x01, 0x06, 0x00, 
-	0x60, 0xe8, 0x99, 0x00, 0x20, 0x01, 0x40, 0x88, 
-	0x21, 0x33, 0x06, 0x49, 0x63, 0x48, 0x48, 0x83, 
-	0x6b, 0x00, 0x23, 0x01, 0x06, 0x1b, 0x40, 0x18, 
-	0xd1, 0x03, 0x20, 0x04, 0xf0, 0x00, 0xfc, 0x6a, 
-	0xe7, 0xf5, 0x20, 0x01, 0x06, 0x00, 0x21, 0x33, 
-	0x06, 0x49, 0x60, 0x48, 0x4e, 0x7c, 0x48, 0x72, 
-	0x68, 0x00, 0x30, 0x80, 0x78, 0x80, 0x01, 0x00, 
-	0x19, 0x86, 0x98, 0x01, 0x30, 0x04, 0x60, 0x30, 
-	0x48, 0x78, 0x60, 0x70, 0x48, 0x6c, 0x68, 0x00, 
-	0x30, 0x80, 0x78, 0x00, 0x23, 0x01, 0x07, 0x9b, 
-	0x43, 0x18, 0x60, 0xb0, 0x20, 0x01, 0x05, 0x80, 
-	0x60, 0xf0, 0x48, 0x67, 0x68, 0x00, 0x30, 0x80, 
-	0x78, 0x81, 0x20, 0x01, 0x40, 0x88, 0x49, 0x65, 
-	0x60, 0xc8, 0x48, 0x63, 0x68, 0x00, 0x30, 0x60, 
-	0x7e, 0x00, 0x49, 0x61, 0x68, 0x09, 0x5c, 0x08, 
-	0x28, 0x00, 0xd0, 0x48, 0x28, 0x01, 0xd0, 0x47, 
-	0x28, 0x02, 0xd0, 0x02, 0x28, 0x03, 0xd0, 0x21, 
-	0xe0, 0x5a, 0x48, 0x67, 0x68, 0x01, 0x23, 0x02, 
-	0x43, 0x19, 0x60, 0x01, 0x48, 0x58, 0x68, 0x00, 
-	0x6f, 0x40, 0x49, 0x57, 0x68, 0x09, 0x31, 0x80, 
-	0x78, 0x09, 0x1a, 0x40, 0x28, 0xbc, 0xd8, 0x05, 
-	0x48, 0x5f, 0x68, 0x01, 0x23, 0x10, 0x43, 0x19, 
-	0x60, 0x01, 0xe0, 0x05, 0x48, 0x5c, 0x68, 0x01, 
-	0x23, 0x10, 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, 
-	0x48, 0x59, 0x68, 0x01, 0x23, 0x08, 0x43, 0x19, 
-	0x60, 0x01, 0xe0, 0x39, 0x48, 0x56, 0x68, 0x01, 
-	0x23, 0x04, 0x43, 0x19, 0x60, 0x01, 0x48, 0x48, 
-	0x68, 0x00, 0x6f, 0x40, 0x49, 0x46, 0x68, 0x09, 
-	0x31, 0x80, 0x78, 0x09, 0x1a, 0x40, 0x28, 0xbc, 
-	0xd8, 0x05, 0x48, 0x4f, 0x68, 0x01, 0x23, 0x10, 
-	0x43, 0x19, 0x60, 0x01, 0xe0, 0x05, 0x48, 0x4c, 
-	0x68, 0x01, 0x23, 0x10, 0x43, 0xdb, 0x40, 0x19, 
-	0x60, 0x01, 0x48, 0x49, 0x68, 0x01, 0x23, 0x08, 
-	0x43, 0x19, 0x60, 0x01, 0xe0, 0x18, 0xe0, 0x17, 
-	0x48, 0x46, 0x68, 0x01, 0x04, 0x09, 0x0c, 0x09, 
-	0x60, 0x01, 0x48, 0x44, 0x49, 0x36, 0x68, 0x09, 
-	0x31, 0x80, 0x78, 0x09, 0x04, 0x09, 0x68, 0x02, 
-	0x43, 0x11, 0x60, 0x01, 0x48, 0x40, 0x68, 0x01, 
-	0x23, 0x20, 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, 
-	0x20, 0x01, 0x49, 0x34, 0x63, 0x08, 0xe7, 0xff, 
-	0x48, 0x36, 0x6b, 0x00, 0x23, 0x01, 0x05, 0x9b, 
-	0x40, 0x18, 0xd1, 0x03, 0x20, 0x04, 0xf0, 0x00, 
-	0xfb, 0xd1, 0xe7, 0xf5, 0x20, 0x01, 0x05, 0x80, 
-	0x21, 0x33, 0x06, 0x49, 0x60, 0x48, 0x48, 0x26, 
-	0x68, 0x00, 0x30, 0x80, 0x78, 0x80, 0x23, 0x01, 
-	0x40, 0x58, 0x49, 0x23, 0x68, 0x09, 0x31, 0x80, 
-	0x70, 0x88, 0x48, 0x21, 0x68, 0x00, 0x6f, 0x40, 
-	0x49, 0x1f, 0x68, 0x09, 0x31, 0x80, 0x78, 0x09, 
-	0x1a, 0x40, 0x49, 0x1d, 0x68, 0x09, 0x67, 0x48, 
-	0x48, 0x1b, 0x68, 0x00, 0x6f, 0xc0, 0x30, 0x04, 
-	0x49, 0x19, 0x68, 0x09, 0x31, 0x80, 0x78, 0x09, 
-	0x68, 0x02, 0x18, 0x89, 0x60, 0x01, 0x48, 0x16, 
-	0x68, 0x00, 0x6f, 0x00, 0x49, 0x14, 0x68, 0x09, 
-	0x31, 0x80, 0x78, 0x09, 0x18, 0x40, 0x49, 0x12, 
-	0x68, 0x09, 0x67, 0x08, 0x48, 0x10, 0x68, 0x00, 
-	0x6f, 0x40, 0x28, 0x00, 0xd0, 0x00, 0xe6, 0xb3, 
-	0x48, 0x11, 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, 
-	0x48, 0x0e, 0x68, 0x01, 0x4b, 0x19, 0x40, 0x19, 
-	0x60, 0x01, 0x20, 0x48, 0x49, 0x08, 0x68, 0x09, 
-	0x6f, 0xc9, 0x72, 0x48, 0x20, 0x00, 0x49, 0x06, 
-	0x68, 0x09, 0x31, 0x60, 0x76, 0x88, 0x48, 0x04, 
-	0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x00, 0x28, 0xff, 
-	0xd0, 0x29, 0x48, 0x01, 0xe0, 0x20, 0x00, 0x00, 
-	0x2e, 0x08, 0x7c, 0x44, 0x66, 0x00, 0x01, 0x00, 
-	0x62, 0x00, 0x00, 0x1c, 0x66, 0x00, 0x00, 0x08, 
-	0x23, 0x48, 0x00, 0x00, 0x62, 0x01, 0x00, 0x00, 
-	0x9e, 0x00, 0x09, 0x80, 0x40, 0x00, 0x00, 0xbc, 
-	0x9e, 0x00, 0x0b, 0x80, 0x66, 0x00, 0x00, 0x80, 
-	0x9e, 0x00, 0x09, 0xc0, 0x66, 0x00, 0x01, 0xf0, 
-	0x64, 0x00, 0x00, 0x60, 0x62, 0x01, 0x00, 0x20, 
-	0x62, 0x01, 0x00, 0x24, 0xfc, 0xb7, 0xff, 0xff, 
-	0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x01, 0x20, 0x01, 
-	0x40, 0x88, 0xf0, 0x05, 0xfc, 0x45, 0x20, 0x00, 
-	0xb0, 0x03, 0xe5, 0xea, 0xb0, 0x02, 0xb0, 0x01, 
-	0xe5, 0xe7, 0xe5, 0xe6, 0xb5, 0xb0, 0x1c, 0x07, 
-	0x06, 0x3d, 0x0e, 0x2d, 0x48, 0x5d, 0x68, 0x00, 
-	0x5d, 0x44, 0x2d, 0x20, 0xdb, 0x03, 0x20, 0xa2, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x59, 
-	0x68, 0x00, 0x5d, 0x40, 0x28, 0xff, 0xd1, 0x01, 
-	0x20, 0x4b, 0xe7, 0xf5, 0x48, 0x56, 0x69, 0x80, 
-	0x28, 0x00, 0xd1, 0x05, 0x2c, 0x02, 0xd0, 0x03, 
-	0x2c, 0x03, 0xd0, 0x01, 0x2c, 0x04, 0xd1, 0x0b, 
-	0x48, 0x51, 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, 
-	0x2c, 0x00, 0xd1, 0x05, 0x48, 0x4e, 0x69, 0x80, 
-	0x28, 0x01, 0xd1, 0x04, 0x2c, 0x01, 0xd0, 0x02, 
-	0x20, 0x4d, 0xe7, 0xdd, 0xe0, 0x90, 0x48, 0x4b, 
-	0x68, 0x01, 0x4b, 0x4b, 0x43, 0x19, 0x60, 0x01, 
-	0x48, 0x49, 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, 
-	0x48, 0x48, 0x68, 0x01, 0x23, 0x04, 0x43, 0x19, 
-	0x60, 0x01, 0x20, 0x00, 0x49, 0x41, 0x68, 0x09, 
-	0x31, 0x80, 0x70, 0x88, 0x20, 0x00, 0x49, 0x3f, 
-	0x68, 0x09, 0x31, 0x80, 0x70, 0x48, 0x20, 0xff, 
-	0x49, 0x3c, 0x68, 0x09, 0x55, 0x48, 0x2c, 0x00, 
-	0xd1, 0x03, 0x20, 0x18, 0x21, 0x31, 0x06, 0x49, 
-	0x62, 0x48, 0x01, 0x20, 0x49, 0x37, 0x68, 0x09, 
-	0x18, 0x40, 0x30, 0x20, 0x7a, 0x80, 0x28, 0x00, 
-	0xd0, 0x28, 0x20, 0x00, 0x49, 0x38, 0x60, 0x08, 
-	0x20, 0x00, 0x49, 0x38, 0x64, 0x08, 0x20, 0x03, 
-	0x49, 0x31, 0x61, 0x08, 0x21, 0x55, 0x01, 0x20, 
-	0x4a, 0x2e, 0x68, 0x12, 0x18, 0x80, 0x6a, 0xc0, 
-	0x72, 0x41, 0x21, 0x00, 0x01, 0x20, 0x4a, 0x2b, 
-	0x68, 0x12, 0x18, 0x80, 0x30, 0x20, 0x72, 0x81, 
-	0x01, 0x20, 0x49, 0x28, 0x68, 0x09, 0x18, 0x40, 
-	0x6a, 0xc0, 0x7a, 0x00, 0x28, 0xff, 0xd0, 0x09, 
-	0x01, 0x20, 0x49, 0x24, 0x68, 0x09, 0x18, 0x40, 
-	0x6a, 0xc0, 0x7a, 0x01, 0x20, 0x01, 0x40, 0x88, 
-	0xf0, 0x05, 0xfb, 0xbe, 0x48, 0x1f, 0x68, 0x00, 
-	0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, 0xd0, 0x2b, 
-	0x48, 0x1c, 0x68, 0x00, 0x30, 0x80, 0x78, 0xc0, 
-	0x28, 0x00, 0xd0, 0x0d, 0x20, 0x00, 0x49, 0x19, 
-	0x68, 0x09, 0x31, 0x80, 0x70, 0xc8, 0x22, 0x00, 
-	0xb4, 0x04, 0x1c, 0x28, 0x23, 0x00, 0x22, 0x00, 
-	0x49, 0x1b, 0xf7, 0xf3, 0xfe, 0xcd, 0xb0, 0x01, 
-	0x20, 0x55, 0x49, 0x12, 0x68, 0x09, 0x6f, 0xc9, 
-	0x72, 0x48, 0x20, 0x00, 0x49, 0x0f, 0x68, 0x09, 
-	0x31, 0x60, 0x76, 0x88, 0x48, 0x0d, 0x68, 0x00, 
-	0x6f, 0xc0, 0x7a, 0x00, 0x28, 0xff, 0xd0, 0x07, 
-	0x48, 0x0a, 0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x01, 
-	0x20, 0x01, 0x40, 0x88, 0xf0, 0x05, 0xfb, 0x8c, 
-	0x48, 0x09, 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, 
-	0x48, 0x06, 0x68, 0x01, 0x4b, 0x0b, 0x40, 0x19, 
-	0x60, 0x01, 0x20, 0x00, 0xe7, 0x4c, 0xe7, 0x4b, 
-	0xe7, 0x4a, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x44, 
-	0x66, 0x00, 0x01, 0x00, 0x66, 0x00, 0x00, 0x08, 
-	0x23, 0x48, 0x00, 0x00, 0x66, 0x00, 0x01, 0x18, 
-	0x9e, 0x00, 0x0a, 0x00, 0x9e, 0x00, 0x0a, 0x80, 
-	0x00, 0x00, 0xff, 0xff, 0xfc, 0xb7, 0xff, 0xff, 
-	0xb5, 0xff, 0x1c, 0x1f, 0x98, 0x00, 0x06, 0x02, 
-	0x0e, 0x12, 0x99, 0x01, 0x06, 0x0d, 0x0e, 0x2d, 
-	0x98, 0x02, 0x06, 0x04, 0x0e, 0x24, 0x48, 0x2d, 
-	0x68, 0x00, 0x5c, 0x81, 0x2a, 0x20, 0xdb, 0x04, 
-	0x20, 0xa2, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x29, 0xff, 0xd1, 0x01, 0x20, 0x4b, 
-	0xe7, 0xf7, 0x48, 0x27, 0x69, 0x80, 0x28, 0x00, 
-	0xd1, 0x05, 0x29, 0x02, 0xd0, 0x03, 0x29, 0x03, 
-	0xd0, 0x01, 0x29, 0x04, 0xd1, 0x0b, 0x48, 0x22, 
-	0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, 0x29, 0x00, 
-	0xd1, 0x05, 0x48, 0x1f, 0x69, 0x80, 0x28, 0x01, 
-	0xd1, 0x03, 0x29, 0x01, 0xd0, 0x01, 0x20, 0x4d, 
-	0xe7, 0xdf, 0x29, 0x05, 0xd2, 0x2a, 0xa3, 0x02, 
-	0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x03, 0x07, 0x04, 0x05, 0x06, 0x00, 0xe0, 0x24, 
-	0xe0, 0x23, 0xe0, 0x22, 0xe0, 0x21, 0x01, 0x08, 
-	0x4b, 0x12, 0x68, 0x1b, 0x18, 0xc0, 0x30, 0x20, 
-	0x7a, 0x80, 0x28, 0x00, 0xd1, 0x05, 0x48, 0x0f, 
-	0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, 
-	0xd0, 0x02, 0x20, 0x49, 0xe7, 0xc1, 0xe0, 0x13, 
-	0x2d, 0x00, 0xd1, 0x05, 0x00, 0xa0, 0x4b, 0x0b, 
-	0x18, 0xc0, 0x68, 0x00, 0x60, 0x38, 0xe0, 0x04, 
-	0x68, 0x38, 0x00, 0xa6, 0x4b, 0x07, 0x18, 0xf3, 
-	0x60, 0x18, 0xe0, 0x02, 0x20, 0x4a, 0xe7, 0xb0, 
-	0xe7, 0xff, 0x20, 0x00, 0xe7, 0xad, 0xe7, 0xac, 
-	0xe7, 0xab, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x44, 
-	0x66, 0x00, 0x01, 0x00, 0x62, 0x01, 0x00, 0x80, 
-	0xb5, 0xf7, 0xb0, 0x82, 0x98, 0x02, 0x06, 0x03, 
-	0x0e, 0x1b, 0x93, 0x00, 0x99, 0x03, 0x06, 0x08, 
-	0x0e, 0x00, 0x90, 0x01, 0x9a, 0x04, 0x06, 0x15, 
-	0x0e, 0x2d, 0xb0, 0x84, 0x4a, 0xca, 0x4f, 0xcb, 
-	0x48, 0xcb, 0x68, 0x00, 0x9b, 0x04, 0x5c, 0xc4, 
-	0x48, 0xca, 0x90, 0x02, 0x21, 0x00, 0x23, 0x00, 
-	0x93, 0x01, 0x9b, 0x04, 0x2b, 0x20, 0xdb, 0x05, 
-	0x20, 0xa2, 0xb0, 0x06, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2c, 0xff, 0xd1, 0x02, 
-	0x20, 0x4b, 0xb0, 0x06, 0xe7, 0xf6, 0x48, 0xc2, 
-	0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, 0x2c, 0x00, 
-	0xd1, 0x03, 0x48, 0xbf, 0x69, 0x80, 0x28, 0x02, 
-	0xd0, 0x02, 0x20, 0x4d, 0xb0, 0x06, 0xe7, 0xe9, 
-	0x98, 0x05, 0x28, 0x01, 0xd1, 0x08, 0x48, 0xb8, 
-	0x68, 0x00, 0x30, 0x80, 0x78, 0xc0, 0x28, 0x00, 
-	0xd0, 0x02, 0x20, 0x50, 0xb0, 0x06, 0xe7, 0xdd, 
-	0x98, 0x05, 0x28, 0x00, 0xd1, 0x05, 0x48, 0xb2, 
-	0x68, 0x00, 0x30, 0x20, 0x7a, 0x80, 0x28, 0x00, 
-	0xd0, 0x08, 0x98, 0x05, 0x28, 0x01, 0xd1, 0x08, 
-	0x48, 0xad, 0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, 
-	0x28, 0x00, 0xd1, 0x02, 0x20, 0x5a, 0xb0, 0x06, 
-	0xe7, 0xc8, 0x20, 0x00, 0x4b, 0xa8, 0x68, 0x1b, 
-	0x6f, 0xdb, 0x72, 0x58, 0x98, 0x05, 0x28, 0x00, 
-	0xd1, 0x50, 0x2d, 0x01, 0xd0, 0x01, 0x2d, 0x02, 
-	0xd1, 0x32, 0x4e, 0xa6, 0x68, 0x30, 0x23, 0x01, 
-	0x04, 0xdb, 0x43, 0x18, 0x60, 0x30, 0x20, 0x00, 
-	0x4b, 0xa3, 0x60, 0x18, 0x48, 0x9e, 0x68, 0x00, 
-	0x30, 0x80, 0x78, 0x40, 0x00, 0x43, 0x18, 0x18, 
-	0x01, 0x80, 0x9b, 0x02, 0x18, 0xc0, 0x90, 0x02, 
-	0x98, 0x02, 0x68, 0x01, 0x48, 0x9a, 0x69, 0x80, 
-	0x07, 0x80, 0x0f, 0x80, 0x01, 0x80, 0x43, 0x01, 
-	0x23, 0x20, 0x43, 0x19, 0x4b, 0x99, 0x43, 0x19, 
-	0x98, 0x02, 0x60, 0x01, 0x4e, 0x98, 0x68, 0x30, 
-	0x23, 0x01, 0x04, 0xdb, 0x43, 0x18, 0x60, 0x30, 
-	0x4e, 0x92, 0x68, 0x30, 0x4b, 0x95, 0x40, 0x18, 
-	0x60, 0x30, 0x2c, 0x00, 0xd1, 0x04, 0x20, 0x00, 
-	0x4b, 0x8b, 0x68, 0x1b, 0x33, 0x20, 0x72, 0x98, 
-	0x2d, 0x02, 0xd0, 0x04, 0x20, 0x01, 0x04, 0xc0, 
-	0x23, 0x33, 0x06, 0x5b, 0x60, 0x18, 0x2c, 0x00, 
-	0xd1, 0x0f, 0x20, 0xff, 0x02, 0x00, 0x40, 0x08, 
-	0xd1, 0x0b, 0x2d, 0x02, 0xd0, 0x09, 0x48, 0x82, 
-	0x68, 0x00, 0x30, 0x80, 0x78, 0x40, 0x23, 0x01, 
-	0x40, 0x58, 0x4b, 0x7f, 0x68, 0x1b, 0x33, 0x80, 
-	0x70, 0x58, 0xe0, 0xed, 0x2d, 0x01, 0xd1, 0x73, 
-	0x2c, 0x00, 0xd1, 0x72, 0x20, 0x31, 0x06, 0x40, 
-	0x68, 0x80, 0x23, 0x08, 0x40, 0x18, 0xd1, 0x3a, 
-	0x48, 0x7a, 0x68, 0x06, 0x23, 0x05, 0x05, 0x9b, 
-	0x43, 0x33, 0x60, 0x03, 0x68, 0x10, 0x4b, 0x7c, 
-	0x40, 0x18, 0x60, 0x10, 0x32, 0xc0, 0x68, 0x10, 
-	0x4b, 0x79, 0x40, 0x18, 0x60, 0x10, 0x20, 0x00, 
-	0x4b, 0x6f, 0x68, 0x1b, 0x67, 0x58, 0x20, 0x00, 
-	0x4b, 0x6d, 0x68, 0x1b, 0x33, 0x80, 0x70, 0x18, 
-	0x48, 0x6d, 0x68, 0x80, 0x23, 0x02, 0x40, 0x18, 
-	0xd1, 0x04, 0x20, 0x00, 0x4b, 0x68, 0x68, 0x1b, 
-	0x33, 0x60, 0x76, 0x98, 0x20, 0x5b, 0x4b, 0x66, 
-	0x68, 0x1b, 0x6f, 0xdb, 0x72, 0x58, 0x4e, 0x6d, 
-	0x68, 0x30, 0x23, 0x02, 0x43, 0x18, 0x60, 0x30, 
-	0x4e, 0x67, 0x68, 0x30, 0x23, 0x05, 0x05, 0x9b, 
-	0x43, 0x18, 0x60, 0x30, 0x4e, 0x61, 0x68, 0x30, 
-	0x4b, 0x67, 0x40, 0x18, 0x60, 0x30, 0x20, 0x5b, 
-	0xb0, 0x06, 0xe7, 0x2b, 0xe0, 0xae, 0x48, 0x5d, 
-	0x68, 0x06, 0x23, 0x01, 0x05, 0x9b, 0x43, 0x33, 
-	0x60, 0x03, 0x20, 0x31, 0x06, 0x40, 0x6a, 0x00, 
-	0x23, 0x04, 0x40, 0x18, 0xd1, 0x27, 0x9b, 0x01, 
-	0x20, 0x31, 0x06, 0x40, 0x6b, 0x00, 0x18, 0x1b, 
-	0x93, 0x01, 0x4e, 0x5c, 0x68, 0x30, 0x23, 0x3b, 
-	0x40, 0x18, 0x60, 0x30, 0x4e, 0x57, 0x68, 0x30, 
-	0x23, 0x0e, 0x43, 0x18, 0x60, 0x30, 0x4e, 0x55, 
-	0x68, 0x30, 0x23, 0x0c, 0x40, 0x18, 0x60, 0x30, 
-	0x20, 0x37, 0x23, 0x31, 0x06, 0x5b, 0x60, 0x98, 
-	0x20, 0x01, 0x90, 0x00, 0x98, 0x00, 0x28, 0x64, 
-	0xd3, 0x04, 0xe0, 0x07, 0x98, 0x00, 0x30, 0x01, 
-	0x90, 0x00, 0xe7, 0xf7, 0xe7, 0xfa, 0xe0, 0x01, 
-	0xe0, 0x36, 0xe0, 0x34, 0xe7, 0xd1, 0x4e, 0x46, 
-	0x68, 0x30, 0x23, 0x01, 0x05, 0x9b, 0x43, 0x18, 
-	0x60, 0x30, 0x4e, 0x40, 0x68, 0x30, 0x4b, 0x48, 
-	0x40, 0x18, 0x60, 0x30, 0x48, 0x3c, 0x68, 0x40, 
-	0x28, 0x00, 0xd0, 0x0d, 0x20, 0x5b, 0x4b, 0x38, 
-	0x68, 0x1b, 0x6f, 0xdb, 0x72, 0x58, 0x20, 0x00, 
-	0x4b, 0x35, 0x68, 0x1b, 0x33, 0x60, 0x76, 0x98, 
-	0x20, 0x5b, 0xb0, 0x06, 0xe6, 0xda, 0xe0, 0x5d, 
-	0x48, 0x31, 0x68, 0x00, 0x6f, 0xc0, 0x1d, 0x06, 
-	0x48, 0x2f, 0x68, 0x00, 0x30, 0x80, 0x78, 0x00, 
-	0x9b, 0x01, 0x1a, 0xc0, 0x68, 0x33, 0x18, 0xc0, 
-	0x60, 0x30, 0x20, 0x5c, 0x4b, 0x2a, 0x68, 0x1b, 
-	0x6f, 0xdb, 0x72, 0x58, 0x20, 0x00, 0x4b, 0x28, 
-	0x68, 0x1b, 0x33, 0x60, 0x76, 0x98, 0xe0, 0x3f, 
-	0x20, 0x33, 0x06, 0x40, 0x6b, 0x80, 0x90, 0x03, 
-	0x23, 0x04, 0x40, 0x18, 0xd0, 0x03, 0x20, 0x52, 
-	0xb0, 0x06, 0xe6, 0xb7, 0xe0, 0x3a, 0x98, 0x03, 
-	0x01, 0x00, 0x19, 0xc7, 0x48, 0x1e, 0x68, 0x00, 
-	0x6f, 0x40, 0x28, 0xbc, 0xdd, 0x07, 0x48, 0x29, 
-	0x60, 0xb8, 0x20, 0xbc, 0x4b, 0x1a, 0x68, 0x1b, 
-	0x33, 0x80, 0x70, 0x18, 0xe0, 0x0d, 0x48, 0x18, 
-	0x68, 0x00, 0x6f, 0x40, 0x23, 0x01, 0x07, 0x9b, 
-	0x43, 0x18, 0x60, 0xb8, 0x48, 0x14, 0x68, 0x00, 
-	0x6f, 0x40, 0x4b, 0x13, 0x68, 0x1b, 0x33, 0x80, 
-	0x70, 0x18, 0x48, 0x11, 0x68, 0x00, 0x30, 0x80, 
-	0x78, 0x80, 0x00, 0x43, 0x18, 0x18, 0x01, 0x80, 
-	0x18, 0x82, 0x48, 0x0d, 0x68, 0x00, 0x6f, 0x00, 
-	0x60, 0x38, 0x1d, 0x10, 0x60, 0x78, 0x20, 0x01, 
-	0x06, 0x00, 0x60, 0xf8, 0x9e, 0x03, 0x20, 0x01, 
-	0x40, 0xb0, 0x23, 0x33, 0x06, 0x5b, 0x63, 0x58, 
-	0x20, 0x00, 0xb0, 0x06, 0xe6, 0x7e, 0xb0, 0x04, 
-	0xb0, 0x02, 0xe6, 0x7b, 0xe6, 0x7a, 0x00, 0x00, 
-	0x9e, 0x00, 0x0b, 0x80, 0x9e, 0x00, 0x09, 0x80, 
-	0x2e, 0x08, 0x7c, 0x44, 0x9e, 0x00, 0x0a, 0x00, 
-	0x66, 0x00, 0x01, 0x00, 0x66, 0x00, 0x00, 0x08, 
-	0x62, 0x00, 0x03, 0x00, 0x80, 0x00, 0x00, 0x00, 
-	0x66, 0x00, 0x00, 0x04, 0xff, 0xf7, 0xff, 0xff, 
-	0xff, 0xff, 0x00, 0xff, 0x62, 0x00, 0x00, 0x1c, 
-	0xfe, 0xbf, 0xff, 0xff, 0x62, 0x00, 0x00, 0x08, 
-	0xff, 0xbf, 0xff, 0xff, 0x40, 0x00, 0x00, 0xbc, 
-	0x48, 0x07, 0x69, 0x80, 0x28, 0x02, 0xd0, 0x03, 
-	0x48, 0x05, 0x69, 0x80, 0x28, 0x03, 0xd1, 0x04, 
-	0x20, 0x31, 0x06, 0x40, 0x6a, 0x80, 0x47, 0x70, 
-	0xe0, 0x01, 0x20, 0x00, 0xe7, 0xfb, 0xe7, 0xfa, 
-	0x66, 0x00, 0x01, 0x00, 0xb5, 0xb0, 0x27, 0x0f, 
-	0x20, 0x31, 0x06, 0x40, 0x68, 0xc0, 0x09, 0x05, 
-	0xf7, 0xff, 0xff, 0xe6, 0x43, 0xc4, 0x48, 0x18, 
-	0x69, 0x80, 0x28, 0x00, 0xd0, 0x03, 0x48, 0x16, 
-	0x69, 0x80, 0x28, 0x01, 0xd1, 0x03, 0x1c, 0x38, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x2d, 0x09, 
-	0xd2, 0x1e, 0xa3, 0x02, 0x5d, 0x5b, 0x00, 0x5b, 
-	0x44, 0x9f, 0x1c, 0x00, 0x05, 0x05, 0x05, 0x05, 
-	0x05, 0x07, 0x07, 0x07, 0x0e, 0x00, 0x1c, 0x2f, 
-	0xe0, 0x13, 0x20, 0x08, 0x40, 0x20, 0xd0, 0x01, 
-	0x1c, 0x2f, 0xe0, 0x00, 0x27, 0x02, 0xe0, 0x0c, 
-	0x20, 0x08, 0x40, 0x20, 0xd0, 0x06, 0x20, 0x02, 
-	0x40, 0x20, 0xd0, 0x01, 0x27, 0x07, 0xe0, 0x00, 
-	0x27, 0x08, 0xe0, 0x00, 0x27, 0x02, 0xe0, 0x00, 
-	0xe7, 0xff, 0x1c, 0x38, 0xe7, 0xd8, 0xe7, 0xd7, 
-	0x66, 0x00, 0x01, 0x00, 0x1c, 0x01, 0x29, 0x07, 
-	0xd2, 0x0f, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, 
-	0x44, 0x9f, 0x1c, 0x00, 0x04, 0x05, 0x06, 0x09, 
-	0x08, 0x07, 0x0a, 0x00, 0xe0, 0x06, 0xe0, 0x05, 
-	0xe0, 0x04, 0xe0, 0x03, 0xe0, 0x02, 0xe0, 0x01, 
-	0xe0, 0x00, 0xe7, 0xff, 0x20, 0x00, 0x47, 0x70, 
-	0xe7, 0xfd, 0x00, 0x00, 0x20, 0x1d, 0x02, 0x80, 
-	0x69, 0x80, 0x49, 0x06, 0x60, 0x08, 0x20, 0x1d, 
-	0x02, 0x80, 0x69, 0x40, 0x49, 0x04, 0x60, 0x08, 
-	0x20, 0x1d, 0x02, 0x80, 0x69, 0xc0, 0x49, 0x03, 
-	0x60, 0x08, 0x47, 0x70, 0x2e, 0x08, 0x94, 0x90, 
-	0x2e, 0x08, 0x94, 0x94, 0x2e, 0x08, 0x94, 0x98, 
-	0xb5, 0xf1, 0xb0, 0x81, 0x20, 0x00, 0x4d, 0x21, 
-	0x95, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 
-	0x43, 0xdb, 0x4c, 0x1f, 0x68, 0x64, 0x42, 0x8c, 
-	0xdd, 0x21, 0x1c, 0x0c, 0x31, 0x01, 0x00, 0xa4, 
-	0x9d, 0x00, 0x59, 0x2f, 0x42, 0x9f, 0xd0, 0xf8, 
-	0x4c, 0x19, 0x68, 0x64, 0x42, 0x8c, 0xda, 0x00, 
-	0xe0, 0x15, 0x32, 0x01, 0x1c, 0x0c, 0x31, 0x01, 
-	0x00, 0xa4, 0x9d, 0x00, 0x59, 0x2b, 0x42, 0x9f, 
-	0xd0, 0xf8, 0x02, 0x9c, 0x43, 0x3c, 0x1c, 0x25, 
-	0x1c, 0x04, 0x30, 0x01, 0x00, 0xa4, 0x9e, 0x01, 
-	0x51, 0x35, 0x4c, 0x0f, 0x68, 0x64, 0x42, 0x8c, 
-	0xdb, 0x00, 0x32, 0x01, 0xe7, 0xd9, 0x28, 0x08, 
-	0xd3, 0x02, 0xe0, 0x07, 0x30, 0x01, 0xe7, 0xfa, 
-	0x25, 0x00, 0x43, 0xed, 0x00, 0x84, 0x9e, 0x01, 
-	0x51, 0x35, 0xe7, 0xf7, 0x4c, 0x07, 0x68, 0x24, 
-	0x2c, 0x00, 0xd1, 0x02, 0x24, 0x0d, 0x06, 0xe4, 
-	0x61, 0x22, 0xb0, 0x01, 0xb0, 0x01, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x7c, 0xcc, 
-	0x2e, 0x08, 0x7d, 0x94, 0x2e, 0x08, 0x94, 0x84, 
-	0xb5, 0x80, 0x48, 0xdc, 0x68, 0x00, 0x28, 0x00, 
-	0xd1, 0x04, 0x48, 0xda, 0x68, 0x00, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xff, 0x92, 
-	0x48, 0xd7, 0x49, 0xd8, 0x60, 0x08, 0x48, 0xd8, 
-	0x49, 0xd8, 0x60, 0x08, 0x48, 0xd8, 0x49, 0xd9, 
-	0x60, 0x08, 0x48, 0xd3, 0x49, 0xd8, 0x68, 0x0b, 
-	0x4a, 0xd8, 0x21, 0x00, 0xf0, 0x01, 0xf8, 0xda, 
-	0x20, 0x00, 0x49, 0xd0, 0x68, 0x09, 0x60, 0x08, 
-	0x20, 0x00, 0x49, 0xd0, 0x68, 0x09, 0x60, 0x08, 
-	0x20, 0x00, 0x49, 0xd0, 0x68, 0x09, 0x60, 0x08, 
-	0x20, 0x00, 0x49, 0xca, 0x68, 0x09, 0x23, 0x07, 
-	0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0x48, 0xce, 
-	0x49, 0xc6, 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 
-	0x18, 0xc9, 0x66, 0xc8, 0x20, 0x00, 0x49, 0xc5, 
-	0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 
-	0x66, 0x88, 0x48, 0xc7, 0x49, 0xc1, 0x68, 0x09, 
-	0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 0x66, 0xc8, 
-	0x20, 0x00, 0x49, 0xc0, 0x68, 0x09, 0x23, 0x07, 
-	0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0x48, 0xc0, 
-	0x49, 0xbc, 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 
-	0x18, 0xc9, 0x66, 0xc8, 0x27, 0x00, 0x2f, 0x19, 
-	0xd3, 0x02, 0xe0, 0x38, 0x37, 0x01, 0xe7, 0xfa, 
-	0x48, 0xba, 0x00, 0xb9, 0x4a, 0xb1, 0x68, 0x12, 
-	0x18, 0x89, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 
-	0x62, 0x08, 0x48, 0xb6, 0x00, 0xb9, 0x4a, 0xad, 
-	0x68, 0x12, 0x18, 0x89, 0x23, 0x07, 0x02, 0x1b, 
-	0x18, 0xc9, 0x60, 0x48, 0x48, 0xb1, 0x00, 0xb9, 
-	0x4a, 0xaa, 0x68, 0x12, 0x18, 0x89, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc9, 0x62, 0x08, 0x48, 0xad, 
-	0x00, 0xb9, 0x4a, 0xa6, 0x68, 0x12, 0x18, 0x89, 
-	0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 0x60, 0x48, 
-	0x48, 0xa8, 0x00, 0xb9, 0x4a, 0xa3, 0x68, 0x12, 
-	0x18, 0x89, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 
-	0x62, 0x08, 0x48, 0xa4, 0x00, 0xb9, 0x4a, 0x9f, 
-	0x68, 0x12, 0x18, 0x89, 0x23, 0x07, 0x02, 0x1b, 
-	0x18, 0xc9, 0x60, 0x48, 0xe7, 0xc6, 0x27, 0x00, 
-	0x2f, 0x07, 0xd3, 0x02, 0xe0, 0x86, 0x37, 0x01, 
-	0xe7, 0xfa, 0x48, 0x9c, 0x00, 0xb9, 0x19, 0xc9, 
-	0x00, 0xc9, 0x4a, 0x92, 0x68, 0x12, 0x18, 0x89, 
-	0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 0x60, 0x08, 
-	0x48, 0x96, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 
-	0x4a, 0x8c, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, 
-	0x02, 0x1b, 0x18, 0xc9, 0x67, 0xc8, 0x48, 0x91, 
-	0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x87, 
-	0x68, 0x12, 0x18, 0x89, 0x23, 0x0b, 0x01, 0xdb, 
-	0x18, 0xc9, 0x60, 0x48, 0x48, 0x8b, 0x00, 0xb9, 
-	0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x81, 0x68, 0x12, 
-	0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc9, 
-	0x67, 0x88, 0x48, 0x86, 0x00, 0xb9, 0x19, 0xc9, 
-	0x00, 0xc9, 0x4a, 0x7e, 0x68, 0x12, 0x18, 0x89, 
-	0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 0x60, 0x08, 
-	0x48, 0x80, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 
-	0x4a, 0x78, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, 
-	0x02, 0x1b, 0x18, 0xc9, 0x67, 0xc8, 0x48, 0x7b, 
-	0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x73, 
-	0x68, 0x12, 0x18, 0x89, 0x23, 0x0b, 0x01, 0xdb, 
-	0x18, 0xc9, 0x60, 0x48, 0x48, 0x75, 0x00, 0xb9, 
-	0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x6d, 0x68, 0x12, 
-	0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc9, 
-	0x67, 0x88, 0x48, 0x70, 0x00, 0xb9, 0x19, 0xc9, 
-	0x00, 0xc9, 0x4a, 0x6a, 0x68, 0x12, 0x18, 0x89, 
-	0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 0x60, 0x08, 
-	0x48, 0x6a, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 
-	0x4a, 0x64, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, 
-	0x02, 0x1b, 0x18, 0xc9, 0x67, 0xc8, 0x48, 0x65, 
-	0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x5f, 
-	0x68, 0x12, 0x18, 0x89, 0x23, 0x0b, 0x01, 0xdb, 
-	0x18, 0xc9, 0x60, 0x48, 0x48, 0x5f, 0x00, 0xb9, 
-	0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x59, 0x68, 0x12, 
-	0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc9, 
-	0x67, 0x88, 0xe7, 0x78, 0x27, 0x00, 0x2f, 0x12, 
-	0xd3, 0x02, 0xe0, 0x56, 0x37, 0x01, 0xe7, 0xfa, 
-	0x48, 0x56, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x4d, 
-	0x68, 0x12, 0x18, 0x89, 0x62, 0xc8, 0x48, 0x53, 
-	0x21, 0x4c, 0x43, 0x79, 0x4a, 0x49, 0x68, 0x12, 
-	0x18, 0x89, 0x62, 0x88, 0x48, 0x4f, 0x21, 0x4c, 
-	0x43, 0x79, 0x4a, 0x46, 0x68, 0x12, 0x18, 0x89, 
-	0x63, 0x08, 0x48, 0x4c, 0x21, 0x4c, 0x43, 0x79, 
-	0x4a, 0x42, 0x68, 0x12, 0x18, 0x89, 0x62, 0x48, 
-	0x48, 0x48, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x41, 
-	0x68, 0x12, 0x18, 0x89, 0x62, 0xc8, 0x48, 0x45, 
-	0x21, 0x4c, 0x43, 0x79, 0x4a, 0x3d, 0x68, 0x12, 
-	0x18, 0x89, 0x62, 0x88, 0x48, 0x41, 0x21, 0x4c, 
-	0x43, 0x79, 0x4a, 0x3a, 0x68, 0x12, 0x18, 0x89, 
-	0x63, 0x08, 0x48, 0x3e, 0x21, 0x4c, 0x43, 0x79, 
-	0x4a, 0x36, 0x68, 0x12, 0x18, 0x89, 0x62, 0x48, 
-	0x48, 0x3a, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x35, 
-	0x68, 0x12, 0x18, 0x89, 0x62, 0xc8, 0x48, 0x37, 
-	0x21, 0x4c, 0x43, 0x79, 0x4a, 0x31, 0x68, 0x12, 
-	0x18, 0x89, 0x62, 0x88, 0x48, 0x33, 0x21, 0x4c, 
-	0x43, 0x79, 0x4a, 0x2e, 0x68, 0x12, 0x18, 0x89, 
-	0x63, 0x08, 0x48, 0x30, 0x21, 0x4c, 0x43, 0x79, 
-	0x4a, 0x2a, 0x68, 0x12, 0x18, 0x89, 0x62, 0x48, 
-	0xe7, 0xa8, 0x20, 0x00, 0x49, 0x25, 0x68, 0x09, 
-	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0xc8, 
-	0x20, 0x00, 0x49, 0x22, 0x68, 0x09, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x20, 0x00, 
-	0x49, 0x1c, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 
-	0x18, 0xc9, 0x61, 0xc8, 0x20, 0x00, 0x49, 0x19, 
-	0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 
-	0x61, 0x88, 0x20, 0x00, 0x49, 0x19, 0x68, 0x09, 
-	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0xc8, 
-	0x20, 0x00, 0x49, 0x16, 0x68, 0x09, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x20, 0x92, 
-	0x49, 0x17, 0x60, 0x08, 0x27, 0x00, 0x2f, 0x08, 
-	0xd3, 0x02, 0xe0, 0x08, 0x37, 0x01, 0xe7, 0xfa, 
-	0x20, 0x00, 0x43, 0xc0, 0x00, 0xb9, 0x4b, 0x13, 
-	0x18, 0xc9, 0x64, 0x08, 0xe7, 0xf6, 0x20, 0x10, 
-	0x21, 0x0d, 0x06, 0xc9, 0x61, 0x08, 0x20, 0x01, 
-	0x49, 0x0f, 0x60, 0x08, 0x48, 0x0e, 0x68, 0x00, 
-	0xe6, 0x4d, 0xe6, 0x4c, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x7d, 0xbc, 0x2e, 0x08, 0x7d, 0xb0, 
-	0x2e, 0x08, 0x85, 0x54, 0x2e, 0x08, 0x7d, 0xb4, 
-	0x2e, 0x08, 0x8c, 0xec, 0x2e, 0x08, 0x7d, 0xb8, 
-	0x2e, 0x08, 0x94, 0x94, 0x00, 0x00, 0x16, 0xc8, 
-	0x3f, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x94, 0x88, 0x68, 0x00, 0x0d, 0x00, 
-	0x2e, 0x08, 0x94, 0x84, 0xb5, 0x90, 0x1c, 0x04, 
-	0x1c, 0x0f, 0x1c, 0x39, 0x20, 0x00, 0xf0, 0x00, 
-	0xf8, 0x4d, 0x1c, 0x39, 0x1c, 0x20, 0xf0, 0x00, 
-	0xf8, 0x03, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x68, 0x78, 
-	0x28, 0x07, 0xd9, 0x1d, 0x23, 0x03, 0x02, 0x5b, 
-	0x18, 0xf8, 0x6d, 0x40, 0x28, 0x00, 0xd0, 0x06, 
-	0x23, 0x03, 0x02, 0x5b, 0x18, 0xf8, 0x6d, 0x80, 
-	0x04, 0x00, 0x0c, 0x00, 0xd1, 0x02, 0x20, 0x02, 
-	0x60, 0xb8, 0xe0, 0x01, 0x20, 0x03, 0x60, 0xb8, 
-	0x1d, 0xfd, 0x35, 0x05, 0x23, 0x65, 0x01, 0x1b, 
-	0x18, 0xfe, 0x1c, 0x31, 0x1c, 0x28, 0x4a, 0x11, 
-	0x68, 0x13, 0x22, 0x28, 0xf0, 0x00, 0xfe, 0xee, 
-	0x2c, 0x06, 0xd0, 0x18, 0x00, 0xa0, 0x19, 0x00, 
-	0x00, 0xc0, 0x19, 0xc0, 0x23, 0x2b, 0x01, 0x5b, 
-	0x18, 0xc6, 0x00, 0xa0, 0x19, 0x00, 0x00, 0xc0, 
-	0x19, 0xc0, 0x23, 0xb1, 0x00, 0xdb, 0x18, 0xc5, 
-	0x20, 0x06, 0x1b, 0x00, 0x00, 0x82, 0x18, 0x12, 
-	0x00, 0xd2, 0x1c, 0x31, 0x1c, 0x28, 0x4b, 0x04, 
-	0x68, 0x1b, 0xf0, 0x00, 0xfe, 0xd3, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x94, 0x90, 
-	0x2e, 0x08, 0x94, 0x98, 0xb5, 0xf0, 0x1c, 0x07, 
-	0x1c, 0x0c, 0x2f, 0x10, 0xd0, 0x13, 0x20, 0x4c, 
-	0x43, 0x78, 0x19, 0x00, 0x1d, 0xc6, 0x36, 0x01, 
-	0x20, 0x4c, 0x43, 0x78, 0x19, 0x00, 0x1d, 0xc5, 
-	0x35, 0x4d, 0x20, 0x10, 0x1b, 0xc0, 0x22, 0x4c, 
-	0x43, 0x42, 0x1c, 0x31, 0x1c, 0x28, 0x4b, 0x03, 
-	0x68, 0x1b, 0xf0, 0x00, 0xfe, 0xb3, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x94, 0x98, 
-	0xb5, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x39, 
-	0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x07, 0x1c, 0x39, 
-	0x20, 0x00, 0xf0, 0x00, 0xf8, 0x33, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x1c, 0x04, 
-	0x1c, 0x0f, 0x00, 0xa0, 0x19, 0x00, 0x00, 0xc0, 
-	0x19, 0xc0, 0x23, 0xb1, 0x00, 0xdb, 0x18, 0xc6, 
-	0x00, 0xa0, 0x19, 0x00, 0x00, 0xc0, 0x19, 0xc0, 
-	0x23, 0x2b, 0x01, 0x5b, 0x18, 0xc5, 0x20, 0x06, 
-	0x1b, 0x00, 0x00, 0x82, 0x18, 0x12, 0x00, 0xd2, 
-	0x1c, 0x31, 0x1c, 0x28, 0x4b, 0x09, 0x68, 0x1b, 
-	0xf0, 0x00, 0xfe, 0x84, 0x1d, 0xfe, 0x36, 0x05, 
-	0x23, 0x65, 0x01, 0x1b, 0x18, 0xfd, 0x1c, 0x31, 
-	0x1c, 0x28, 0x4a, 0x05, 0x68, 0x13, 0x22, 0x28, 
-	0xf0, 0x00, 0xfe, 0x78, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x98, 
-	0x2e, 0x08, 0x94, 0x90, 0xb5, 0xf0, 0x1c, 0x07, 
-	0x1c, 0x0c, 0x20, 0x4c, 0x43, 0x78, 0x19, 0x00, 
-	0x1d, 0xc6, 0x36, 0x4d, 0x20, 0x4c, 0x43, 0x78, 
-	0x19, 0x00, 0x1d, 0xc5, 0x35, 0x01, 0x20, 0x10, 
-	0x1b, 0xc0, 0x22, 0x4c, 0x43, 0x42, 0x1c, 0x31, 
-	0x1c, 0x28, 0x4b, 0x03, 0x68, 0x1b, 0xf0, 0x00, 
-	0xfe, 0x59, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x94, 0x98, 0xb4, 0xb0, 0x1c, 0x02, 
-	0x1c, 0x0f, 0x20, 0x00, 0x1c, 0x03, 0x30, 0x01, 
-	0x00, 0x9b, 0x18, 0x9c, 0x23, 0x07, 0x02, 0x1b, 
-	0x18, 0xe3, 0x68, 0x5b, 0x10, 0x7c, 0x34, 0x01, 
-	0x42, 0xa3, 0xd2, 0x00, 0xe7, 0xf2, 0x38, 0x01, 
-	0x21, 0x18, 0x42, 0x81, 0xd8, 0x02, 0xe0, 0x1a, 
-	0x39, 0x01, 0xe7, 0xfa, 0x00, 0x8b, 0x18, 0x9c, 
-	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xe3, 0x69, 0xdc, 
-	0x00, 0x8b, 0x18, 0x9d, 0x23, 0x0d, 0x01, 0xdb, 
-	0x18, 0xeb, 0x62, 0x1c, 0x00, 0x8b, 0x18, 0x9c, 
-	0x23, 0x07, 0x02, 0x1b, 0x18, 0xe3, 0x68, 0x1c, 
-	0x00, 0x8b, 0x18, 0x9d, 0x23, 0x07, 0x02, 0x1b, 
-	0x18, 0xeb, 0x60, 0x5c, 0xe7, 0xe4, 0x23, 0x00, 
-	0x2b, 0x00, 0xd0, 0x10, 0x10, 0x7b, 0x1c, 0x5c, 
-	0x00, 0x83, 0x18, 0x9d, 0x23, 0x0d, 0x01, 0xdb, 
-	0x18, 0xeb, 0x62, 0x1c, 0x10, 0x7b, 0x1c, 0x5c, 
-	0x00, 0x83, 0x18, 0x9d, 0x23, 0x07, 0x02, 0x1b, 
-	0x18, 0xeb, 0x60, 0x5c, 0xe0, 0x0e, 0x10, 0x7c, 
-	0x00, 0x83, 0x18, 0x9d, 0x23, 0x0d, 0x01, 0xdb, 
-	0x18, 0xeb, 0x62, 0x1c, 0x10, 0x7b, 0x1c, 0x5c, 
-	0x00, 0x83, 0x18, 0x9d, 0x23, 0x07, 0x02, 0x1b, 
-	0x18, 0xeb, 0x60, 0x5c, 0xbc, 0xb0, 0x47, 0x70, 
-	0xb4, 0xb0, 0x1c, 0x02, 0x1c, 0x0f, 0x21, 0x00, 
-	0x1c, 0x0b, 0x31, 0x01, 0x00, 0x9b, 0x18, 0x9c, 
-	0x23, 0x07, 0x02, 0x1b, 0x18, 0xe3, 0x68, 0x5b, 
-	0x10, 0x7c, 0x34, 0x01, 0x42, 0xa3, 0xd0, 0x00, 
-	0xe7, 0xf2, 0x39, 0x01, 0x1c, 0x08, 0x28, 0x18, 
-	0xd3, 0x02, 0xe0, 0x1a, 0x30, 0x01, 0xe7, 0xfa, 
-	0x00, 0x83, 0x18, 0x9c, 0x23, 0x0d, 0x01, 0xdb, 
-	0x18, 0xe3, 0x6a, 0x5c, 0x00, 0x83, 0x18, 0x9d, 
-	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xeb, 0x62, 0x1c, 
-	0x00, 0x83, 0x18, 0x9c, 0x23, 0x07, 0x02, 0x1b, 
-	0x18, 0xe3, 0x68, 0x9c, 0x00, 0x83, 0x18, 0x9d, 
-	0x23, 0x07, 0x02, 0x1b, 0x18, 0xeb, 0x60, 0x5c, 
-	0xe7, 0xe4, 0x4c, 0x06, 0x23, 0x07, 0x02, 0x1b, 
-	0x18, 0xd3, 0x60, 0x1c, 0x4c, 0x03, 0x23, 0x07, 
-	0x02, 0x1b, 0x18, 0xd3, 0x66, 0x5c, 0xbc, 0xb0, 
-	0x47, 0x70, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 
-	0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0c, 0x1c, 0x15, 
-	0x6a, 0xa1, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x19, 
-	0x62, 0x39, 0x21, 0x01, 0x02, 0x89, 0x43, 0x29, 
-	0x62, 0x79, 0x6a, 0xe1, 0x05, 0x89, 0x0d, 0x89, 
-	0x61, 0xf9, 0x6b, 0x61, 0x31, 0x01, 0x05, 0x89, 
-	0x0d, 0x89, 0x61, 0xb9, 0x69, 0x61, 0x60, 0xf9, 
-	0x69, 0xa1, 0x61, 0x39, 0x69, 0xe1, 0x61, 0x79, 
-	0x68, 0xa1, 0x23, 0x01, 0x06, 0x1b, 0x40, 0x19, 
-	0xd0, 0x02, 0x49, 0x0f, 0x60, 0xb9, 0xe0, 0x01, 
-	0x21, 0x00, 0x60, 0xb9, 0x6a, 0x60, 0x28, 0x00, 
-	0xd0, 0x0b, 0x68, 0x41, 0x60, 0x39, 0x78, 0x01, 
-	0x00, 0x89, 0x4b, 0x0a, 0x18, 0xc9, 0x60, 0x79, 
-	0x68, 0xb9, 0x88, 0x42, 0x43, 0x11, 0x60, 0xb9, 
-	0xe0, 0x07, 0x21, 0x00, 0x60, 0x39, 0x21, 0x00, 
-	0x60, 0x79, 0x68, 0xb9, 0x0c, 0x09, 0x04, 0x09, 
-	0x60, 0xb9, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00, 
-	0xff, 0xff, 0x00, 0x00, 0x68, 0x00, 0x08, 0x00, 
-	0xb4, 0x80, 0x1c, 0x02, 0x1c, 0x0f, 0x69, 0x79, 
-	0x60, 0xd1, 0x69, 0xb9, 0x61, 0x11, 0x69, 0xf9, 
-	0x61, 0x51, 0x68, 0xb9, 0x23, 0x01, 0x06, 0x1b, 
-	0x40, 0x19, 0xd0, 0x02, 0x49, 0x0e, 0x60, 0x91, 
-	0xe0, 0x01, 0x21, 0x00, 0x60, 0x91, 0x6a, 0x78, 
-	0x28, 0x00, 0xd0, 0x0b, 0x68, 0x41, 0x60, 0x11, 
-	0x78, 0x01, 0x00, 0x89, 0x4b, 0x09, 0x18, 0xc9, 
-	0x60, 0x51, 0x68, 0x91, 0x88, 0x43, 0x43, 0x19, 
-	0x60, 0x91, 0xe0, 0x07, 0x21, 0x00, 0x60, 0x11, 
-	0x21, 0x00, 0x60, 0x51, 0x68, 0x91, 0x0c, 0x09, 
-	0x04, 0x09, 0x60, 0x91, 0xbc, 0x80, 0x47, 0x70, 
-	0xff, 0xff, 0x00, 0x00, 0x68, 0x00, 0x08, 0x00, 
-	0x1c, 0x01, 0x48, 0x07, 0x62, 0x08, 0x48, 0x06, 
-	0x62, 0x48, 0x48, 0x05, 0x61, 0xc8, 0x48, 0x04, 
-	0x61, 0x88, 0x20, 0x00, 0x60, 0x08, 0x20, 0x00, 
-	0x60, 0x48, 0x20, 0x00, 0x60, 0x88, 0x47, 0x70, 
-	0x00, 0x00, 0xff, 0xff, 0xb5, 0xb0, 0x1c, 0x07, 
-	0x1c, 0x0c, 0x2c, 0x07, 0xd2, 0x73, 0x25, 0x00, 
-	0x2d, 0x07, 0xdb, 0x02, 0xe0, 0x2f, 0x35, 0x01, 
-	0xe7, 0xfa, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 
-	0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, 
-	0x68, 0x00, 0x00, 0xa9, 0x19, 0x49, 0x00, 0xc9, 
-	0x19, 0xc9, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 
-	0x68, 0x49, 0x42, 0x88, 0xd0, 0x1a, 0x00, 0xa8, 
-	0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, 
-	0x01, 0xdb, 0x18, 0xc0, 0x68, 0x40, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x00, 0xa8, 
-	0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, 
-	0x01, 0xdb, 0x18, 0xc0, 0x68, 0x00, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0xf8, 
-	0xf0, 0x00, 0xfb, 0xd2, 0xe7, 0xcf, 0x23, 0xcf, 
-	0x00, 0xdb, 0x18, 0xf8, 0xf7, 0xff, 0xfb, 0xb8, 
-	0x25, 0x00, 0x2d, 0x07, 0xdb, 0x02, 0xe0, 0x54, 
-	0x35, 0x01, 0xe7, 0xfa, 0x00, 0xa8, 0x19, 0x40, 
-	0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 
-	0x18, 0xc0, 0x68, 0x00, 0x00, 0xa9, 0x19, 0x49, 
-	0x00, 0xc9, 0x19, 0xc9, 0x23, 0x0b, 0x01, 0xdb, 
-	0x18, 0xc9, 0x68, 0x49, 0x42, 0x88, 0xd0, 0x1a, 
-	0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 
-	0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x40, 
-	0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 
-	0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 
-	0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x00, 
-	0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 
-	0x48, 0xdb, 0xf0, 0x00, 0xfb, 0x6b, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 
-	0x43, 0x69, 0x19, 0xc9, 0xe0, 0x00, 0xe0, 0x94, 
-	0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0xcc, 
-	0xf0, 0x00, 0xfb, 0x7a, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x30, 0x34, 0xf7, 0xff, 0xfb, 0x60, 
-	0xe7, 0xaa, 0x25, 0x07, 0x2d, 0x11, 0xdb, 0x02, 
-	0xe0, 0x4e, 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 
-	0x38, 0x02, 0x69, 0x80, 0x21, 0x4c, 0x43, 0x69, 
-	0x19, 0xc9, 0x39, 0xff, 0x39, 0xff, 0x39, 0x02, 
-	0x69, 0xc9, 0x42, 0x88, 0xd0, 0x18, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 
-	0x38, 0x02, 0x69, 0xc0, 0x23, 0x01, 0x02, 0x9b, 
-	0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 
-	0x69, 0x80, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 
-	0x1c, 0x01, 0x48, 0xb1, 0xf0, 0x00, 0xfb, 0x16, 
-	0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 
-	0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09, 
-	0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b, 
-	0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b, 
-	0x43, 0x98, 0x1c, 0x01, 0x48, 0xa2, 0xf0, 0x00, 
-	0xfb, 0x27, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 
-	0x30, 0x34, 0xf7, 0xff, 0xfb, 0x0d, 0xe7, 0xb0, 
-	0x25, 0x0a, 0x2d, 0x11, 0xdb, 0x02, 0xe0, 0x1f, 
-	0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 
-	0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 
-	0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 
-	0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 
-	0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 
-	0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 
-	0x48, 0x8d, 0xf0, 0x00, 0xfa, 0xcf, 0xe7, 0xdf, 
-	0xe1, 0xca, 0x2c, 0x0e, 0xd3, 0x73, 0x3c, 0x07, 
-	0x1f, 0xe5, 0x42, 0xa5, 0xd3, 0x02, 0xe0, 0x1f, 
-	0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 
-	0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 
-	0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 
-	0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 
-	0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 
-	0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 
-	0x48, 0x79, 0xf0, 0x00, 0xfa, 0xd5, 0xe7, 0xdf, 
-	0x1c, 0x25, 0x2d, 0x11, 0xdb, 0x02, 0xe0, 0x50, 
-	0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 
-	0x69, 0x80, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, 
-	0x39, 0xff, 0x39, 0xff, 0x39, 0x02, 0x69, 0xc9, 
-	0x42, 0x88, 0xd0, 0x18, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 
-	0x69, 0xc0, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 
-	0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 
-	0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x69, 0x80, 
-	0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 
-	0x48, 0x61, 0xf0, 0x00, 0xfa, 0x77, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 
-	0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 
-	0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 
-	0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 
-	0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 
-	0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 
-	0x1c, 0x01, 0x48, 0x53, 0xf0, 0x00, 0xfa, 0x88, 
-	0x20, 0x4c, 0x43, 0x68, 0xe0, 0x00, 0xe0, 0x29, 
-	0x19, 0xc0, 0x30, 0x34, 0xf7, 0xff, 0xfa, 0x6c, 
-	0xe7, 0xae, 0x25, 0x0a, 0x2d, 0x11, 0xdb, 0x02, 
-	0xe0, 0x1f, 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 
-	0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 
-	0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 
-	0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 
-	0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 
-	0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 
-	0x1c, 0x01, 0x48, 0x3d, 0xf0, 0x00, 0xfa, 0x2e, 
-	0xe7, 0xdf, 0xe1, 0x29, 0x3c, 0x07, 0x1c, 0x25, 
-	0x2d, 0x07, 0xdb, 0x02, 0xe0, 0x2f, 0x35, 0x01, 
-	0xe7, 0xfa, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 
-	0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, 
-	0x68, 0x00, 0x00, 0xa9, 0x19, 0x49, 0x00, 0xc9, 
-	0x19, 0xc9, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 
-	0x68, 0x49, 0x42, 0x88, 0xd0, 0x1a, 0x00, 0xa8, 
-	0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, 
-	0x01, 0xdb, 0x18, 0xc0, 0x68, 0x40, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x00, 0xa8, 
-	0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, 
-	0x01, 0xdb, 0x18, 0xc0, 0x68, 0x00, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0x22, 
-	0xf0, 0x00, 0xfa, 0x26, 0xe7, 0xcf, 0x25, 0x00, 
-	0x42, 0xa5, 0xd3, 0x02, 0xe0, 0x1f, 0x35, 0x01, 
-	0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 
-	0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, 
-	0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0x10, 
-	0xf0, 0x00, 0xfa, 0x02, 0xe7, 0xdf, 0x1c, 0x25, 
-	0x2d, 0x07, 0xdb, 0x02, 0xe0, 0x55, 0x35, 0x01, 
-	0xe7, 0xfa, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 
-	0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, 
-	0x68, 0x00, 0x00, 0xa9, 0x19, 0x49, 0x00, 0xc9, 
-	0x19, 0xc9, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 
-	0x68, 0x49, 0x42, 0x88, 0xd0, 0x1d, 0x00, 0xa8, 
-	0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0xe0, 0x01, 
-	0x2e, 0x08, 0x7d, 0x94, 0x23, 0x0b, 0x01, 0xdb, 
-	0x18, 0xc0, 0x68, 0x40, 0x23, 0x01, 0x02, 0x9b, 
-	0x43, 0x98, 0x1c, 0x02, 0x00, 0xa8, 0x19, 0x40, 
-	0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 
-	0x18, 0xc0, 0x68, 0x00, 0x23, 0x01, 0x02, 0x9b, 
-	0x43, 0x98, 0x1c, 0x01, 0x48, 0x50, 0xf0, 0x00, 
-	0xf9, 0x9d, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 
-	0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, 
-	0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0x42, 
-	0xf0, 0x00, 0xf9, 0xae, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x30, 0x34, 0xf7, 0xff, 0xf9, 0x94, 
-	0xe7, 0xa9, 0x25, 0x07, 0x2d, 0x11, 0xdb, 0x02, 
-	0xe0, 0x4e, 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 
-	0x38, 0x02, 0x69, 0x80, 0x21, 0x4c, 0x43, 0x69, 
-	0x19, 0xc9, 0x39, 0xff, 0x39, 0xff, 0x39, 0x02, 
-	0x69, 0xc9, 0x42, 0x88, 0xd0, 0x18, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 
-	0x38, 0x02, 0x69, 0xc0, 0x23, 0x01, 0x02, 0x9b, 
-	0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 
-	0x69, 0x80, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 
-	0x1c, 0x01, 0x48, 0x27, 0xf0, 0x00, 0xf9, 0x4a, 
-	0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 
-	0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09, 
-	0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b, 
-	0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b, 
-	0x43, 0x98, 0x1c, 0x01, 0x48, 0x18, 0xf0, 0x00, 
-	0xf9, 0x5b, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 
-	0x30, 0x34, 0xf7, 0xff, 0xf9, 0x41, 0xe7, 0xb0, 
-	0x25, 0x0a, 0x2d, 0x11, 0xdb, 0x02, 0xe0, 0x1f, 
-	0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 
-	0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 
-	0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 
-	0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 
-	0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 
-	0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 
-	0x48, 0x03, 0xf0, 0x00, 0xf9, 0x03, 0xe7, 0xdf, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x7d, 0x94, 0xb4, 0x90, 0x1c, 0x02, 
-	0x1c, 0x0f, 0x3a, 0x01, 0x2f, 0x01, 0xd1, 0x0d, 
-	0x09, 0x50, 0x00, 0x80, 0x49, 0x0d, 0x58, 0x08, 
-	0x06, 0xd4, 0x0e, 0xe4, 0x21, 0x01, 0x40, 0xa1, 
-	0x43, 0x08, 0x09, 0x51, 0x00, 0x89, 0x4b, 0x09, 
-	0x50, 0x58, 0xe0, 0x0d, 0x09, 0x50, 0x00, 0x80, 
-	0x49, 0x06, 0x58, 0x08, 0x06, 0xd4, 0x0e, 0xe4, 
-	0x21, 0x01, 0x40, 0xa1, 0x43, 0xc9, 0x40, 0x01, 
-	0x09, 0x50, 0x00, 0x80, 0x4b, 0x01, 0x50, 0x19, 
-	0xbc, 0x90, 0x47, 0x70, 0x2e, 0x08, 0x94, 0x8c, 
-	0xb4, 0x80, 0x1c, 0x01, 0x39, 0x01, 0x09, 0x48, 
-	0x00, 0x80, 0x4a, 0x08, 0x58, 0x10, 0x06, 0xca, 
-	0x0e, 0xd2, 0x27, 0x01, 0x40, 0x97, 0x1c, 0x3b, 
-	0x40, 0x18, 0xd0, 0x03, 0x20, 0x01, 0xbc, 0x80, 
-	0x47, 0x70, 0xe0, 0x01, 0x20, 0x00, 0xe7, 0xfa, 
-	0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x8c, 
-	0xb4, 0xf0, 0x1c, 0x07, 0x1c, 0x0a, 0x68, 0x54, 
-	0x6a, 0xf8, 0x05, 0x86, 0x0d, 0xb6, 0x2c, 0x07, 
-	0xda, 0x01, 0x1c, 0x20, 0xe0, 0x00, 0x20, 0x07, 
-	0x1c, 0x05, 0x21, 0x00, 0x42, 0xa9, 0xd3, 0x02, 
-	0xe0, 0x15, 0x31, 0x01, 0xe7, 0xfa, 0x00, 0x88, 
-	0x18, 0x40, 0x00, 0xc0, 0x18, 0x80, 0x23, 0x05, 
-	0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0xb0, 
-	0xd1, 0x08, 0x00, 0x88, 0x18, 0x40, 0x00, 0xc0, 
-	0x18, 0x80, 0x23, 0x2b, 0x01, 0x5b, 0x18, 0xc0, 
-	0xbc, 0xf0, 0x47, 0x70, 0xe7, 0xe9, 0x1f, 0xe0, 
-	0x28, 0x11, 0xda, 0x01, 0x1f, 0xe0, 0xe0, 0x00, 
-	0x20, 0x11, 0x1c, 0x05, 0x21, 0x00, 0x42, 0xa9, 
-	0xd3, 0x02, 0xe0, 0x0d, 0x31, 0x01, 0xe7, 0xfa, 
-	0x20, 0x4c, 0x43, 0x48, 0x18, 0x80, 0x6a, 0x80, 
-	0x42, 0xb0, 0xd1, 0x04, 0x20, 0x4c, 0x43, 0x48, 
-	0x18, 0x80, 0x30, 0x0c, 0xe7, 0xe4, 0xe7, 0xf1, 
-	0x20, 0x00, 0xe7, 0xe1, 0xe7, 0xe0, 0xb5, 0x90, 
-	0x48, 0x07, 0x68, 0x04, 0x48, 0x07, 0x68, 0x07, 
-	0x1c, 0x39, 0x1c, 0x20, 0x4a, 0x06, 0x68, 0x13, 
-	0x22, 0xf3, 0x00, 0xd2, 0xf0, 0x00, 0xf9, 0xca, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x7d, 0xb4, 0x2e, 0x08, 0x7d, 0xb8, 
-	0x2e, 0x08, 0x94, 0x90, 0xb4, 0xf0, 0x1c, 0x01, 
-	0xb0, 0x83, 0x22, 0x00, 0x68, 0x4b, 0x2b, 0x07, 
-	0xdd, 0x01, 0x23, 0x07, 0xe0, 0x00, 0x68, 0x4b, 
-	0x1c, 0x1c, 0x23, 0x00, 0x43, 0xdb, 0x93, 0x02, 
-	0x23, 0x00, 0x43, 0xdb, 0x93, 0x01, 0x23, 0x00, 
-	0x93, 0x00, 0x4b, 0x17, 0x68, 0x1b, 0x2b, 0x00, 
-	0xd0, 0x07, 0x4b, 0x15, 0x68, 0x1b, 0x6a, 0xdb, 
-	0x93, 0x02, 0x4b, 0x13, 0x68, 0x1b, 0x6b, 0x5b, 
-	0x93, 0x01, 0x20, 0x00, 0x42, 0xa0, 0xd3, 0x02, 
-	0xe0, 0x16, 0x30, 0x01, 0xe7, 0xfa, 0x00, 0x83, 
-	0x18, 0x1b, 0x00, 0xdb, 0x18, 0x5d, 0x23, 0x05, 
-	0x02, 0x1b, 0x18, 0xeb, 0x6e, 0x9f, 0x04, 0x3b, 
-	0x0c, 0x1b, 0xd0, 0x08, 0x0c, 0x3b, 0x04, 0x1b, 
-	0xd0, 0x05, 0x9b, 0x00, 0x18, 0xc5, 0x26, 0x01, 
-	0x40, 0xae, 0x1c, 0x33, 0x43, 0x1a, 0xe7, 0xe8, 
-	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xcb, 0x61, 0xda, 
-	0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x7c, 0x58, 0xb4, 0x80, 0x1c, 0x01, 
-	0x20, 0x00, 0x68, 0x0a, 0x42, 0x90, 0xdb, 0x02, 
-	0xe0, 0x07, 0x30, 0x01, 0xe7, 0xf9, 0x23, 0x00, 
-	0x43, 0xdb, 0x68, 0x8a, 0x00, 0x87, 0x51, 0xd3, 
-	0xe7, 0xf7, 0x22, 0x00, 0x43, 0xd2, 0x68, 0x8b, 
-	0x68, 0x0f, 0x00, 0xbf, 0x51, 0xda, 0x23, 0x00, 
-	0x43, 0xdb, 0x68, 0x8a, 0x68, 0x0f, 0x00, 0xbf, 
-	0x19, 0xd2, 0x60, 0x53, 0x22, 0x00, 0x60, 0x4a, 
-	0xbc, 0x80, 0x47, 0x70, 0xb4, 0xf0, 0x1c, 0x03, 
-	0x1c, 0x0c, 0x1c, 0x17, 0x68, 0x9a, 0xca, 0x40, 
-	0x42, 0xa6, 0xd2, 0x00, 0xe7, 0xfb, 0x3a, 0x04, 
-	0x1c, 0x11, 0xc9, 0x40, 0x42, 0xbe, 0xd2, 0x00, 
-	0xe7, 0xfb, 0x39, 0x04, 0x68, 0x10, 0x42, 0xa0, 
-	0xd1, 0x02, 0x68, 0x08, 0x42, 0xb8, 0xd0, 0x02, 
-	0x20, 0xff, 0xbc, 0xf0, 0x47, 0x70, 0x39, 0x04, 
-	0x68, 0x98, 0x68, 0x5e, 0x00, 0xb6, 0x19, 0x85, 
-	0x68, 0x58, 0x38, 0x02, 0x60, 0x58, 0x68, 0x50, 
-	0x60, 0x10, 0x32, 0x04, 0x42, 0x8a, 0xd3, 0xfa, 
-	0x68, 0x88, 0x60, 0x08, 0x31, 0x04, 0x42, 0xa9, 
-	0xd3, 0xfa, 0x20, 0x00, 0xe7, 0xe9, 0xe7, 0xe8, 
-	0xb4, 0xf0, 0x1c, 0x03, 0x1c, 0x0c, 0x1c, 0x17, 
-	0x68, 0x58, 0x68, 0x1e, 0x3e, 0x01, 0x42, 0xb0, 
-	0xdb, 0x02, 0x20, 0xff, 0xbc, 0xf0, 0x47, 0x70, 
-	0x68, 0x9a, 0xca, 0x40, 0x42, 0xa6, 0xd2, 0x00, 
-	0xe7, 0xfb, 0x3a, 0x04, 0x1c, 0x15, 0xcd, 0x40, 
-	0x42, 0xbe, 0xd2, 0x00, 0xe7, 0xfb, 0x68, 0x58, 
-	0x30, 0x02, 0x60, 0x58, 0x68, 0x98, 0x68, 0x5e, 
-	0x00, 0xb6, 0x19, 0x80, 0x1f, 0xc1, 0x39, 0x01, 
-	0x68, 0x08, 0x60, 0x88, 0x39, 0x04, 0x1d, 0xc8, 
-	0x30, 0x01, 0x42, 0xa8, 0xd8, 0xf8, 0x60, 0x8f, 
-	0x68, 0x08, 0x60, 0x48, 0x39, 0x04, 0x1d, 0x08, 
-	0x42, 0x90, 0xd8, 0xf9, 0x60, 0x14, 0x20, 0x00, 
-	0xe7, 0xd8, 0xe7, 0xd7, 0xb5, 0xf0, 0x1c, 0x07, 
-	0x1c, 0x0c, 0xb0, 0x81, 0x1c, 0x38, 0x21, 0x00, 
-	0xf0, 0x0c, 0xff, 0xe0, 0x1c, 0x06, 0x1c, 0x38, 
-	0x21, 0x01, 0xf0, 0x0c, 0xff, 0xdb, 0x90, 0x00, 
-	0x1c, 0x31, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x50, 
-	0x49, 0x20, 0x68, 0x09, 0x60, 0x08, 0x99, 0x00, 
-	0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x49, 0x49, 0x1e, 
-	0x68, 0x09, 0x60, 0x08, 0x48, 0x1b, 0x68, 0x00, 
-	0x68, 0x05, 0x48, 0x1c, 0x68, 0x01, 0x23, 0x02, 
-	0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, 0x2c, 0x00, 
-	0xd0, 0x0c, 0x48, 0x19, 0x68, 0x00, 0x78, 0x00, 
-	0x28, 0x00, 0xd0, 0x07, 0x48, 0x14, 0x68, 0x00, 
-	0x68, 0x05, 0x48, 0x14, 0x68, 0x01, 0x23, 0x02, 
-	0x43, 0x19, 0x60, 0x01, 0x1c, 0x20, 0x49, 0x13, 
-	0x68, 0x09, 0x70, 0x08, 0x48, 0x12, 0x63, 0xc5, 
-	0x20, 0x3f, 0x04, 0x00, 0x40, 0x28, 0x0c, 0x00, 
-	0x49, 0x10, 0x62, 0x08, 0x20, 0xff, 0x02, 0x00, 
-	0x40, 0x28, 0x0a, 0x00, 0x49, 0x0d, 0x62, 0x48, 
-	0x06, 0xa8, 0x0e, 0x80, 0x23, 0x80, 0x43, 0x18, 
-	0x49, 0x0a, 0x62, 0x88, 0x1c, 0x28, 0xb0, 0x01, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 
-	0xe7, 0xfa, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x9c, 
-	0x2e, 0x08, 0x94, 0xa0, 0x6a, 0x00, 0x00, 0x18, 
-	0x2e, 0x08, 0x94, 0xa4, 0x2e, 0x08, 0x94, 0xa8, 
-	0x68, 0x00, 0x0d, 0x00, 0x72, 0x00, 0x01, 0x00, 
-	0xb4, 0x80, 0x1c, 0x02, 0x1c, 0x0f, 0x06, 0xb9, 
-	0x0e, 0x89, 0x20, 0x01, 0x03, 0x80, 0x40, 0x10, 
-	0x09, 0xc0, 0x43, 0x01, 0x20, 0xf0, 0x40, 0x10, 
-	0x01, 0x40, 0x43, 0x01, 0x07, 0x10, 0x0f, 0x00, 
-	0x03, 0x00, 0x43, 0x01, 0x20, 0x07, 0x02, 0xc0, 
-	0x40, 0x10, 0x01, 0x40, 0x43, 0x01, 0x20, 0x07, 
-	0x02, 0x00, 0x40, 0x10, 0x02, 0xc0, 0x43, 0x01, 
-	0x1c, 0x08, 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, 
-	0xb5, 0xff, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, 
-	0x9b, 0x03, 0x06, 0x18, 0x16, 0x06, 0x20, 0x33, 
-	0x06, 0x40, 0x6b, 0x80, 0x1c, 0x01, 0x20, 0x04, 
-	0x40, 0x08, 0xd0, 0x05, 0x20, 0xd0, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xe0, 0x17, 
-	0x23, 0x04, 0x43, 0xdb, 0x40, 0x19, 0x01, 0x08, 
-	0x4b, 0x0a, 0x68, 0x1b, 0x18, 0xc2, 0x60, 0x15, 
-	0x60, 0x54, 0x2e, 0xfe, 0xd0, 0x04, 0x20, 0x01, 
-	0x40, 0xb0, 0x60, 0xd0, 0x4b, 0x06, 0x43, 0x1f, 
-	0x60, 0x97, 0x20, 0x01, 0x40, 0x88, 0x23, 0x33, 
-	0x06, 0x5b, 0x63, 0x58, 0x20, 0x00, 0xe7, 0xe2, 
-	0xe7, 0xe1, 0x00, 0x00, 0x2e, 0x08, 0x20, 0x0c, 
-	0x80, 0x00, 0x00, 0x00, 0xb4, 0xb0, 0x1c, 0x01, 
-	0x06, 0x08, 0x16, 0x04, 0x4f, 0x0c, 0x22, 0x00, 
-	0x20, 0x00, 0x28, 0x04, 0xd3, 0x02, 0xe0, 0x0b, 
-	0x30, 0x01, 0xe7, 0xfa, 0x01, 0x03, 0x19, 0xdb, 
-	0x68, 0x5b, 0x42, 0xa3, 0xd1, 0x03, 0x25, 0x01, 
-	0x40, 0x85, 0x1c, 0x2b, 0x43, 0x1a, 0xe7, 0xf3, 
-	0x23, 0x33, 0x06, 0x5b, 0x6c, 0x1b, 0x40, 0x13, 
-	0xd0, 0x00, 0xe7, 0xf9, 0xbc, 0xb0, 0x47, 0x70, 
-	0x9e, 0x00, 0x00, 0xc0, 0xe3, 0xa0, 0x14, 0x62, 
-	0xe5, 0x91, 0x10, 0x14, 0xe2, 0x01, 0x00, 0xff, 
-	0xe5, 0x9f, 0x10, 0x2c, 0xe5, 0xd1, 0x10, 0x00, 
-	0xe3, 0x51, 0x00, 0xff, 0x0a, 0x00, 0x00, 0x05, 
-	0xe5, 0x9f, 0x10, 0x1c, 0xe5, 0xd1, 0x10, 0x00, 
-	0xe3, 0xa0, 0x20, 0x01, 0xe1, 0xa0, 0x11, 0x12, 
-	0xe3, 0xa0, 0x24, 0x66, 0xe5, 0x82, 0x10, 0x10, 
-	0xe3, 0xa0, 0x14, 0x62, 0xe5, 0x81, 0x00, 0x14, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x08, 0x7c, 0x48, 
-	0x47, 0x00, 0x00, 0x00, 0x47, 0x08, 0x00, 0x00, 
-	0x47, 0x10, 0x00, 0x00, 0x47, 0x18, 0x00, 0x00, 
-	0x47, 0x20, 0x00, 0x00, 0x47, 0x28, 0x00, 0x00, 
-	0x47, 0x30, 0x00, 0x00, 0x47, 0x38, 0x00, 0x00, 
-	0x17, 0xcb, 0x40, 0x59, 0x1a, 0xc9, 0x17, 0xc2, 
-	0x40, 0x50, 0x1a, 0x80, 0xd1, 0x01, 0xf0, 0x00, 
-	0xfa, 0x07, 0xb4, 0x0c, 0x08, 0x4b, 0x1c, 0x02, 
-	0x42, 0x9a, 0xd8, 0x00, 0x00, 0x52, 0xd3, 0xfb, 
-	0x23, 0x00, 0xe0, 0x00, 0x08, 0x52, 0x42, 0x91, 
-	0x41, 0x5b, 0x42, 0x91, 0xd3, 0x00, 0x1a, 0x89, 
-	0x42, 0x82, 0xd1, 0xf7, 0x1c, 0x18, 0xbc, 0x0c, 
-	0x40, 0x5a, 0x40, 0x50, 0x1a, 0x80, 0x40, 0x59, 
-	0x1a, 0xc9, 0x47, 0x70, 0x08, 0x4b, 0x1c, 0x02, 
-	0xd1, 0x01, 0xf0, 0x00, 0xf9, 0xe9, 0x42, 0x9a, 
-	0xd8, 0x00, 0x00, 0x52, 0xd3, 0xfb, 0x23, 0x00, 
-	0xe0, 0x00, 0x08, 0x52, 0x42, 0x91, 0x41, 0x5b, 
-	0x42, 0x91, 0xd3, 0x00, 0x1a, 0x89, 0x42, 0x82, 
-	0xd1, 0xf7, 0x1c, 0x18, 0x47, 0x70, 0x00, 0x00, 
-	0x3a, 0x20, 0xd5, 0x09, 0x42, 0x53, 0x32, 0x20, 
-	0x40, 0xd0, 0x46, 0x94, 0x1c, 0x0a, 0x40, 0x9a, 
-	0x43, 0x10, 0x46, 0x62, 0x40, 0xd1, 0x47, 0x70, 
-	0x1c, 0x08, 0x40, 0xd0, 0x21, 0x00, 0x47, 0x70, 
-	0x40, 0x10, 0x40, 0x19, 0x47, 0x70, 0x00, 0x00, 
-	0x47, 0x70, 0x00, 0x00, 0x1a, 0x43, 0x42, 0x93, 
-	0xd3, 0x30, 0x46, 0x84, 0x07, 0x8b, 0xd0, 0x07, 
-	0x1e, 0x52, 0xd3, 0x29, 0x78, 0x0b, 0x70, 0x03, 
-	0x1c, 0x40, 0x1c, 0x49, 0x07, 0x8b, 0xd1, 0xf7, 
-	0x07, 0x83, 0xd1, 0x17, 0x3a, 0x10, 0xd3, 0x05, 
-	0xb4, 0xb0, 0xc9, 0xb8, 0xc0, 0xb8, 0x3a, 0x10, 
-	0xd2, 0xfb, 0xbc, 0xb0, 0x32, 0x0c, 0xd3, 0x0f, 
-	0xc9, 0x08, 0xc0, 0x08, 0x1f, 0x12, 0xd2, 0xfb, 
-	0xe0, 0x0a, 0xc9, 0x08, 0x70, 0xc3, 0x0a, 0x1b, 
-	0x70, 0x83, 0x0a, 0x1b, 0x70, 0x43, 0x0a, 0x1b, 
-	0x70, 0x03, 0x1d, 0x00, 0x1f, 0x12, 0xd2, 0xf4, 
-	0x1c, 0xd2, 0xd3, 0x05, 0x78, 0x0b, 0x70, 0x03, 
-	0x1c, 0x49, 0x1c, 0x40, 0x1e, 0x52, 0xd2, 0xf9, 
-	0x46, 0x60, 0x47, 0x70, 0x1c, 0x03, 0x43, 0x0b, 
-	0x43, 0x13, 0x07, 0x9b, 0xd1, 0x04, 0x1f, 0x12, 
-	0x58, 0x8b, 0x50, 0x83, 0xd1, 0xfb, 0x47, 0x70, 
-	0x1e, 0x52, 0x5c, 0x8b, 0x54, 0x83, 0xd1, 0xfb, 
-	0x47, 0x70, 0x00, 0x00, 0x42, 0x41, 0x46, 0x8c, 
-	0x07, 0x83, 0xd0, 0x05, 0x78, 0x03, 0x2b, 0x00, 
-	0xd0, 0x16, 0x1c, 0x40, 0x07, 0x83, 0xd1, 0xf9, 
-	0x49, 0x0a, 0xc8, 0x04, 0x09, 0xc9, 0x1a, 0x53, 
-	0x43, 0x93, 0x01, 0xc9, 0x40, 0x0b, 0xd0, 0xf8, 
-	0x1f, 0x00, 0x0e, 0x13, 0xd0, 0x08, 0x1c, 0x40, 
-	0x02, 0x13, 0x0e, 0x1b, 0xd0, 0x04, 0x1c, 0x40, 
-	0x04, 0x13, 0x0e, 0x1b, 0xd0, 0x00, 0x1c, 0x40, 
-	0x44, 0x60, 0x47, 0x70, 0x80, 0x80, 0x80, 0x80, 
-	0x46, 0x84, 0x07, 0x83, 0xd0, 0x05, 0x1e, 0x52, 
-	0xd3, 0x12, 0x70, 0x01, 0x1c, 0x40, 0x07, 0x83, 
-	0xd1, 0xf9, 0x3a, 0x08, 0xd3, 0x07, 0x02, 0x0b, 
-	0x43, 0x19, 0x04, 0x0b, 0x43, 0x19, 0x1c, 0x0b, 
-	0xc0, 0x0a, 0x3a, 0x08, 0xd2, 0xfc, 0x1d, 0xd2, 
-	0xd3, 0x02, 0x54, 0x81, 0x1e, 0x52, 0xd2, 0xfc, 
-	0x46, 0x60, 0x47, 0x70, 0x46, 0x84, 0x1c, 0x03, 
-	0x43, 0x0b, 0x07, 0x9b, 0xd1, 0x15, 0x1f, 0x12, 
-	0xd3, 0x0b, 0xb4, 0xb0, 0x4c, 0x10, 0x01, 0xe5, 
-	0xc9, 0x80, 0x1b, 0x3b, 0x43, 0xbb, 0x40, 0x2b, 
-	0xd1, 0x0f, 0xc0, 0x80, 0x1f, 0x12, 0xd2, 0xf7, 
-	0xbc, 0xb0, 0x1c, 0xd2, 0xd3, 0x11, 0x78, 0x0b, 
-	0x70, 0x03, 0x1c, 0x49, 0x1c, 0x40, 0x2b, 0x00, 
-	0xd0, 0x09, 0x1e, 0x52, 0xd2, 0xf7, 0x46, 0x60, 
-	0x47, 0x70, 0xbc, 0xb0, 0x1f, 0x09, 0x1c, 0xd2, 
-	0xe7, 0xf1, 0x70, 0x03, 0x1c, 0x40, 0x1e, 0x52, 
-	0xd2, 0xfb, 0x46, 0x60, 0x47, 0x70, 0x00, 0x00, 
-	0x01, 0x01, 0x01, 0x01, 0x1c, 0x02, 0x43, 0x0a, 
-	0x07, 0x92, 0xd1, 0x13, 0x46, 0x84, 0xb4, 0x30, 
-	0x4c, 0x0c, 0x01, 0xe5, 0xe0, 0x00, 0xc0, 0x04, 
-	0xc9, 0x04, 0x1b, 0x13, 0x43, 0x93, 0x40, 0x2b, 
-	0xd0, 0xf9, 0xe0, 0x01, 0x02, 0x12, 0x1c, 0x40, 
-	0x0e, 0x13, 0x70, 0x03, 0xd1, 0xfa, 0xbc, 0x30, 
-	0x46, 0x60, 0x47, 0x70, 0x1c, 0x03, 0x78, 0x0a, 
-	0x70, 0x1a, 0x1c, 0x49, 0x1c, 0x5b, 0x2a, 0x00, 
-	0xd1, 0xf9, 0x47, 0x70, 0x01, 0x01, 0x01, 0x01, 
-	0xb5, 0x80, 0x00, 0x43, 0x15, 0x5f, 0x43, 0xff, 
-	0x1c, 0x02, 0x0f, 0xc0, 0x07, 0xc0, 0x2f, 0x00, 
-	0xd0, 0x15, 0x43, 0x0b, 0xd0, 0x0c, 0x28, 0x00, 
-	0xd1, 0x07, 0x1c, 0x10, 0xf0, 0x00, 0xf9, 0x00, 
-	0xf0, 0x00, 0xf9, 0x9a, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x21, 0x01, 0x1c, 0x10, 0xe0, 0x11, 
-	0x21, 0x01, 0x07, 0xc8, 0xf0, 0x00, 0xfa, 0x98, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x03, 0x13, 
-	0x43, 0x0b, 0xd1, 0x05, 0x28, 0x00, 0xd1, 0x03, 
-	0x1c, 0x10, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x21, 0x01, 0x07, 0xc8, 0xf0, 0x00, 0xfa, 0x82, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x46, 0xbc, 0xb4, 0x60, 0x1c, 0x03, 0x43, 0x08, 
-	0x07, 0x80, 0xd1, 0x1b, 0x1f, 0x12, 0xd3, 0x0b, 
-	0x4e, 0x0f, 0xcb, 0x01, 0xc9, 0x80, 0x1b, 0xc0, 
-	0xd1, 0x09, 0x1b, 0xbd, 0x43, 0xbd, 0x01, 0xf7, 
-	0x40, 0x3d, 0xd1, 0x04, 0x1f, 0x12, 0xd2, 0xf4, 
-	0x1c, 0xd2, 0xd3, 0x0e, 0xe0, 0x02, 0x1f, 0x1b, 
-	0x1f, 0x09, 0x1c, 0xd2, 0x78, 0x18, 0x78, 0x0f, 
-	0x1b, 0xc0, 0xd1, 0x06, 0x2f, 0x00, 0xd0, 0x04, 
-	0x1c, 0x5b, 0x1c, 0x49, 0x1e, 0x52, 0xd2, 0xf5, 
-	0x20, 0x00, 0xbc, 0x60, 0x46, 0x67, 0x47, 0x70, 
-	0x01, 0x01, 0x01, 0x01, 0x47, 0x78, 0x00, 0x00, 
-	0xe2, 0x10, 0xc1, 0x02, 0x12, 0x60, 0x00, 0x00, 
-	0x03, 0x30, 0x00, 0x00, 0x03, 0xa0, 0x10, 0x00, 
-	0x01, 0x2f, 0xff, 0x1e, 0xe3, 0x8c, 0xc1, 0x01, 
-	0xe3, 0x8c, 0xc6, 0x1e, 0xe1, 0xb0, 0x28, 0x20, 
-	0x01, 0xa0, 0x08, 0x00, 0x02, 0x4c, 0xc4, 0x01, 
-	0xe1, 0xb0, 0x2c, 0x20, 0x01, 0xa0, 0x04, 0x00, 
-	0x02, 0x4c, 0xc5, 0x02, 0xe1, 0xb0, 0x2e, 0x20, 
-	0x01, 0xa0, 0x02, 0x00, 0x02, 0x4c, 0xc5, 0x01, 
-	0xe1, 0xb0, 0x2f, 0x20, 0x01, 0xa0, 0x01, 0x00, 
-	0x02, 0x4c, 0xc6, 0x02, 0xe1, 0xb0, 0x2f, 0xa0, 
-	0x01, 0xa0, 0x00, 0x80, 0x02, 0x4c, 0xc6, 0x01, 
-	0xe1, 0xa0, 0x00, 0x80, 0xe1, 0xa0, 0x1a, 0x00, 
-	0xe1, 0x8c, 0x06, 0x20, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x22, 0x01, 0x07, 0xd2, 0x40, 0x50, 0x47, 0x70, 
-	0xe2, 0x20, 0x01, 0x02, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x00, 0x40, 0x08, 0x40, 0x47, 0x70, 0x00, 0x00, 
-	0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0xc4, 0xff, 
-	0xe3, 0x8c, 0xc6, 0x0e, 0xe1, 0x5c, 0x00, 0x82, 
-	0x9a, 0x00, 0x00, 0x0a, 0xe1, 0xb0, 0x00, 0x80, 
-	0x03, 0x31, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x0a, 
-	0x3a, 0x00, 0x00, 0x12, 0xe1, 0x50, 0x00, 0x0c, 
-	0x03, 0x51, 0x00, 0x00, 0x8a, 0x00, 0x01, 0x0c, 
-	0xe1, 0xb0, 0x20, 0x82, 0x8a, 0x00, 0x00, 0x18, 
-	0xe3, 0xa0, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x03, 0x53, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xf2, 
-	0xea, 0x00, 0x01, 0x09, 0xe1, 0x50, 0x00, 0x0c, 
-	0x03, 0x51, 0x00, 0x00, 0x8a, 0x00, 0x01, 0x02, 
-	0xe1, 0xb0, 0x20, 0x82, 0x33, 0xa0, 0x00, 0x01, 
-	0x23, 0xa0, 0x00, 0x00, 0x03, 0x33, 0x00, 0x00, 
-	0x03, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe1, 0x50, 0x00, 0x0c, 0x03, 0x51, 0x00, 0x00, 
-	0x8a, 0x00, 0x00, 0xf9, 0xe1, 0xb0, 0x20, 0x82, 
-	0x23, 0xa0, 0x00, 0x00, 0x21, 0x2f, 0xff, 0x1e, 
-	0xe1, 0x50, 0x00, 0x02, 0x01, 0x51, 0x00, 0x03, 
-	0x33, 0xa0, 0x00, 0x01, 0x23, 0xa0, 0x00, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x02, 
-	0x01, 0x51, 0x00, 0x03, 0x83, 0xa0, 0x00, 0x01, 
-	0x93, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0xc0, 0x28, 
-	0xe8, 0xac, 0x7f, 0xff, 0xe2, 0x8f, 0x00, 0x0c, 
-	0xe2, 0x4c, 0x10, 0x3c, 0xe2, 0x4e, 0xe0, 0x04, 
-	0xe5, 0x8c, 0xe0, 0x00, 0xea, 0x00, 0x01, 0x91, 
-	0x80, 0x00, 0x00, 0x20, 0x44, 0x69, 0x76, 0x69, 
-	0x64, 0x65, 0x20, 0x62, 0x79, 0x20, 0x7a, 0x65, 
-	0x72, 0x6f, 0x00, 0x00, 0x2e, 0x08, 0x21, 0x50, 
-	0xb5, 0xf0, 0xb0, 0x8f, 0xf0, 0x00, 0xfd, 0x01, 
-	0x1c, 0x04, 0x1c, 0x16, 0x1c, 0x0f, 0xf0, 0x00, 
-	0xfd, 0x3b, 0x90, 0x03, 0x91, 0x04, 0x92, 0x05, 
-	0xa3, 0x3e, 0xcb, 0x0c, 0x1c, 0x20, 0x1c, 0x39, 
-	0xf0, 0x00, 0xfd, 0xae, 0x49, 0x3d, 0x22, 0x00, 
-	0x4f, 0x3d, 0x28, 0x00, 0xd0, 0x0a, 0x48, 0x3d, 
-	0xab, 0x03, 0xf0, 0x00, 0xfd, 0xfb, 0x90, 0x0c, 
-	0x91, 0x0d, 0x92, 0x0e, 0xaa, 0x03, 0xca, 0x07, 
-	0x1c, 0x3b, 0xe0, 0x08, 0x48, 0x38, 0xab, 0x03, 
-	0x3e, 0x01, 0xf0, 0x00, 0xfd, 0xef, 0x90, 0x0c, 
-	0x91, 0x0d, 0x92, 0x0e, 0x1c, 0x3b, 0xf0, 0x00, 
-	0xfe, 0x03, 0x1c, 0x3b, 0xf0, 0x00, 0xfd, 0xe6, 
-	0xab, 0x0c, 0xf0, 0x00, 0xfe, 0x17, 0x90, 0x09, 
-	0x91, 0x0a, 0x92, 0x0b, 0xf0, 0x00, 0xfe, 0x48, 
-	0x1c, 0x04, 0x1c, 0x15, 0x1c, 0x0f, 0x4a, 0x2d, 
-	0xb4, 0x04, 0x23, 0x03, 0x1c, 0x2a, 0xf0, 0x00, 
-	0xfe, 0x5b, 0x90, 0x01, 0x91, 0x02, 0x92, 0x03, 
-	0xb0, 0x01, 0x4a, 0x29, 0xb4, 0x04, 0x23, 0x03, 
-	0x1c, 0x20, 0x1c, 0x39, 0x1c, 0x2a, 0xf0, 0x00, 
-	0xfe, 0x65, 0xb0, 0x01, 0x46, 0x6b, 0xf0, 0x00, 
-	0xfd, 0xf9, 0xab, 0x09, 0xf0, 0x00, 0xfd, 0xdc, 
-	0xab, 0x09, 0xf0, 0x00, 0xfd, 0xbf, 0x2e, 0x00, 
-	0xd0, 0x2c, 0xb0, 0x86, 0xab, 0x0c, 0xc3, 0x07, 
-	0x1c, 0x30, 0xf0, 0x00, 0xfe, 0x69, 0x1c, 0x0c, 
-	0x1c, 0x05, 0x1c, 0x17, 0x4b, 0x1b, 0x1c, 0x1e, 
-	0xf0, 0x00, 0xfd, 0xca, 0x90, 0x03, 0x91, 0x04, 
-	0x92, 0x05, 0xab, 0x0c, 0xf0, 0x00, 0xfd, 0xaa, 
-	0x90, 0x06, 0x91, 0x07, 0x92, 0x08, 0xab, 0x03, 
-	0xf0, 0x00, 0xfe, 0x86, 0xab, 0x0c, 0xf0, 0x00, 
-	0xfe, 0x83, 0x90, 0x00, 0x91, 0x01, 0x92, 0x02, 
-	0x1c, 0x28, 0x1c, 0x21, 0x1c, 0x3a, 0x1d, 0xf3, 
-	0x33, 0x05, 0xf0, 0x00, 0xfd, 0xb1, 0x46, 0x6b, 
-	0xf0, 0x00, 0xfd, 0x94, 0xab, 0x06, 0xf0, 0x00, 
-	0xfd, 0x91, 0xb0, 0x06, 0xb0, 0x0f, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x3f, 0xe6, 0xa0, 0x9e, 
-	0x66, 0x7f, 0x3b, 0xcd, 0x80, 0x00, 0x00, 0x00, 
-	0x2e, 0x03, 0x3b, 0x10, 0x80, 0x00, 0x3f, 0xff, 
-	0x80, 0x00, 0x3f, 0xfe, 0x2e, 0x03, 0x3a, 0xbc, 
-	0x2e, 0x03, 0x3a, 0xe0, 0x2e, 0x03, 0x3a, 0xa4, 
-	0x47, 0x78, 0x00, 0x00, 0xe1, 0xa0, 0x38, 0x80, 
-	0xe1, 0xa0, 0x38, 0xa3, 0xe1, 0xc0, 0x00, 0x03, 
-	0xe1, 0xd1, 0xc0, 0x80, 0x5a, 0x00, 0x00, 0x0c, 
-	0xe2, 0x53, 0x3b, 0x0f, 0x4a, 0x00, 0x00, 0x13, 
-	0x12, 0x83, 0xc0, 0x01, 0x13, 0x5c, 0x0b, 0x02, 
-	0xaa, 0x00, 0x00, 0x0d, 0xe1, 0xb0, 0xc5, 0xa2, 
-	0x2a, 0x00, 0x00, 0x58, 0xe1, 0x80, 0x0a, 0x03, 
-	0xe3, 0xc1, 0x11, 0x02, 0xe1, 0x80, 0x05, 0xa1, 
-	0xe1, 0x8c, 0x1a, 0x81, 0xe3, 0xa0, 0x30, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe3, 0x10, 0x01, 0x01, 
-	0x1a, 0x00, 0x00, 0x40, 0xe2, 0x00, 0x01, 0x02, 
-	0xe3, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x30, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe3, 0x33, 0x00, 0x00, 
-	0x13, 0xa0, 0x33, 0x19, 0x11, 0x2f, 0xff, 0x1e, 
-	0xe2, 0x93, 0x30, 0x34, 0x0a, 0x00, 0x00, 0x31, 
-	0x42, 0x00, 0x01, 0x02, 0x43, 0xa0, 0x10, 0x00, 
-	0x43, 0xa0, 0x30, 0x00, 0x41, 0x2f, 0xff, 0x1e, 
-	0xe2, 0x53, 0x30, 0x20, 0x0a, 0x00, 0x00, 0x13, 
-	0xba, 0x00, 0x00, 0x1a, 0xe1, 0xb0, 0xc3, 0x12, 
-	0x4a, 0x00, 0x00, 0x05, 0xe2, 0x63, 0xc0, 0x20, 
-	0xe1, 0x80, 0x0c, 0x31, 0xe1, 0xa0, 0x2c, 0x32, 
-	0xe1, 0x82, 0x13, 0x11, 0xe3, 0xa0, 0x30, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0x96, 0xc0, 0x8c, 
-	0xe2, 0x63, 0xc0, 0x20, 0xe1, 0x80, 0x0c, 0x31, 
-	0xe1, 0xa0, 0x2c, 0x32, 0xe1, 0x82, 0x13, 0x11, 
-	0xe3, 0xa0, 0x30, 0x00, 0x03, 0x11, 0x00, 0x01, 
-	0x01, 0x2f, 0xff, 0x1e, 0xe2, 0x91, 0x10, 0x01, 
-	0x22, 0x80, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe3, 0xa0, 0x30, 0x00, 0xe3, 0x32, 0x01, 0x02, 
-	0x41, 0x2f, 0xff, 0x1e, 0x03, 0x11, 0x00, 0x01, 
-	0x01, 0x2f, 0xff, 0x1e, 0xe2, 0x91, 0x10, 0x01, 
-	0x22, 0x80, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe2, 0x83, 0x30, 0x20, 0xe1, 0xb0, 0xc3, 0x11, 
-	0x4a, 0x00, 0x00, 0x04, 0xe2, 0x63, 0xc0, 0x20, 
-	0xe1, 0xa0, 0x1c, 0x31, 0xe2, 0x00, 0x01, 0x02, 
-	0xe3, 0xa0, 0x30, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe3, 0x3c, 0x01, 0x02, 0x01, 0x92, 0xc0, 0x06, 
-	0xe2, 0x63, 0xc0, 0x20, 0xe1, 0xa0, 0x1c, 0x31, 
-	0x03, 0x11, 0x00, 0x01, 0x12, 0x81, 0x10, 0x01, 
-	0xe3, 0xa0, 0x30, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe3, 0x31, 0x01, 0x02, 0x03, 0x32, 0x00, 0x00, 
-	0x03, 0xa0, 0x10, 0x00, 0x13, 0xa0, 0x10, 0x01, 
-	0xe3, 0xa0, 0x30, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe3, 0x10, 0x02, 0x02, 0x1a, 0x00, 0x00, 0x0b, 
-	0xe3, 0xa0, 0x30, 0x00, 0xe3, 0x31, 0x00, 0x00, 
-	0x11, 0xb0, 0x10, 0x81, 0x43, 0xe0, 0x00, 0x00, 
-	0x41, 0x2f, 0xff, 0x1e, 0x03, 0x32, 0x00, 0x00, 
-	0x13, 0xa0, 0x34, 0x61, 0x11, 0x2f, 0xff, 0x1e, 
-	0xe2, 0x00, 0x01, 0x02, 0xe3, 0x80, 0x02, 0x07, 
-	0xe3, 0x80, 0x06, 0xff, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe1, 0xa0, 0x30, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe3, 0xc1, 0x11, 0x02, 0xe1, 0xa0, 0xcb, 0x02, 
-	0xe1, 0x9c, 0xc0, 0x06, 0xe2, 0x00, 0xc1, 0x02, 
-	0xe1, 0xa0, 0x0a, 0x03, 0xe1, 0x80, 0x05, 0xa1, 
-	0xe1, 0xa0, 0x1a, 0x81, 0xe1, 0x81, 0x15, 0xa2, 
-	0xe3, 0xa0, 0x30, 0x00, 0x0a, 0x00, 0x00, 0x06, 
-	0xe2, 0x91, 0x10, 0x01, 0x22, 0x80, 0x00, 0x01, 
-	0xe2, 0x90, 0x26, 0x01, 0xe1, 0x80, 0x00, 0x0c, 
-	0x51, 0x2f, 0xff, 0x1e, 0xe3, 0xa0, 0x33, 0x19, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x03, 0x11, 0x00, 0x01, 
-	0x01, 0x80, 0x00, 0x0c, 0x01, 0x2f, 0xff, 0x1e, 
-	0xe2, 0x91, 0x10, 0x01, 0x22, 0x80, 0x00, 0x01, 
-	0xe2, 0x90, 0x26, 0x01, 0xe1, 0x80, 0x00, 0x0c, 
-	0x51, 0x2f, 0xff, 0x1e, 0xe3, 0xa0, 0x33, 0x19, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, 
-	0xe3, 0xa0, 0x20, 0x01, 0xea, 0x00, 0x00, 0x01, 
-	0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0x20, 0x02, 
-	0xe2, 0x00, 0x31, 0x02, 0xe5, 0x9f, 0x00, 0x18, 
-	0xe5, 0x80, 0x20, 0x00, 0xe3, 0x31, 0x00, 0x00, 
-	0x03, 0xa0, 0x00, 0x00, 0x15, 0x9f, 0x00, 0x0c, 
-	0x18, 0x90, 0x00, 0x03, 0xe1, 0x80, 0x00, 0x03, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x08, 0x20, 0xb0, 
-	0x2e, 0x08, 0x20, 0xbc, 0xe3, 0x10, 0x06, 0x01, 
-	0x13, 0xa0, 0x00, 0x00, 0x11, 0x2f, 0xff, 0x1e, 
-	0xea, 0x00, 0x00, 0x0a, 0xe3, 0x12, 0x07, 0x02, 
-	0x0a, 0x00, 0x00, 0x08, 0xe1, 0x5c, 0x00, 0x80, 
-	0x83, 0xa0, 0x00, 0x00, 0x81, 0x2f, 0xff, 0x1e, 
-	0x03, 0x51, 0x00, 0x00, 0x03, 0xa0, 0x00, 0x00, 
-	0x01, 0x2f, 0xff, 0x1e, 0xe3, 0x10, 0x07, 0x02, 
-	0x13, 0xa0, 0x00, 0x00, 0x11, 0x2f, 0xff, 0x1e, 
-	0xe3, 0xa0, 0x35, 0x06, 0xea, 0x00, 0x04, 0xee, 
-	0xe1, 0x2f, 0xff, 0x1f, 0xea, 0x00, 0x00, 0x3e, 
-	0xe5, 0x9f, 0x04, 0x5c, 0xe3, 0x50, 0x00, 0x00, 
-	0x0a, 0x00, 0x00, 0x02, 0xe3, 0xa0, 0x00, 0x20, 
-	0xe3, 0xa0, 0x10, 0x01, 0xef, 0x12, 0x34, 0x56, 
-	0xe5, 0x9f, 0x04, 0x48, 0xe3, 0x50, 0x00, 0x00, 
-	0x0a, 0x00, 0x00, 0x05, 0xe5, 0x90, 0x10, 0x00, 
-	0xe5, 0x9f, 0x04, 0x3c, 0xe5, 0x90, 0x30, 0x00, 
-	0xe5, 0x9f, 0x04, 0x38, 0xe5, 0x90, 0xd0, 0x00, 
-	0xea, 0x00, 0x00, 0x0b, 0xe3, 0xa0, 0x00, 0x16, 
-	0xe5, 0x9f, 0x44, 0x18, 0xe2, 0x84, 0x20, 0xa8, 
-	0xe2, 0x84, 0x10, 0xa4, 0xe5, 0x81, 0x20, 0x00, 
-	0xef, 0x12, 0x34, 0x56, 0xe2, 0x84, 0x00, 0xa8, 
-	0xe5, 0x90, 0xd0, 0x08, 0xe5, 0x90, 0x30, 0x04, 
-	0xe5, 0x90, 0x10, 0x00, 0xe3, 0x51, 0x00, 0x00, 
-	0x05, 0x9f, 0x14, 0x04, 0xe2, 0x8f, 0x00, 0x10, 
-	0xeb, 0x00, 0x00, 0x36, 0xe5, 0x9f, 0x03, 0xfc, 
-	0xe5, 0x9f, 0x33, 0xfc, 0xeb, 0x00, 0x00, 0x12, 
-	0xea, 0x00, 0x00, 0x4e, 0x2e, 0x00, 0x04, 0x04, 
-	0x2e, 0x03, 0x3b, 0xfc, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x00, 
-	0xe3, 0x1c, 0x00, 0x01, 0x1a, 0x00, 0x00, 0x03, 
-	0xe1, 0xa0, 0xe0, 0x0f, 0xe1, 0x2f, 0xff, 0x1c, 
-	0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe3, 0x8f, 0xe0, 0x01, 0xe1, 0x2f, 0xff, 0x1c, 
-	0x47, 0x78, 0x00, 0x00, 0xe8, 0xbd, 0x40, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x1c, 0x02, 0x1c, 0x13, 
-	0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x00, 
-	0xe3, 0x13, 0x00, 0x01, 0x1a, 0x00, 0x00, 0x03, 
-	0xe1, 0xa0, 0xe0, 0x0f, 0xe1, 0x2f, 0xff, 0x13, 
-	0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe3, 0x8f, 0xe0, 0x01, 0xe1, 0x2f, 0xff, 0x13, 
-	0x47, 0x78, 0x00, 0x00, 0xe8, 0xbd, 0x40, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe5, 0x9f, 0xc0, 0x44, 
-	0xe8, 0x8c, 0xff, 0xff, 0xe2, 0x8f, 0x00, 0x00, 
-	0xea, 0x00, 0x0c, 0xac, 0x00, 0x80, 0x0e, 0x09, 
-	0x54, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x64, 
-	0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x6f, 0x6e, 
-	0x6c, 0x79, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x6f, 
-	0x6e, 0x20, 0x61, 0x20, 0x54, 0x68, 0x75, 0x6d, 
-	0x62, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 
-	0x69, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x72, 0x6f, 
-	0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x00, 0x00, 
-	0x2e, 0x08, 0x21, 0x50, 0x47, 0x78, 0x00, 0x00, 
-	0xe5, 0x9f, 0x73, 0x08, 0xe5, 0x87, 0x00, 0x00, 
-	0xe2, 0x8f, 0x50, 0xc9, 0xe2, 0x85, 0x5c, 0x02, 
-	0xe5, 0x87, 0x50, 0x10, 0xe2, 0x8f, 0x50, 0xe9, 
-	0xe2, 0x85, 0x5c, 0x02, 0xe5, 0x87, 0x50, 0x14, 
-	0xe1, 0xa0, 0x80, 0x0e, 0xe2, 0x87, 0x00, 0x04, 
-	0xeb, 0x00, 0x02, 0x39, 0xe9, 0x2d, 0x01, 0x00, 
-	0xe3, 0xa0, 0x00, 0x00, 0xe5, 0xc7, 0x00, 0x2c, 
-	0xe2, 0x87, 0x00, 0x04, 0xeb, 0x00, 0x00, 0xce, 
-	0xe3, 0xa0, 0x40, 0x00, 0xe2, 0x8d, 0x00, 0x04, 
-	0xe5, 0x97, 0x10, 0x00, 0xe3, 0xa0, 0x30, 0x00, 
-	0xe5, 0xc7, 0x30, 0x2e, 0xe2, 0x81, 0x30, 0x08, 
-	0xe8, 0x91, 0x00, 0x06, 0xe5, 0x9f, 0xc2, 0xcc, 
-	0xeb, 0xff, 0xff, 0xb7, 0xe8, 0xbd, 0x40, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, 
-	0xe3, 0xa0, 0x80, 0x01, 0xea, 0x00, 0x00, 0x01, 
-	0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0x80, 0x00, 
-	0xe1, 0xa0, 0x70, 0x00, 0xeb, 0x00, 0x02, 0x31, 
-	0xe1, 0xa0, 0x00, 0x08, 0xeb, 0x00, 0x00, 0x0d, 
-	0xe1, 0xa0, 0x20, 0x07, 0xe3, 0x52, 0x00, 0x00, 
-	0x12, 0x8f, 0x00, 0x08, 0x15, 0x9f, 0x10, 0x00, 
-	0xeb, 0x00, 0x0c, 0x6d, 0x41, 0x42, 0x45, 0x58, 
-	0x00, 0x80, 0x0e, 0x06, 0x52, 0x65, 0x74, 0x75, 
-	0x72, 0x6e, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 
-	0x74, 0x6f, 0x6f, 0x20, 0x6c, 0x61, 0x72, 0x67, 
-	0x65, 0x00, 0x00, 0x00, 0xe3, 0xa0, 0x00, 0x00, 
-	0xe9, 0x2d, 0x40, 0x00, 0xe5, 0x9f, 0x32, 0x60, 
-	0xeb, 0xff, 0xff, 0xa9, 0xe8, 0xbd, 0x40, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, 
-	0xe5, 0x9f, 0xc2, 0x28, 0xe5, 0xdc, 0x00, 0x2c, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0xa0, 0x30, 0x00, 
-	0xe5, 0x9f, 0x12, 0x14, 0xe4, 0x81, 0xf0, 0x04, 
-	0xe8, 0xb3, 0x00, 0x04, 0xe8, 0xa1, 0x00, 0x04, 
-	0xe4, 0xd3, 0x20, 0x01, 0xe4, 0xc1, 0x20, 0x01, 
-	0xe3, 0x52, 0x00, 0x00, 0x1a, 0xff, 0xff, 0xfb, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0x47, 0x78, 0x00, 0x00, 
-	0xe1, 0xa0, 0x80, 0x01, 0xeb, 0xff, 0xff, 0xf2, 
-	0xe5, 0x9f, 0x71, 0xe8, 0xe5, 0xd7, 0x20, 0x2f, 
-	0xe3, 0x52, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x2c, 
-	0xe3, 0xa0, 0x20, 0x01, 0xe5, 0xc7, 0x20, 0x2f, 
-	0xeb, 0x00, 0x00, 0x3b, 0xe1, 0xa0, 0x10, 0x08, 
-	0xeb, 0x00, 0x01, 0xfa, 0xe3, 0x50, 0x00, 0x00, 
-	0x0a, 0x00, 0x00, 0x1b, 0xe2, 0x88, 0xb0, 0x40, 
-	0xe9, 0x3b, 0x01, 0xef, 0xe9, 0x2c, 0x01, 0xef, 
-	0xe9, 0x3b, 0x01, 0xef, 0xe9, 0x2c, 0x01, 0xef, 
-	0xe5, 0x9f, 0x71, 0xa8, 0xe5, 0x97, 0x40, 0xa0, 
-	0xe3, 0x84, 0x40, 0x80, 0xe1, 0x21, 0xf0, 0x04, 
-	0xe1, 0xa0, 0xd0, 0x0c, 0xe1, 0xa0, 0xb0, 0x04, 
-	0xe5, 0x9f, 0x01, 0x8c, 0xe5, 0x90, 0x00, 0x04, 
-	0xe1, 0xa0, 0x10, 0x0d, 0xeb, 0x00, 0x02, 0x1a, 
-	0xe3, 0xa0, 0x10, 0x00, 0xe5, 0xc7, 0x10, 0x2f, 
-	0xe1, 0xa0, 0x10, 0x0d, 0xe3, 0x54, 0x00, 0x10, 
-	0x1a, 0x00, 0x00, 0x02, 0xe3, 0xa0, 0x00, 0x17, 
-	0xef, 0x12, 0x34, 0x56, 0xe3, 0x21, 0xf0, 0x93, 
-	0xe1, 0xa0, 0x00, 0x00, 0xe2, 0x81, 0xe0, 0x3c, 
-	0xe9, 0x5e, 0x7f, 0xff, 0xe1, 0xa0, 0x00, 0x00, 
-	0xe8, 0xde, 0x80, 0x00, 0xe2, 0x8f, 0x00, 0x00, 
-	0xea, 0x00, 0x0c, 0x2a, 0x00, 0x80, 0x0e, 0x07, 
-	0x4e, 0x6f, 0x20, 0x53, 0x74, 0x61, 0x63, 0x6b, 
-	0x20, 0x66, 0x6f, 0x72, 0x20, 0x54, 0x72, 0x61, 
-	0x70, 0x20, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 
-	0x72, 0x00, 0x00, 0x00, 0xe2, 0x8f, 0x00, 0x00, 
-	0xea, 0x00, 0x0c, 0x20, 0x00, 0x80, 0x0e, 0x00, 
-	0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 
-	0x65, 0x20, 0x54, 0x72, 0x61, 0x70, 0x00, 0x00, 
-	0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0xc1, 0x04, 
-	0xe3, 0xa0, 0x00, 0x00, 0xe5, 0xcc, 0x00, 0x2f, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, 
-	0xe5, 0x9f, 0x00, 0xf0, 0xe5, 0x90, 0x00, 0x00, 
-	0xe5, 0x90, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0x00, 0xdc, 
-	0xe2, 0x80, 0x00, 0x04, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0xc0, 0xcc, 
-	0xe3, 0x50, 0x0b, 0x02, 0x33, 0xa0, 0x0b, 0x02, 
-	0xe2, 0x8c, 0xc0, 0x04, 0xe9, 0x9c, 0x00, 0x0c, 
-	0xe0, 0x53, 0x31, 0x00, 0x21, 0x53, 0x00, 0x02, 
-	0x3a, 0x00, 0x00, 0x03, 0xe5, 0x81, 0x20, 0x00, 
-	0xe0, 0x82, 0x21, 0x00, 0xe5, 0x8c, 0x20, 0x04, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe9, 0x2d, 0x50, 0x03, 
-	0xe1, 0xa0, 0x10, 0x0c, 0xeb, 0x00, 0x00, 0x44, 
-	0xe3, 0x50, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x0d, 
-	0xe5, 0x9d, 0xc0, 0x08, 0xe9, 0x9c, 0x40, 0x04, 
-	0xe1, 0x5e, 0x00, 0x01, 0x10, 0x4e, 0x30, 0x02, 
-	0xe0, 0x81, 0xe0, 0x00, 0x11, 0xa0, 0x00, 0x02, 
-	0x11, 0xa0, 0x20, 0x01, 0xe9, 0x8c, 0x40, 0x04, 
-	0x13, 0x53, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x03, 
-	0xe8, 0xbd, 0x50, 0x03, 0xe5, 0x81, 0x00, 0x00, 
-	0xe1, 0xa0, 0x01, 0x43, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe8, 0xbd, 0x50, 0x03, 0xe9, 0x9c, 0x00, 0x0c, 
-	0xe0, 0x43, 0x00, 0x02, 0xe1, 0xb0, 0x01, 0x40, 
-	0x03, 0xa0, 0x20, 0x00, 0x15, 0x8c, 0x30, 0x04, 
-	0xe5, 0x81, 0x20, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe2, 0x80, 0x20, 0x03, 
-	0xe3, 0xc2, 0x20, 0x03, 0xe5, 0x9f, 0xc0, 0x24, 
-	0xe2, 0x8c, 0xc0, 0x08, 0xe8, 0x9c, 0x00, 0x03, 
-	0xe0, 0x90, 0x20, 0x02, 0x31, 0x52, 0x00, 0x01, 
-	0x35, 0x8c, 0x20, 0x00, 0x23, 0xa0, 0x00, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x08, 0x20, 0xcc, 
-	0x2e, 0x08, 0x20, 0x98, 0x00, 0x00, 0x00, 0x00, 
-	0x2e, 0x02, 0x5d, 0xa4, 0x2e, 0x02, 0x5d, 0xa0, 
-	0x2e, 0x02, 0x5d, 0x9c, 0x2e, 0x08, 0x99, 0xfc, 
-	0x2e, 0x00, 0x1c, 0x39, 0x2e, 0x01, 0xa1, 0x35, 
-	0x2e, 0x01, 0x9f, 0xe9, 0x2e, 0x01, 0xa0, 0xa9, 
-	0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0x00, 0x04, 
-	0xe5, 0x90, 0x00, 0x00, 0xe2, 0x00, 0x04, 0xff, 
-	0xe3, 0x50, 0x04, 0xea, 0x03, 0xa0, 0x00, 0x01, 
-	0x13, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe2, 0x40, 0x0b, 0x05, 
-	0xe3, 0x50, 0x0b, 0x1b, 0x33, 0xa0, 0x00, 0x01, 
-	0x23, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0x00, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, 
-	0xe2, 0x8f, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 
-	0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 
-	0x00, 0x02, 0x00, 0x00, 0x42, 0x72, 0x61, 0x6e, 
-	0x63, 0x68, 0x20, 0x54, 0x68, 0x72, 0x6f, 0x75, 
-	0x67, 0x68, 0x20, 0x5a, 0x65, 0x72, 0x6f, 0x00, 
-	0x00, 0x02, 0x00, 0x01, 0x55, 0x6e, 0x64, 0x65, 
-	0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x49, 0x6e, 
-	0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 
-	0x6e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 
-	0x55, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 
-	0x64, 0x20, 0x53, 0x57, 0x49, 0x20, 0x49, 0x6e, 
-	0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 
-	0x6e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 
-	0x50, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 
-	0x20, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x00, 0x00, 
-	0x00, 0x02, 0x00, 0x04, 0x44, 0x61, 0x74, 0x61, 
-	0x20, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x00, 0x00, 
-	0x00, 0x02, 0x00, 0x05, 0x41, 0x64, 0x64, 0x72, 
-	0x65, 0x73, 0x73, 0x20, 0x45, 0x78, 0x63, 0x65, 
-	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 
-	0x00, 0x02, 0x00, 0x06, 0x55, 0x6e, 0x68, 0x61, 
-	0x6e, 0x64, 0x6c, 0x65, 0x64, 0x20, 0x49, 0x6e, 
-	0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x00, 
-	0x00, 0x02, 0x00, 0x07, 0x55, 0x6e, 0x68, 0x61, 
-	0x6e, 0x64, 0x6c, 0x65, 0x64, 0x20, 0x46, 0x61, 
-	0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 
-	0x72, 0x75, 0x70, 0x74, 0x00, 0x00, 0x00, 0x00, 
-	0x2e, 0x01, 0x99, 0x2c, 0x2e, 0x01, 0x99, 0x44, 
-	0x2e, 0x01, 0x99, 0x60, 0x2e, 0x01, 0x99, 0x80, 
-	0x2e, 0x01, 0x99, 0x94, 0x2e, 0x01, 0x99, 0xa4, 
-	0x2e, 0x01, 0x99, 0xbc, 0x2e, 0x01, 0x99, 0xd4, 
-	0xe2, 0x4f, 0x20, 0x28, 0xe7, 0x92, 0x01, 0x00, 
-	0xea, 0xff, 0xff, 0x1c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xb5, 0x04, 0xf0, 0x00, 
-	0xf8, 0x04, 0xbc, 0x08, 0x60, 0x1a, 0xbc, 0x08, 
-	0x47, 0x18, 0x47, 0x78, 0xe1, 0xb0, 0x00, 0x80, 
-	0x03, 0x31, 0x00, 0x00, 0x01, 0xa0, 0x00, 0x60, 
-	0x03, 0xa0, 0x20, 0x00, 0x01, 0x2f, 0xff, 0x1e, 
-	0xe1, 0xa0, 0x2a, 0xa0, 0xe1, 0xc0, 0x0a, 0x82, 
-	0xe1, 0xa0, 0x00, 0x60, 0xe3, 0x32, 0x00, 0x00, 
-	0xe2, 0x42, 0x2c, 0x03, 0xe2, 0x42, 0x20, 0xfe, 
-	0x0a, 0x00, 0x00, 0x06, 0xe3, 0x80, 0x04, 0x3f, 
-	0xe3, 0x80, 0x06, 0x0e, 0xe2, 0x22, 0x3b, 0x01, 
-	0xe3, 0x33, 0x00, 0x01, 0x11, 0x2f, 0xff, 0x1e, 
-	0xe3, 0xa0, 0x10, 0x01, 0xea, 0xff, 0xfe, 0x39, 
-	0xe2, 0x00, 0xc1, 0x02, 0xe1, 0xa0, 0x06, 0x00, 
-	0xe2, 0x42, 0x20, 0x01, 0xe1, 0xb0, 0x00, 0x80, 
-	0x4a, 0x00, 0x00, 0x02, 0xe1, 0xb0, 0x10, 0x81, 
-	0x23, 0x80, 0x0a, 0x01, 0xea, 0xff, 0xff, 0xf9, 
-	0xe1, 0xa0, 0x04, 0xc0, 0xe3, 0xc0, 0x05, 0x01, 
-	0xe1, 0x8c, 0x01, 0x20, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe1, 0xb0, 0xc0, 0x80, 
-	0x03, 0x31, 0x00, 0x00, 0xe1, 0xa0, 0x35, 0x0c, 
-	0xe1, 0xa0, 0x0a, 0x2c, 0xe1, 0xa0, 0x25, 0x81, 
-	0xe1, 0x83, 0x1a, 0xa1, 0x12, 0x80, 0x0b, 0x1e, 
-	0xe1, 0xa0, 0x00, 0x60, 0x13, 0x81, 0x11, 0x02, 
-	0xe1, 0xb0, 0xca, 0xcc, 0x0a, 0x00, 0x00, 0x02, 
-	0xe3, 0x7c, 0x00, 0x01, 0x03, 0x80, 0x01, 0x01, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe3, 0x11, 0x01, 0x02, 
-	0x01, 0x2f, 0xff, 0x1e, 0xe3, 0xd1, 0x11, 0x02, 
-	0x0a, 0x00, 0x00, 0x15, 0xe1, 0xb0, 0x38, 0x21, 
-	0x01, 0xa0, 0x18, 0x01, 0x03, 0xa0, 0xc0, 0x10, 
-	0x13, 0xa0, 0xc0, 0x00, 0xe1, 0xb0, 0x3c, 0x21, 
-	0x01, 0xa0, 0x14, 0x01, 0x02, 0x8c, 0xc0, 0x08, 
-	0xe1, 0xb0, 0x3e, 0x21, 0x01, 0xa0, 0x12, 0x01, 
-	0x02, 0x8c, 0xc0, 0x04, 0xe1, 0xb0, 0x3f, 0x21, 
-	0x01, 0xa0, 0x11, 0x01, 0x02, 0x8c, 0xc0, 0x02, 
-	0xe1, 0xb0, 0x3f, 0xa1, 0x01, 0xa0, 0x10, 0x81, 
-	0x02, 0x8c, 0xc0, 0x01, 0xe2, 0x6c, 0x30, 0x20, 
-	0xe1, 0x81, 0x13, 0x32, 0xe1, 0xa0, 0x2c, 0x12, 
-	0xe0, 0x40, 0x00, 0x0c, 0xe2, 0x80, 0x00, 0x01, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0xb0, 0x38, 0x22, 
-	0x01, 0xa0, 0x28, 0x02, 0x03, 0xa0, 0xc0, 0x10, 
-	0x13, 0xa0, 0xc0, 0x00, 0xe1, 0xb0, 0x3c, 0x22, 
-	0x01, 0xa0, 0x24, 0x02, 0x02, 0x8c, 0xc0, 0x08, 
-	0xe1, 0xb0, 0x3e, 0x22, 0x01, 0xa0, 0x22, 0x02, 
-	0x02, 0x8c, 0xc0, 0x04, 0xe1, 0xb0, 0x3f, 0x22, 
-	0x01, 0xa0, 0x21, 0x02, 0x02, 0x8c, 0xc0, 0x02, 
-	0xe1, 0xb0, 0x3f, 0xa2, 0x01, 0xa0, 0x20, 0x82, 
-	0x02, 0x8c, 0xc0, 0x01, 0xe1, 0xa0, 0x10, 0x02, 
-	0xe3, 0xa0, 0x20, 0x00, 0xe2, 0x40, 0x00, 0x1f, 
-	0xe0, 0x40, 0x00, 0x0c, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0xc4, 0xff, 
-	0xe3, 0x8c, 0xc6, 0x0e, 0xe1, 0x5c, 0x00, 0x82, 
-	0x9a, 0x00, 0x00, 0x0a, 0xe1, 0xb0, 0x00, 0x80, 
-	0x03, 0x31, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x0a, 
-	0x3a, 0x00, 0x00, 0x11, 0xe1, 0x50, 0x00, 0x0c, 
-	0x03, 0x51, 0x00, 0x00, 0x8a, 0xff, 0xfd, 0xf2, 
-	0xe1, 0xb0, 0x20, 0x82, 0x8a, 0x00, 0x00, 0x17, 
-	0xe3, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x03, 0x53, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xf2, 
-	0xea, 0xff, 0xfd, 0xef, 0xe1, 0x50, 0x00, 0x0c, 
-	0x03, 0x51, 0x00, 0x00, 0x8a, 0xff, 0xfd, 0xe8, 
-	0xe1, 0xb0, 0x20, 0x82, 0x03, 0x33, 0x00, 0x00, 
-	0x83, 0xa0, 0x00, 0x01, 0x93, 0xa0, 0x00, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x0c, 
-	0x03, 0x51, 0x00, 0x00, 0x8a, 0xff, 0xfd, 0xe0, 
-	0xe1, 0xb0, 0x20, 0x82, 0x23, 0xa0, 0x00, 0x01, 
-	0x21, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x02, 
-	0x01, 0x51, 0x00, 0x03, 0x93, 0xa0, 0x00, 0x00, 
-	0x83, 0xa0, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe1, 0x50, 0x00, 0x02, 0x01, 0x51, 0x00, 0x03, 
-	0x33, 0xa0, 0x00, 0x01, 0x23, 0xa0, 0x00, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, 
-	0xe9, 0x2d, 0x4b, 0xf0, 0xe8, 0x93, 0x00, 0x38, 
-	0xe3, 0x10, 0x01, 0x01, 0x03, 0x13, 0x01, 0x01, 
-	0x1a, 0x00, 0x00, 0x03, 0xeb, 0x00, 0x02, 0x30, 
-	0xeb, 0x00, 0x03, 0x38, 0xe8, 0xbd, 0x4b, 0xf0, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe2, 0x4f, 0xe0, 0x14, 
-	0xe3, 0xa0, 0xb0, 0x00, 0xea, 0x00, 0x02, 0x86, 
-	0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x4b, 0xf0, 
-	0xe8, 0x93, 0x00, 0x38, 0xe3, 0x10, 0x01, 0x01, 
-	0x03, 0x13, 0x01, 0x01, 0x1a, 0x00, 0x00, 0x03, 
-	0xeb, 0x00, 0x03, 0x5e, 0xeb, 0x00, 0x03, 0x2b, 
-	0xe8, 0xbd, 0x4b, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe2, 0x4f, 0xe0, 0x14, 0xe3, 0xa0, 0xb0, 0x00, 
-	0xea, 0x00, 0x03, 0xf8, 0x47, 0x78, 0x00, 0x00, 
-	0xe9, 0x2d, 0x4b, 0xf0, 0xe8, 0x93, 0x00, 0x38, 
-	0xe3, 0xa0, 0xb0, 0x00, 0xe1, 0xd1, 0xc0, 0x80, 
-	0x41, 0xd4, 0xc0, 0x83, 0x5a, 0x00, 0x00, 0x04, 
-	0xe3, 0xa0, 0xb0, 0x04, 0xeb, 0x00, 0x04, 0x3f, 
-	0xeb, 0x00, 0x03, 0x1c, 0xe8, 0xbd, 0x4b, 0xf0, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe3, 0x11, 0x01, 0x02, 
-	0x0a, 0x00, 0x00, 0x08, 0xe3, 0x10, 0x01, 0x01, 
-	0x03, 0x13, 0x01, 0x01, 0x02, 0x4f, 0xe0, 0x24, 
-	0xe3, 0xa0, 0xb0, 0x04, 0x0a, 0x00, 0x05, 0x5b, 
-	0xe0, 0x23, 0x00, 0x00, 0xe2, 0x00, 0x01, 0x02, 
-	0xe8, 0xbd, 0x4b, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe3, 0x14, 0x01, 0x02, 0x03, 0xa0, 0x34, 0x62, 
-	0x13, 0xa0, 0x34, 0x61, 0xea, 0x00, 0x02, 0x9d, 
-	0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x4b, 0xf0, 
-	0xe1, 0xa0, 0x30, 0x00, 0xe1, 0xa0, 0x40, 0x01, 
-	0xe1, 0xa0, 0x50, 0x02, 0xe3, 0x10, 0x01, 0x01, 
-	0x1a, 0x00, 0x00, 0x03, 0xeb, 0x00, 0x03, 0x35, 
-	0xeb, 0x00, 0x03, 0x02, 0xe8, 0xbd, 0x4b, 0xf0, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe2, 0x4f, 0xe0, 0x14, 
-	0xe3, 0xa0, 0xb0, 0x00, 0xea, 0x00, 0x03, 0xcf, 
-	0xb4, 0x77, 0x46, 0x76, 0x1e, 0x5d, 0x9b, 0x06, 
-	0x1c, 0x1c, 0x34, 0x0c, 0xf7, 0xff, 0xff, 0x8c, 
-	0x1c, 0x23, 0x34, 0x0c, 0xf7, 0xff, 0xff, 0x6e, 
-	0x46, 0x6b, 0xf7, 0xff, 0xff, 0x85, 0x1e, 0x6d, 
-	0xd1, 0xf6, 0xb0, 0x03, 0x46, 0xb6, 0xbc, 0x70, 
-	0x47, 0x70, 0x00, 0x00, 0xb4, 0x77, 0x46, 0x76, 
-	0x1e, 0x5d, 0x9b, 0x06, 0x1c, 0x1c, 0x34, 0x0c, 
-	0xf7, 0xff, 0xff, 0x5c, 0x46, 0x6b, 0xf7, 0xff, 
-	0xff, 0x73, 0x1c, 0x23, 0x34, 0x0c, 0xf7, 0xff, 
-	0xff, 0x55, 0x1e, 0x6d, 0xd1, 0xf6, 0xb0, 0x03, 
-	0x46, 0xb6, 0xbc, 0x70, 0x47, 0x70, 0x00, 0x00, 
-	0x47, 0x78, 0x00, 0x00, 0xe1, 0xb0, 0x10, 0x00, 
-	0xe2, 0x00, 0x01, 0x02, 0x42, 0x61, 0x10, 0x00, 
-	0xe3, 0xa0, 0x20, 0x00, 0x01, 0x2f, 0xff, 0x1e, 
-	0xe3, 0x80, 0x09, 0x01, 0xe3, 0x80, 0x00, 0x1e, 
-	0xe1, 0xb0, 0xc8, 0x21, 0x01, 0xa0, 0x18, 0x01, 
-	0x02, 0x40, 0x00, 0x10, 0xe1, 0xb0, 0xcc, 0x21, 
-	0x01, 0xa0, 0x14, 0x01, 0x02, 0x40, 0x00, 0x08, 
-	0xe1, 0xb0, 0xce, 0x21, 0x01, 0xa0, 0x12, 0x01, 
-	0x02, 0x40, 0x00, 0x04, 0xe1, 0xb0, 0xcf, 0x21, 
-	0x01, 0xa0, 0x11, 0x01, 0x02, 0x40, 0x00, 0x02, 
-	0xe1, 0xb0, 0xcf, 0xa1, 0x01, 0xa0, 0x10, 0x81, 
-	0x02, 0x40, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x4b, 0xf0, 
-	0xe8, 0x93, 0x00, 0x38, 0xe2, 0x23, 0x31, 0x02, 
-	0xe3, 0x10, 0x01, 0x01, 0x03, 0x13, 0x01, 0x01, 
-	0x1a, 0x00, 0x00, 0x03, 0xeb, 0x00, 0x01, 0xbe, 
-	0xeb, 0x00, 0x02, 0xc6, 0xe8, 0xbd, 0x4b, 0xf0, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe2, 0x4f, 0xe0, 0x14, 
-	0xe3, 0xa0, 0xb0, 0x00, 0xea, 0x00, 0x02, 0x14, 
-	0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0xb0, 0x00, 
-	0xe1, 0xa0, 0x20, 0x01, 0xe8, 0x80, 0x00, 0x0e, 
-	0xe5, 0x9f, 0xc0, 0x38, 0xe5, 0x8c, 0xd0, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, 
-	0xe5, 0x9f, 0x20, 0x28, 0xe5, 0x92, 0x20, 0x00, 
-	0xe5, 0x91, 0x40, 0x2c, 0xe5, 0x91, 0xc0, 0x34, 
-	0xe1, 0x5c, 0x00, 0x02, 0x23, 0xa0, 0x00, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, 
-	0xe5, 0x9f, 0xc0, 0x08, 0xe5, 0x9c, 0xd0, 0x00, 
-	0xe3, 0xa0, 0xb0, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x2e, 0x08, 0x21, 0x90, 0x47, 0x78, 0x00, 0x00, 
-	0xe9, 0x2d, 0x40, 0x00, 0xe5, 0x9f, 0xc0, 0xe4, 
-	0xe5, 0x9c, 0x00, 0x00, 0xe3, 0x50, 0x00, 0x00, 
-	0xe3, 0xa0, 0x00, 0x04, 0x15, 0x8c, 0x00, 0x04, 
-	0x0b, 0x00, 0x00, 0x01, 0xe8, 0xbd, 0x40, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe5, 0x9f, 0xc0, 0xcc, 
-	0xea, 0xff, 0xfd, 0x6b, 0xe3, 0xa0, 0x10, 0x0a, 
-	0xe3, 0x50, 0x01, 0x02, 0x13, 0x50, 0x01, 0x06, 
-	0x13, 0x50, 0x01, 0x16, 0x03, 0xa0, 0x10, 0x03, 
-	0xe3, 0x50, 0x01, 0x0a, 0x13, 0x50, 0x01, 0x0e, 
-	0x03, 0xa0, 0x10, 0x05, 0xe5, 0x9f, 0x20, 0xa8, 
-	0xe1, 0x50, 0x00, 0x02, 0xe2, 0x82, 0x20, 0xff, 
-	0x21, 0x52, 0x00, 0x00, 0x23, 0xa0, 0x10, 0x02, 
-	0xe3, 0x50, 0x01, 0x82, 0x03, 0xa0, 0x10, 0x02, 
-	0xe3, 0x50, 0x01, 0x86, 0x03, 0xa0, 0x10, 0x07, 
-	0xe5, 0x9f, 0x20, 0x88, 0xe0, 0x50, 0x20, 0x02, 
-	0x13, 0x52, 0x00, 0x01, 0x03, 0xa0, 0x10, 0x05, 
-	0xe1, 0xa0, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x02, 
-	0xe1, 0xa0, 0x30, 0x00, 0xeb, 0xff, 0xff, 0xe4, 
-	0xe8, 0xbd, 0x40, 0x02, 0xe5, 0x9f, 0xc0, 0x50, 
-	0xe3, 0xa0, 0x20, 0x01, 0xe5, 0xcc, 0x20, 0x00, 
-	0xe9, 0x2d, 0x00, 0x0a, 0xeb, 0xff, 0xff, 0xdc, 
-	0xea, 0x00, 0x00, 0x09, 0x47, 0x78, 0x00, 0x00, 
-	0xe5, 0x9f, 0xc0, 0x30, 0xe3, 0xa0, 0x10, 0x00, 
-	0xe5, 0x8c, 0x10, 0x00, 0xe5, 0x9c, 0x00, 0x04, 
-	0xe3, 0x50, 0x00, 0x00, 0x01, 0x2f, 0xff, 0x1e, 
-	0xe5, 0x8c, 0x10, 0x04, 0xea, 0xff, 0xff, 0xd2, 
-	0x47, 0x78, 0x00, 0x00, 0xe1, 0xa0, 0xc0, 0x0d, 
-	0xe9, 0x2d, 0xd9, 0xf0, 0xe2, 0x4c, 0xb0, 0x04, 
-	0xe3, 0xa0, 0x10, 0x01, 0xea, 0xff, 0xfd, 0x88, 
-	0x2e, 0x08, 0x20, 0xb4, 0x2e, 0x08, 0x20, 0xc6, 
-	0x2e, 0x01, 0xb5, 0xe1, 0x80, 0x00, 0x02, 0x00, 
-	0x80, 0x80, 0x0e, 0xa0, 0xb5, 0xff, 0xa6, 0x23, 
-	0xa5, 0x22, 0xa4, 0x22, 0x68, 0x5a, 0x68, 0x1f, 
-	0x4b, 0x21, 0x60, 0x5a, 0x23, 0x00, 0x4a, 0x21, 
-	0x70, 0x13, 0x70, 0x53, 0x70, 0x93, 0x4a, 0x20, 
-	0x2a, 0x00, 0xd0, 0x02, 0x9a, 0x02, 0xf7, 0xff, 
-	0xff, 0xfe, 0x48, 0x1e, 0x28, 0x00, 0xd0, 0x01, 
-	0xf7, 0xff, 0xff, 0xfe, 0x48, 0x1c, 0x28, 0x00, 
-	0xd0, 0x01, 0xf7, 0xff, 0xff, 0xfe, 0x48, 0x1b, 
-	0x28, 0x00, 0xd0, 0x01, 0xf0, 0x01, 0xfc, 0xb2, 
-	0x48, 0x19, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xff, 
-	0xff, 0xfe, 0x48, 0x18, 0x28, 0x00, 0xd0, 0x01, 
-	0xf0, 0x01, 0xfb, 0x18, 0x48, 0x16, 0x28, 0x00, 
-	0xd0, 0x01, 0xf0, 0x01, 0xfc, 0x89, 0x48, 0x15, 
-	0x28, 0x00, 0xd0, 0x01, 0xf7, 0xff, 0xff, 0xfe, 
-	0xf7, 0xff, 0xff, 0xa0, 0x48, 0x12, 0x28, 0x00, 
-	0xd0, 0x04, 0x1c, 0x30, 0x1c, 0x29, 0x1c, 0x22, 
-	0xf0, 0x01, 0xfe, 0xa6, 0x2f, 0x00, 0xd0, 0x01, 
-	0xf7, 0xfe, 0xfd, 0xcc, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x3a, 0x74, 0x74, 0x00, 
-	0x2e, 0x08, 0x21, 0x94, 0x2e, 0x08, 0x21, 0x94, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xb9, 0x91, 
-	0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xb6, 0x71, 
-	0x2e, 0x01, 0xb9, 0x5d, 0x00, 0x00, 0x00, 0x00, 
-	0x2e, 0x01, 0xbd, 0xb5, 0xb5, 0x90, 0x28, 0x00, 
-	0xd0, 0x04, 0x48, 0x12, 0x28, 0x00, 0xd0, 0x01, 
-	0xf7, 0xff, 0xff, 0xfe, 0x4f, 0x10, 0x68, 0x78, 
-	0x28, 0x00, 0xd0, 0x03, 0xf7, 0xfe, 0xfd, 0x94, 
-	0x20, 0x00, 0x60, 0x78, 0x4f, 0x0d, 0x78, 0x78, 
-	0x24, 0x01, 0x28, 0x00, 0xd1, 0x05, 0x70, 0x7c, 
-	0x48, 0x0b, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xff, 
-	0xff, 0xfe, 0x78, 0xb8, 0x28, 0x00, 0xd1, 0x05, 
-	0x70, 0xbc, 0x48, 0x08, 0x28, 0x00, 0xd0, 0x01, 
-	0xf0, 0x01, 0xfe, 0xb2, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x2e, 0x08, 0x21, 0x94, 0x2e, 0x08, 0x21, 0x94, 
-	0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xbe, 0x55, 
-	0xb5, 0x90, 0x1c, 0x0c, 0x21, 0x01, 0x1c, 0x17, 
-	0xf0, 0x01, 0xfa, 0xbc, 0x21, 0x00, 0x1c, 0x20, 
-	0xf0, 0x01, 0xfa, 0xb8, 0x21, 0x02, 0x1c, 0x38, 
-	0xf0, 0x01, 0xfa, 0xb4, 0x20, 0x01, 0xf7, 0xff, 
-	0xfa, 0x5d, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xf1, 0x20, 0x00, 0xb0, 0x89, 0x90, 0x06, 
-	0x26, 0x00, 0x90, 0x05, 0x20, 0x01, 0x90, 0x04, 
-	0x27, 0x00, 0x20, 0x00, 0x90, 0x03, 0x90, 0x02, 
-	0x25, 0x00, 0x90, 0x01, 0xf0, 0x01, 0xfb, 0xe2, 
-	0x1c, 0x04, 0x78, 0x00, 0x28, 0x00, 0xd0, 0x17, 
-	0x49, 0xe3, 0x5d, 0xe0, 0x5c, 0x08, 0x08, 0x40, 
-	0xd3, 0x06, 0x37, 0x01, 0x5d, 0xe0, 0x5c, 0x08, 
-	0x08, 0x40, 0xd2, 0xfa, 0xe0, 0x00, 0x37, 0x01, 
-	0x5d, 0xe0, 0x5c, 0x0a, 0x08, 0x52, 0xd2, 0x01, 
-	0x28, 0x00, 0xd1, 0xf8, 0x98, 0x04, 0x30, 0x01, 
-	0x90, 0x04, 0x5d, 0xe0, 0x28, 0x00, 0xd1, 0xe8, 
-	0x98, 0x04, 0x00, 0x80, 0xf0, 0x01, 0xfc, 0x16, 
-	0x4b, 0xd6, 0x93, 0x08, 0x60, 0x18, 0x1c, 0x78, 
-	0xf0, 0x01, 0xfc, 0x10, 0x9b, 0x08, 0x60, 0x58, 
-	0x48, 0xd3, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xff, 
-	0xff, 0xfe, 0x21, 0x00, 0x20, 0x00, 0x90, 0x04, 
-	0x48, 0xd0, 0x90, 0x07, 0x78, 0x27, 0x34, 0x01, 
-	0x2e, 0x00, 0xd1, 0x58, 0x2f, 0x22, 0xd0, 0x01, 
-	0x2f, 0x27, 0xd1, 0x02, 0x97, 0x05, 0x1c, 0x3e, 
-	0xe0, 0x93, 0x98, 0x06, 0x42, 0x81, 0xd1, 0x4e, 
-	0x98, 0x03, 0x28, 0x00, 0xd1, 0x4b, 0x25, 0x00, 
-	0x43, 0xed, 0x1c, 0x2a, 0x95, 0x01, 0x22, 0x00, 
-	0xab, 0x00, 0x70, 0x1a, 0x70, 0x5a, 0x1e, 0x60, 
-	0x78, 0x02, 0x2a, 0x30, 0xdb, 0x04, 0x2a, 0x39, 
-	0xdc, 0x02, 0x30, 0x01, 0x1f, 0xd5, 0x3d, 0x29, 
-	0x78, 0x02, 0x2a, 0x3e, 0xd0, 0x01, 0x2a, 0x3c, 
-	0xd1, 0x35, 0x2a, 0x3e, 0xd1, 0x0e, 0x22, 0x77, 
-	0xab, 0x00, 0x70, 0x1a, 0x2d, 0x00, 0xd0, 0x63, 
-	0x2d, 0x02, 0xdc, 0x62, 0x78, 0x42, 0x30, 0x01, 
-	0x2a, 0x3e, 0xd1, 0x13, 0x22, 0x61, 0x70, 0x1a, 
-	0x30, 0x01, 0xe0, 0x0f, 0x30, 0x01, 0x1c, 0x02, 
-	0xe0, 0x02, 0x2b, 0x3e, 0xd0, 0x56, 0x32, 0x01, 
-	0x78, 0x13, 0x2b, 0x00, 0xd0, 0x01, 0x2b, 0x20, 
-	0xd1, 0xf7, 0x2d, 0x00, 0xdc, 0x4d, 0x22, 0x72, 
-	0xab, 0x00, 0x70, 0x1a, 0x78, 0x02, 0x2a, 0x26, 
-	0xd1, 0x24, 0x23, 0x01, 0x42, 0xdd, 0xd0, 0x19, 
-	0x2d, 0x00, 0xdd, 0x5e, 0x78, 0x42, 0x30, 0x01, 
-	0x2a, 0x30, 0xdb, 0x5b, 0x2a, 0x32, 0xdc, 0x3c, 
-	0x30, 0x01, 0x1c, 0x2b, 0xd5, 0x04, 0x07, 0xdb, 
-	0x0f, 0xdb, 0x42, 0x5b, 0xe0, 0x02, 0xe0, 0x42, 
-	0x07, 0xdb, 0x0f, 0xdb, 0x33, 0x31, 0x42, 0x9a, 
-	0xd1, 0x63, 0x22, 0x00, 0xab, 0x00, 0x70, 0x1a, 
-	0x95, 0x01, 0xe0, 0x11, 0x22, 0x02, 0x92, 0x01, 
-	0xaa, 0x00, 0x78, 0x12, 0x30, 0x01, 0x2a, 0x72, 
-	0xd0, 0x09, 0xe0, 0x06, 0x23, 0x01, 0x42, 0xdd, 
-	0xd1, 0x06, 0xaa, 0x00, 0x78, 0x12, 0x2a, 0x72, 
-	0xd0, 0x01, 0x25, 0x01, 0xe0, 0x00, 0x25, 0x00, 
-	0xaa, 0x00, 0x78, 0x12, 0x2a, 0x00, 0xd0, 0x16, 
-	0x22, 0x01, 0x92, 0x03, 0x4a, 0x8c, 0x78, 0x03, 
-	0x5c, 0xd3, 0x08, 0x5b, 0xd3, 0x04, 0x78, 0x43, 
-	0x5c, 0xd3, 0x30, 0x01, 0x08, 0x5b, 0xd2, 0xfa, 
-	0x78, 0x02, 0x2a, 0x22, 0xd0, 0x01, 0x2a, 0x27, 
-	0xd1, 0x0c, 0x30, 0x01, 0x1c, 0x16, 0xe0, 0x09, 
-	0xe0, 0x6a, 0xe0, 0xfb, 0xe0, 0x23, 0x78, 0x02, 
-	0x2a, 0x00, 0xd0, 0x03, 0x4b, 0x80, 0x5c, 0x9a, 
-	0x08, 0x52, 0xd3, 0x61, 0x22, 0x01, 0x92, 0x02, 
-	0x1c, 0x04, 0x78, 0x27, 0x34, 0x01, 0x2e, 0x00, 
-	0xd0, 0x15, 0x2f, 0x5c, 0xd1, 0x0b, 0x78, 0x20, 
-	0x28, 0x22, 0xd0, 0x03, 0x28, 0x5c, 0xd0, 0x01, 
-	0x28, 0x27, 0xd1, 0x04, 0x34, 0x01, 0x1c, 0x07, 
-	0xe0, 0x09, 0xe0, 0xdf, 0xe0, 0xde, 0x1c, 0x30, 
-	0x42, 0xb7, 0xd1, 0x04, 0x40, 0x7e, 0x78, 0x27, 
-	0x34, 0x01, 0x42, 0x87, 0xd0, 0xfa, 0x2f, 0x00, 
-	0xd0, 0x0c, 0x2e, 0x00, 0xd1, 0x03, 0x48, 0x6e, 
-	0x5d, 0xc0, 0x08, 0x40, 0xd2, 0x06, 0x1c, 0x08, 
-	0x9b, 0x08, 0x68, 0x5a, 0x54, 0x17, 0x31, 0x01, 
-	0xe0, 0x97, 0xe0, 0xc7, 0x98, 0x06, 0x42, 0x81, 
-	0xd1, 0x08, 0x98, 0x05, 0x28, 0x00, 0xd1, 0x05, 
-	0x98, 0x02, 0x28, 0x00, 0xd0, 0x74, 0x98, 0x03, 
-	0x28, 0x00, 0xd1, 0x72, 0x22, 0x00, 0x1c, 0x08, 
-	0x9b, 0x08, 0x68, 0x5b, 0x54, 0x1a, 0x98, 0x02, 
-	0x31, 0x01, 0x28, 0x00, 0xd0, 0x6a, 0x98, 0x03, 
-	0x28, 0x00, 0xd0, 0x13, 0x01, 0xa8, 0x99, 0x07, 
-	0x18, 0x42, 0x9b, 0x08, 0x68, 0x58, 0x99, 0x06, 
-	0x18, 0x40, 0x46, 0x69, 0xf0, 0x01, 0xfc, 0x72, 
-	0x28, 0x00, 0xd1, 0x07, 0x9b, 0x08, 0x68, 0x58, 
-	0x99, 0x06, 0x18, 0x41, 0xa2, 0x58, 0xa0, 0x5e, 
-	0xf7, 0xff, 0xfe, 0xb6, 0x23, 0x01, 0x98, 0x01, 
-	0x42, 0xd8, 0xdd, 0x51, 0x98, 0x01, 0x28, 0x00, 
-	0xda, 0x03, 0x40, 0x18, 0x42, 0x40, 0xe0, 0x02, 
-	0xe0, 0x90, 0x07, 0xc0, 0x0f, 0xc0, 0x1c, 0x41, 
-	0x98, 0x01, 0xf0, 0x01, 0xfd, 0x61, 0x01, 0x80, 
-	0x99, 0x07, 0x18, 0x40, 0xf0, 0x01, 0xf9, 0xfc, 
-	0x28, 0x00, 0xd1, 0x3d, 0xb0, 0x82, 0x98, 0x03, 
-	0x01, 0x80, 0x99, 0x09, 0x18, 0x40, 0x90, 0x01, 
-	0x9a, 0x03, 0x2a, 0x00, 0xda, 0x03, 0x07, 0xd2, 
-	0x0f, 0xd2, 0x42, 0x52, 0xe0, 0x01, 0x07, 0xd2, 
-	0x0f, 0xd2, 0x01, 0x90, 0x99, 0x09, 0x18, 0x40, 
-	0x30, 0x40, 0x90, 0x00, 0x20, 0xff, 0x30, 0x01, 
-	0xf0, 0x01, 0xfa, 0xe0, 0x1c, 0x01, 0x23, 0xff, 
-	0x22, 0x01, 0x02, 0x52, 0x98, 0x01, 0x33, 0x01, 
-	0xf0, 0x01, 0xfd, 0x56, 0x98, 0x01, 0x68, 0xc0, 
-	0x23, 0x01, 0x02, 0xdb, 0x43, 0x18, 0x99, 0x01, 
-	0x60, 0xc8, 0x08, 0xd8, 0xf0, 0x01, 0xfa, 0xce, 
-	0x1c, 0x01, 0x23, 0xff, 0x22, 0x01, 0x02, 0x52, 
-	0x98, 0x00, 0x33, 0x01, 0xf0, 0x01, 0xfd, 0x44, 
-	0x98, 0x00, 0x68, 0xc0, 0x23, 0x01, 0x02, 0xdb, 
-	0x43, 0x18, 0x99, 0x00, 0x60, 0xc8, 0xe0, 0x02, 
-	0xe0, 0x13, 0xe0, 0x12, 0xe0, 0x05, 0xb0, 0x02, 
-	0x20, 0x00, 0x90, 0x02, 0x90, 0x03, 0x99, 0x06, 
-	0xe0, 0x0b, 0x9b, 0x08, 0x68, 0x58, 0x9a, 0x06, 
-	0x18, 0x82, 0x98, 0x04, 0x1c, 0x43, 0x93, 0x04, 
-	0x00, 0x80, 0x9b, 0x08, 0x68, 0x1b, 0x50, 0x1a, 
-	0x91, 0x06, 0x2f, 0x00, 0xd0, 0x01, 0x26, 0x00, 
-	0x96, 0x05, 0x2f, 0x00, 0xd0, 0x00, 0xe6, 0x9d, 
-	0x2e, 0x00, 0xd0, 0x0a, 0xb0, 0x81, 0xab, 0x00, 
-	0x70, 0x1e, 0x22, 0x00, 0x70, 0x5a, 0x46, 0x69, 
-	0xa2, 0x24, 0xa0, 0x25, 0xf7, 0xff, 0xfe, 0x3c, 
-	0xb0, 0x01, 0x22, 0x00, 0x98, 0x04, 0x00, 0x80, 
-	0x9b, 0x08, 0x68, 0x19, 0x50, 0x0a, 0x98, 0x04, 
-	0x28, 0x00, 0xdd, 0x0f, 0x9b, 0x08, 0x68, 0x18, 
-	0x68, 0x01, 0x68, 0x09, 0x4b, 0x21, 0x40, 0x19, 
-	0xa2, 0x21, 0x68, 0x12, 0x42, 0x91, 0xd1, 0x05, 
-	0x9b, 0x04, 0x3b, 0x01, 0x93, 0x04, 0x30, 0x04, 
-	0x9b, 0x08, 0x60, 0x18, 0x9a, 0x09, 0x9b, 0x08, 
-	0x68, 0x19, 0x98, 0x04, 0xf7, 0xff, 0xf8, 0x0f, 
-	0xf7, 0xff, 0xf8, 0x88, 0x1e, 0x61, 0xa2, 0x19, 
-	0xa0, 0x19, 0xf7, 0xff, 0xfe, 0x15, 0xb0, 0x09, 
-	0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x21, 0xac, 0x2e, 0x08, 0x21, 0x9c, 
-	0x00, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x95, 0xdc, 
-	0x27, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x49, 0x2f, 
-	0x4f, 0x20, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 
-	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x00, 0x00, 
-	0x63, 0x61, 0x6e, 0x27, 0x74, 0x20, 0x6f, 0x70, 
-	0x65, 0x6e, 0x20, 0x27, 0x00, 0x00, 0x00, 0x00, 
-	0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 
-	0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x20, 
-	0x00, 0x00, 0x00, 0x00, 0xdf, 0xdf, 0xdf, 0xdf, 
-	0x52, 0x55, 0x4e, 0x00, 0x27, 0x0a, 0x00, 0x00, 
-	0x75, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 
-	0x74, 0x65, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x69, 
-	0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20, 0x49, 
-	0x2f, 0x4f, 0x20, 0x72, 0x65, 0x64, 0x69, 0x72, 
-	0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x27, 
-	0x00, 0x00, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x00, 
-	0xe1, 0xa0, 0x68, 0x80, 0xe0, 0x56, 0x88, 0x83, 
-	0xe0, 0x20, 0xe0, 0x03, 0xe2, 0x00, 0x01, 0x02, 
-	0xe1, 0xa0, 0x38, 0xa6, 0x8a, 0x00, 0x00, 0x1a, 
-	0x01, 0xa0, 0x90, 0x08, 0x0a, 0x00, 0x00, 0x2e, 
-	0xe2, 0x68, 0x60, 0x00, 0xe1, 0xa0, 0x68, 0xa6, 
-	0xe0, 0x83, 0x30, 0x06, 0xe1, 0xa0, 0x92, 0xa6, 
-	0xe1, 0xc6, 0x62, 0x89, 0xe3, 0x59, 0x00, 0x02, 
-	0x33, 0x39, 0x00, 0x00, 0xe2, 0x66, 0x90, 0x20, 
-	0xe1, 0xa0, 0x89, 0x12, 0xe1, 0xa0, 0x26, 0x32, 
-	0xe1, 0x82, 0x29, 0x11, 0xe1, 0xa0, 0x16, 0x31, 
-	0x0a, 0x00, 0x00, 0x03, 0x11, 0x88, 0x81, 0x08, 
-	0x11, 0x82, 0x81, 0x28, 0x11, 0xa0, 0x20, 0x01, 
-	0x13, 0xa0, 0x10, 0x00, 0x3a, 0x00, 0x00, 0x04, 
-	0x21, 0x88, 0x80, 0x02, 0x21, 0x88, 0x81, 0x08, 
-	0x21, 0x81, 0x81, 0x28, 0x23, 0xa0, 0x20, 0x00, 
-	0x23, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x90, 0x00, 
-	0xea, 0x00, 0x00, 0x15, 0xe1, 0xa0, 0x68, 0xa8, 
-	0xe1, 0xa0, 0x82, 0xa6, 0xe1, 0xc6, 0x62, 0x88, 
-	0xe3, 0x58, 0x00, 0x02, 0x33, 0x38, 0x00, 0x00, 
-	0xe2, 0x66, 0x80, 0x20, 0xe1, 0xa0, 0x98, 0x15, 
-	0xe1, 0xa0, 0x56, 0x35, 0xe1, 0x85, 0x58, 0x14, 
-	0xe1, 0xa0, 0x46, 0x34, 0x0a, 0x00, 0x00, 0x03, 
-	0x11, 0x89, 0x91, 0x09, 0x11, 0x85, 0x91, 0x29, 
-	0x11, 0xa0, 0x50, 0x04, 0x13, 0xa0, 0x40, 0x00, 
-	0x3a, 0x00, 0x00, 0x04, 0x21, 0x89, 0x90, 0x05, 
-	0x21, 0x89, 0x91, 0x09, 0x21, 0x84, 0x91, 0x29, 
-	0x23, 0xa0, 0x50, 0x00, 0x23, 0xa0, 0x40, 0x00, 
-	0xe3, 0xa0, 0x80, 0x00, 0xe3, 0x1e, 0x01, 0x02, 
-	0x1a, 0x00, 0x00, 0x09, 0xe0, 0x98, 0x60, 0x09, 
-	0xe0, 0xb2, 0x20, 0x05, 0xe0, 0xb1, 0x10, 0x04, 
-	0x38, 0xbd, 0x80, 0x00, 0xe2, 0x83, 0x30, 0x01, 
-	0xe1, 0xb0, 0x10, 0x61, 0xe1, 0xb0, 0x20, 0x62, 
-	0xe1, 0x86, 0x60, 0x86, 0xe1, 0xa0, 0x60, 0x66, 
-	0xe8, 0xbd, 0x80, 0x00, 0xe0, 0x58, 0x60, 0x09, 
-	0xe0, 0xd2, 0x20, 0x05, 0xe0, 0xd1, 0x10, 0x04, 
-	0x2a, 0x00, 0x00, 0x03, 0xe2, 0x20, 0x01, 0x02, 
-	0xe2, 0x76, 0x60, 0x00, 0xe2, 0xf2, 0x20, 0x00, 
-	0xe2, 0xe1, 0x10, 0x00, 0xe3, 0x11, 0x01, 0x02, 
-	0x18, 0xbd, 0x80, 0x00, 0xe0, 0x96, 0x60, 0x06, 
-	0xe0, 0xb2, 0x20, 0x02, 0xe0, 0xa1, 0x10, 0x01, 
-	0xe2, 0x43, 0x30, 0x01, 0xe3, 0x11, 0x01, 0x02, 
-	0x18, 0xbd, 0x80, 0x00, 0xe1, 0x91, 0xe0, 0x02, 
-	0x1b, 0x00, 0x06, 0x90, 0x18, 0xbd, 0x80, 0x00, 
-	0xe3, 0xa0, 0x00, 0x00, 0xe3, 0xa0, 0x10, 0x00, 
-	0xe2, 0x8d, 0xd0, 0x04, 0xe8, 0xbd, 0x4b, 0xf0, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0xa0, 0x98, 0x83, 
-	0xe3, 0x79, 0x08, 0x02, 0x30, 0x09, 0x90, 0x04, 
-	0xe0, 0x19, 0x90, 0x83, 0xe1, 0xa0, 0x88, 0x80, 
-	0xe3, 0x78, 0x08, 0x02, 0x30, 0x08, 0x80, 0x01, 
-	0xe0, 0x18, 0x80, 0x80, 0x4a, 0x00, 0x00, 0x14, 
-	0xe3, 0x19, 0x01, 0x02, 0x1a, 0x00, 0x00, 0x22, 
-	0xe9, 0x2d, 0x40, 0x00, 0xe0, 0x11, 0x60, 0x80, 
-	0x43, 0xc1, 0x11, 0x02, 0x42, 0x80, 0x00, 0x01, 
-	0xe0, 0x14, 0x60, 0x83, 0x43, 0xc4, 0x41, 0x02, 
-	0x42, 0x83, 0x30, 0x01, 0xe3, 0x10, 0x01, 0x01, 
-	0x11, 0xb0, 0x68, 0x80, 0x1b, 0x00, 0x05, 0xf8, 
-	0xe3, 0x13, 0x01, 0x01, 0x11, 0xb0, 0x68, 0x83, 
-	0x1b, 0x00, 0x06, 0x2f, 0xeb, 0xff, 0xff, 0x8a, 
-	0xe3, 0x11, 0x01, 0x02, 0x18, 0xbd, 0x80, 0x00, 
-	0xe1, 0x91, 0xe0, 0x02, 0x1b, 0x00, 0x06, 0x6d, 
-	0xe8, 0xbd, 0x80, 0x00, 0xe3, 0x19, 0x01, 0x02, 
-	0x0a, 0x00, 0x00, 0x09, 0xe1, 0x82, 0x80, 0x81, 
-	0xe1, 0x88, 0x80, 0x05, 0xe1, 0x98, 0x80, 0x84, 
-	0x1a, 0x00, 0x06, 0xb7, 0xe0, 0x23, 0x85, 0x0b, 
-	0xe0, 0x38, 0x80, 0x00, 0x52, 0x00, 0x81, 0x02, 
-	0x5a, 0x00, 0x00, 0x0a, 0xe3, 0x80, 0x04, 0x61, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0x92, 0x80, 0x81, 
-	0x1a, 0x00, 0x06, 0xc0, 0xe2, 0x00, 0x81, 0x02, 
-	0xea, 0x00, 0x00, 0x04, 0xe1, 0x95, 0x80, 0x84, 
-	0x1a, 0x00, 0x06, 0xb3, 0xe2, 0x03, 0x81, 0x02, 
-	0xe3, 0x1b, 0x06, 0x02, 0x12, 0x28, 0x81, 0x02, 
-	0xe3, 0x1b, 0x06, 0x01, 0x12, 0x28, 0x81, 0x02, 
-	0xe2, 0x8f, 0x00, 0x14, 0xe8, 0x90, 0x00, 0x07, 
-	0xe1, 0x80, 0x00, 0x08, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x7f, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xe8, 0xbd, 0x4b, 0xf0, 0xe5, 0x9f, 0x20, 0x6c, 
-	0xe5, 0x92, 0x10, 0x00, 0xe1, 0xa0, 0xc1, 0x83, 
-	0xe1, 0xa0, 0xcd, 0xac, 0xe1, 0x81, 0x10, 0x0c, 
-	0xe5, 0x82, 0x10, 0x00, 0xe3, 0x13, 0x03, 0x01, 
-	0x1a, 0x00, 0x00, 0x05, 0xe3, 0x13, 0x04, 0x02, 
-	0x1a, 0x00, 0x00, 0x07, 0xe3, 0x11, 0x08, 0x01, 
-	0x0a, 0x00, 0x00, 0x44, 0xe2, 0x8f, 0x00, 0x54, 
-	0xea, 0x00, 0x00, 0x06, 0xe3, 0x11, 0x07, 0x01, 
-	0x0a, 0x00, 0x00, 0x34, 0xe2, 0x8f, 0x00, 0x74, 
-	0xea, 0x00, 0x00, 0x02, 0xe3, 0x11, 0x08, 0x02, 
-	0x0a, 0x00, 0x00, 0x30, 0xe2, 0x8f, 0x00, 0x8c, 
-	0xe5, 0x9f, 0x10, 0x1c, 0xe2, 0x4e, 0xe0, 0x04, 
-	0xe5, 0x81, 0xe0, 0x3c, 0xe3, 0xa0, 0xec, 0xde, 
-	0xe3, 0x8e, 0xe0, 0xad, 0xe1, 0x8e, 0xe8, 0x0e, 
-	0xe8, 0x81, 0x7f, 0xff, 0xea, 0x00, 0x00, 0x01, 
-	0x2e, 0x08, 0x22, 0xac, 0x2e, 0x08, 0x22, 0xb0, 
-	0xe5, 0x9f, 0xc1, 0x2c, 0xe3, 0x5c, 0x00, 0x00, 
-	0x11, 0x2f, 0xff, 0x1c, 0xe6, 0x00, 0x00, 0x10, 
-	0x80, 0x00, 0x02, 0x00, 0x46, 0x6c, 0x6f, 0x61, 
-	0x74, 0x69, 0x6e, 0x67, 0x20, 0x50, 0x6f, 0x69, 
-	0x6e, 0x74, 0x20, 0x45, 0x78, 0x63, 0x65, 0x70, 
-	0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x49, 0x6e, 
-	0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x4f, 0x70, 
-	0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, 
-	0x80, 0x00, 0x02, 0x01, 0x46, 0x6c, 0x6f, 0x61, 
-	0x74, 0x69, 0x6e, 0x67, 0x20, 0x50, 0x6f, 0x69, 
-	0x6e, 0x74, 0x20, 0x45, 0x78, 0x63, 0x65, 0x70, 
-	0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x4f, 0x76, 
-	0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x00, 0x00, 
-	0x80, 0x00, 0x02, 0x02, 0x46, 0x6c, 0x6f, 0x61, 
-	0x74, 0x69, 0x6e, 0x67, 0x20, 0x50, 0x6f, 0x69, 
-	0x6e, 0x74, 0x20, 0x45, 0x78, 0x63, 0x65, 0x70, 
-	0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x44, 0x69, 
-	0x76, 0x69, 0x64, 0x65, 0x20, 0x42, 0x79, 0x20, 
-	0x5a, 0x65, 0x72, 0x6f, 0x00, 0x00, 0x00, 0x00, 
-	0xe2, 0x00, 0x21, 0x02, 0xe3, 0x13, 0x07, 0x0f, 
-	0x1a, 0x00, 0x00, 0x13, 0xe3, 0x13, 0x05, 0x02, 
-	0x12, 0x8f, 0x00, 0x0c, 0x18, 0x90, 0x00, 0x03, 
-	0x05, 0x9f, 0x00, 0x0c, 0xe1, 0x80, 0x00, 0x02, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x7f, 0xf0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 
-	0xe3, 0x13, 0x07, 0x0f, 0x12, 0x00, 0x21, 0x02, 
-	0x1a, 0x00, 0x00, 0x07, 0xe3, 0x13, 0x05, 0x02, 
-	0x12, 0x8f, 0x00, 0x08, 0x18, 0x90, 0x00, 0x03, 
-	0x05, 0x9f, 0x00, 0x08, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x7f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x7f, 0xc0, 0x00, 0x00, 0xe3, 0x13, 0x07, 0x02, 
-	0x13, 0xa0, 0x00, 0x00, 0x13, 0xa0, 0x10, 0x00, 
-	0x11, 0x2f, 0xff, 0x1e, 0xe3, 0x13, 0x07, 0x01, 
-	0x13, 0xe0, 0x00, 0x00, 0x13, 0xe0, 0x10, 0x00, 
-	0x11, 0x2f, 0xff, 0x1e, 0xe3, 0x13, 0x06, 0x01, 
-	0x13, 0xa0, 0x00, 0x00, 0x13, 0xa0, 0x11, 0x02, 
-	0x03, 0xa0, 0x01, 0x02, 0xe3, 0x32, 0x01, 0x02, 
-	0x11, 0xe0, 0x00, 0x00, 0x11, 0xe0, 0x10, 0x01, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x01, 0x96, 0x91, 
-	0xe3, 0x10, 0x02, 0x06, 0x1a, 0x00, 0x00, 0x0d, 
-	0xe1, 0xb0, 0x80, 0x86, 0x0a, 0x00, 0x00, 0x0d, 
-	0x22, 0x92, 0x20, 0x01, 0x22, 0x91, 0x10, 0x01, 
-	0x23, 0xa0, 0x11, 0x02, 0xe2, 0xb3, 0x30, 0x00, 
-	0x4a, 0x00, 0x00, 0x0a, 0xe2, 0x83, 0xc0, 0x01, 
-	0xe3, 0xcc, 0xc1, 0x01, 0xe3, 0x5c, 0x09, 0x02, 
-	0xc3, 0xa0, 0x33, 0x19, 0xe2, 0x00, 0x01, 0x02, 
-	0xe1, 0x83, 0x00, 0x00, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0xe1, 0xa0, 0x30, 0x00, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0x21, 0xb0, 0x80, 0xa2, 0xea, 0xff, 0xff, 0xef, 
-	0xe3, 0x11, 0x01, 0x02, 0x1a, 0x00, 0x00, 0x04, 
-	0xe3, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x20, 0x00, 
-	0xe2, 0x00, 0x01, 0x02, 0xe3, 0xa0, 0x30, 0x00, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0xb0, 0xc8, 0x21, 
-	0x01, 0xa0, 0xc8, 0x22, 0x01, 0x8c, 0x18, 0x01, 
-	0x02, 0x83, 0x30, 0x10, 0xe1, 0xb0, 0xcc, 0x21, 
-	0x01, 0xa0, 0xcc, 0x22, 0x01, 0x8c, 0x14, 0x01, 
-	0x02, 0x83, 0x30, 0x08, 0xe1, 0xb0, 0xce, 0x21, 
-	0x01, 0xa0, 0xce, 0x22, 0x01, 0x8c, 0x12, 0x01, 
-	0x02, 0x83, 0x30, 0x04, 0xe1, 0xb0, 0xcf, 0x21, 
-	0x01, 0xa0, 0xcf, 0x22, 0x01, 0x8c, 0x11, 0x01, 
-	0x02, 0x83, 0x30, 0x02, 0xe1, 0xb0, 0xcf, 0xa1, 
-	0x01, 0xa0, 0xcf, 0xa2, 0x01, 0x8c, 0x10, 0x81, 
-	0x02, 0x83, 0x30, 0x01, 0xe1, 0xb0, 0x30, 0x03, 
-	0x4a, 0xff, 0xff, 0xe4, 0x5a, 0xff, 0xff, 0xda, 
-	0xe3, 0xc0, 0x81, 0x03, 0xe3, 0xc3, 0x91, 0x03, 
-	0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02, 
-	0xe0, 0x88, 0x30, 0x09, 0xe2, 0x43, 0x3c, 0x3f, 
-	0xe2, 0x43, 0x30, 0xfe, 0xe3, 0x32, 0x00, 0x00, 
-	0x0a, 0x00, 0x00, 0x5d, 0xe3, 0x35, 0x00, 0x00, 
-	0x0a, 0x00, 0x00, 0x3d, 0xe9, 0x2d, 0x48, 0x81, 
-	0xe1, 0xa0, 0x08, 0x21, 0xe1, 0xc1, 0x78, 0x00, 
-	0xe1, 0xa0, 0x68, 0x24, 0xe1, 0xc4, 0x88, 0x06, 
-	0xe0, 0x09, 0x06, 0x90, 0xe0, 0x06, 0x06, 0x97, 
-	0xe0, 0x07, 0x07, 0x98, 0xe0, 0x97, 0x78, 0x06, 
-	0xe0, 0xa9, 0x98, 0x26, 0xe0, 0x08, 0x08, 0x90, 
-	0xe0, 0x97, 0x78, 0x08, 0xe0, 0xa9, 0x08, 0x28, 
-	0xe1, 0xa0, 0xb8, 0x22, 0xe1, 0xc2, 0xe8, 0x0b, 
-	0xe1, 0xa0, 0x68, 0x25, 0xe1, 0xc5, 0x88, 0x06, 
-	0xe0, 0x09, 0x06, 0x9b, 0xe0, 0x06, 0x06, 0x9e, 
-	0xe0, 0x0e, 0x0e, 0x98, 0xe0, 0x9e, 0xe8, 0x06, 
-	0xe0, 0xa9, 0x98, 0x26, 0xe0, 0x08, 0x08, 0x9b, 
-	0xe0, 0x9e, 0xe8, 0x08, 0xe0, 0xa9, 0xb8, 0x28, 
-	0xe0, 0x97, 0x70, 0x0b, 0xe2, 0xa0, 0x00, 0x00, 
-	0xe0, 0x97, 0xb0, 0x0e, 0xe0, 0xb7, 0x70, 0x00, 
-	0xe2, 0xa0, 0x00, 0x00, 0xe0, 0x51, 0x80, 0x02, 
-	0xe3, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x60, 0x00, 
-	0x31, 0xe0, 0x10, 0x01, 0x30, 0x44, 0x60, 0x05, 
-	0x10, 0x55, 0x90, 0x04, 0x03, 0xa0, 0x10, 0x00, 
-	0x31, 0xe0, 0x10, 0x01, 0x30, 0x46, 0x60, 0x08, 
-	0xe1, 0xa0, 0x48, 0x28, 0xe1, 0xc8, 0x58, 0x04, 
-	0xe1, 0xa0, 0x88, 0x29, 0xe1, 0xc9, 0x98, 0x08, 
-	0xe0, 0x22, 0x68, 0x94, 0xe0, 0x08, 0x08, 0x95, 
-	0xe0, 0x06, 0x05, 0x99, 0xe0, 0x96, 0x68, 0x08, 
-	0xe0, 0xa2, 0x28, 0x28, 0xe0, 0x09, 0x09, 0x94, 
-	0xe0, 0x96, 0x68, 0x09, 0xe0, 0xa2, 0x28, 0x29, 
-	0xe0, 0x9b, 0x60, 0x06, 0xe0, 0xb7, 0x20, 0x02, 
-	0xe0, 0xb0, 0x10, 0x01, 0xe1, 0x8e, 0xe1, 0x0e, 
-	0xe1, 0x86, 0x61, 0x2e, 0x48, 0xbd, 0x88, 0x81, 
-	0xe0, 0x96, 0x60, 0x06, 0xe0, 0xb2, 0x20, 0x02, 
-	0xe0, 0xa1, 0x10, 0x01, 0xe2, 0x43, 0x30, 0x01, 
-	0xe8, 0xbd, 0x88, 0x81, 0xe1, 0xa0, 0x58, 0x24, 
-	0xe1, 0xc4, 0x68, 0x05, 0xe1, 0xa0, 0x88, 0x21, 
-	0xe1, 0xc1, 0x98, 0x08, 0xe0, 0x04, 0x08, 0x95, 
-	0xe0, 0x08, 0x08, 0x96, 0xe0, 0x01, 0x06, 0x99, 
-	0xe0, 0x91, 0x18, 0x08, 0xe0, 0xa4, 0x48, 0x28, 
-	0xe0, 0x09, 0x09, 0x95, 0xe0, 0x91, 0x18, 0x09, 
-	0xe0, 0xa4, 0x48, 0x29, 0xe1, 0xa0, 0x88, 0x22, 
-	0xe1, 0xc2, 0x98, 0x08, 0xe0, 0x02, 0x08, 0x95, 
-	0xe0, 0x08, 0x08, 0x96, 0xe0, 0x06, 0x06, 0x99, 
-	0xe0, 0x96, 0x68, 0x08, 0xe0, 0xa2, 0x28, 0x28, 
-	0xe0, 0x09, 0x09, 0x95, 0xe0, 0x96, 0x68, 0x09, 
-	0xe0, 0xa2, 0x58, 0x29, 0xe0, 0x95, 0x20, 0x01, 
-	0xe2, 0xb4, 0x10, 0x00, 0x41, 0xa0, 0xf0, 0x0e, 
-	0xe0, 0x96, 0x60, 0x06, 0xe0, 0xb2, 0x20, 0x02, 
-	0xe0, 0xa1, 0x10, 0x01, 0xe2, 0x43, 0x30, 0x01, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0x35, 0x00, 0x00, 
-	0x0a, 0x00, 0x00, 0x24, 0xe1, 0xa0, 0x28, 0x21, 
-	0xe1, 0xc1, 0x68, 0x02, 0xe1, 0xa0, 0x88, 0x24, 
-	0xe1, 0xc4, 0x98, 0x08, 0xe0, 0x01, 0x08, 0x92, 
-	0xe0, 0x08, 0x08, 0x96, 0xe0, 0x04, 0x06, 0x99, 
-	0xe0, 0x94, 0x48, 0x08, 0xe0, 0xa1, 0x18, 0x28, 
-	0xe0, 0x09, 0x09, 0x92, 0xe0, 0x94, 0x48, 0x09, 
-	0xe0, 0xa1, 0x18, 0x29, 0xe1, 0xa0, 0x88, 0x25, 
-	0xe1, 0xc5, 0x98, 0x08, 0xe0, 0x05, 0x08, 0x92, 
-	0xe0, 0x08, 0x08, 0x96, 0xe0, 0x06, 0x06, 0x99, 
-	0xe0, 0x96, 0x68, 0x08, 0xe0, 0xa5, 0x58, 0x28, 
-	0xe0, 0x09, 0x09, 0x92, 0xe0, 0x96, 0x68, 0x09, 
-	0xe0, 0xa5, 0x28, 0x29, 0xe0, 0x92, 0x20, 0x04, 
-	0xe2, 0xb1, 0x10, 0x00, 0x41, 0xa0, 0xf0, 0x0e, 
-	0xe0, 0x96, 0x60, 0x06, 0xe0, 0xb2, 0x20, 0x02, 
-	0xe0, 0xa1, 0x10, 0x01, 0xe2, 0x43, 0x30, 0x01, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0xc0, 0x81, 0x03, 
-	0xe3, 0xc3, 0x91, 0x03, 0xe0, 0x20, 0x00, 0x03, 
-	0xe2, 0x00, 0x01, 0x02, 0xe0, 0x88, 0x30, 0x09, 
-	0xe2, 0x43, 0x3c, 0x3f, 0xe2, 0x43, 0x30, 0xfe, 
-	0xe1, 0xa0, 0x58, 0x24, 0xe1, 0xc4, 0x68, 0x05, 
-	0xe1, 0xa0, 0x88, 0x21, 0xe1, 0xc1, 0x98, 0x08, 
-	0xe0, 0x01, 0x08, 0x95, 0xe0, 0x08, 0x08, 0x96, 
-	0xe0, 0x02, 0x06, 0x99, 0xe0, 0x92, 0x28, 0x08, 
-	0xe0, 0xa1, 0x18, 0x28, 0xe0, 0x09, 0x09, 0x95, 
-	0xe0, 0x92, 0x28, 0x09, 0xe0, 0xb1, 0x18, 0x29, 
-	0xe3, 0xa0, 0x60, 0x00, 0x41, 0xa0, 0xf0, 0x0e, 
-	0xe0, 0x92, 0x20, 0x02, 0xe0, 0xa1, 0x10, 0x01, 
-	0xe2, 0x43, 0x30, 0x01, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0xe1, 0xa0, 0x98, 0x83, 0xe3, 0x79, 0x08, 0x02, 
-	0x30, 0x09, 0x90, 0x04, 0xe0, 0x19, 0x90, 0x83, 
-	0xe1, 0xa0, 0x88, 0x80, 0xe3, 0x78, 0x08, 0x02, 
-	0x30, 0x08, 0x80, 0x01, 0xe0, 0x18, 0x80, 0x80, 
-	0x4a, 0x00, 0x00, 0x1f, 0xe3, 0x19, 0x01, 0x02, 
-	0x1a, 0x00, 0x00, 0x2f, 0xe1, 0x91, 0x80, 0x02, 
-	0x11, 0x94, 0x80, 0x05, 0x0a, 0x00, 0x00, 0x13, 
-	0xe0, 0x11, 0x60, 0x80, 0x43, 0xc1, 0x11, 0x02, 
-	0x42, 0x80, 0x00, 0x01, 0xe0, 0x14, 0x60, 0x83, 
-	0x43, 0xc4, 0x41, 0x02, 0x42, 0x83, 0x30, 0x01, 
-	0xe3, 0xc0, 0x81, 0x03, 0xe3, 0xc3, 0x91, 0x03, 
-	0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02, 
-	0xe0, 0x88, 0x30, 0x09, 0xe2, 0x43, 0x3c, 0x3f, 
-	0xe2, 0x43, 0x30, 0xfe, 0xe9, 0x2d, 0x40, 0x00, 
-	0xe3, 0x11, 0x01, 0x02, 0x0b, 0x00, 0x04, 0xed, 
-	0xe3, 0x14, 0x01, 0x02, 0x0b, 0x00, 0x05, 0x04, 
-	0xe8, 0xbd, 0x40, 0x00, 0xea, 0xff, 0xff, 0x44, 
-	0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02, 
-	0xe3, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x20, 0x00, 
-	0xe3, 0xa0, 0x30, 0x00, 0xe3, 0xa0, 0x60, 0x00, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0x19, 0x01, 0x02, 
-	0x0a, 0x00, 0x00, 0x09, 0xe1, 0x82, 0x80, 0x81, 
-	0xe1, 0x88, 0x80, 0x05, 0xe1, 0x98, 0x80, 0x84, 
-	0x1a, 0x00, 0x05, 0x2d, 0xe0, 0x20, 0x80, 0x03, 
-	0xe2, 0x08, 0x81, 0x02, 0xe2, 0x8f, 0x00, 0x44, 
-	0xe8, 0x90, 0x00, 0x07, 0xe1, 0x80, 0x00, 0x08, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0x92, 0x80, 0x81, 
-	0x1a, 0x00, 0x05, 0x36, 0xe1, 0x94, 0x80, 0x05, 
-	0x1a, 0xff, 0xff, 0xf5, 0xe3, 0x80, 0x04, 0x61, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0x95, 0x80, 0x84, 
-	0x1a, 0x00, 0x05, 0x27, 0xe1, 0x91, 0x80, 0x02, 
-	0x1a, 0xff, 0xff, 0xef, 0xe3, 0x80, 0x04, 0x61, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x40, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xe1, 0xa0, 0x80, 0x00, 
-	0xe1, 0xa0, 0x00, 0x03, 0xe1, 0xa0, 0x30, 0x08, 
-	0xe1, 0xa0, 0x80, 0x01, 0xe1, 0xa0, 0x10, 0x04, 
-	0xe1, 0xa0, 0x40, 0x08, 0xe1, 0xa0, 0x80, 0x02, 
-	0xe1, 0xa0, 0x20, 0x05, 0xe1, 0xa0, 0x50, 0x08, 
-	0xe3, 0xc0, 0x81, 0x03, 0xe3, 0xc3, 0x91, 0x03, 
-	0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02, 
-	0xe0, 0x49, 0x30, 0x08, 0xe2, 0x83, 0x3c, 0x3f, 
-	0xe2, 0x83, 0x30, 0xff, 0xe9, 0x2d, 0x48, 0x89, 
-	0xe1, 0xa0, 0x08, 0x21, 0xe1, 0xc1, 0x78, 0x00, 
-	0xe1, 0xa0, 0xb8, 0x22, 0xe1, 0xc2, 0xe8, 0x0b, 
-	0xe2, 0x8f, 0x6e, 0x36, 0xe7, 0xd6, 0x64, 0x20, 
-	0xe0, 0x28, 0x66, 0x90, 0xe2, 0x68, 0x85, 0x02, 
-	0xe0, 0x06, 0x06, 0x98, 0xe1, 0xa0, 0x69, 0xa6, 
-	0xe2, 0x86, 0x60, 0x02, 0xe1, 0xa0, 0x86, 0xa1, 
-	0xe0, 0x29, 0x66, 0x98, 0xe2, 0x69, 0x92, 0x02, 
-	0xe1, 0xa0, 0x88, 0x29, 0xe1, 0xc9, 0x98, 0x08, 
-	0xe0, 0x02, 0x06, 0x99, 0xe0, 0x01, 0x06, 0x98, 
-	0xe0, 0x81, 0x68, 0x22, 0xe1, 0xa0, 0x63, 0x26, 
-	0xe1, 0xb0, 0x40, 0xa4, 0xe1, 0xb0, 0x50, 0x65, 
-	0x33, 0xa0, 0x30, 0x00, 0x23, 0xa0, 0x31, 0x02, 
-	0xe1, 0xa0, 0x87, 0xa4, 0xe0, 0x09, 0x08, 0x96, 
-	0xe1, 0xa0, 0x98, 0x29, 0xe0, 0x08, 0x0b, 0x99, 
-	0xe0, 0x55, 0x50, 0x08, 0xe0, 0x08, 0x09, 0x90, 
-	0xe0, 0xc4, 0x40, 0x08, 0xe0, 0x08, 0x0e, 0x99, 
-	0xe0, 0x53, 0x38, 0x08, 0xe0, 0xd5, 0x58, 0x28, 
-	0xe0, 0x08, 0x07, 0x99, 0x30, 0x45, 0x58, 0x08, 
-	0x20, 0x55, 0x58, 0x08, 0xe0, 0xc4, 0x48, 0x28, 
-	0xe1, 0xa0, 0x18, 0x09, 0xe1, 0xa0, 0x81, 0x24, 
-	0xe0, 0x09, 0x08, 0x96, 0xe1, 0xa0, 0x98, 0x29, 
-	0xe0, 0x08, 0x0b, 0x99, 0xe0, 0x53, 0x39, 0x88, 
-	0xe0, 0xd5, 0x56, 0xa8, 0xe0, 0x08, 0x09, 0x90, 
-	0x30, 0x45, 0x59, 0x88, 0x20, 0x55, 0x59, 0x88, 
-	0xe0, 0xc4, 0x46, 0xa8, 0xe0, 0x08, 0x0e, 0x99, 
-	0xe0, 0x53, 0x31, 0x88, 0xe0, 0xd5, 0x5e, 0xa8, 
-	0xe0, 0x08, 0x07, 0x99, 0x30, 0x45, 0x51, 0x88, 
-	0x20, 0x55, 0x51, 0x88, 0xe0, 0xc4, 0x4e, 0xa8, 
-	0xe1, 0xa0, 0x4d, 0x04, 0xe1, 0x84, 0x43, 0x25, 
-	0xe1, 0xa0, 0x5d, 0x05, 0xe1, 0x85, 0x53, 0x23, 
-	0xe1, 0xa0, 0x3d, 0x03, 0xe0, 0x81, 0x11, 0x89, 
-	0xe5, 0x9d, 0x80, 0x0c, 0xe3, 0x18, 0x00, 0x01, 
-	0x1a, 0x00, 0x00, 0x94, 0xe1, 0xa0, 0x87, 0xa4, 
-	0xe0, 0x09, 0x08, 0x96, 0xe1, 0xa0, 0x98, 0x29, 
-	0xe0, 0x08, 0x0b, 0x99, 0xe0, 0x55, 0x50, 0x08, 
-	0xe0, 0x08, 0x09, 0x90, 0xe0, 0xc4, 0x40, 0x08, 
-	0xe0, 0x08, 0x0e, 0x99, 0xe0, 0x53, 0x38, 0x08, 
-	0xe0, 0xd5, 0x58, 0x28, 0xe0, 0x08, 0x07, 0x99, 
-	0x30, 0x45, 0x58, 0x08, 0x20, 0x55, 0x58, 0x08, 
-	0xe0, 0xc4, 0x48, 0x28, 0xe1, 0xa0, 0x2b, 0x09, 
-	0xe0, 0x81, 0x15, 0x29, 0xe1, 0xa0, 0x81, 0x24, 
-	0xe0, 0x09, 0x08, 0x96, 0xe1, 0xa0, 0x98, 0x29, 
-	0xe0, 0x08, 0x0b, 0x99, 0xe0, 0x53, 0x39, 0x88, 
-	0xe0, 0xd5, 0x56, 0xa8, 0xe0, 0x08, 0x09, 0x90, 
-	0x30, 0x45, 0x59, 0x88, 0x20, 0x55, 0x59, 0x88, 
-	0xe0, 0xc4, 0x46, 0xa8, 0xe0, 0x08, 0x0e, 0x99, 
-	0xe0, 0x53, 0x31, 0x88, 0xe0, 0xd5, 0x5e, 0xa8, 
-	0xe0, 0x08, 0x07, 0x99, 0x30, 0x45, 0x51, 0x88, 
-	0x20, 0x55, 0x51, 0x88, 0xe0, 0xc4, 0x4e, 0xa8, 
-	0xe1, 0xa0, 0x4d, 0x04, 0xe1, 0x84, 0x43, 0x25, 
-	0xe1, 0xa0, 0x5d, 0x05, 0xe1, 0x85, 0x53, 0x23, 
-	0xe1, 0xa0, 0x3d, 0x03, 0xe0, 0x92, 0x24, 0x89, 
-	0xe2, 0xa1, 0x10, 0x00, 0xe5, 0x9d, 0x80, 0x0c, 
-	0xe3, 0x18, 0x00, 0x02, 0x1a, 0x00, 0x00, 0x3f, 
-	0xe1, 0xa0, 0x87, 0xa4, 0xe0, 0x09, 0x08, 0x96, 
-	0xe1, 0xa0, 0x98, 0x29, 0xe0, 0x08, 0x0b, 0x99, 
-	0xe0, 0x55, 0x50, 0x08, 0xe0, 0x08, 0x09, 0x90, 
-	0xe0, 0xc4, 0x40, 0x08, 0xe0, 0x08, 0x0e, 0x99, 
-	0xe0, 0x53, 0x38, 0x08, 0xe0, 0xd5, 0x58, 0x28, 
-	0xe0, 0x08, 0x07, 0x99, 0x30, 0x45, 0x58, 0x08, 
-	0x20, 0x55, 0x58, 0x08, 0xe0, 0xc4, 0x48, 0x28, 
-	0xe1, 0xa0, 0x47, 0x04, 0xe1, 0x84, 0x49, 0x25, 
-	0xe1, 0xa0, 0x57, 0x05, 0xe1, 0x85, 0x59, 0x23, 
-	0xe1, 0xa0, 0x37, 0x03, 0xe1, 0xa0, 0x6e, 0x09, 
-	0xe0, 0x92, 0x22, 0x29, 0xe2, 0xa1, 0x10, 0x00, 
-	0xe1, 0x87, 0x08, 0x00, 0xe1, 0x8e, 0x78, 0x0b, 
-	0xe3, 0xa0, 0xe0, 0x00, 0xe0, 0x55, 0x90, 0x07, 
-	0xe0, 0xd4, 0x80, 0x00, 0x21, 0xa0, 0x50, 0x09, 
-	0x21, 0xa0, 0x40, 0x08, 0xe0, 0xae, 0xe0, 0x0e, 
-	0xe3, 0xa0, 0xb0, 0x00, 0xe0, 0x93, 0x30, 0x03, 
-	0xe0, 0xb5, 0x50, 0x05, 0xe0, 0xb4, 0x40, 0x04, 
-	0xe0, 0xab, 0xb0, 0x0b, 0xe0, 0x55, 0x90, 0x07, 
-	0xe0, 0xd4, 0x80, 0x00, 0xe2, 0xdb, 0xb0, 0x00, 
-	0x21, 0xa0, 0x50, 0x09, 0x21, 0xa0, 0x40, 0x08, 
-	0xe0, 0xae, 0xe0, 0x0e, 0xe3, 0xa0, 0xb0, 0x00, 
-	0xe0, 0x93, 0x30, 0x03, 0xe0, 0xb5, 0x50, 0x05, 
-	0xe0, 0xb4, 0x40, 0x04, 0xe0, 0xab, 0xb0, 0x0b, 
-	0xe0, 0x55, 0x90, 0x07, 0xe0, 0xd4, 0x80, 0x00, 
-	0xe2, 0xdb, 0xb0, 0x00, 0x21, 0xa0, 0x50, 0x09, 
-	0x21, 0xa0, 0x40, 0x08, 0xe0, 0xae, 0xe0, 0x0e, 
-	0xe1, 0x94, 0x80, 0x05, 0x13, 0x86, 0x60, 0x01, 
-	0xe0, 0x96, 0x6e, 0x0e, 0xe2, 0xb2, 0x20, 0x00, 
-	0xe2, 0xb1, 0x10, 0x00, 0x48, 0xbd, 0x88, 0x89, 
-	0xe8, 0xbd, 0x48, 0x89, 0xe0, 0x96, 0x60, 0x06, 
-	0xe0, 0xb2, 0x20, 0x02, 0xe0, 0xa1, 0x10, 0x01, 
-	0xe2, 0x43, 0x30, 0x01, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0xe1, 0x87, 0x08, 0x00, 0xe1, 0x8e, 0x78, 0x0b, 
-	0xe3, 0xa0, 0xe0, 0x00, 0xe0, 0x93, 0x30, 0x03, 
-	0xe0, 0xb5, 0x50, 0x05, 0xe0, 0xa4, 0x40, 0x04, 
-	0xe0, 0x55, 0x90, 0x07, 0xe0, 0xd4, 0x80, 0x00, 
-	0x21, 0xa0, 0x50, 0x09, 0x21, 0xa0, 0x40, 0x08, 
-	0xe0, 0xae, 0xe0, 0x0e, 0xe3, 0xa0, 0xb0, 0x00, 
-	0xe0, 0x93, 0x30, 0x03, 0xe0, 0xb5, 0x50, 0x05, 
-	0xe0, 0xb4, 0x40, 0x04, 0xe0, 0xab, 0xb0, 0x0b, 
-	0xe0, 0x55, 0x90, 0x07, 0xe0, 0xd4, 0x80, 0x00, 
-	0xe2, 0xdb, 0xb0, 0x00, 0x21, 0xa0, 0x50, 0x09, 
-	0x21, 0xa0, 0x40, 0x08, 0xe0, 0xae, 0xe0, 0x0e, 
-	0xe3, 0xa0, 0xb0, 0x00, 0xe0, 0x93, 0x30, 0x03, 
-	0xe0, 0xb5, 0x50, 0x05, 0xe0, 0xb4, 0x40, 0x04, 
-	0xe0, 0xab, 0xb0, 0x0b, 0xe0, 0x55, 0x90, 0x07, 
-	0xe0, 0xd4, 0x80, 0x00, 0xe2, 0xdb, 0xb0, 0x00, 
-	0x21, 0xa0, 0x50, 0x09, 0x21, 0xa0, 0x40, 0x08, 
-	0xe0, 0xae, 0xe0, 0x0e, 0xe1, 0x84, 0x60, 0x05, 
-	0xe0, 0x92, 0x24, 0x8e, 0xe2, 0xb1, 0x10, 0x00, 
-	0x48, 0xbd, 0x88, 0x89, 0xe8, 0xbd, 0x48, 0x89, 
-	0xe0, 0x92, 0x20, 0x02, 0xe0, 0xa1, 0x10, 0x01, 
-	0xe2, 0x43, 0x30, 0x01, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0xe1, 0x87, 0x08, 0x00, 0xe1, 0x8e, 0x78, 0x0b, 
-	0xe0, 0x93, 0x30, 0x03, 0xe0, 0xb5, 0x50, 0x05, 
-	0xe0, 0xa4, 0x40, 0x04, 0xe0, 0x55, 0x90, 0x07, 
-	0xe0, 0xd4, 0x80, 0x00, 0x21, 0xa0, 0x50, 0x09, 
-	0x21, 0xa0, 0x40, 0x08, 0x22, 0x81, 0x10, 0x20, 
-	0xe3, 0xa0, 0xb0, 0x00, 0xe0, 0x93, 0x30, 0x03, 
-	0xe0, 0xb5, 0x50, 0x05, 0xe0, 0xb4, 0x40, 0x04, 
-	0xe0, 0xab, 0xb0, 0x0b, 0xe0, 0x55, 0x90, 0x07, 
-	0xe0, 0xd4, 0x80, 0x00, 0xe2, 0xdb, 0xb0, 0x00, 
-	0x21, 0xa0, 0x50, 0x09, 0x21, 0xa0, 0x40, 0x08, 
-	0x22, 0x81, 0x10, 0x10, 0xe3, 0xa0, 0xb0, 0x00, 
-	0xe0, 0x93, 0x30, 0x03, 0xe0, 0xb5, 0x50, 0x05, 
-	0xe0, 0xb4, 0x40, 0x04, 0xe0, 0xab, 0xb0, 0x0b, 
-	0xe0, 0x55, 0x90, 0x07, 0xe0, 0xd4, 0x80, 0x00, 
-	0xe2, 0xdb, 0xb0, 0x00, 0x21, 0xa0, 0x50, 0x09, 
-	0x21, 0xa0, 0x40, 0x08, 0x22, 0x81, 0x10, 0x08, 
-	0xe1, 0x84, 0x60, 0x05, 0xe3, 0xa0, 0x20, 0x00, 
-	0xe3, 0x31, 0x00, 0x00, 0x48, 0xbd, 0x88, 0x89, 
-	0xe8, 0xbd, 0x48, 0x89, 0xe1, 0xa0, 0x10, 0x81, 
-	0xe2, 0x43, 0x30, 0x01, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0x80, 0x80, 0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 
-	0x79, 0x78, 0x77, 0x76, 0x76, 0x75, 0x74, 0x73, 
-	0x72, 0x71, 0x71, 0x70, 0x6f, 0x6e, 0x6e, 0x6d, 
-	0x6c, 0x6c, 0x6b, 0x6a, 0x6a, 0x69, 0x68, 0x68, 
-	0x67, 0x66, 0x66, 0x65, 0x64, 0x64, 0x63, 0x63, 
-	0x62, 0x61, 0x61, 0x60, 0x60, 0x5f, 0x5f, 0x5e, 
-	0x5e, 0x5d, 0x5d, 0x5c, 0x5c, 0x5b, 0x5b, 0x5a, 
-	0x5a, 0x59, 0x59, 0x58, 0x58, 0x57, 0x57, 0x56, 
-	0x56, 0x55, 0x55, 0x55, 0x54, 0x54, 0x53, 0x53, 
-	0x52, 0x52, 0x52, 0x51, 0x51, 0x50, 0x50, 0x50, 
-	0x4f, 0x4f, 0x4f, 0x4e, 0x4e, 0x4d, 0x4d, 0x4d, 
-	0x4c, 0x4c, 0x4c, 0x4b, 0x4b, 0x4b, 0x4a, 0x4a, 
-	0x4a, 0x49, 0x49, 0x49, 0x48, 0x48, 0x48, 0x47, 
-	0x47, 0x47, 0x47, 0x46, 0x46, 0x46, 0x45, 0x45, 
-	0x45, 0x44, 0x44, 0x44, 0x44, 0x43, 0x43, 0x43, 
-	0x43, 0x42, 0x42, 0x42, 0x42, 0x41, 0x41, 0x41, 
-	0xe1, 0xa0, 0x98, 0x83, 0xe3, 0x79, 0x08, 0x02, 
-	0x30, 0x09, 0x90, 0x04, 0xe0, 0x19, 0x90, 0x83, 
-	0xe1, 0xa0, 0x88, 0x80, 0xe3, 0x78, 0x08, 0x02, 
-	0x30, 0x08, 0x80, 0x01, 0xe0, 0x18, 0x80, 0x80, 
-	0x4a, 0x00, 0x00, 0x20, 0xe3, 0x19, 0x01, 0x02, 
-	0x1a, 0x00, 0x00, 0x32, 0xe3, 0x1b, 0x00, 0x04, 
-	0x1a, 0x00, 0x00, 0x08, 0xe1, 0xa0, 0x80, 0x00, 
-	0xe1, 0xa0, 0x00, 0x03, 0xe1, 0xa0, 0x30, 0x08, 
-	0xe1, 0xa0, 0x80, 0x01, 0xe1, 0xa0, 0x10, 0x04, 
-	0xe1, 0xa0, 0x40, 0x08, 0xe1, 0xa0, 0x80, 0x02, 
-	0xe1, 0xa0, 0x20, 0x05, 0xe1, 0xa0, 0x50, 0x08, 
-	0xe0, 0x11, 0x60, 0x80, 0x43, 0xc1, 0x11, 0x02, 
-	0x42, 0x80, 0x00, 0x01, 0xe0, 0x14, 0x60, 0x83, 
-	0x43, 0xc4, 0x41, 0x02, 0x42, 0x83, 0x30, 0x01, 
-	0xe3, 0xc0, 0x81, 0x03, 0xe3, 0xc3, 0x91, 0x03, 
-	0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02, 
-	0xe0, 0x49, 0x30, 0x08, 0xe2, 0x83, 0x3c, 0x3f, 
-	0xe2, 0x83, 0x30, 0xff, 0xe9, 0x2d, 0x40, 0x00, 
-	0xe3, 0x11, 0x01, 0x02, 0x0b, 0x00, 0x03, 0xa1, 
-	0xe3, 0x14, 0x01, 0x02, 0x0b, 0x00, 0x03, 0x86, 
-	0xe8, 0xbd, 0x40, 0x00, 0xea, 0xff, 0xfe, 0xb6, 
-	0xe3, 0x19, 0x01, 0x02, 0x0a, 0x00, 0x00, 0x05, 
-	0xe1, 0x82, 0x80, 0x81, 0xe1, 0x88, 0x80, 0x05, 
-	0xe1, 0x98, 0x80, 0x84, 0x1a, 0x00, 0x03, 0xb6, 
-	0xe3, 0x80, 0x04, 0x61, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0xe1, 0x92, 0x80, 0x81, 0x1a, 0x00, 0x03, 0xc3, 
-	0xe0, 0x20, 0x80, 0x03, 0xe2, 0x08, 0x81, 0x02, 
-	0xe3, 0x1b, 0x00, 0x04, 0x02, 0x8f, 0x00, 0x50, 
-	0x12, 0x8f, 0x00, 0x40, 0xe8, 0x90, 0x00, 0x07, 
-	0xe1, 0x80, 0x00, 0x08, 0xe3, 0xa0, 0x30, 0x00, 
-	0xe3, 0xa0, 0x60, 0x00, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0xe1, 0x95, 0x80, 0x84, 0x1a, 0x00, 0x03, 0xae, 
-	0xe0, 0x20, 0x80, 0x03, 0xe2, 0x08, 0x81, 0x02, 
-	0xe3, 0x1b, 0x00, 0x04, 0x12, 0x8f, 0x00, 0x20, 
-	0x02, 0x8f, 0x00, 0x10, 0xe8, 0x90, 0x00, 0x07, 
-	0xe1, 0x80, 0x00, 0x08, 0xe3, 0xa0, 0x30, 0x00, 
-	0xe3, 0xa0, 0x60, 0x00, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x7f, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xb5, 0x00, 0x49, 0x02, 0xf0, 0x00, 0xf9, 0x2a, 
-	0xbc, 0x08, 0x47, 0x18, 0xff, 0xff, 0xff, 0xfd, 
-	0xb5, 0x80, 0x1c, 0x07, 0x28, 0x0a, 0xd2, 0x14, 
-	0xa3, 0x01, 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 
-	0x10, 0x04, 0x10, 0x06, 0x08, 0x0a, 0x0c, 0x10, 
-	0x0e, 0x0e, 0xa0, 0x0f, 0xe0, 0x0c, 0xa0, 0x1a, 
-	0xe0, 0x0a, 0xa0, 0x33, 0xe0, 0x08, 0xa0, 0x3f, 
-	0xe0, 0x06, 0xa0, 0x4b, 0xe0, 0x04, 0xa0, 0x52, 
-	0xe0, 0x02, 0x1c, 0x38, 0xf0, 0x00, 0xff, 0x89, 
-	0x21, 0x03, 0xf0, 0x00, 0xf9, 0x27, 0x2f, 0x04, 
-	0xd1, 0x05, 0x20, 0x01, 0xf7, 0xfe, 0xf8, 0xd4, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xfe, 
-	0xfd, 0xb3, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x41, 0x62, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 
-	0x20, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 
-	0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x2e, 
-	0x67, 0x2e, 0x20, 0x61, 0x62, 0x6f, 0x72, 0x74, 
-	0x28, 0x29, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 
-	0x69, 0x6f, 0x6e, 0x29, 0x00, 0x00, 0x00, 0x00, 
-	0x49, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20, 
-	0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 
-	0x69, 0x6f, 0x6e, 0x20, 0x28, 0x63, 0x61, 0x6c, 
-	0x6c, 0x20, 0x74, 0x6f, 0x20, 0x6e, 0x6f, 0x6e, 
-	0x2d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 
-	0x6e, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x63, 
-	0x6f, 0x72, 0x72, 0x75, 0x70, 0x74, 0x65, 0x64, 
-	0x29, 0x0a, 0x5b, 0x69, 0x73, 0x20, 0x74, 0x68, 
-	0x65, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x69, 
-	0x6e, 0x67, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 
-	0x20, 0x65, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 
-	0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 
-	0x6c, 0x65, 0x64, 0x3f, 0x5d, 0x00, 0x00, 0x00, 
-	0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 
-	0x74, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 
-	0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 
-	0x75, 0x73, 0x65, 0x72, 0x20, 0x2d, 0x20, 0x70, 
-	0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x74, 
-	0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 
-	0x64, 0x00, 0x00, 0x00, 0x49, 0x6c, 0x6c, 0x65, 
-	0x67, 0x61, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x72, 
-	0x65, 0x73, 0x73, 0x20, 0x28, 0x65, 0x2e, 0x67, 
-	0x2e, 0x20, 0x77, 0x69, 0x6c, 0x64, 0x6c, 0x79, 
-	0x20, 0x6f, 0x75, 0x74, 0x73, 0x69, 0x64, 0x65, 
-	0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x62, 
-	0x6f, 0x75, 0x6e, 0x64, 0x73, 0x29, 0x00, 0x00, 
-	0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 
-	0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 
-	0x65, 0x73, 0x74, 0x20, 0x72, 0x65, 0x63, 0x65, 
-	0x69, 0x76, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 
-	0x55, 0x73, 0x65, 0x72, 0x2d, 0x64, 0x65, 0x66, 
-	0x69, 0x6e, 0x65, 0x64, 0x20, 0x73, 0x69, 0x67, 
-	0x6e, 0x61, 0x6c, 0x00, 0xb5, 0x00, 0x20, 0x01, 
-	0x49, 0x05, 0x70, 0x08, 0xa0, 0x05, 0x21, 0x03, 
-	0xf0, 0x00, 0xf8, 0x78, 0x20, 0x64, 0xf7, 0xfe, 
-	0xf8, 0x27, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x21, 0x94, 0x53, 0x74, 0x61, 0x63, 
-	0x6b, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 
-	0x6f, 0x77, 0x0a, 0x00, 0xb5, 0x00, 0x28, 0x07, 
-	0xd1, 0x03, 0xf7, 0xff, 0xff, 0xe3, 0xbc, 0x08, 
-	0x47, 0x18, 0xf7, 0xff, 0xff, 0x19, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x00, 0xf7, 0xff, 0xff, 0xf2, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x28, 0x00, 
-	0xdd, 0x01, 0x28, 0x0b, 0xdb, 0x05, 0x20, 0x03, 
-	0x49, 0x0b, 0x60, 0x08, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x87, 0x4b, 0x09, 0x59, 0xd9, 
-	0x4a, 0x09, 0x42, 0x91, 0xd1, 0x02, 0xf7, 0xff, 
-	0xff, 0xdd, 0xe0, 0x05, 0x4c, 0x07, 0x42, 0xa1, 
-	0xd0, 0x02, 0x51, 0xda, 0xf7, 0xfd, 0xfa, 0xee, 
-	0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x20, 0xb0, 0x2e, 0x08, 0x94, 0xac, 
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 
-	0x28, 0x00, 0xdd, 0x09, 0x28, 0x0b, 0xda, 0x07, 
-	0x00, 0x80, 0x49, 0x04, 0x58, 0x08, 0x49, 0x04, 
-	0x42, 0x88, 0xd0, 0x01, 0x20, 0x01, 0x47, 0x70, 
-	0x20, 0x00, 0x47, 0x70, 0x2e, 0x08, 0x94, 0xac, 
-	0xff, 0xff, 0xff, 0xff, 0x28, 0x00, 0xdd, 0x01, 
-	0x28, 0x0b, 0xdb, 0x01, 0x48, 0x03, 0x47, 0x70, 
-	0x00, 0x83, 0x4a, 0x03, 0x58, 0xd0, 0x50, 0xd1, 
-	0x47, 0x70, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfe, 
-	0x2e, 0x08, 0x94, 0xac, 0xb5, 0x90, 0x27, 0x01, 
-	0x4c, 0x05, 0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, 
-	0xff, 0xe9, 0x37, 0x01, 0x2f, 0x0b, 0xdb, 0xf8, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0xff, 0xff, 0xff, 0xff, 0xb5, 0x90, 0x1c, 0x0c, 
-	0x1c, 0x07, 0x48, 0x12, 0x28, 0x00, 0xd0, 0x09, 
-	0x48, 0x11, 0x78, 0x00, 0x28, 0x00, 0xd1, 0x05, 
-	0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x00, 0xfb, 0x44, 
-	0x28, 0x00, 0xd1, 0x13, 0x08, 0x60, 0xd3, 0x02, 
-	0x20, 0x0a, 0xf0, 0x00, 0xf8, 0xd3, 0x78, 0x38, 
-	0x28, 0x00, 0xd0, 0x06, 0x78, 0x38, 0x37, 0x01, 
-	0xf0, 0x00, 0xf8, 0xcc, 0x78, 0x38, 0x28, 0x00, 
-	0xd1, 0xf8, 0x08, 0xa0, 0xd3, 0x02, 0x20, 0x0a, 
-	0xf0, 0x00, 0xf8, 0xc4, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x01, 0xbd, 0x35, 
-	0x2e, 0x08, 0x21, 0x94, 0xb5, 0x80, 0xb0, 0x83, 
-	0x90, 0x00, 0x91, 0x01, 0xf7, 0xfd, 0xfb, 0x1e, 
-	0x90, 0x02, 0x46, 0x69, 0x20, 0x01, 0xf0, 0x01, 
-	0xf8, 0x61, 0x23, 0x01, 0x1c, 0x07, 0x42, 0xd8, 
-	0xd1, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x01, 
-	0xf8, 0x59, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 
-	0xb0, 0x03, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x20, 0xb0, 0xb5, 0x80, 0xb0, 0x81, 
-	0x90, 0x00, 0x46, 0x69, 0x20, 0x02, 0xf0, 0x01, 
-	0xf8, 0x49, 0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 
-	0x20, 0x13, 0xf0, 0x01, 0xf8, 0x43, 0x49, 0x03, 
-	0x60, 0x08, 0x1c, 0x38, 0xb0, 0x01, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x20, 0xb0, 
-	0xb5, 0x80, 0xb0, 0x84, 0x90, 0x00, 0x91, 0x01, 
-	0x92, 0x02, 0x46, 0x69, 0x20, 0x05, 0xf0, 0x01, 
-	0xf8, 0x31, 0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 
-	0x20, 0x13, 0xf0, 0x01, 0xf8, 0x2b, 0x49, 0x03, 
-	0x60, 0x08, 0x1c, 0x38, 0xb0, 0x04, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x20, 0xb0, 
-	0xb5, 0x80, 0xb0, 0x84, 0x90, 0x00, 0x91, 0x01, 
-	0x92, 0x02, 0x93, 0x03, 0x46, 0x69, 0x20, 0x06, 
-	0xf0, 0x01, 0xf8, 0x18, 0x1c, 0x07, 0xd0, 0x05, 
-	0x21, 0x00, 0x20, 0x13, 0xf0, 0x01, 0xf8, 0x12, 
-	0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x04, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x20, 0xb0, 0xb5, 0x00, 0xb0, 0x81, 
-	0x90, 0x00, 0x46, 0x69, 0x20, 0x08, 0xf0, 0x01, 
-	0xf8, 0x01, 0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0x00, 0x69, 0x40, 0xb0, 0x81, 0x90, 0x00, 
-	0x46, 0x69, 0x20, 0x09, 0xf0, 0x00, 0xff, 0xf6, 
-	0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x80, 
-	0xb0, 0x82, 0x90, 0x00, 0x91, 0x01, 0x46, 0x69, 
-	0x20, 0x0a, 0xf0, 0x00, 0xff, 0xeb, 0x1c, 0x07, 
-	0xd5, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x00, 
-	0xff, 0xe5, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 
-	0xb0, 0x02, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x20, 0xb0, 0xb5, 0x80, 0xb0, 0x81, 
-	0x90, 0x00, 0x46, 0x69, 0x20, 0x0b, 0xf0, 0x00, 
-	0xff, 0xd5, 0x1c, 0x07, 0xd5, 0x05, 0x21, 0x00, 
-	0x20, 0x13, 0xf0, 0x00, 0xff, 0xcf, 0x49, 0x03, 
-	0x60, 0x08, 0x1c, 0x38, 0xb0, 0x01, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x20, 0xb0, 
-	0xb5, 0x00, 0xb0, 0x81, 0x90, 0x00, 0x46, 0x69, 
-	0x20, 0x0c, 0xf0, 0x00, 0xff, 0xbf, 0xb0, 0x01, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 0xb0, 0x83, 
-	0x90, 0x00, 0x91, 0x01, 0x92, 0x02, 0x46, 0x69, 
-	0x20, 0x0d, 0xf0, 0x00, 0xff, 0xb3, 0xb0, 0x03, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x01, 0x46, 0x69, 
-	0x20, 0x03, 0xf0, 0x00, 0xff, 0xab, 0xb0, 0x01, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x80, 0xb0, 0x82, 
-	0x90, 0x00, 0xf7, 0xfd, 0xfa, 0x5b, 0x90, 0x01, 
-	0x46, 0x69, 0x20, 0x12, 0xf0, 0x00, 0xff, 0x9e, 
-	0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 0x20, 0x13, 
-	0xf0, 0x00, 0xff, 0x98, 0x49, 0x03, 0x60, 0x08, 
-	0x1c, 0x38, 0xb0, 0x02, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x20, 0xb0, 
-	0xb5, 0x80, 0xb0, 0x82, 0x90, 0x00, 0xf7, 0xfd, 
-	0xfa, 0x41, 0x90, 0x01, 0x46, 0x69, 0x20, 0x0e, 
-	0xf0, 0x00, 0xff, 0x84, 0x1c, 0x07, 0xd0, 0x05, 
-	0x21, 0x00, 0x20, 0x13, 0xf0, 0x00, 0xff, 0x7e, 
-	0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x02, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x20, 0xb0, 0xb5, 0x80, 0xb0, 0x84, 
-	0x90, 0x00, 0x1c, 0x0f, 0xf7, 0xfd, 0xfa, 0x26, 
-	0x90, 0x01, 0x97, 0x02, 0x1c, 0x38, 0xf7, 0xfd, 
-	0xfa, 0x21, 0x90, 0x03, 0x46, 0x69, 0x20, 0x0f, 
-	0xf0, 0x00, 0xff, 0x64, 0x1c, 0x07, 0xd0, 0x05, 
-	0x21, 0x00, 0x20, 0x13, 0xf0, 0x00, 0xff, 0x5e, 
-	0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x04, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x20, 0xb0, 0xb5, 0x80, 0xb0, 0x82, 
-	0x4f, 0x08, 0x97, 0x00, 0x20, 0xff, 0x30, 0x01, 
-	0x90, 0x01, 0x46, 0x69, 0x20, 0x15, 0xf0, 0x00, 
-	0xff, 0x49, 0x28, 0x00, 0xd0, 0x01, 0x20, 0x00, 
-	0xe0, 0x00, 0x1c, 0x38, 0xb0, 0x02, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x94, 0xdc, 
-	0xb5, 0x00, 0x21, 0x00, 0x20, 0x10, 0xf0, 0x00, 
-	0xff, 0x39, 0x49, 0x02, 0x68, 0x09, 0x1a, 0x40, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x21, 0xa4, 
-	0xb5, 0x00, 0x21, 0x00, 0x20, 0x10, 0xf0, 0x00, 
-	0xff, 0x2d, 0x49, 0x02, 0x60, 0x08, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x21, 0xa4, 
-	0xb5, 0x80, 0x21, 0x00, 0x1c, 0x07, 0x20, 0x11, 
-	0xf0, 0x00, 0xff, 0x20, 0x2f, 0x00, 0xd0, 0x00, 
-	0x60, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x00, 0x47, 0x70, 0xb4, 0x80, 0x20, 0x03, 
-	0x43, 0xc0, 0x23, 0x00, 0x49, 0x07, 0x54, 0x0b, 
-	0x30, 0x01, 0xd4, 0xfc, 0x20, 0x00, 0x4a, 0x06, 
-	0x5c, 0x17, 0x54, 0x0f, 0x18, 0x0f, 0x37, 0x80, 
-	0x70, 0x3b, 0x30, 0x01, 0x28, 0x80, 0xd3, 0xf7, 
-	0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x21, 0xac, 
-	0x2e, 0x03, 0x3b, 0x58, 0xb5, 0x80, 0x49, 0x07, 
-	0x68, 0x09, 0xf7, 0xfd, 0xf9, 0x13, 0x1c, 0x07, 
-	0xd1, 0x03, 0xa1, 0x05, 0xa0, 0x05, 0xf0, 0x00, 
-	0xfc, 0xe7, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x20, 0xa8, 
-	0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x20, 0x73, 
-	0x74, 0x6f, 0x72, 0x65, 0x20, 0x6c, 0x65, 0x66, 
-	0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x49, 0x2f, 
-	0x4f, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 
-	0x20, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 
-	0x6c, 0x69, 0x6b, 0x65, 0x00, 0x00, 0x00, 0x00, 
-	0x23, 0x80, 0x68, 0xc1, 0x43, 0x19, 0x60, 0xc1, 
-	0x21, 0x00, 0x60, 0x01, 0x60, 0x81, 0x47, 0x70, 
-	0xb5, 0xf7, 0x68, 0xd5, 0x69, 0x56, 0x1c, 0x0c, 
-	0x1c, 0x17, 0x0d, 0x68, 0xd3, 0x05, 0x23, 0x10, 
-	0x43, 0x1d, 0x1c, 0x30, 0xf7, 0xff, 0xfe, 0xfc, 
-	0x61, 0xb8, 0x48, 0x12, 0x40, 0x28, 0xd0, 0x08, 
-	0x69, 0xb9, 0x1c, 0x30, 0xf7, 0xff, 0xfe, 0xc7, 
-	0x28, 0x00, 0xdb, 0x10, 0x4b, 0x0e, 0x40, 0x1d, 
-	0x60, 0xfd, 0x99, 0x00, 0x1c, 0x30, 0x1c, 0x22, 
-	0x1c, 0x2b, 0xf7, 0xff, 0xfe, 0x75, 0x00, 0x41, 
-	0x08, 0x49, 0x1a, 0x61, 0x69, 0xba, 0x18, 0x51, 
-	0x61, 0xb9, 0x28, 0x00, 0xd0, 0x08, 0x1c, 0x38, 
-	0xf7, 0xff, 0xff, 0xce, 0x20, 0x00, 0x43, 0xc0, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x00, 0xe7, 0xf9, 0x00, 0x02, 0x00, 0x10, 
-	0xff, 0xfd, 0xff, 0xef, 0xb5, 0xb0, 0x48, 0x15, 
-	0x68, 0xc1, 0x4b, 0x15, 0x40, 0x19, 0x1c, 0x1d, 
-	0x42, 0x99, 0xd1, 0x01, 0xf0, 0x00, 0xfc, 0xd6, 
-	0x48, 0x12, 0x68, 0xc1, 0x4b, 0x10, 0x40, 0x19, 
-	0x42, 0xa9, 0xd1, 0x01, 0xf0, 0x00, 0xfc, 0xce, 
-	0x48, 0x0f, 0x68, 0xc1, 0x4b, 0x0c, 0x40, 0x19, 
-	0x42, 0xa9, 0xd1, 0x01, 0xf0, 0x00, 0xfc, 0xc6, 
-	0x27, 0x00, 0x4c, 0x0c, 0x01, 0xb8, 0x19, 0x00, 
-	0x68, 0xc1, 0x4b, 0x07, 0x40, 0x19, 0x42, 0xa9, 
-	0xd1, 0x01, 0xf0, 0x00, 0xfc, 0xbb, 0x37, 0x01, 
-	0x2f, 0x0d, 0xdb, 0xf3, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x95, 0xdc, 
-	0x00, 0x00, 0x02, 0x02, 0x2e, 0x08, 0x96, 0x1c, 
-	0x2e, 0x08, 0x96, 0x5c, 0x2e, 0x08, 0x96, 0x9c, 
-	0xb5, 0xf0, 0x1c, 0x07, 0x69, 0x04, 0x6a, 0xc0, 
-	0x68, 0x79, 0x42, 0x88, 0xd9, 0x00, 0x1c, 0x01, 
-	0x68, 0xf8, 0x4b, 0x13, 0x40, 0x18, 0x07, 0x82, 
-	0x0f, 0x92, 0x25, 0x00, 0x60, 0xf8, 0x2a, 0x01, 
-	0xd0, 0x1a, 0x22, 0x82, 0x40, 0x02, 0x15, 0x1e, 
-	0x2a, 0x02, 0xd1, 0x0a, 0x0c, 0x40, 0xd3, 0x13, 
-	0x42, 0xa1, 0xd0, 0x0a, 0x1b, 0x09, 0x1c, 0x20, 
-	0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x75, 0x28, 0x00, 
-	0xd0, 0x03, 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x62, 0xfc, 0x60, 0x7c, 0x60, 0xbd, 
-	0x68, 0xf8, 0x4b, 0x04, 0x40, 0x18, 0x60, 0xf8, 
-	0x1c, 0x28, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0xff, 0xf7, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 
-	0xb5, 0x80, 0x1c, 0x07, 0x68, 0xc0, 0x23, 0x20, 
-	0x43, 0xdb, 0x40, 0x18, 0x60, 0xf8, 0x69, 0xb8, 
-	0x6a, 0xb9, 0x42, 0x88, 0xd0, 0x0d, 0x1c, 0x38, 
-	0xf7, 0xff, 0xff, 0xbe, 0x68, 0xf8, 0x4b, 0x08, 
-	0x40, 0x18, 0x23, 0x10, 0x43, 0x18, 0x60, 0xf8, 
-	0x6a, 0xb8, 0x61, 0xb8, 0x69, 0x38, 0x62, 0xf8, 
-	0x60, 0x78, 0x68, 0xf8, 0x4b, 0x03, 0x40, 0x18, 
-	0x60, 0xf8, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xbf, 0xbf, 
-	0xb5, 0xf0, 0x1c, 0x07, 0x69, 0x40, 0xb0, 0x83, 
-	0x90, 0x01, 0x69, 0x38, 0x90, 0x00, 0x25, 0x00, 
-	0x68, 0xfe, 0x07, 0xb0, 0xd1, 0x01, 0x43, 0xc0, 
-	0xe0, 0x48, 0x09, 0x30, 0xd2, 0x40, 0x24, 0x10, 
-	0x1c, 0x38, 0xf0, 0x00, 0xfc, 0x3f, 0x1c, 0x05, 
-	0x0d, 0x70, 0xd3, 0x1b, 0x24, 0x00, 0x49, 0x21, 
-	0x91, 0x02, 0x01, 0xa0, 0x99, 0x02, 0x18, 0x40, 
-	0x42, 0xb8, 0xd0, 0x10, 0x68, 0xc1, 0x07, 0x8a, 
-	0xd0, 0x0d, 0x69, 0x42, 0x9b, 0x01, 0x42, 0x9a, 
-	0xd1, 0x09, 0x0d, 0x49, 0xd3, 0x07, 0x68, 0xc1, 
-	0x4b, 0x19, 0x40, 0x19, 0x60, 0xc1, 0x68, 0xf8, 
-	0x40, 0x18, 0x60, 0xf8, 0xe0, 0x02, 0x34, 0x01, 
-	0x2c, 0x10, 0xdb, 0xe6, 0x2c, 0x10, 0xd1, 0x06, 
-	0x98, 0x01, 0xf7, 0xff, 0xfd, 0x83, 0x28, 0x00, 
-	0xda, 0x01, 0x25, 0x00, 0x43, 0xed, 0x0b, 0x30, 
-	0xd3, 0x04, 0x98, 0x00, 0x49, 0x0f, 0x68, 0x09, 
-	0xf7, 0xfc, 0xff, 0xe0, 0x0d, 0xf0, 0x05, 0xc0, 
-	0x23, 0xa5, 0x05, 0xdb, 0x42, 0xd8, 0xd1, 0x07, 
-	0x48, 0x0b, 0x28, 0x00, 0xd0, 0x04, 0x1c, 0x38, 
-	0x1c, 0x29, 0xf7, 0xff, 0xff, 0xfe, 0x1c, 0x05, 
-	0x22, 0x40, 0x21, 0x00, 0x1c, 0x38, 0xf7, 0xfd, 
-	0xf8, 0x8f, 0x1c, 0x28, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x95, 0xdc, 
-	0xff, 0xef, 0xff, 0xff, 0x2e, 0x08, 0x20, 0xac, 
-	0x00, 0x00, 0x00, 0x00, 0xb5, 0xf7, 0x1c, 0x10, 
-	0x1c, 0x0c, 0x1c, 0x17, 0xf7, 0xff, 0xff, 0x98, 
-	0x78, 0x20, 0x34, 0x01, 0x28, 0x61, 0xd0, 0x09, 
-	0x28, 0x72, 0xd0, 0x04, 0x28, 0x77, 0xd1, 0x25, 
-	0x26, 0x02, 0x25, 0x04, 0xe0, 0x04, 0x26, 0x01, 
-	0x25, 0x00, 0xe0, 0x01, 0x4e, 0x1a, 0x25, 0x08, 
-	0x78, 0x20, 0x34, 0x01, 0x28, 0x2b, 0xd0, 0x06, 
-	0x28, 0x62, 0xd1, 0x09, 0x23, 0x04, 0x43, 0x1e, 
-	0x23, 0x01, 0x43, 0x1d, 0xe7, 0xf4, 0x23, 0x03, 
-	0x43, 0x1e, 0x23, 0x02, 0x43, 0x1d, 0xe7, 0xef, 
-	0x1f, 0xe0, 0x38, 0x19, 0x7f, 0xc0, 0x28, 0x74, 
-	0xd1, 0x01, 0x23, 0x10, 0x43, 0x1d, 0x98, 0x00, 
-	0x1c, 0x29, 0xf7, 0xff, 0xfd, 0x0b, 0x23, 0x01, 
-	0x42, 0xd8, 0xd1, 0x04, 0x20, 0x00, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 
-	0x60, 0x79, 0x61, 0x39, 0x21, 0x01, 0x03, 0x09, 
-	0x61, 0x78, 0x61, 0xf9, 0x60, 0xfe, 0x09, 0x28, 
-	0xd3, 0x04, 0x22, 0x02, 0x21, 0x00, 0x1c, 0x38, 
-	0xf0, 0x00, 0xfb, 0xc4, 0x1c, 0x38, 0xe7, 0xea, 
-	0x00, 0x00, 0x80, 0x02, 0xb5, 0x90, 0x23, 0x03, 
-	0x4f, 0x08, 0x01, 0x9a, 0x19, 0xd2, 0x68, 0xd4, 
-	0x07, 0xa4, 0xd1, 0x04, 0xf7, 0xff, 0xff, 0xaa, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x33, 0x01, 
-	0x2b, 0x10, 0xdb, 0xf2, 0x20, 0x00, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x95, 0xdc, 
-	0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x4d, 0x10, 
-	0x68, 0xe8, 0x08, 0x80, 0xd3, 0x18, 0x20, 0x01, 
-	0x4e, 0x0e, 0x70, 0x30, 0x40, 0x38, 0xd0, 0x03, 
-	0x20, 0x0a, 0x1c, 0x29, 0xf0, 0x00, 0xfc, 0x1e, 
-	0x1c, 0x20, 0x1c, 0x29, 0xf0, 0x00, 0xfc, 0x2c, 
-	0x08, 0xb8, 0xd3, 0x03, 0x20, 0x0a, 0x1c, 0x29, 
-	0xf0, 0x00, 0xfc, 0x14, 0x20, 0x00, 0x70, 0x30, 
-	0x20, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x96, 0x5c, 0x2e, 0x08, 0x21, 0x94, 
-	0xb5, 0x80, 0x1c, 0x07, 0xa0, 0x06, 0x21, 0x01, 
-	0xf7, 0xff, 0xfc, 0x80, 0x21, 0x02, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfc, 0x7c, 0x20, 0x01, 0xf7, 0xfd, 
-	0xfc, 0x25, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x43, 0x6f, 0x75, 0x6c, 0x64, 0x6e, 0x27, 0x74, 
-	0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x00, 
-	0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x15, 0x1c, 0x0f, 
-	0x48, 0x20, 0x22, 0x01, 0x02, 0x92, 0x21, 0x00, 
-	0x1c, 0x06, 0xf7, 0xfc, 0xff, 0xd5, 0x4a, 0x1e, 
-	0x1c, 0x28, 0xa1, 0x1e, 0xf7, 0xff, 0xff, 0x4e, 
-	0x28, 0x00, 0xd1, 0x02, 0x1c, 0x28, 0xf7, 0xff, 
-	0xff, 0xd3, 0x1c, 0x20, 0x1c, 0x32, 0xa1, 0x1a, 
-	0xf7, 0xff, 0xff, 0x44, 0x28, 0x00, 0xd1, 0x02, 
-	0x1c, 0x20, 0xf7, 0xff, 0xff, 0xc9, 0x4a, 0x17, 
-	0x1c, 0x38, 0x1c, 0x15, 0xa1, 0x13, 0xf7, 0xff, 
-	0xff, 0x39, 0x28, 0x00, 0xd1, 0x02, 0x1c, 0x38, 
-	0xf7, 0xff, 0xff, 0xbe, 0x1c, 0x30, 0x26, 0x01, 
-	0x03, 0x36, 0x08, 0xf2, 0x21, 0x00, 0x1c, 0x33, 
-	0xf0, 0x00, 0xf8, 0x52, 0x28, 0x00, 0xd0, 0x02, 
-	0x1c, 0x20, 0xf7, 0xff, 0xff, 0xb1, 0x22, 0x01, 
-	0x02, 0x52, 0x21, 0x00, 0x1c, 0x28, 0x1c, 0x33, 
-	0xf0, 0x00, 0xf8, 0x46, 0x28, 0x00, 0xd0, 0x02, 
-	0x1c, 0x38, 0xf7, 0xff, 0xff, 0xa5, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x95, 0xdc, 
-	0x2e, 0x08, 0x96, 0x5c, 0x77, 0x00, 0x00, 0x00, 
-	0x72, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x96, 0x1c, 
-	0xb5, 0x90, 0x27, 0x03, 0x4c, 0x09, 0x01, 0xb8, 
-	0x19, 0x00, 0xf7, 0xff, 0xfe, 0xa5, 0x37, 0x01, 
-	0x2f, 0x10, 0xdb, 0xf8, 0x27, 0x00, 0x01, 0xb8, 
-	0x19, 0x00, 0xf7, 0xff, 0xfe, 0x9d, 0x37, 0x01, 
-	0x2f, 0x03, 0xdb, 0xf8, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x95, 0xdc, 
-	0xb5, 0xb0, 0x01, 0x80, 0x1c, 0x0f, 0x4c, 0x0a, 
-	0x19, 0x00, 0x1c, 0x05, 0xf7, 0xff, 0xfe, 0x8c, 
-	0x01, 0xb8, 0x19, 0x00, 0x23, 0x01, 0x05, 0x1b, 
-	0x68, 0xc1, 0x43, 0x19, 0x60, 0xc1, 0x4b, 0x05, 
-	0x40, 0x19, 0x60, 0xe9, 0x69, 0x40, 0x61, 0x68, 
-	0x1c, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x95, 0xdc, 0x00, 0x10, 0x8f, 0x03, 
-	0xb4, 0xf0, 0x1c, 0x1f, 0x68, 0xc3, 0x07, 0x9e, 
-	0x0f, 0xb6, 0x25, 0x01, 0x1c, 0x1c, 0x2e, 0x00, 
-	0xd0, 0x13, 0x1c, 0x1e, 0x0d, 0xf3, 0xd2, 0x10, 
-	0x02, 0x2b, 0x42, 0x9a, 0xd0, 0x09, 0x00, 0x5b, 
-	0x42, 0x9a, 0xd0, 0x06, 0x00, 0x5b, 0x42, 0x9a, 
-	0xd1, 0x07, 0x27, 0x01, 0x1d, 0xc1, 0x31, 0x1d, 
-	0xe0, 0x06, 0x1e, 0x7e, 0x4b, 0x08, 0x42, 0x9e, 
-	0xd3, 0x02, 0x1c, 0x28, 0xbc, 0xf0, 0x47, 0x70, 
-	0x61, 0x01, 0x23, 0x0f, 0x02, 0x1b, 0x43, 0x9c, 
-	0x60, 0x41, 0x61, 0xc7, 0x1c, 0x21, 0x43, 0x11, 
-	0x60, 0xc1, 0x20, 0x00, 0xbc, 0xf0, 0x47, 0x70, 
-	0x00, 0xff, 0xff, 0xff, 0xe2, 0x00, 0x01, 0x02, 
-	0xe3, 0x31, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x17, 
-	0xe3, 0xa0, 0x80, 0x00, 0xe1, 0xb0, 0x98, 0x21, 
-	0x01, 0xa0, 0x18, 0x01, 0x02, 0x88, 0x80, 0x10, 
-	0xe1, 0xb0, 0x9c, 0x21, 0x01, 0xa0, 0x14, 0x01, 
-	0x02, 0x88, 0x80, 0x08, 0xe1, 0xb0, 0x9e, 0x21, 
-	0x01, 0xa0, 0x12, 0x01, 0x02, 0x88, 0x80, 0x04, 
-	0xe1, 0xb0, 0x9f, 0x21, 0x01, 0xa0, 0x11, 0x01, 
-	0x02, 0x88, 0x80, 0x02, 0xe1, 0xb0, 0x9f, 0xa1, 
-	0x01, 0xa0, 0x10, 0x81, 0x02, 0x88, 0x80, 0x01, 
-	0xe0, 0x58, 0x98, 0xa6, 0x81, 0xa0, 0x19, 0x31, 
-	0x81, 0xa0, 0x88, 0xa6, 0xe2, 0x68, 0x60, 0x20, 
-	0xe1, 0x81, 0x16, 0x32, 0xe1, 0xa0, 0x28, 0x12, 
-	0x30, 0x40, 0x00, 0x09, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0xe3, 0x56, 0x05, 0x01, 0x3a, 0x00, 0x00, 0x16, 
-	0xe1, 0xb0, 0x10, 0x02, 0x01, 0xa0, 0xf0, 0x0e, 
-	0xe3, 0xa0, 0x20, 0x00, 0xe3, 0xa0, 0x80, 0x20, 
-	0xe1, 0xb0, 0x98, 0x21, 0x01, 0xa0, 0x18, 0x01, 
-	0x02, 0x88, 0x80, 0x10, 0xe1, 0xb0, 0x9c, 0x21, 
-	0x01, 0xa0, 0x14, 0x01, 0x02, 0x88, 0x80, 0x08, 
-	0xe1, 0xb0, 0x9e, 0x21, 0x01, 0xa0, 0x12, 0x01, 
-	0x02, 0x88, 0x80, 0x04, 0xe1, 0xb0, 0x9f, 0x21, 
-	0x01, 0xa0, 0x11, 0x01, 0x02, 0x88, 0x80, 0x02, 
-	0xe1, 0xb0, 0x9f, 0xa1, 0x01, 0xa0, 0x10, 0x81, 
-	0x02, 0x88, 0x80, 0x01, 0xe0, 0x58, 0x98, 0xa6, 
-	0x81, 0xa0, 0x19, 0x31, 0x30, 0x40, 0x00, 0x09, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0xa0, 0x88, 0xa6, 
-	0xe2, 0x68, 0x90, 0x20, 0xe1, 0xa0, 0x18, 0x11, 
-	0xe1, 0x81, 0x19, 0x32, 0xe1, 0xa0, 0x28, 0x12, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe2, 0x03, 0x31, 0x02, 
-	0xe3, 0x34, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x17, 
-	0xe3, 0xa0, 0x80, 0x00, 0xe1, 0xb0, 0x98, 0x24, 
-	0x01, 0xa0, 0x48, 0x04, 0x02, 0x88, 0x80, 0x10, 
-	0xe1, 0xb0, 0x9c, 0x24, 0x01, 0xa0, 0x44, 0x04, 
-	0x02, 0x88, 0x80, 0x08, 0xe1, 0xb0, 0x9e, 0x24, 
-	0x01, 0xa0, 0x42, 0x04, 0x02, 0x88, 0x80, 0x04, 
-	0xe1, 0xb0, 0x9f, 0x24, 0x01, 0xa0, 0x41, 0x04, 
-	0x02, 0x88, 0x80, 0x02, 0xe1, 0xb0, 0x9f, 0xa4, 
-	0x01, 0xa0, 0x40, 0x84, 0x02, 0x88, 0x80, 0x01, 
-	0xe0, 0x58, 0x98, 0xa6, 0x81, 0xa0, 0x49, 0x34, 
-	0x81, 0xa0, 0x88, 0xa6, 0xe2, 0x68, 0x60, 0x20, 
-	0xe1, 0x84, 0x46, 0x35, 0xe1, 0xa0, 0x58, 0x15, 
-	0x30, 0x43, 0x30, 0x09, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0xe3, 0x56, 0x05, 0x01, 0x3a, 0x00, 0x00, 0x16, 
-	0xe1, 0xb0, 0x40, 0x05, 0x01, 0xa0, 0xf0, 0x0e, 
-	0xe3, 0xa0, 0x50, 0x00, 0xe3, 0xa0, 0x80, 0x20, 
-	0xe1, 0xb0, 0x98, 0x24, 0x01, 0xa0, 0x48, 0x04, 
-	0x02, 0x88, 0x80, 0x10, 0xe1, 0xb0, 0x9c, 0x24, 
-	0x01, 0xa0, 0x44, 0x04, 0x02, 0x88, 0x80, 0x08, 
-	0xe1, 0xb0, 0x9e, 0x24, 0x01, 0xa0, 0x42, 0x04, 
-	0x02, 0x88, 0x80, 0x04, 0xe1, 0xb0, 0x9f, 0x24, 
-	0x01, 0xa0, 0x41, 0x04, 0x02, 0x88, 0x80, 0x02, 
-	0xe1, 0xb0, 0x9f, 0xa4, 0x01, 0xa0, 0x40, 0x84, 
-	0x02, 0x88, 0x80, 0x01, 0xe0, 0x58, 0x98, 0xa6, 
-	0x81, 0xa0, 0x49, 0x34, 0x30, 0x43, 0x30, 0x09, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0xa0, 0x88, 0xa6, 
-	0xe2, 0x68, 0x90, 0x20, 0xe1, 0xa0, 0x48, 0x14, 
-	0xe1, 0x84, 0x49, 0x35, 0xe1, 0xa0, 0x58, 0x15, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0xa0, 0x20, 0x00, 
-	0xe2, 0x16, 0x01, 0x02, 0x12, 0x66, 0x10, 0x00, 
-	0x01, 0xb0, 0x10, 0x06, 0x03, 0xa0, 0x30, 0x00, 
-	0x01, 0xa0, 0xf0, 0x0e, 0xe3, 0xa0, 0x39, 0x01, 
-	0xe3, 0x83, 0x30, 0x1e, 0xe3, 0xa0, 0x60, 0x00, 
-	0xe3, 0x31, 0x00, 0x00, 0x01, 0xa0, 0x10, 0x02, 
-	0x03, 0xa0, 0x20, 0x00, 0x02, 0x43, 0x30, 0x20, 
-	0xe3, 0xa0, 0x80, 0x00, 0xe1, 0xb0, 0x98, 0x21, 
-	0x01, 0xa0, 0x18, 0x01, 0x02, 0x88, 0x80, 0x10, 
-	0xe1, 0xb0, 0x9c, 0x21, 0x01, 0xa0, 0x14, 0x01, 
-	0x02, 0x88, 0x80, 0x08, 0xe1, 0xb0, 0x9e, 0x21, 
-	0x01, 0xa0, 0x12, 0x01, 0x02, 0x88, 0x80, 0x04, 
-	0xe1, 0xb0, 0x9f, 0x21, 0x01, 0xa0, 0x11, 0x01, 
-	0x02, 0x88, 0x80, 0x02, 0xe1, 0xb0, 0x9f, 0xa1, 
-	0x01, 0xa0, 0x10, 0x81, 0x02, 0x88, 0x80, 0x01, 
-	0xe2, 0x78, 0x90, 0x20, 0xe1, 0x81, 0x19, 0x32, 
-	0xe1, 0xa0, 0x28, 0x12, 0xe0, 0x43, 0x30, 0x08, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0x34, 0x00, 0x00, 
-	0x01, 0xa0, 0x40, 0x05, 0x03, 0xa0, 0x50, 0x00, 
-	0x02, 0x43, 0x30, 0x20, 0xe3, 0xa0, 0x80, 0x00, 
-	0xe1, 0xb0, 0x98, 0x24, 0x01, 0xa0, 0x48, 0x04, 
-	0x02, 0x88, 0x80, 0x10, 0xe1, 0xb0, 0x9c, 0x24, 
-	0x01, 0xa0, 0x44, 0x04, 0x02, 0x88, 0x80, 0x08, 
-	0xe1, 0xb0, 0x9e, 0x24, 0x01, 0xa0, 0x42, 0x04, 
-	0x02, 0x88, 0x80, 0x04, 0xe1, 0xb0, 0x9f, 0x24, 
-	0x01, 0xa0, 0x41, 0x04, 0x02, 0x88, 0x80, 0x02, 
-	0xe1, 0xb0, 0x9f, 0xa4, 0x01, 0xa0, 0x40, 0x84, 
-	0x02, 0x88, 0x80, 0x01, 0xe2, 0x78, 0x90, 0x20, 
-	0xe1, 0x84, 0x49, 0x35, 0xe1, 0xa0, 0x58, 0x15, 
-	0xe0, 0x43, 0x30, 0x08, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0xe3, 0x31, 0x00, 0x00, 0x01, 0xa0, 0x10, 0x02, 
-	0x03, 0xa0, 0x20, 0x00, 0x02, 0x83, 0x30, 0x20, 
-	0xe3, 0xa0, 0x80, 0x00, 0xe1, 0xb0, 0x98, 0x21, 
-	0x01, 0xa0, 0x18, 0x01, 0x02, 0x88, 0x80, 0x10, 
-	0xe1, 0xb0, 0x9c, 0x21, 0x01, 0xa0, 0x14, 0x01, 
-	0x02, 0x88, 0x80, 0x08, 0xe1, 0xb0, 0x9e, 0x21, 
-	0x01, 0xa0, 0x12, 0x01, 0x02, 0x88, 0x80, 0x04, 
-	0xe1, 0xb0, 0x9f, 0x21, 0x01, 0xa0, 0x11, 0x01, 
-	0x02, 0x88, 0x80, 0x02, 0xe1, 0xb0, 0x9f, 0xa1, 
-	0x01, 0xa0, 0x10, 0x81, 0x02, 0x88, 0x80, 0x01, 
-	0xe2, 0x78, 0x90, 0x20, 0xe1, 0x81, 0x19, 0x32, 
-	0xe1, 0xa0, 0x28, 0x12, 0xe0, 0x83, 0x30, 0x08, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x40, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xe1, 0x92, 0x80, 0x81, 
-	0x0a, 0x00, 0x00, 0x05, 0xe3, 0x11, 0x01, 0x01, 
-	0x0a, 0x00, 0x00, 0x0c, 0xe1, 0x95, 0x80, 0x84, 
-	0x0a, 0x00, 0x00, 0x0a, 0xe3, 0x14, 0x01, 0x01, 
-	0x1a, 0x00, 0x00, 0x08, 0xe3, 0x14, 0x01, 0x01, 
-	0x0a, 0x00, 0x00, 0x28, 0xe1, 0xa0, 0x00, 0x03, 
-	0xe1, 0xa0, 0x10, 0x04, 0xe1, 0xa0, 0x20, 0x05, 
-	0xea, 0x00, 0x00, 0x04, 0xe3, 0x11, 0x01, 0x01, 
-	0x0a, 0x00, 0x00, 0x22, 0xea, 0x00, 0x00, 0x01, 
-	0xe3, 0x11, 0x01, 0x01, 0x0a, 0x00, 0x00, 0x1f, 
-	0xe3, 0x1b, 0x00, 0x01, 0x1a, 0x00, 0x00, 0x16, 
-	0xe3, 0x1b, 0x00, 0x02, 0x1a, 0x00, 0x00, 0x0c, 
-	0xe3, 0x1b, 0x0c, 0x02, 0x1a, 0x00, 0x00, 0x05, 
-	0xe3, 0xc0, 0x81, 0x03, 0xe3, 0xa0, 0x90, 0xff, 
-	0xe3, 0x89, 0x9c, 0x43, 0xe1, 0x58, 0x00, 0x09, 
-	0x33, 0xc2, 0x20, 0x01, 0x03, 0x82, 0x20, 0x01, 
-	0xe2, 0x00, 0x01, 0x03, 0xe3, 0x80, 0x00, 0xff, 
-	0xe3, 0x80, 0x0c, 0x7f, 0xe1, 0x30, 0x00, 0x00, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe2, 0x00, 0x01, 0x03, 
-	0xe3, 0x80, 0x00, 0xff, 0xe3, 0x80, 0x0c, 0x43, 
-	0xe1, 0xa0, 0x25, 0xa2, 0xe1, 0xa0, 0x25, 0x82, 
-	0xe3, 0x81, 0x11, 0x02, 0xe1, 0x30, 0x00, 0x00, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe2, 0x00, 0x01, 0x03, 
-	0xe3, 0x80, 0x00, 0x7f, 0xe3, 0x80, 0x09, 0x01, 
-	0xe3, 0xa0, 0x20, 0x00, 0xe3, 0xc1, 0x10, 0xff, 
-	0xe3, 0x81, 0x11, 0x02, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0xe3, 0x80, 0x04, 0x61, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0xb5, 0x80, 0x1c, 0x0f, 0x29, 0x0f, 0xdd, 0x04, 
-	0x11, 0x39, 0xf7, 0xff, 0xff, 0xf9, 0x07, 0x3f, 
-	0x0f, 0x3f, 0x2f, 0x09, 0xdd, 0x02, 0x1d, 0xf9, 
-	0x31, 0x29, 0xe0, 0x01, 0x1d, 0xf9, 0x31, 0x50, 
-	0x70, 0x01, 0x30, 0x01, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x90, 0x1c, 0x07, 0x48, 0x0d, 
-	0x68, 0x01, 0x29, 0x00, 0xd1, 0x12, 0x4c, 0x0c, 
-	0x1c, 0x20, 0xa1, 0x0c, 0x22, 0x14, 0xf7, 0xfc, 
-	0xfc, 0xa1, 0x1d, 0xe0, 0x30, 0x0b, 0x1c, 0x39, 
-	0xf7, 0xff, 0xff, 0xda, 0x21, 0x29, 0x70, 0x01, 
-	0x21, 0x00, 0x70, 0x41, 0x1c, 0x20, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x30, 0x08, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x20, 0xcc, 
-	0x2e, 0x08, 0x99, 0xdc, 0x55, 0x6e, 0x6b, 0x6e, 
-	0x6f, 0x77, 0x6e, 0x20, 0x53, 0x69, 0x67, 0x6e, 
-	0x61, 0x6c, 0x20, 0x28, 0x30, 0x78, 0x00, 0x00, 
-	0xb5, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0xa0, 0x09, 
-	0x21, 0x01, 0xf7, 0xff, 0xf9, 0x6f, 0x21, 0x00, 
-	0x1c, 0x20, 0xf7, 0xff, 0xf9, 0x6b, 0x21, 0x02, 
-	0x1c, 0x38, 0xf7, 0xff, 0xf9, 0x67, 0x20, 0x01, 
-	0xf7, 0xfd, 0xf9, 0x10, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2a, 0x2a, 0x2a, 0x20, 
-	0x66, 0x61, 0x74, 0x61, 0x6c, 0x20, 0x65, 0x72, 
-	0x72, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x72, 
-	0x75, 0x6e, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 
-	0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x3a, 0x20, 
-	0x00, 0x00, 0x00, 0x00, 0xb5, 0xb0, 0x1c, 0x07, 
-	0x68, 0xc0, 0x07, 0x81, 0xd0, 0x1f, 0x23, 0x20, 
-	0x40, 0x18, 0xd0, 0x01, 0x6a, 0xbd, 0xe0, 0x04, 
-	0x68, 0x79, 0x69, 0xba, 0x18, 0x89, 0x69, 0x3a, 
-	0x1a, 0x8d, 0x28, 0x00, 0xd0, 0x02, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfb, 0xa2, 0x68, 0xf8, 0x4b, 0x0a, 
-	0x40, 0x18, 0x60, 0xf8, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfb, 0x67, 0x1c, 0x04, 0x22, 0x00, 0x1c, 0x38, 
-	0x1c, 0x29, 0xf0, 0x00, 0xf8, 0x27, 0x1c, 0x20, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0xff, 0xff, 0xcf, 0xff, 0xb5, 0xb0, 0x24, 0x00, 
-	0x28, 0x00, 0xd0, 0x03, 0xf7, 0xff, 0xff, 0xce, 
-	0x1c, 0x04, 0xe0, 0x0c, 0x27, 0x00, 0x4d, 0x08, 
-	0x01, 0xb8, 0x19, 0x40, 0xf7, 0xff, 0xff, 0xc6, 
-	0x28, 0x00, 0xd0, 0x01, 0x24, 0x00, 0x43, 0xe4, 
-	0x37, 0x01, 0x2f, 0x10, 0xdb, 0xf4, 0x1c, 0x20, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x95, 0xdc, 0xb5, 0xf7, 0x68, 0xc5, 
-	0x69, 0x46, 0x1c, 0x0c, 0x1c, 0x07, 0xb0, 0x81, 
-	0x48, 0x3c, 0x40, 0x28, 0xd0, 0x04, 0x1c, 0x38, 
-	0xf7, 0xff, 0xf9, 0x92, 0x28, 0x00, 0xd0, 0x01, 
-	0x20, 0x02, 0xe0, 0x6a, 0x9a, 0x03, 0x2a, 0x00, 
-	0xd0, 0x26, 0x2a, 0x01, 0xd0, 0x0b, 0x2a, 0x02, 
-	0xd1, 0x24, 0x1c, 0x30, 0xf7, 0xff, 0xf9, 0xbc, 
-	0x28, 0x00, 0xda, 0x09, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfa, 0xa7, 0x20, 0x01, 0xe0, 0x59, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf8, 0x8c, 0x19, 0x04, 0xe0, 0x13, 
-	0x68, 0x79, 0x6a, 0xfa, 0x42, 0x8a, 0xd9, 0x00, 
-	0x1c, 0x11, 0x69, 0xba, 0x18, 0x89, 0x69, 0x3a, 
-	0x1a, 0x89, 0x68, 0xfa, 0x09, 0x92, 0xd3, 0x03, 
-	0x6a, 0xba, 0x42, 0x8a, 0xdd, 0x00, 0x1c, 0x11, 
-	0x42, 0x81, 0xdd, 0x00, 0x1c, 0x08, 0x18, 0x24, 
-	0x2c, 0x00, 0xda, 0x03, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfa, 0x87, 0xe7, 0xcd, 0x0b, 0xa8, 0xd3, 0x04, 
-	0x68, 0x78, 0x6a, 0xf9, 0x42, 0x81, 0xd2, 0x00, 
-	0x62, 0xf8, 0x69, 0xb8, 0x42, 0xa0, 0xdc, 0x10, 
-	0x68, 0x79, 0x6a, 0xfa, 0x42, 0x8a, 0xd9, 0x01, 
-	0x1c, 0x13, 0xe0, 0x00, 0x1c, 0x0b, 0x18, 0x1b, 
-	0x69, 0x3e, 0x1b, 0x9b, 0x42, 0xa3, 0xdb, 0x04, 
-	0x6b, 0x3b, 0x93, 0x00, 0x18, 0xc3, 0x42, 0xa3, 
-	0xdc, 0x06, 0x20, 0x20, 0x43, 0x28, 0x21, 0x00, 
-	0x60, 0x39, 0x60, 0xb9, 0x62, 0xbc, 0xe0, 0x14, 
-	0x1a, 0x24, 0x08, 0xa8, 0xd3, 0x03, 0x9b, 0x00, 
-	0x1b, 0x18, 0x42, 0x40, 0x60, 0xb8, 0x08, 0x68, 
-	0xd3, 0x06, 0x42, 0x8a, 0xd9, 0x00, 0x1c, 0x11, 
-	0x1b, 0x88, 0x1b, 0x00, 0x42, 0x40, 0x60, 0x38, 
-	0x19, 0x30, 0x23, 0x20, 0x43, 0x9d, 0x60, 0x78, 
-	0x1c, 0x28, 0x4b, 0x05, 0x40, 0x18, 0x60, 0xf8, 
-	0x20, 0x00, 0xb0, 0x01, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0x10, 0x00, 0x03, 
-	0xff, 0xf7, 0xcf, 0xbf, 0xb5, 0x00, 0x68, 0x8a, 
-	0x68, 0x4b, 0x3a, 0x01, 0xd5, 0x03, 0xf0, 0x00, 
-	0xf8, 0x3f, 0xbc, 0x08, 0x47, 0x18, 0x06, 0x00, 
-	0x0e, 0x00, 0x70, 0x18, 0x33, 0x01, 0x60, 0x8a, 
-	0x60, 0x4b, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0xb5, 0xb0, 0x1c, 0x07, 0x78, 0x00, 0x1c, 0x0c, 
-	0x37, 0x01, 0x28, 0x00, 0xd0, 0x0e, 0x25, 0x00, 
-	0x43, 0xed, 0x1c, 0x21, 0xf0, 0x00, 0xf8, 0xe8, 
-	0x42, 0xa8, 0xd1, 0x03, 0x1c, 0x28, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x78, 0x38, 0x37, 0x01, 
-	0x28, 0x00, 0xd1, 0xf2, 0x20, 0x00, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x68, 0xc1, 0x07, 0x8a, 
-	0xd1, 0x04, 0x20, 0x01, 0x49, 0x09, 0x60, 0x08, 
-	0x42, 0x40, 0x47, 0x70, 0x09, 0x8a, 0xd3, 0x01, 
-	0x6a, 0x80, 0xe0, 0x04, 0x68, 0x42, 0x69, 0x83, 
-	0x18, 0xd2, 0x69, 0x00, 0x1a, 0x10, 0x0d, 0x09, 
-	0xd3, 0xf3, 0x28, 0x00, 0xdd, 0xf1, 0x38, 0x01, 
-	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x20, 0xb0, 
-	0xb5, 0xf0, 0x1c, 0x04, 0x68, 0xc8, 0x1c, 0x0f, 
-	0x4b, 0x5a, 0x40, 0x18, 0x23, 0x01, 0x05, 0x9b, 
-	0x43, 0x18, 0x60, 0xc8, 0x09, 0x80, 0xd3, 0x02, 
-	0x1c, 0x38, 0xf7, 0xff, 0xfa, 0x95, 0x06, 0x26, 
-	0x0e, 0x36, 0x68, 0xb9, 0x29, 0x00, 0xda, 0x12, 
-	0x68, 0xf8, 0x0a, 0x82, 0xd2, 0x0f, 0x22, 0x00, 
-	0x43, 0xd2, 0x1a, 0x51, 0x23, 0x09, 0x03, 0x5b, 
-	0x43, 0x18, 0x60, 0xf8, 0x60, 0xb9, 0x68, 0x79, 
-	0x70, 0x0e, 0x31, 0x01, 0x60, 0x79, 0x1c, 0x30, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xf8, 
-	0x49, 0x49, 0x40, 0x01, 0x29, 0x02, 0xd0, 0x03, 
-	0x1c, 0x38, 0xf7, 0xff, 0xf9, 0xcd, 0xe0, 0x7f, 
-	0x49, 0x46, 0x40, 0x01, 0x23, 0x01, 0x03, 0xdb, 
-	0x42, 0x99, 0xd1, 0x0b, 0x22, 0x02, 0x21, 0x00, 
-	0x1c, 0x38, 0xf7, 0xff, 0xfe, 0xfb, 0x68, 0xf8, 
-	0x09, 0x80, 0xd3, 0x02, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfa, 0x63, 0x68, 0xf8, 0x25, 0x09, 0x03, 0x6d, 
-	0x43, 0x05, 0x60, 0xfd, 0x69, 0x38, 0x28, 0x00, 
-	0xd1, 0x2f, 0x1c, 0x38, 0xf7, 0xff, 0xf8, 0x88, 
-	0x28, 0x00, 0xd0, 0x18, 0x68, 0xf8, 0x0a, 0x00, 
-	0x07, 0x80, 0xd0, 0x09, 0x69, 0xf8, 0xf7, 0xff, 
-	0xf9, 0x7d, 0x61, 0x38, 0x60, 0x78, 0x23, 0x01, 
-	0x02, 0xdb, 0x43, 0x1d, 0x68, 0xf8, 0xe0, 0x1a, 
-	0x1d, 0xf8, 0x30, 0x1d, 0x61, 0x38, 0x60, 0x78, 
-	0x20, 0x01, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x1d, 
-	0x61, 0xf8, 0x60, 0xfd, 0xe0, 0x11, 0x69, 0xf8, 
-	0xf7, 0xff, 0xf9, 0x68, 0x61, 0x38, 0x60, 0x78, 
-	0x23, 0x01, 0x02, 0xdb, 0x43, 0x1d, 0x68, 0xf8, 
-	0x43, 0x28, 0x60, 0xf8, 0x0a, 0x29, 0x07, 0x89, 
-	0xd1, 0x03, 0x08, 0xdb, 0x43, 0x1d, 0x43, 0x28, 
-	0x60, 0xf8, 0x0a, 0x68, 0xd3, 0x19, 0x68, 0x78, 
-	0x6a, 0xf9, 0x69, 0x3c, 0x42, 0x81, 0xd9, 0x00, 
-	0x1c, 0x08, 0x1b, 0x01, 0xd0, 0x05, 0x1c, 0x20, 
-	0x1c, 0x3a, 0xf7, 0xff, 0xf9, 0x7d, 0x28, 0x00, 
-	0xd1, 0x26, 0x1c, 0x60, 0x62, 0xf8, 0x60, 0x78, 
-	0x69, 0xf8, 0x1e, 0x41, 0x63, 0x38, 0x60, 0xb9, 
-	0x70, 0x26, 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x69, 0x38, 0x68, 0x7a, 0x70, 0x14, 
-	0x32, 0x01, 0x60, 0x7a, 0x6a, 0xf9, 0x42, 0x91, 
-	0xd8, 0x00, 0x1c, 0x11, 0x1a, 0x09, 0x69, 0xfa, 
-	0x63, 0x3a, 0x0a, 0xeb, 0xd2, 0x03, 0x2e, 0x0a, 
-	0xd0, 0x01, 0x42, 0x8a, 0xdc, 0x0d, 0x62, 0xf8, 
-	0x22, 0x00, 0x60, 0x78, 0x60, 0xba, 0x1c, 0x3a, 
-	0xf7, 0xff, 0xf9, 0x56, 0x28, 0x00, 0xd0, 0x04, 
-	0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0xff, 0xf7, 0xff, 0xff, 
-	0x00, 0x00, 0x10, 0x8a, 0x00, 0x00, 0xa0, 0x10, 
-	0xb5, 0x00, 0x68, 0x8a, 0x68, 0x4b, 0x3a, 0x01, 
-	0xd5, 0x03, 0xf7, 0xff, 0xff, 0x39, 0xbc, 0x08, 
-	0x47, 0x18, 0x06, 0x00, 0x0e, 0x00, 0x70, 0x18, 
-	0x33, 0x01, 0x60, 0x8a, 0x60, 0x4b, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x47, 0x78, 0x46, 0xc0, 
-	0xe9, 0x2d, 0x40, 0x00, 0xe2, 0x8f, 0xe0, 0x00, 
-	0xef, 0x12, 0x34, 0x56, 0xe8, 0xbd, 0x40, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0xa0, 0x10, 0x00, 
-	0xe3, 0xa0, 0x00, 0x18, 0xe5, 0x9f, 0x10, 0x18, 
-	0xef, 0x12, 0x34, 0x56, 0xea, 0xff, 0xff, 0xfe, 
-	0xe1, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x00, 0x18, 
-	0xe5, 0x9f, 0x10, 0x08, 0xef, 0x12, 0x34, 0x56, 
-	0xea, 0xff, 0xff, 0xfe, 0x00, 0x02, 0x00, 0x26, 
-	0x00, 0x02, 0x00, 0x23, 0xe8, 0xb0, 0x01, 0xf0, 
-	0xe8, 0xa1, 0x01, 0xf0, 0xe8, 0xb0, 0x01, 0xf8, 
-	0xe8, 0xa1, 0x01, 0xf8, 0xe8, 0xb0, 0x01, 0xf8, 
-	0xe8, 0xa1, 0x01, 0xf8, 0xe8, 0xb0, 0x01, 0xf8, 
-	0xe8, 0xa1, 0x01, 0xf8, 0xe8, 0xb0, 0x01, 0xf8, 
-	0xe8, 0xa1, 0x01, 0xf8, 0xe8, 0xb0, 0x01, 0xf8, 
-	0xe8, 0xa1, 0x01, 0xf8, 0xe8, 0xb0, 0x01, 0xf8, 
-	0xe8, 0xa1, 0x01, 0xf8, 0xe8, 0xb0, 0x01, 0xf8, 
-	0xe8, 0xa1, 0x01, 0xf8, 0xe2, 0x52, 0x20, 0xbc, 
-	0x1a, 0xff, 0xff, 0xed, 0xe8, 0xbd, 0x01, 0xf8, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe4, 0x90, 0x40, 0x04, 
-	0xe1, 0x85, 0x54, 0x24, 0xe4, 0x81, 0x50, 0x04, 
-	0xe1, 0xa0, 0x5c, 0x04, 0xe2, 0x53, 0x30, 0x04, 
-	0x1a, 0xff, 0xff, 0xf9, 0xe5, 0x9f, 0xf0, 0x88, 
-	0xe4, 0x90, 0x40, 0x04, 0xe1, 0x85, 0x5c, 0x24, 
-	0xe4, 0x81, 0x50, 0x04, 0xe1, 0xa0, 0x54, 0x04, 
-	0xe2, 0x53, 0x30, 0x04, 0x1a, 0xff, 0xff, 0xf9, 
-	0xe5, 0x9f, 0xf0, 0x70, 0xe4, 0x90, 0x40, 0x04, 
-	0xe1, 0xa0, 0x58, 0x24, 0xe0, 0xc1, 0x50, 0xb2, 
-	0xe0, 0xc1, 0x40, 0xb2, 0xe2, 0x53, 0x30, 0x04, 
-	0x1a, 0xff, 0xff, 0xf9, 0xe5, 0x9f, 0xf0, 0x4c, 
-	0xe2, 0x03, 0x40, 0x0f, 0xe0, 0x53, 0x40, 0x04, 
-	0x0a, 0x00, 0x00, 0x0a, 0xe9, 0x2d, 0x00, 0xc4, 
-	0xe1, 0xa0, 0x20, 0x03, 0xe1, 0xa0, 0x30, 0x04, 
-	0xe8, 0xb0, 0x00, 0xf0, 0xe8, 0xa1, 0x00, 0xf0, 
-	0xe2, 0x53, 0x30, 0x10, 0x1a, 0xff, 0xff, 0xfb, 
-	0xe1, 0xa0, 0x30, 0x02, 0xe8, 0xbd, 0x00, 0xc4, 
-	0xe2, 0x13, 0x30, 0x0f, 0x0a, 0x00, 0x00, 0x03, 
-	0xe4, 0x90, 0x40, 0x04, 0xe4, 0x81, 0x40, 0x04, 
-	0xe2, 0x53, 0x30, 0x04, 0x1a, 0xff, 0xff, 0xfb, 
-	0xe5, 0x9f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x2e, 0x01, 0xc9, 0xe4, 0x2e, 0x01, 0xc9, 0x88, 
-	0x2e, 0x01, 0xc9, 0xb8, 0xe9, 0x2d, 0x00, 0x38, 
-	0xe3, 0x52, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x3f, 
-	0xe3, 0xe0, 0x30, 0x03, 0xe0, 0x12, 0x30, 0x03, 
-	0x0a, 0x00, 0x00, 0x30, 0xe2, 0x10, 0x30, 0x01, 
-	0x0a, 0x00, 0x00, 0x03, 0xe4, 0xd0, 0x30, 0x01, 
-	0xe4, 0xc1, 0x30, 0x01, 0xe2, 0x52, 0x20, 0x01, 
-	0x0a, 0x00, 0x00, 0x36, 0xe2, 0x10, 0x30, 0x02, 
-	0x0a, 0x00, 0x00, 0x05, 0xe0, 0xd0, 0x30, 0xb2, 
-	0xe1, 0xa0, 0x44, 0x23, 0xe4, 0xc1, 0x40, 0x01, 
-	0xe4, 0xc1, 0x30, 0x01, 0xe2, 0x52, 0x20, 0x02, 
-	0x0a, 0x00, 0x00, 0x2e, 0xe3, 0xe0, 0x30, 0x03, 
-	0xe0, 0x12, 0x30, 0x03, 0x0a, 0x00, 0x00, 0x1f, 
-	0xe2, 0x11, 0x40, 0x01, 0x0a, 0x00, 0x00, 0x19, 
-	0xe2, 0x11, 0x40, 0x02, 0x1a, 0x00, 0x00, 0x0b, 
-	0xe2, 0x41, 0x10, 0x01, 0xe5, 0x91, 0x50, 0x00, 
-	0xe1, 0xa0, 0x5c, 0x25, 0xe1, 0xa0, 0x5c, 0x05, 
-	0xe5, 0x9f, 0xf0, 0xa8, 0xe5, 0x91, 0x40, 0x00, 
-	0xe1, 0xa0, 0x44, 0x04, 0xe1, 0xa0, 0x44, 0x24, 
-	0xe1, 0x85, 0x50, 0x04, 0xe5, 0x81, 0x50, 0x00, 
-	0xe2, 0x81, 0x10, 0x01, 0xea, 0x00, 0x00, 0x0f, 
-	0xe2, 0x41, 0x10, 0x03, 0xe5, 0x91, 0x50, 0x00, 
-	0xe1, 0xa0, 0x54, 0x25, 0xe1, 0xa0, 0x54, 0x05, 
-	0xe5, 0x9f, 0xf0, 0x7c, 0xe5, 0x91, 0x40, 0x00, 
-	0xe1, 0xa0, 0x4c, 0x04, 0xe1, 0xa0, 0x4c, 0x24, 
-	0xe1, 0x85, 0x50, 0x04, 0xe5, 0x81, 0x50, 0x00, 
-	0xe2, 0x81, 0x10, 0x03, 0xea, 0x00, 0x00, 0x03, 
-	0xe2, 0x11, 0x40, 0x02, 0x0a, 0x00, 0x00, 0x00, 
-	0xe5, 0x9f, 0xf0, 0x5c, 0xe5, 0x9f, 0xf0, 0x48, 
-	0xe2, 0x12, 0x20, 0x03, 0x0a, 0x00, 0x00, 0x09, 
-	0xe4, 0xd0, 0x40, 0x01, 0xe4, 0xc1, 0x40, 0x01, 
-	0xe2, 0x52, 0x20, 0x01, 0x0a, 0x00, 0x00, 0x05, 
-	0xe4, 0xd0, 0x40, 0x01, 0xe4, 0xc1, 0x40, 0x01, 
-	0xe2, 0x52, 0x20, 0x01, 0x0a, 0x00, 0x00, 0x01, 
-	0xe4, 0xd0, 0x40, 0x01, 0xe4, 0xc1, 0x40, 0x01, 
-	0xe8, 0xbd, 0x00, 0x38, 0xe3, 0x8e, 0xe0, 0x01, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe9, 0x2d, 0x01, 0xf8, 
-	0xe5, 0x9f, 0xf0, 0x18, 0x2e, 0x01, 0xc8, 0x58, 
-	0x2e, 0x01, 0xc8, 0x90, 0x2e, 0x01, 0xc8, 0xac, 
-	0x2e, 0x01, 0xc8, 0x58, 0x2e, 0x01, 0xc8, 0x74, 
-	0x2e, 0x01, 0xc8, 0xac, 0x2e, 0x01, 0xc8, 0x90, 
-	0x2e, 0x01, 0xc8, 0x08, 0xe9, 0x2d, 0x5f, 0xff, 
-	0xe1, 0x4f, 0x00, 0x00, 0xe9, 0x2d, 0x00, 0x01, 
-	0xe2, 0x8f, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x10, 
-	0x21, 0xff, 0x48, 0x37, 0x68, 0x00, 0x40, 0x52, 
-	0x42, 0x08, 0xd1, 0x0b, 0x32, 0x20, 0x0a, 0x00, 
-	0x42, 0x08, 0xd1, 0x07, 0x32, 0x20, 0x0a, 0x00, 
-	0x42, 0x08, 0xd1, 0x03, 0x0a, 0x00, 0x42, 0x08, 
-	0xd0, 0x23, 0x32, 0x20, 0x21, 0x0f, 0x42, 0x08, 
-	0xd1, 0x01, 0x32, 0x10, 0x09, 0x00, 0x21, 0x01, 
-	0x42, 0x08, 0xd1, 0x08, 0x1d, 0x12, 0x21, 0x02, 
-	0x42, 0x08, 0xd1, 0x04, 0x1d, 0x12, 0x21, 0x04, 
-	0x42, 0x08, 0xd1, 0x00, 0x1d, 0x12, 0x48, 0x25, 
-	0x68, 0x00, 0xb4, 0x01, 0x08, 0x90, 0x21, 0x01, 
-	0x40, 0x81, 0x48, 0x21, 0x60, 0x01, 0x48, 0x1d, 
-	0x58, 0x82, 0x48, 0x01, 0x46, 0x86, 0x47, 0x10, 
-	0x2e, 0x01, 0xca, 0xc1, 0xbc, 0x02, 0x48, 0x1d, 
-	0x60, 0x01, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, 
-	0xe8, 0xbd, 0x00, 0x01, 0xe1, 0x69, 0xf0, 0x00, 
-	0xe8, 0xbd, 0x5f, 0xff, 0xe2, 0x5e, 0xf0, 0x04, 
-	0x48, 0x12, 0x21, 0x20, 0x4a, 0x12, 0x60, 0x02, 
-	0x1d, 0x00, 0x1e, 0x49, 0xd1, 0xfb, 0x20, 0x00, 
-	0x47, 0x70, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x46, 0x73, 0x49, 0x0e, 0x60, 0x08, 0x20, 0x00, 
-	0x47, 0x18, 0x46, 0x73, 0x49, 0x0c, 0x60, 0x08, 
-	0x20, 0x00, 0x47, 0x18, 0x46, 0x73, 0x48, 0x0b, 
-	0x68, 0x00, 0x47, 0x18, 0x46, 0x73, 0x49, 0x09, 
-	0x60, 0x08, 0x47, 0x18, 0x46, 0x73, 0x4a, 0x03, 
-	0x00, 0x80, 0x18, 0x12, 0x68, 0x10, 0x60, 0x11, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x3a, 0xf4, 
-	0x2e, 0x01, 0xca, 0xf0, 0x66, 0x00, 0x00, 0x10, 
-	0x66, 0x00, 0x00, 0x14, 0x66, 0x00, 0x00, 0x18, 
-	0x66, 0x00, 0x00, 0x1c, 0xe9, 0x2d, 0x5f, 0xf0, 
-	0xe1, 0x4f, 0x40, 0x00, 0xe3, 0x14, 0x00, 0x20, 
-	0x11, 0x5e, 0x40, 0xb2, 0x13, 0xc4, 0x4c, 0xff, 
-	0x05, 0x1e, 0x40, 0x04, 0x03, 0xc4, 0x44, 0xff, 
-	0xe5, 0x9f, 0x50, 0x14, 0xe7, 0x95, 0x51, 0x04, 
-	0xe5, 0x9f, 0xe0, 0x00, 0xe1, 0x2f, 0xff, 0x15, 
-	0x2e, 0x01, 0xcb, 0x70, 0xe8, 0xbd, 0x5f, 0xf0, 
-	0xe1, 0xb0, 0xf0, 0x0e, 0x2e, 0x08, 0x1f, 0xe8, 
-	0x00, 0x00, 0x00, 0xc0, 0x46, 0x73, 0x47, 0x78, 
-	0xe1, 0x0f, 0x10, 0x00, 0xe3, 0x81, 0x00, 0x80, 
-	0xe1, 0x29, 0xf0, 0x00, 0xe2, 0x01, 0x00, 0x80, 
-	0xe1, 0x2f, 0xff, 0x13, 0x46, 0x73, 0x00, 0x00, 
-	0x47, 0x78, 0x00, 0x00, 0xe1, 0x4f, 0x10, 0x00, 
-	0xe3, 0x81, 0x00, 0x80, 0xe1, 0x69, 0xf0, 0x00, 
-	0xe2, 0x01, 0x00, 0x80, 0xe1, 0x2f, 0xff, 0x13, 
-	0x46, 0x73, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, 
-	0xe1, 0x0f, 0x10, 0x00, 0xe3, 0x81, 0x00, 0x40, 
-	0xe1, 0x29, 0xf0, 0x00, 0xe2, 0x01, 0x00, 0x40, 
-	0xe1, 0x2f, 0xff, 0x13, 0x46, 0x73, 0x00, 0x00, 
-	0x47, 0x78, 0x00, 0x00, 0xe1, 0x4f, 0x10, 0x00, 
-	0xe3, 0x81, 0x00, 0x40, 0xe1, 0x69, 0xf0, 0x00, 
-	0xe2, 0x01, 0x00, 0x40, 0xe1, 0x2f, 0xff, 0x13, 
-	0x46, 0x73, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, 
-	0xe1, 0x0f, 0x00, 0x00, 0xe3, 0xc0, 0x00, 0x80, 
-	0xe1, 0x29, 0xf0, 0x00, 0xe3, 0xa0, 0x00, 0x00, 
-	0xe1, 0x2f, 0xff, 0x13, 0x46, 0x73, 0x00, 0x00, 
-	0x47, 0x78, 0x00, 0x00, 0xe1, 0x4f, 0x00, 0x00, 
-	0xe3, 0xc0, 0x00, 0x80, 0xe1, 0x69, 0xf0, 0x00, 
-	0xe3, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x13, 
-	0x46, 0x73, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, 
-	0xe1, 0x0f, 0x00, 0x00, 0xe3, 0xc0, 0x00, 0x40, 
-	0xe1, 0x29, 0xf0, 0x00, 0xe3, 0xa0, 0x00, 0x00, 
-	0xe1, 0x2f, 0xff, 0x13, 0x46, 0x73, 0x00, 0x00, 
-	0x47, 0x78, 0x00, 0x00, 0xe1, 0x4f, 0x00, 0x00, 
-	0xe3, 0xc0, 0x00, 0x40, 0xe1, 0x69, 0xf0, 0x00, 
-	0xe3, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x13, 
-	0x46, 0x73, 0x49, 0x02, 0x60, 0x08, 0x20, 0x00, 
-	0x46, 0x9f, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 
-	0x46, 0x73, 0x49, 0x02, 0x60, 0x08, 0x20, 0x00, 
-	0x46, 0x9f, 0x00, 0x00, 0x66, 0x00, 0x00, 0x04, 
-	0x46, 0x73, 0x48, 0x03, 0x68, 0x00, 0x47, 0x18, 
-	0x46, 0x73, 0x49, 0x01, 0x60, 0x08, 0x47, 0x18, 
-	0x66, 0x00, 0x00, 0x08, 0x00, 0x00, 0x46, 0x6c, 
-	0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x80, 
-	0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x02, 0xd0, 
-	0x00, 0x00, 0x02, 0xd0, 0x00, 0x00, 0x00, 0x15, 
-	0x00, 0x03, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x04, 0x90, 0x85, 0x00, 0x00, 0xa6, 0xee, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xd0, 
-	0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 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, 0x08, 0xa0, 0x00, 0x08, 0x08, 0x28, 
-	0x00, 0x08, 0x88, 0x68, 0x00, 0x08, 0xa0, 0x98, 
-	0x00, 0x08, 0x88, 0x68, 0x00, 0x08, 0x28, 0x98, 
-	0x00, 0x08, 0xac, 0xf4, 0x00, 0x08, 0xb8, 0x7c, 
-	0x00, 0x02, 0x02, 0x88, 0x00, 0x02, 0x08, 0x22, 
-	0x00, 0x02, 0x88, 0xaa, 0x00, 0x02, 0x22, 0xaa, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 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, 0x04, 0x24, 0x00, 0x04, 0x04, 0x24, 
-	0x00, 0x04, 0x28, 0x6c, 0x00, 0x04, 0x28, 0x6c, 
-	0x00, 0x01, 0x10, 0x44, 0x00, 0x01, 0x20, 0x44, 
-	0x00, 0x01, 0x11, 0xaa, 0x00, 0x01, 0x88, 0x55, 
-	0x00, 0x01, 0x44, 0xaa, 0x00, 0x01, 0x44, 0x55, 
-	0x00, 0x20, 0x80, 0xa0, 0x00, 0x20, 0x80, 0xc0, 
-	0x00, 0x20, 0x20, 0xa0, 0x00, 0x20, 0x40, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x02, 0x40, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	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, 0x10, 0x13, 0x16, 0x1a, 0x1b, 0x1d, 0x22, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	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, 0x10, 0x13, 0x16, 0x1a, 0x1b, 0x1d, 0x22, 
-	0x10, 0x10, 0x16, 0x18, 0x1b, 0x1d, 0x22, 0x25, 
-	0x13, 0x16, 0x1a, 0x1b, 0x1d, 0x22, 0x22, 0x26, 
-	0x16, 0x16, 0x1a, 0x1b, 0x1d, 0x22, 0x25, 0x28, 
-	0x16, 0x1a, 0x1b, 0x1d, 0x20, 0x23, 0x28, 0x30, 
-	0x1a, 0x1b, 0x1d, 0x20, 0x23, 0x28, 0x30, 0x3a, 
-	0x1a, 0x1b, 0x1d, 0x22, 0x26, 0x2e, 0x38, 0x45, 
-	0x1b, 0x1d, 0x23, 0x26, 0x2e, 0x38, 0x45, 0x53, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 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, 0xd6, 0x00, 0x00, 0x1b, 0x08, 0x00, 
-	0x00, 0x1f, 0xde, 0x00, 0x00, 0x00, 0x50, 0x00, 
-	0x00, 0x09, 0xce, 0x00, 0x00, 0x13, 0x4c, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-	0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 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, 0x15, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x03, 0x05, 0x28, 0x20, 0x01, 
-	0x00, 0x00, 0x02, 0x40, 0x71, 0x01, 0x00, 0x68, 
-	0xe0, 0x7f, 0xb0, 0x7f, 0x60, 0x40, 0xe0, 0x1d, 
-	0x90, 0x10, 0xb4, 0x81, 0xe8, 0xc0, 0xe0, 0xc2, 
-	0x90, 0x18, 0x00, 0x8a, 0x70, 0xc0, 0x0f, 0x87, 
-	0xe3, 0xe8, 0xc0, 0x00, 0x70, 0x40, 0xe0, 0x01, 
-	0xe0, 0x86, 0x00, 0x26, 0xd0, 0x28, 0xe0, 0x0e, 
-	0xd0, 0x0e, 0x0f, 0x0b, 0x70, 0x1d, 0xe0, 0x67, 
-	0x0f, 0x87, 0x0f, 0x87, 0x0f, 0x87, 0x0f, 0x87, 
-	0x0f, 0x87, 0x02, 0x20, 0xd0, 0x01, 0xe0, 0x25, 
-	0x0f, 0x45, 0x6f, 0x81, 0xdf, 0xa6, 0xe0, 0x36, 
-	0xe1, 0x30, 0xa0, 0x37, 0xc0, 0x00, 0xe0, 0x26, 
-	0x00, 0x33, 0xdf, 0x00, 0xe0, 0x32, 0x0f, 0xc5, 
-	0x0f, 0x87, 0x00, 0x27, 0xd0, 0x4c, 0xe0, 0x21, 
-	0x00, 0x33, 0xdf, 0x60, 0x00, 0x27, 0xd0, 0x56, 
-	0x60, 0x01, 0xe0, 0x2d, 0x03, 0xa0, 0xd0, 0x41, 
-	0xa0, 0x78, 0x00, 0x60, 0xd0, 0x41, 0xa0, 0x77, 
-	0x00, 0x22, 0xd0, 0x58, 0xa0, 0x76, 0x00, 0x21, 
-	0xd0, 0x7c, 0x00, 0x4a, 0xd0, 0x72, 0x70, 0x40, 
-	0x00, 0x06, 0x0f, 0x87, 0x00, 0x22, 0xdc, 0xf8, 
-	0xf0, 0x4a, 0xe1, 0x70, 0x07, 0xef, 0xdd, 0xbf, 
-	0x4f, 0x36, 0x1d, 0x99, 0x4d, 0x80, 0x10, 0x18, 
-	0xdd, 0x50, 0x60, 0x35, 0xdd, 0x72, 0xdd, 0x10, 
-	0x3d, 0xb4, 0xec, 0x57, 0x2d, 0x36, 0x1d, 0x03, 
-	0xbd, 0x04, 0xe4, 0x2b, 0x01, 0x46, 0x00, 0x06, 
-	0xac, 0xf6, 0x80, 0x3f, 0x0d, 0x0a, 0x10, 0x02, 
-	0x7d, 0x40, 0x10, 0x1e, 0xb0, 0x20, 0xbc, 0xe0, 
-	0x00, 0x06, 0x00, 0xc6, 0xe0, 0x52, 0xb7, 0x60, 
-	0xb7, 0x60, 0xc0, 0x5d, 0x30, 0x5f, 0xe4, 0x72, 
-	0xc7, 0x5e, 0x00, 0xed, 0xd0, 0x28, 0x70, 0x40, 
-	0xb0, 0x7f, 0x60, 0x40, 0xc0, 0x1d, 0x30, 0x1c, 
-	0xf8, 0x7e, 0x00, 0x21, 0xd0, 0x01, 0x00, 0x26, 
-	0xd0, 0x78, 0xa0, 0x38, 0x80, 0x3f, 0x70, 0x01, 
-	0xb0, 0x3f, 0x60, 0x01, 0x0f, 0x87, 0x80, 0x34, 
-	0x03, 0xef, 0xd8, 0x3f, 0xa8, 0x38, 0x01, 0x35, 
-	0xdc, 0x33, 0xe0, 0x46, 0xc0, 0x1c, 0xe4, 0xa5, 
-	0x97, 0x2e, 0x30, 0x1c, 0xe8, 0x8e, 0x00, 0x21, 
-	0xd0, 0x00, 0xa0, 0x38, 0xc0, 0x5d, 0x00, 0x23, 
-	0xd0, 0x00, 0x30, 0x40, 0x30, 0x5e, 0xe4, 0x99, 
-	0x20, 0x5e, 0xc0, 0x01, 0x30, 0x1c, 0xec, 0xa4, 
-	0xe0, 0x9d, 0x20, 0x5f, 0xc0, 0x1c, 0x30, 0x01, 
-	0xf4, 0xa5, 0xc0, 0x1c, 0x30, 0x1d, 0xec, 0xa4, 
-	0xe4, 0xa5, 0x90, 0x38, 0x00, 0x1b, 0xe8, 0xa5, 
-	0xa0, 0x66, 0xb1, 0x3f, 0xe4, 0xb3, 0xe8, 0xb1, 
-	0xc0, 0x4b, 0x30, 0x44, 0xf8, 0xb3, 0x60, 0x45, 
-	0xb1, 0x7c, 0x01, 0x20, 0xd0, 0x00, 0xa0, 0x05, 
-	0x80, 0x40, 0x72, 0xc5, 0x00, 0x06, 0x90, 0x55, 
-	0xd0, 0x01, 0x00, 0x40, 0xa0, 0x55, 0x0f, 0x87, 
-	0x01, 0x46, 0x00, 0x06, 0x03, 0xef, 0xd0, 0x3f, 
-	0xa0, 0x38, 0xb0, 0x01, 0xa0, 0x37, 0x80, 0x3f, 
-	0x82, 0x34, 0x80, 0x3f, 0xf2, 0x1a, 0x80, 0x34, 
-	0x80, 0x3f, 0xf2, 0x1a, 0xd8, 0x00, 0xd8, 0x40, 
-	0xd8, 0x80, 0xd8, 0xc0, 0xd9, 0x00, 0xd9, 0x40, 
-	0xd9, 0x80, 0xd9, 0xc0, 0xda, 0x00, 0xda, 0x40, 
-	0xda, 0x80, 0xda, 0xc0, 0xdb, 0x00, 0xdb, 0x40, 
-	0xdb, 0x80, 0xdb, 0xc0, 0xdc, 0x00, 0xdc, 0x40, 
-	0xdc, 0x80, 0xdc, 0xc0, 0xdd, 0x00, 0xdd, 0x40, 
-	0xdd, 0x80, 0xdd, 0xc0, 0xde, 0x00, 0xde, 0x40, 
-	0xde, 0x80, 0xde, 0xc0, 0xdf, 0x00, 0xdf, 0x40, 
-	0xdf, 0x80, 0xdf, 0xc0, 0xde, 0x80, 0xde, 0xc1, 
-	0x00, 0x28, 0xd0, 0x60, 0x6e, 0x81, 0x80, 0x00, 
-	0x80, 0x05, 0x00, 0xe3, 0xd1, 0x88, 0x00, 0x73, 
-	0xd5, 0x80, 0x60, 0x06, 0xb1, 0xbc, 0x00, 0xfa, 
-	0xd0, 0x80, 0x60, 0x06, 0x00, 0x26, 0xd0, 0x6c, 
-	0x6e, 0x81, 0x04, 0xf4, 0xdc, 0x00, 0x00, 0xee, 
-	0xd1, 0x94, 0x60, 0x06, 0x00, 0xed, 0xd0, 0x50, 
-	0x6e, 0x81, 0x00, 0x22, 0xd0, 0x70, 0x6e, 0x81, 
-	0x00, 0xee, 0xd0, 0x74, 0x6e, 0x81, 0xd0, 0x4c, 
-	0x6e, 0x81, 0xd0, 0x02, 0x00, 0xef, 0xd0, 0x6c, 
-	0x60, 0x01, 0xd0, 0x03, 0x00, 0xef, 0xd0, 0x70, 
-	0x60, 0x01, 0x00, 0xe0, 0xd0, 0x48, 0xd0, 0x02, 
-	0x60, 0x01, 0x00, 0x32, 0xdf, 0x20, 0xa0, 0x1c, 
-	0x00, 0x21, 0xd0, 0x60, 0xa0, 0x76, 0x00, 0x34, 
-	0xd5, 0x70, 0x80, 0x3f, 0x00, 0x23, 0xd0, 0x5c, 
-	0x00, 0x4a, 0xd0, 0x72, 0x70, 0x40, 0x00, 0x06, 
-	0x00, 0x22, 0xd1, 0xa4, 0x6e, 0xc6, 0xd0, 0x58, 
-	0x6e, 0xc1, 0xd0, 0xc9, 0x00, 0xed, 0xd0, 0x54, 
-	0x60, 0xc1, 0x00, 0x22, 0xd0, 0x40, 0x60, 0xc1, 
-	0x00, 0x22, 0xd0, 0x60, 0x60, 0xc1, 0x82, 0x34, 
-	0x80, 0x3f, 0xd6, 0xd9, 0x01, 0x2d, 0xd6, 0x0c, 
-	0x16, 0x08, 0xd0, 0x55, 0xd0, 0x2c, 0x60, 0x40, 
-	0xd0, 0x70, 0x00, 0xfb, 0xd1, 0x00, 0x60, 0x01, 
-	0x00, 0x2b, 0xd4, 0x10, 0x00, 0x29, 0xd4, 0x40, 
-	0x00, 0x2b, 0xd0, 0x90, 0xc0, 0xc2, 0xd1, 0x18, 
-	0xd1, 0x44, 0xa1, 0x50, 0x00, 0x21, 0xd0, 0xb6, 
-	0xd0, 0xd7, 0x00, 0x29, 0xd0, 0x04, 0x64, 0x00, 
-	0xb0, 0x3c, 0x64, 0x40, 0x80, 0x34, 0x80, 0x3f, 
-	0xd0, 0x40, 0x00, 0x35, 0xd0, 0x00, 0x60, 0x01, 
-	0xd0, 0x48, 0x6e, 0x81, 0xd0, 0x44, 0x6e, 0x81, 
-	0x00, 0x64, 0xd1, 0x80, 0x6e, 0x86, 0x01, 0x3c, 
-	0xd2, 0x39, 0xe0, 0x46, 0xd0, 0x00, 0xd0, 0x40, 
-	0xd0, 0x80, 0xd0, 0xc0, 0xd1, 0x00, 0xd1, 0x40, 
-	0xd1, 0x80, 0xd1, 0xc0, 0xd2, 0x00, 0xd2, 0x40, 
-	0xd2, 0x80, 0xd2, 0xc0, 0xd3, 0x00, 0xd3, 0x40, 
-	0xd3, 0x80, 0xd3, 0xc0, 0xd4, 0x00, 0xd4, 0x40, 
-	0xd4, 0x80, 0xd4, 0xc0, 0xd5, 0x00, 0xd5, 0x40, 
-	0xd5, 0x80, 0xd5, 0xc0, 0xd6, 0x00, 0xd6, 0x40, 
-	0xd6, 0x80, 0xd6, 0xc0, 0xd7, 0x00, 0xd7, 0x40, 
-	0xd7, 0x80, 0xd7, 0xc0, 0x0f, 0xc5, 0x50, 0x00, 
-	0x01, 0x46, 0x00, 0x06, 0xde, 0x80, 0xde, 0xc1, 
-	0x03, 0x2f, 0xd0, 0x33, 0xa0, 0x38, 0xb0, 0x01, 
-	0xa0, 0x37, 0x80, 0x3f, 0x08, 0x20, 0xdf, 0x00, 
-	0x82, 0x34, 0x80, 0x3f, 0x00, 0xee, 0xd0, 0x08, 
-	0x77, 0xc0, 0xb0, 0x04, 0x77, 0x80, 0xb0, 0x04, 
-	0xc0, 0x5f, 0x30, 0x5e, 0x60, 0x40, 0xd7, 0x00, 
-	0xb7, 0x01, 0x80, 0x34, 0x80, 0x3f, 0x00, 0x60, 
-	0xd0, 0x80, 0x00, 0xec, 0xd0, 0x40, 0x60, 0x81, 
-	0xb0, 0x7c, 0x60, 0x81, 0x00, 0xa0, 0xd0, 0x80, 
-	0xb0, 0x74, 0x60, 0x81, 0xb0, 0x7c, 0x60, 0x81, 
-	0x00, 0x68, 0xd0, 0x80, 0x6e, 0x82, 0x00, 0xef, 
-	0xd0, 0x8c, 0x6e, 0x82, 0x00, 0x06, 0xd0, 0x11, 
-	0xa0, 0x38, 0x80, 0x3f, 0x08, 0x20, 0xd0, 0x40, 
-	0x10, 0x48, 0xa0, 0x4a, 0xa0, 0x5b, 0x0c, 0x20, 
-	0xd0, 0x00, 0x10, 0x08, 0xa0, 0x27, 0xa0, 0x0a, 
-	0x90, 0x4d, 0x0f, 0xff, 0xd8, 0x1f, 0x40, 0x40, 
-	0xa0, 0x4d, 0x80, 0x0a, 0x80, 0x07, 0x80, 0x1b, 
-	0x80, 0x27, 0x00, 0x60, 0xd0, 0x00, 0xa0, 0x09, 
-	0x80, 0x28, 0x01, 0x20, 0xd0, 0x67, 0xa0, 0x69, 
-	0x80, 0x2a, 0x82, 0x29, 0x80, 0x6a, 0x84, 0x29, 
-	0xd0, 0x54, 0x10, 0x4f, 0xa0, 0x6a, 0x01, 0x20, 
-	0xd0, 0x00, 0xa0, 0x29, 0x80, 0x2b, 0x02, 0x30, 
-	0xd0, 0x00, 0xa0, 0x38, 0x80, 0x3f, 0x01, 0xb0, 
-	0xd0, 0x10, 0xa0, 0x37, 0x80, 0x3f, 0x02, 0x30, 
-	0xd0, 0x01, 0xa0, 0x38, 0x00, 0xea, 0xd0, 0x00, 
-	0xd0, 0x4e, 0x0f, 0x0b, 0x70, 0x40, 0x00, 0x06, 
-	0x00, 0x21, 0xd0, 0x88, 0x00, 0xe1, 0xd0, 0x60, 
-	0x60, 0x81, 0x00, 0x2b, 0xd0, 0x80, 0x00, 0xe0, 
-	0xd0, 0x6c, 0x60, 0x81, 0xb0, 0x7c, 0x00, 0x29, 
-	0xd0, 0x80, 0x60, 0x81, 0xb0, 0x7c, 0xd0, 0x82, 
-	0x60, 0x81, 0xb0, 0x7c, 0xd0, 0x85, 0x60, 0x81, 
-	0xb0, 0x7c, 0x03, 0xaa, 0xd0, 0x98, 0x60, 0x81, 
-	0xb0, 0x7c, 0x6e, 0x81, 0x00, 0x27, 0xd0, 0x40, 
-	0x6e, 0x81, 0xb0, 0x7c, 0x6e, 0x81, 0xb0, 0x7c, 
-	0x6e, 0x81, 0x00, 0x27, 0xd1, 0x90, 0x6e, 0x86, 
-	0x00, 0x21, 0xd1, 0xb8, 0x6e, 0x86, 0x00, 0x66, 
-	0xd1, 0xa0, 0xd0, 0x00, 0x01, 0x64, 0xd0, 0x58, 
-	0x30, 0x01, 0x60, 0x06, 0x00, 0xed, 0xd1, 0xbc, 
-	0x6e, 0x86, 0x00, 0xec, 0xd1, 0xb8, 0x6e, 0x86, 
-	0xb1, 0x84, 0x6e, 0x86, 0x00, 0xee, 0xd1, 0x84, 
-	0x70, 0x46, 0x00, 0x65, 0xd1, 0x94, 0x60, 0x46, 
-	0x00, 0x64, 0xd1, 0xbc, 0x6e, 0x86, 0x00, 0x65, 
-	0xd1, 0x80, 0x6e, 0x86, 0xb1, 0xbc, 0x6e, 0x86, 
-	0xb1, 0xbc, 0x6e, 0x86, 0x00, 0xed, 0xd1, 0xa8, 
-	0x6e, 0x86, 0xd0, 0x0e, 0xb1, 0xbc, 0x60, 0x06, 
-	0xb1, 0xbc, 0x60, 0x06, 0x00, 0x65, 0xd1, 0xa4, 
-	0x60, 0x06, 0x00, 0x28, 0xd1, 0xa4, 0x6e, 0x86, 
-	0x00, 0x27, 0xd1, 0x98, 0x6e, 0x86, 0x00, 0x64, 
-	0xd1, 0xa4, 0x6e, 0x86, 0xd2, 0x01, 0x00, 0x64, 
-	0xd0, 0x60, 0x62, 0x01, 0x00, 0x64, 0xd1, 0x80, 
-	0x70, 0x46, 0x6e, 0x86, 0x00, 0xef, 0xd1, 0x98, 
-	0x70, 0x86, 0x08, 0x20, 0xd0, 0xcf, 0x30, 0xc1, 
-	0xea, 0x42, 0xd0, 0x81, 0x00, 0x21, 0xd1, 0xa8, 
-	0x60, 0x86, 0x00, 0xed, 0xd1, 0xa0, 0x6e, 0xc6, 
-	0x00, 0x65, 0xd1, 0x98, 0x6e, 0xc6, 0x00, 0x22, 
-	0xd0, 0x00, 0xa0, 0x05, 0x80, 0x40, 0x00, 0xc6, 
-	0x01, 0x73, 0xd4, 0x3d, 0xe0, 0x46, 0x50, 0x00, 
-	0x08, 0x20, 0xd0, 0x00, 0x5f, 0x00, 0x00, 0x64, 
-	0xd0, 0x60, 0x70, 0xc1, 0x00, 0xec, 0xd0, 0x40, 
-	0x71, 0x81, 0xb0, 0x7c, 0x71, 0xc1, 0xc0, 0x87, 
-	0x30, 0x86, 0xf9, 0x83, 0x10, 0xee, 0xe9, 0x76, 
-	0x10, 0xe1, 0xe9, 0x76, 0xe2, 0x57, 0x00, 0x63, 
-	0xd0, 0xbf, 0x72, 0x06, 0xb1, 0xbc, 0x41, 0x82, 
-	0x02, 0x1b, 0xe9, 0x8d, 0x72, 0x86, 0xb1, 0xbc, 
-	0x41, 0x82, 0xd0, 0x75, 0x30, 0x48, 0xe9, 0xfe, 
-	0xb0, 0x7f, 0xea, 0x00, 0x02, 0x1c, 0xe9, 0x96, 
-	0x15, 0xa3, 0xea, 0x57, 0x10, 0xf0, 0xe9, 0x9a, 
-	0x10, 0xfa, 0xf9, 0xa1, 0x15, 0xa3, 0xea, 0x57, 
-	0x00, 0x21, 0xd0, 0x4c, 0x70, 0x41, 0x10, 0x61, 
-	0xfa, 0x57, 0x00, 0xed, 0xd0, 0x08, 0x70, 0x40, 
-	0xd0, 0x85, 0x40, 0x42, 0x60, 0x40, 0x00, 0x64, 
-	0xd0, 0x64, 0x62, 0x01, 0x12, 0x2b, 0xe9, 0xeb, 
-	0x12, 0x3b, 0xe9, 0xd5, 0x00, 0xec, 0xd0, 0x40, 
-	0x61, 0x81, 0x12, 0x2d, 0xe9, 0xbf, 0x12, 0x30, 
-	0xe9, 0xd4, 0x12, 0x36, 0xe9, 0xd4, 0x12, 0x3a, 
-	0xe9, 0xd4, 0xd0, 0x62, 0x30, 0x48, 0xe9, 0xf2, 
-	0x12, 0x2e, 0xe9, 0xf9, 0xe1, 0x76, 0x00, 0xed, 
-	0xd0, 0x08, 0x70, 0x40, 0xd0, 0x85, 0x40, 0x42, 
-	0x60, 0x40, 0xb0, 0x08, 0x00, 0x21, 0xd0, 0x41, 
-	0x60, 0x40, 0x00, 0x64, 0xd0, 0x60, 0x62, 0x01, 
-	0xf2, 0x5a, 0x00, 0xed, 0xd0, 0x20, 0xd0, 0x41, 
-	0x60, 0x40, 0x10, 0xe1, 0xea, 0x3a, 0xe2, 0x57, 
-	0xe2, 0x53, 0x10, 0xee, 0xf9, 0xe9, 0x01, 0x46, 
-	0x82, 0x34, 0x80, 0x3f, 0x97, 0x2e, 0xc7, 0x5c, 
-	0xa7, 0x66, 0x81, 0x34, 0x80, 0x3f, 0x00, 0x21, 
-	0xd0, 0x01, 0xa0, 0x38, 0x00, 0xc6, 0x00, 0x21, 
-	0xd0, 0x15, 0x0b, 0x09, 0x00, 0x4d, 0xb0, 0x01, 
-	0xed, 0xe5, 0xd2, 0x1a, 0xe1, 0xec, 0xf1, 0x18, 
-	0x00, 0xec, 0xd0, 0x40, 0x71, 0x81, 0xd0, 0x4e, 
-	0x60, 0x46, 0xe2, 0x54, 0xc0, 0x0a, 0x10, 0x06, 
-	0x52, 0x80, 0x00, 0xed, 0xd0, 0x40, 0x62, 0x81, 
-	0xe2, 0x53, 0x00, 0x64, 0xd0, 0x60, 0x62, 0x01, 
-	0xf2, 0x5a, 0xe1, 0x70, 0x12, 0xa3, 0xf6, 0x57, 
-	0x15, 0xa1, 0xfa, 0x57, 0x12, 0xa0, 0xea, 0x23, 
-	0x00, 0x65, 0xd1, 0x1c, 0xd0, 0x75, 0x30, 0x48, 
-	0xea, 0x0a, 0xb1, 0x3c, 0x71, 0x04, 0x11, 0x20, 
-	0xfa, 0x11, 0x00, 0xec, 0xd0, 0x40, 0x61, 0x81, 
-	0xe2, 0x57, 0x12, 0xa1, 0xea, 0x33, 0x00, 0xe2, 
-	0xd0, 0x60, 0x70, 0x01, 0xb0, 0x7c, 0x70, 0x41, 
-	0x10, 0x0c, 0x50, 0x40, 0x0c, 0x30, 0xd0, 0x00, 
-	0x31, 0x01, 0xee, 0x21, 0x21, 0x00, 0xe6, 0x57, 
-	0xe2, 0x23, 0x31, 0x00, 0xfe, 0x57, 0xd0, 0x75, 
-	0x30, 0x48, 0xea, 0x28, 0xf2, 0x5a, 0xe2, 0x0d, 
-	0x00, 0xec, 0xd0, 0x40, 0x71, 0x81, 0x00, 0x63, 
-	0xd1, 0x3f, 0xb1, 0xbc, 0x41, 0x84, 0x61, 0x81, 
-	0xd0, 0x50, 0x60, 0x46, 0xe2, 0x57, 0x00, 0xed, 
-	0xd0, 0x7c, 0x70, 0x41, 0x08, 0x20, 0xd0, 0x00, 
-	0x10, 0x08, 0xe2, 0x1c, 0xd2, 0x84, 0x00, 0xed, 
-	0xd1, 0xa4, 0x62, 0x86, 0xd5, 0x00, 0xb5, 0x01, 
-	0x01, 0x46, 0x82, 0x34, 0x80, 0x3f, 0xc7, 0x5e, 
-	0x97, 0x2e, 0x81, 0x34, 0x80, 0x3f, 0x02, 0xe8, 
-	0xd0, 0x30, 0xa0, 0x37, 0xa0, 0x38, 0x08, 0x20, 
-	0xdf, 0x00, 0x80, 0x73, 0x80, 0x3f, 0x00, 0xc6, 
-	0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0xf2, 0x5a, 
-	0x00, 0x64, 0xd0, 0x60, 0x62, 0x01, 0x02, 0x3c, 
-	0xdc, 0x89, 0xe0, 0x46, 0x00, 0x28, 0xd0, 0x64, 
-	0x70, 0x81, 0x00, 0x22, 0xd0, 0x00, 0x50, 0x80, 
-	0x60, 0x81, 0x0f, 0xc5, 0x50, 0x00, 0x50, 0x00, 
-	0x00, 0xed, 0xd1, 0xa4, 0x72, 0x86, 0x00, 0xef, 
-	0xd1, 0x90, 0x70, 0x46, 0x10, 0x5c, 0x10, 0x65, 
-	0xed, 0x7d, 0xd0, 0x46, 0xc0, 0x0a, 0x10, 0x40, 
-	0x60, 0x46, 0x00, 0x22, 0xd0, 0x73, 0x30, 0x54, 
-	0xe9, 0x8e, 0x12, 0xa4, 0xe9, 0xb5, 0x15, 0x20, 
-	0xe9, 0xc0, 0xb0, 0x7b, 0xe9, 0xc3, 0xb0, 0x41, 
-	0xe9, 0xc9, 0xc0, 0x54, 0x10, 0x5c, 0x10, 0x6e, 
-	0xe9, 0xc6, 0xe1, 0xb5, 0x00, 0x28, 0xd1, 0xb0, 
-	0xd0, 0x00, 0x60, 0x06, 0x12, 0xa4, 0xf9, 0xb2, 
-	0x00, 0xed, 0xd1, 0x9c, 0x62, 0x86, 0xd2, 0x80, 
-	0x00, 0xed, 0xd1, 0xa4, 0x62, 0x86, 0xd0, 0x02, 
-	0x00, 0xec, 0xd1, 0xbc, 0x60, 0x06, 0x00, 0x64, 
-	0xd1, 0xa0, 0x72, 0x06, 0x12, 0x21, 0xf9, 0xa6, 
-	0xd2, 0x0d, 0x62, 0x06, 0x00, 0xed, 0xd1, 0xa0, 
-	0x61, 0x86, 0xd0, 0x0e, 0x00, 0xed, 0xd1, 0xac, 
-	0x60, 0x06, 0xb1, 0xbc, 0x60, 0x06, 0x00, 0x65, 
-	0xd1, 0xa4, 0x60, 0x06, 0x01, 0x7e, 0xd2, 0x32, 
-	0xe1, 0xcb, 0x01, 0x46, 0x90, 0x49, 0x00, 0x60, 
-	0xd0, 0x00, 0x50, 0x40, 0xa0, 0x49, 0x80, 0x3f, 
-	0x00, 0xc6, 0x0c, 0x09, 0x05, 0x0d, 0xe1, 0x70, 
-	0x01, 0xbf, 0xd0, 0x41, 0xe1, 0xcb, 0x01, 0xbb, 
-	0xda, 0x10, 0xe1, 0xcb, 0x01, 0xbd, 0xda, 0x0b, 
-	0xe1, 0xcb, 0x03, 0xb9, 0xd8, 0x10, 0x01, 0x46, 
-	0x90, 0x49, 0x00, 0x60, 0xd1, 0x00, 0x50, 0x44, 
-	0x30, 0x44, 0xa0, 0x49, 0x80, 0x3f, 0x00, 0xc6, 
-	0xe0, 0x46, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 
-	0x01, 0xfa, 0xd4, 0x3d, 0x00, 0x25, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0x00, 0x26, 0xd0, 0x18, 0xd0, 0x40, 
-	0x60, 0x40, 0x00, 0x28, 0xd0, 0x24, 0x70, 0x40, 
-	0xd0, 0x82, 0x50, 0x42, 0x60, 0x40, 0x00, 0xec, 
-	0xd0, 0xa4, 0x70, 0xc2, 0x10, 0xe0, 0xf9, 0x81, 
-	0x00, 0xec, 0xd1, 0x98, 0xd0, 0x41, 0x60, 0x46, 
-	0x70, 0xc2, 0x10, 0xe0, 0xe9, 0x8e, 0xd0, 0x40, 
-	0x60, 0x46, 0xe1, 0x81, 0xd0, 0x40, 0x00, 0xe6, 
-	0xd0, 0x10, 0x60, 0x40, 0xb0, 0x3c, 0x60, 0x40, 
-	0xb0, 0x3c, 0x60, 0x40, 0xd0, 0xe0, 0x00, 0xea, 
-	0xd0, 0x40, 0x00, 0xe8, 0xd0, 0x82, 0x01, 0x46, 
-	0x70, 0x01, 0xb0, 0x7c, 0x60, 0x02, 0xb0, 0xbc, 
-	0x00, 0x06, 0x00, 0xc6, 0xb0, 0xc1, 0xed, 0x9b, 
-	0x80, 0x49, 0xd6, 0x44, 0xd5, 0x43, 0x00, 0xe0, 
-	0xd1, 0x80, 0x00, 0x06, 0x0b, 0x09, 0x01, 0x0d, 
-	0x0b, 0x09, 0x61, 0x06, 0xb1, 0xbc, 0x01, 0x4d, 
-	0x09, 0x09, 0x61, 0x46, 0xb1, 0xbc, 0x00, 0xcd, 
-	0x09, 0x09, 0x10, 0xe4, 0xed, 0xb8, 0x60, 0xc6, 
-	0xb1, 0xbc, 0x00, 0xcd, 0x60, 0xc6, 0x00, 0xed, 
-	0xd0, 0x04, 0x70, 0x00, 0x10, 0x20, 0xf9, 0xd8, 
-	0xd0, 0x0a, 0x40, 0x03, 0xe9, 0xc9, 0x10, 0xe2, 
-	0xe9, 0xc9, 0x10, 0xe7, 0xe9, 0xc9, 0x10, 0xe8, 
-	0xf9, 0xd8, 0x01, 0x46, 0x90, 0x10, 0x00, 0x20, 
-	0xd0, 0x44, 0x50, 0x40, 0x00, 0xc6, 0xa0, 0x50, 
-	0x00, 0xa0, 0xd0, 0x00, 0xa0, 0x05, 0x80, 0x40, 
-	0x00, 0xed, 0xd1, 0xa4, 0xd0, 0x04, 0x60, 0x06, 
-	0x00, 0xee, 0xd1, 0xac, 0x73, 0x86, 0x10, 0xe3, 
-	0xe5, 0xe3, 0xe9, 0xe8, 0x00, 0xe7, 0xd0, 0x40, 
-	0x00, 0xae, 0xd0, 0xbb, 0xe1, 0xec, 0x01, 0x24, 
-	0xd0, 0x6b, 0x00, 0xea, 0xd0, 0xa6, 0xe1, 0xec, 
-	0x01, 0x21, 0xd0, 0x7b, 0x00, 0xe8, 0xd0, 0x90, 
-	0x13, 0xa0, 0xf9, 0xef, 0xc0, 0x42, 0x00, 0xe0, 
-	0xd1, 0xa8, 0x60, 0x46, 0xb1, 0x98, 0x0b, 0xc9, 
-	0x00, 0x4d, 0x09, 0x09, 0x10, 0x44, 0x00, 0x8d, 
-	0x20, 0x42, 0x10, 0x5f, 0x60, 0x46, 0xb1, 0xb8, 
-	0x00, 0x90, 0xea, 0x1c, 0x0a, 0x89, 0x00, 0x8d, 
-	0x60, 0x86, 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, 
-	0x60, 0x46, 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, 
-	0x60, 0x46, 0x10, 0x60, 0xea, 0x10, 0x00, 0xe8, 
-	0xd1, 0x80, 0xf2, 0xb0, 0x10, 0x60, 0xfa, 0x1c, 
-	0x08, 0x49, 0x00, 0xe0, 0xd1, 0xa4, 0x00, 0x4d, 
-	0x60, 0x46, 0x10, 0x60, 0xea, 0x20, 0x00, 0xe9, 
-	0xd1, 0x80, 0xf2, 0xb0, 0x10, 0x60, 0xea, 0x20, 
-	0x00, 0xe0, 0xd1, 0x88, 0xd0, 0x40, 0x60, 0x46, 
-	0xd0, 0x00, 0x00, 0xe0, 0xd1, 0xa8, 0x70, 0x46, 
-	0x00, 0xef, 0xd1, 0x9c, 0x70, 0x86, 0xb0, 0xb0, 
-	0xee, 0x2a, 0xd0, 0x81, 0x00, 0x90, 0xea, 0x2d, 
-	0x20, 0x01, 0x10, 0x41, 0x10, 0x9f, 0x10, 0xa0, 
-	0xee, 0x2a, 0x10, 0x1c, 0x00, 0x65, 0xd1, 0xa8, 
-	0x60, 0x06, 0x01, 0xb4, 0xd6, 0x3a, 0xe0, 0x46, 
-	0x02, 0x31, 0xde, 0x13, 0x00, 0x27, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0x0c, 0x09, 0x00, 0x06, 0x05, 0x0d, 
-	0x00, 0x22, 0xd0, 0x72, 0x30, 0x54, 0xe9, 0xea, 
-	0xb0, 0x7d, 0xfa, 0x05, 0x09, 0x09, 0x01, 0xcd, 
-	0x11, 0xe1, 0xf9, 0xc7, 0x80, 0x09, 0x80, 0x27, 
-	0x0a, 0x09, 0xd6, 0x45, 0x00, 0xe1, 0xd1, 0xa0, 
-	0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 0x08, 0x49, 
-	0x00, 0x4d, 0x60, 0x46, 0x00, 0x50, 0xe9, 0x91, 
-	0xd4, 0x01, 0xb1, 0xbc, 0x08, 0x89, 0x00, 0x4d, 
-	0x60, 0x46, 0x00, 0xe0, 0xd1, 0x80, 0x08, 0x89, 
-	0x00, 0x4d, 0x08, 0x89, 0x10, 0x4c, 0x71, 0x06, 
-	0x21, 0x01, 0x61, 0x06, 0xb1, 0xbc, 0x00, 0x4d, 
-	0x0b, 0x49, 0x10, 0x4c, 0x71, 0x46, 0x21, 0x41, 
-	0x61, 0x46, 0xb1, 0xb0, 0x00, 0x4d, 0x10, 0x5f, 
-	0x60, 0x46, 0xb1, 0xbc, 0x0a, 0x09, 0x00, 0x4d, 
-	0x10, 0x4a, 0x70, 0x86, 0x20, 0x81, 0x60, 0x86, 
-	0x00, 0xe1, 0xd1, 0xac, 0x08, 0x49, 0x00, 0x4d, 
-	0x60, 0x46, 0xb1, 0xbc, 0x08, 0x89, 0x00, 0x4d, 
-	0x60, 0x46, 0xb1, 0xbc, 0x09, 0x49, 0x00, 0x8d, 
-	0x60, 0x86, 0xc0, 0x02, 0x00, 0xe0, 0xd1, 0xa8, 
-	0x70, 0xc6, 0x10, 0xc0, 0xd0, 0x20, 0x30, 0x01, 
-	0x10, 0xc0, 0x60, 0xc6, 0xe1, 0x75, 0x11, 0xe2, 
-	0xf9, 0x75, 0x00, 0xe2, 0xd1, 0x80, 0x08, 0xc9, 
-	0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 0x08, 0x49, 
-	0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 0x10, 0x60, 
-	0xf9, 0xd7, 0xb1, 0xb4, 0xe1, 0xde, 0xd2, 0x03, 
-	0x0a, 0x09, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 
-	0xb2, 0x01, 0xf9, 0xd8, 0x0b, 0xc9, 0x00, 0x4d, 
-	0x10, 0x49, 0x10, 0x56, 0x60, 0x46, 0xb1, 0xbc, 
-	0x0b, 0x89, 0x00, 0x4d, 0x10, 0x4a, 0x10, 0x56, 
-	0x60, 0x46, 0xe1, 0x75, 0x0b, 0x2c, 0xd4, 0x40, 
-	0xf3, 0xb0, 0xe1, 0x77, 0x00, 0xe0, 0xd0, 0x6c, 
-	0x00, 0xe0, 0xd1, 0x80, 0xd0, 0x0a, 0xf1, 0xfe, 
-	0x00, 0xe1, 0xd1, 0xb0, 0xd0, 0x02, 0xf1, 0xfe, 
-	0x00, 0xe0, 0xd1, 0x80, 0x76, 0x86, 0xb1, 0xbc, 
-	0x73, 0x46, 0xe2, 0x3c, 0x70, 0x81, 0x60, 0x86, 
-	0xb1, 0xbc, 0xb0, 0x7c, 0xb0, 0x01, 0xed, 0xfe, 
-	0x0f, 0xc5, 0x00, 0xe1, 0xd1, 0xa0, 0x70, 0x46, 
-	0xd0, 0x8f, 0x40, 0x42, 0x00, 0x25, 0xd0, 0xe0, 
-	0x00, 0x24, 0xd1, 0x20, 0x10, 0x6a, 0xea, 0x1e, 
-	0x00, 0x66, 0xd0, 0xe0, 0x00, 0x62, 0xd1, 0x00, 
-	0x10, 0x66, 0xea, 0x1e, 0x00, 0x6e, 0xd0, 0xc0, 
-	0x10, 0x64, 0xea, 0x1e, 0x00, 0x2b, 0xd0, 0xd0, 
-	0x00, 0x29, 0xd1, 0x00, 0x00, 0xe0, 0xd1, 0x80, 
-	0x76, 0x86, 0x16, 0xa0, 0xe9, 0xee, 0x30, 0xda, 
-	0xe5, 0xee, 0xb1, 0xbc, 0x73, 0x46, 0x13, 0x60, 
-	0xe9, 0xee, 0x31, 0x0d, 0xe5, 0xee, 0xd0, 0x82, 
-	0xb1, 0xbc, 0x70, 0x46, 0x10, 0x60, 0xe9, 0xee, 
-	0xb0, 0x81, 0xee, 0x2c, 0x00, 0xe0, 0xd0, 0x40, 
-	0x00, 0xe0, 0xd1, 0xac, 0xd0, 0x0a, 0xf1, 0xfe, 
-	0x00, 0xe1, 0xd0, 0x70, 0xd0, 0x02, 0xf1, 0xfe, 
-	0x00, 0xec, 0xd1, 0x98, 0xd0, 0x40, 0x60, 0x46, 
-	0x00, 0xe0, 0xd0, 0x8c, 0x70, 0x82, 0x00, 0x21, 
-	0xd0, 0x70, 0x60, 0x81, 0xd0, 0x40, 0x00, 0x25, 
-	0xd0, 0x20, 0x30, 0x1a, 0xfa, 0x50, 0x00, 0x24, 
-	0xd0, 0x20, 0x30, 0x0d, 0xfa, 0x50, 0xd0, 0x41, 
-	0x00, 0x21, 0xd1, 0x84, 0x60, 0x46, 0xb6, 0xb1, 
-	0x16, 0x9c, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 
-	0x02, 0x31, 0xde, 0x13, 0x00, 0x27, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0x00, 0xec, 0xd0, 0xa8, 0x70, 0xc2, 
-	0x10, 0xe0, 0xf9, 0x77, 0x00, 0xec, 0xd1, 0x9c, 
-	0xd0, 0x41, 0x60, 0x46, 0x70, 0xc2, 0x10, 0xe0, 
-	0xe9, 0x84, 0xd0, 0x40, 0x60, 0x46, 0xe1, 0x77, 
-	0x0b, 0x49, 0x00, 0xe2, 0xd1, 0xa0, 0x00, 0x4d, 
-	0x10, 0x5f, 0x00, 0x6f, 0xd0, 0xff, 0x40, 0x43, 
-	0x60, 0x46, 0xb1, 0xbc, 0x0b, 0x09, 0x00, 0x4d, 
-	0x60, 0x46, 0xb1, 0xbc, 0x08, 0x89, 0x00, 0x4d, 
-	0x60, 0x46, 0x10, 0x61, 0xf9, 0x9b, 0xd3, 0xc2, 
-	0x00, 0xec, 0xd1, 0xbc, 0x63, 0xc6, 0x0c, 0x09, 
-	0x90, 0x4d, 0x10, 0x60, 0xe5, 0x9c, 0x00, 0x06, 
-	0x05, 0x0d, 0x00, 0x22, 0xd0, 0x72, 0x30, 0x54, 
-	0xf9, 0xa9, 0x0b, 0xa0, 0xd4, 0x40, 0xf3, 0xb0, 
-	0xe1, 0xa0, 0x00, 0xec, 0xd1, 0x9c, 0xd0, 0x40, 
-	0x60, 0x46, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 
-	0x0b, 0x09, 0x00, 0x4d, 0x0b, 0x09, 0x00, 0x4d, 
-	0x0a, 0x09, 0x01, 0x4d, 0x0a, 0x09, 0x00, 0x4d, 
-	0x01, 0x59, 0xe9, 0x96, 0x09, 0x09, 0x00, 0x4d, 
-	0x10, 0x5f, 0x10, 0x61, 0xf9, 0x96, 0x09, 0x09, 
-	0x01, 0x4d, 0x11, 0x5f, 0x0b, 0xc9, 0x00, 0x4d, 
-	0xc0, 0x01, 0x10, 0x5f, 0x11, 0x4e, 0x51, 0x41, 
-	0x08, 0x49, 0x00, 0x4d, 0x0b, 0xc9, 0x10, 0x0f, 
-	0x00, 0x4d, 0x50, 0x01, 0x00, 0xed, 0xd1, 0xb6, 
-	0x01, 0x46, 0x00, 0x06, 0xa0, 0x3c, 0xa1, 0x7d, 
-	0x60, 0x06, 0x00, 0xc6, 0xd5, 0x00, 0xb5, 0x01, 
-	0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x50, 0x00, 
-	0x00, 0xec, 0xd0, 0xac, 0x70, 0xc2, 0x10, 0xe0, 
-	0xf9, 0x70, 0x00, 0xec, 0xd1, 0xa0, 0xd0, 0x41, 
-	0x60, 0x46, 0x70, 0xc2, 0x10, 0xe0, 0xe9, 0x7f, 
-	0xd0, 0x40, 0x60, 0x46, 0xe1, 0x70, 0x0a, 0x89, 
-	0x0b, 0xcd, 0x00, 0xe3, 0xd1, 0x80, 0x6b, 0xc6, 
-	0x08, 0xc9, 0x05, 0x8d, 0x15, 0xa3, 0xee, 0x6e, 
-	0x15, 0xa0, 0xea, 0x6e, 0x90, 0x4d, 0xd0, 0x9f, 
-	0xd0, 0xdf, 0x40, 0x81, 0x10, 0x55, 0x40, 0xc1, 
-	0x01, 0x46, 0x82, 0x34, 0x80, 0x3f, 0xc8, 0x1d, 
-	0x81, 0x34, 0x80, 0x3f, 0x00, 0xc6, 0xd1, 0x23, 
-	0x31, 0x03, 0x11, 0x02, 0x38, 0x04, 0xb0, 0x8d, 
-	0x10, 0x9d, 0x28, 0x02, 0xc0, 0x60, 0x00, 0x65, 
-	0xd1, 0x94, 0x71, 0x06, 0x68, 0x06, 0x30, 0x44, 
-	0x00, 0xed, 0xd1, 0xa8, 0x70, 0x06, 0x10, 0x20, 
-	0xe9, 0xb0, 0x00, 0xee, 0xd0, 0xc0, 0x70, 0xc3, 
-	0x20, 0x43, 0xb0, 0x01, 0xf9, 0xac, 0x60, 0x06, 
-	0x00, 0x64, 0xd1, 0xbc, 0x71, 0x06, 0xc0, 0x04, 
-	0x21, 0x01, 0x61, 0x06, 0x10, 0x20, 0xf5, 0xbb, 
-	0x11, 0x20, 0xe5, 0xbb, 0xb0, 0x41, 0x00, 0x65, 
-	0xd1, 0x80, 0x71, 0x06, 0x21, 0x01, 0x61, 0x06, 
-	0x00, 0xed, 0xd1, 0xac, 0x71, 0x06, 0x15, 0xa1, 
-	0xe9, 0xcb, 0xb1, 0x3f, 0x61, 0x06, 0x15, 0xa3, 
-	0xf9, 0xd6, 0xd0, 0xbf, 0xe1, 0xd3, 0xd0, 0x40, 
-	0x60, 0x46, 0xb1, 0xbc, 0x70, 0x86, 0x61, 0x06, 
-	0x31, 0x02, 0xe5, 0xd3, 0x20, 0x84, 0x00, 0x65, 
-	0xd1, 0xa4, 0x60, 0x86, 0xd9, 0x40, 0x00, 0xec, 
-	0xd1, 0x94, 0x79, 0x06, 0xb1, 0x84, 0x78, 0xc6, 
-	0xc0, 0x63, 0x30, 0x64, 0xe9, 0xf8, 0x00, 0xa7, 
-	0xd0, 0xff, 0x7a, 0x63, 0x00, 0x65, 0xd0, 0x00, 
-	0x71, 0x00, 0x31, 0x29, 0xe5, 0xf8, 0xc0, 0x63, 
-	0xc8, 0xc1, 0xb0, 0x78, 0x40, 0x43, 0xc0, 0xa4, 
-	0x30, 0x81, 0xe9, 0xf2, 0x7a, 0x41, 0x31, 0x29, 
-	0xf5, 0xe8, 0x21, 0x29, 0x61, 0x00, 0xb8, 0xfc, 
-	0x79, 0x63, 0xb8, 0xfc, 0x48, 0xc3, 0x68, 0xc6, 
-	0x00, 0xed, 0xd1, 0xb8, 0x69, 0x46, 0x80, 0x28, 
-	0x0b, 0xc9, 0x00, 0x4d, 0x08, 0x49, 0x10, 0x41, 
-	0x00, 0xe3, 0xd1, 0x84, 0x00, 0x8d, 0x20, 0x42, 
-	0x60, 0x46, 0x00, 0xee, 0xd1, 0xa4, 0x70, 0x86, 
-	0x10, 0xa1, 0xee, 0x18, 0xe6, 0x6b, 0x90, 0x86, 
-	0x00, 0x90, 0xea, 0x18, 0x00, 0xed, 0xd0, 0x1c, 
-	0x70, 0x80, 0xb0, 0x81, 0xe6, 0x6b, 0x60, 0x80, 
-	0xb1, 0xa8, 0x70, 0x86, 0x10, 0xa0, 0xfa, 0x6b, 
-	0x00, 0x21, 0xd0, 0x38, 0x70, 0x80, 0x10, 0xa0, 
-	0xfa, 0x6b, 0x0f, 0xef, 0xd0, 0xbf, 0x30, 0x81, 
-	0xfa, 0x22, 0x60, 0x00, 0x08, 0x20, 0xd0, 0x00, 
-	0x5f, 0x00, 0x15, 0xa3, 0xea, 0x6b, 0x00, 0xee, 
-	0xd1, 0x80, 0x79, 0x46, 0x00, 0xf8, 0xd0, 0x00, 
-	0xc4, 0x40, 0x00, 0xe3, 0xd1, 0x84, 0x78, 0x46, 
-	0x0f, 0xef, 0xd0, 0x3f, 0x30, 0x21, 0xea, 0x48, 
-	0x00, 0xe0, 0xd1, 0x90, 0x78, 0x06, 0xc0, 0xa1, 
-	0x18, 0x43, 0x28, 0x42, 0x18, 0x43, 0x28, 0x42, 
-	0x18, 0x1e, 0xd8, 0x80, 0x08, 0x11, 0xea, 0x41, 
-	0x28, 0xa1, 0x18, 0x01, 0x18, 0x5f, 0x18, 0x60, 
-	0xee, 0x3e, 0xc0, 0x51, 0x30, 0x62, 0xee, 0x4e, 
-	0xc8, 0x91, 0x18, 0x9f, 0x00, 0x21, 0xd1, 0xb8, 
-	0xd0, 0x01, 0x60, 0x06, 0x00, 0xef, 0xd0, 0x10, 
-	0xd0, 0x72, 0x60, 0x40, 0x01, 0x46, 0x82, 0x34, 
-	0x80, 0x3f, 0xc8, 0xdc, 0xc9, 0x1d, 0x81, 0x34, 
-	0x80, 0x3f, 0x00, 0xc6, 0x38, 0xe4, 0xee, 0x5e, 
-	0xea, 0x52, 0x28, 0xe5, 0x01, 0x46, 0x90, 0x6d, 
-	0x28, 0xc1, 0x00, 0xc6, 0x38, 0xe2, 0xf6, 0x6b, 
-	0xdb, 0x08, 0xf1, 0x16, 0xf1, 0x18, 0x00, 0x21, 
-	0xd1, 0xb4, 0x61, 0x86, 0xe2, 0x52, 0x01, 0xf7, 
-	0xd2, 0x19, 0xe0, 0x46, 0xd5, 0x00, 0xb5, 0x01, 
-	0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x50, 0x00, 
-	0x02, 0x31, 0xde, 0x13, 0x00, 0x27, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0xdb, 0x09, 0x00, 0xe3, 0xd0, 0x1c, 
-	0x6b, 0x00, 0xda, 0xc1, 0x00, 0xe6, 0xd1, 0x98, 
-	0x70, 0x06, 0xb1, 0x84, 0x60, 0x06, 0xb1, 0x84, 
-	0x60, 0x06, 0x05, 0x9f, 0xe9, 0x9f, 0x08, 0x49, 
-	0xd1, 0x17, 0x46, 0x44, 0x00, 0x4d, 0x10, 0x43, 
-	0x26, 0x41, 0x08, 0xc9, 0x05, 0xcd, 0xb5, 0xc1, 
-	0xe5, 0xcc, 0xc0, 0x57, 0x15, 0xc6, 0x25, 0xc1, 
-	0x15, 0xa3, 0xf9, 0x9f, 0x08, 0x49, 0xd1, 0x0f, 
-	0x46, 0x44, 0x00, 0x4d, 0x10, 0x44, 0x26, 0x41, 
-	0x08, 0xc9, 0x06, 0x0d, 0xb6, 0x01, 0xe5, 0xcc, 
-	0xc0, 0x58, 0x16, 0x06, 0x26, 0x01, 0x08, 0x49, 
-	0x00, 0x4d, 0x10, 0x60, 0xe9, 0xa6, 0x0a, 0x09, 
-	0x00, 0x4d, 0xe1, 0x9f, 0x0c, 0x09, 0x90, 0x4d, 
-	0x10, 0x60, 0xe5, 0xa7, 0x00, 0x06, 0x05, 0x0d, 
-	0x00, 0x22, 0xd0, 0x72, 0x30, 0x54, 0xf9, 0xb3, 
-	0xd4, 0x40, 0xf3, 0xb0, 0xe1, 0xab, 0xb0, 0x7d, 
-	0xf9, 0xb8, 0x02, 0x34, 0xd4, 0x44, 0xe0, 0x46, 
-	0x00, 0xec, 0xd1, 0xa0, 0xd0, 0x40, 0x60, 0x46, 
-	0x02, 0x3c, 0xdc, 0x89, 0x00, 0xec, 0xd1, 0x80, 
-	0x70, 0x46, 0xb1, 0xbc, 0x70, 0x86, 0x30, 0x81, 
-	0xe8, 0x46, 0x15, 0x63, 0xe9, 0xc9, 0x05, 0x5e, 
-	0xe8, 0x46, 0x01, 0x73, 0xd4, 0x3d, 0xe0, 0x46, 
-	0xd5, 0x00, 0xb5, 0x01, 0x01, 0x7a, 0xde, 0x1a, 
-	0xe0, 0x46, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 
-	0xcc, 0xc0, 0xcd, 0x01, 0xcd, 0x42, 0xcd, 0x83, 
-	0x00, 0xa0, 0xd0, 0x01, 0xa0, 0x38, 0xc8, 0x7f, 
-	0xc8, 0x06, 0xb1, 0xbe, 0xf3, 0x96, 0xc8, 0x80, 
-	0xf3, 0x92, 0x58, 0x80, 0xf3, 0x96, 0xc8, 0xc0, 
-	0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92, 0x58, 0xc0, 
-	0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x92, 0x59, 0x40, 
-	0xc0, 0x22, 0xc0, 0x65, 0xc0, 0x86, 0xf3, 0x9a, 
-	0xf3, 0x96, 0xc8, 0x80, 0xf3, 0x92, 0x59, 0x00, 
-	0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x96, 0xc9, 0x80, 
-	0xf3, 0x92, 0x59, 0x40, 0xf3, 0x96, 0xc9, 0xc0, 
-	0xf3, 0x92, 0x58, 0x80, 0xc0, 0x23, 0xc0, 0x62, 
-	0xd0, 0x88, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 
-	0xc8, 0xc0, 0xf3, 0x92, 0x58, 0xc0, 0xf3, 0x96, 
-	0xc8, 0x80, 0xf3, 0x92, 0x59, 0xc0, 0xc0, 0x24, 
-	0xc0, 0x67, 0xd0, 0x90, 0x20, 0x86, 0xf3, 0x9a, 
-	0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92, 0x59, 0x80, 
-	0xf3, 0x96, 0xc9, 0xc0, 0xf3, 0x96, 0xca, 0x00, 
-	0xf3, 0x92, 0x59, 0xc0, 0xf3, 0x96, 0xca, 0x40, 
-	0xf3, 0x92, 0x59, 0x00, 0xc0, 0x25, 0xc0, 0x64, 
-	0xd0, 0x98, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 
-	0xc9, 0x40, 0xf3, 0x92, 0x58, 0x80, 0xf3, 0x96, 
-	0xc9, 0x00, 0xf3, 0x92, 0x59, 0x00, 0xc0, 0x23, 
-	0xc0, 0x64, 0xd0, 0x84, 0x20, 0x86, 0xf3, 0x9a, 
-	0xf3, 0x96, 0xc8, 0xc0, 0xf3, 0x92, 0x59, 0x40, 
-	0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92, 0x5a, 0x40, 
-	0xc0, 0x26, 0xc0, 0x69, 0xd0, 0xa0, 0x20, 0x86, 
-	0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x80, 0xf3, 0x92, 
-	0x5a, 0x00, 0xf3, 0x96, 0xca, 0x40, 0xf3, 0x92, 
-	0x5a, 0x40, 0xf3, 0x96, 0xca, 0x80, 0xf3, 0x92, 
-	0x59, 0x80, 0xc0, 0x27, 0xc0, 0x66, 0xd0, 0xa8, 
-	0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0xc0, 
-	0xf3, 0x92, 0x59, 0x00, 0xf3, 0x96, 0xc9, 0x80, 
-	0xf3, 0x92, 0x58, 0xc0, 0xc0, 0x22, 0xc0, 0x63, 
-	0xd0, 0x8c, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x92, 
-	0x59, 0x80, 0xc0, 0x25, 0xc0, 0x66, 0xd0, 0x94, 
-	0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc8, 0x80, 
-	0xf3, 0x92, 0x59, 0xc0, 0xf3, 0x96, 0xc8, 0xc0, 
-	0xf3, 0x92, 0x5a, 0x80, 0xc0, 0x28, 0xc0, 0x6a, 
-	0xd0, 0xb0, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 
-	0xc9, 0x40, 0xf3, 0x92, 0x59, 0x40, 0xc0, 0x29, 
-	0xc0, 0x65, 0xd0, 0xb8, 0x20, 0x86, 0xf3, 0x9a, 
-	0xf3, 0x96, 0xc9, 0x80, 0xf3, 0x92, 0x58, 0xc0, 
-	0xf3, 0x96, 0xca, 0x00, 0xf3, 0x92, 0x58, 0x80, 
-	0xc0, 0x24, 0xc0, 0x62, 0xd0, 0x9c, 0x20, 0x86, 
-	0xf3, 0x9a, 0xf3, 0x92, 0x5a, 0x00, 0xc0, 0x27, 
-	0xc0, 0x68, 0xd0, 0xa4, 0x20, 0x86, 0xf3, 0x9a, 
-	0xf3, 0x96, 0xca, 0x80, 0xf3, 0x92, 0x59, 0x80, 
-	0xf3, 0x96, 0xca, 0x40, 0xf3, 0x92, 0x5a, 0x40, 
-	0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x92, 0x5a, 0x80, 
-	0xc0, 0x23, 0xc0, 0x6a, 0xd0, 0xac, 0x20, 0x86, 
-	0xf3, 0x9a, 0xf3, 0x92, 0x59, 0x40, 0xc0, 0x26, 
-	0xc0, 0x65, 0xd0, 0xb4, 0x20, 0x86, 0xf3, 0x9a, 
-	0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92, 0x59, 0x00, 
-	0xc0, 0x29, 0xc0, 0x64, 0xd0, 0xbc, 0x20, 0x86, 
-	0xf3, 0x9a, 0xc0, 0x33, 0xc0, 0x74, 0xc0, 0xb5, 
-	0xc0, 0xf6, 0xd0, 0x40, 0x00, 0xa0, 0xd8, 0x00, 
-	0xa8, 0x38, 0x08, 0x45, 0x0a, 0x09, 0x00, 0x0d, 
-	0x0f, 0xc5, 0x50, 0x00, 0x0a, 0x09, 0x00, 0x0d, 
-	0x10, 0x08, 0x0f, 0xc5, 0x01, 0x46, 0x00, 0x06, 
-	0xa0, 0x7c, 0xa0, 0x3d, 0x60, 0x42, 0x00, 0xc6, 
-	0x0f, 0xc5, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 
-	0x14, 0x48, 0xd0, 0x81, 0x00, 0xef, 0xd1, 0x8c, 
-	0x71, 0x46, 0x11, 0x60, 0xfb, 0xb1, 0x60, 0x86, 
-	0x71, 0x46, 0x31, 0x42, 0xfb, 0xb1, 0x00, 0xec, 
-	0xd1, 0x0c, 0x74, 0x84, 0x00, 0x68, 0xd0, 0x80, 
-	0x70, 0x02, 0x10, 0x20, 0xfb, 0xc4, 0xc4, 0x82, 
-	0xc4, 0xd2, 0xb4, 0xfc, 0xda, 0x00, 0xda, 0x4f, 
-	0x0a, 0x09, 0x0f, 0xef, 0xd0, 0x3f, 0xb4, 0x7f, 
-	0xca, 0x29, 0x1a, 0x18, 0x4a, 0x00, 0x1a, 0x48, 
-	0x00, 0x8d, 0x2a, 0x42, 0xd0, 0x03, 0x40, 0x11, 
-	0xfb, 0xe3, 0xb4, 0x44, 0x00, 0xa0, 0xd0, 0xc0, 
-	0x30, 0xd3, 0xff, 0xe3, 0xb4, 0xfe, 0x01, 0x46, 
-	0x00, 0x06, 0xaa, 0x3d, 0xaa, 0x7c, 0x6a, 0x53, 
-	0x00, 0xc6, 0xb4, 0xfe, 0xb4, 0x7c, 0x1a, 0x61, 
-	0xfb, 0xc8, 0xb4, 0x43, 0x00, 0xef, 0xd0, 0x3f, 
-	0x40, 0x11, 0xeb, 0xf7, 0xb0, 0xc4, 0xe7, 0xf7, 
-	0xeb, 0xee, 0x61, 0x53, 0x64, 0x52, 0x64, 0xc4, 
-	0x00, 0x28, 0xd1, 0x24, 0x70, 0x04, 0x00, 0x21, 
-	0xd0, 0x80, 0x50, 0x02, 0x60, 0x04, 0x61, 0x46, 
-	0x0a, 0x09, 0x0f, 0xc5, 0x50, 0x00, 0x50, 0x00, 
-	0x02, 0x31, 0xde, 0x13, 0x00, 0x27, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0x01, 0xfa, 0xd4, 0x3d, 0x00, 0x25, 
-	0xdc, 0xd8, 0xf0, 0x4a, 0x09, 0x09, 0x01, 0xcd, 
-	0x11, 0xe8, 0xf9, 0xe2, 0x00, 0xe3, 0xd1, 0x9c, 
-	0x09, 0x09, 0x05, 0xcd, 0xb5, 0xc1, 0x09, 0x09, 
-	0x00, 0x4d, 0xb0, 0x41, 0x10, 0x46, 0x25, 0xc1, 
-	0x09, 0x09, 0x06, 0x0d, 0xb6, 0x01, 0x09, 0x09, 
-	0x00, 0x4d, 0x08, 0x89, 0xb0, 0x41, 0x10, 0x46, 
-	0x26, 0x01, 0x00, 0x8d, 0x08, 0x89, 0x10, 0x82, 
-	0xd0, 0x04, 0xc0, 0x55, 0x00, 0x40, 0x40, 0x40, 
-	0x05, 0x4d, 0x08, 0x49, 0x0b, 0x0d, 0xd1, 0x00, 
-	0x15, 0x63, 0xe9, 0xa2, 0xd1, 0x01, 0x55, 0x41, 
-	0xdb, 0x01, 0x4b, 0x15, 0xa1, 0x1b, 0x08, 0x89, 
-	0x00, 0x4d, 0x08, 0x49, 0x10, 0x41, 0xd1, 0x19, 
-	0x46, 0x44, 0x26, 0x41, 0x00, 0xcd, 0x08, 0x49, 
-	0x10, 0xc4, 0x00, 0x4d, 0x08, 0x49, 0x10, 0x41, 
-	0x20, 0x81, 0xa0, 0x89, 0x00, 0x4d, 0x10, 0x43, 
-	0x20, 0xc1, 0xa0, 0xe8, 0x08, 0x49, 0x00, 0x4d, 
-	0x1b, 0x03, 0x5b, 0x01, 0xbb, 0x3f, 0x6b, 0x06, 
-	0x08, 0x49, 0xb1, 0xbc, 0x00, 0x4d, 0x60, 0x46, 
-	0x08, 0x49, 0xb1, 0xbc, 0x0a, 0xcd, 0x1a, 0xc2, 
-	0x4a, 0xd9, 0x1a, 0xde, 0x6a, 0xc6, 0x08, 0x49, 
-	0xb1, 0xbc, 0x00, 0x4d, 0x60, 0x46, 0x10, 0x60, 
-	0xea, 0x3e, 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, 
-	0x60, 0x46, 0xb1, 0xbc, 0x08, 0xc9, 0x00, 0x4d, 
-	0x60, 0x46, 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, 
-	0x60, 0x46, 0xb1, 0xbc, 0x09, 0xc9, 0x00, 0x4d, 
-	0x60, 0x46, 0xb1, 0xbc, 0x0a, 0x09, 0x00, 0x4d, 
-	0x60, 0x46, 0xe2, 0x3e, 0x11, 0xe3, 0xfa, 0x00, 
-	0x00, 0xe7, 0xd0, 0xc0, 0xd0, 0x84, 0xb0, 0x81, 
-	0xe6, 0x3e, 0x08, 0x49, 0x00, 0x4d, 0x60, 0x43, 
-	0xb0, 0xfc, 0x10, 0x60, 0xe9, 0xe7, 0x10, 0xa3, 
-	0xf9, 0xf4, 0x00, 0xe8, 0xd1, 0x80, 0xe1, 0xf8, 
-	0x10, 0xa2, 0xf9, 0xfa, 0x00, 0xe9, 0xd1, 0x80, 
-	0xf2, 0xb0, 0xe1, 0xe7, 0xd2, 0x3f, 0x0a, 0x09, 
-	0x00, 0x4d, 0xb2, 0x01, 0xf5, 0xfb, 0xe1, 0xe7, 
-	0x11, 0xe7, 0xfa, 0x3e, 0xd4, 0x01, 0x00, 0xe1, 
-	0xd0, 0x24, 0x70, 0x00, 0x10, 0x21, 0xea, 0x0d, 
-	0x15, 0x63, 0xfa, 0x0d, 0xd4, 0x03, 0x44, 0x2c, 
-	0xb4, 0x3f, 0x00, 0xe6, 0xd1, 0x90, 0x0b, 0x09, 
-	0x00, 0x4d, 0x09, 0x49, 0x10, 0x45, 0x00, 0x8d, 
-	0x50, 0x81, 0xd0, 0x40, 0x10, 0x87, 0x10, 0x98, 
-	0x30, 0x42, 0xf2, 0x61, 0x60, 0x46, 0xb1, 0xbc, 
-	0x0b, 0x09, 0x00, 0x0d, 0x09, 0x49, 0x00, 0x0d, 
-	0xb4, 0x01, 0xfa, 0x0f, 0x00, 0xe6, 0xd0, 0x18, 
-	0x30, 0x06, 0xe6, 0x29, 0x60, 0x46, 0xb1, 0xbc, 
-	0xe2, 0x22, 0x00, 0xe0, 0xd1, 0x88, 0x70, 0x46, 
-	0x10, 0x63, 0xea, 0x39, 0x10, 0x64, 0xea, 0x39, 
-	0x00, 0xe6, 0xd1, 0x90, 0xd0, 0x00, 0x60, 0x06, 
-	0xb1, 0xbc, 0x60, 0x06, 0xb1, 0xbc, 0x60, 0x06, 
-	0xe2, 0x3e, 0x00, 0xef, 0xd1, 0x84, 0x70, 0x46, 
-	0x10, 0x60, 0xfa, 0x30, 0x0c, 0x09, 0x90, 0x4d, 
-	0x10, 0x60, 0xe6, 0x3f, 0x00, 0x06, 0x05, 0x0d, 
-	0x00, 0x22, 0xd0, 0x72, 0x30, 0x54, 0xfa, 0x4b, 
-	0xd4, 0x40, 0xf3, 0xb0, 0xe2, 0x43, 0xb0, 0x7d, 
-	0xe9, 0x7a, 0x00, 0xec, 0xd1, 0xa0, 0xd0, 0x40, 
-	0x60, 0x46, 0x02, 0x3c, 0xdc, 0x89, 0x00, 0xec, 
-	0xd1, 0x80, 0x70, 0x46, 0xb1, 0xbc, 0x70, 0x86, 
-	0x30, 0x81, 0xe8, 0x46, 0x15, 0x63, 0xea, 0x5e, 
-	0x05, 0x5e, 0xe8, 0x46, 0x01, 0x73, 0xd4, 0x3d, 
-	0xe0, 0x46, 0x00, 0xe0, 0xd0, 0x00, 0x70, 0xc0, 
-	0x10, 0xc1, 0x00, 0xe0, 0xd0, 0x08, 0x70, 0x00, 
-	0x10, 0x23, 0xea, 0x75, 0xc0, 0x83, 0x10, 0x9d, 
-	0x30, 0xc2, 0x10, 0x9f, 0x30, 0xc2, 0x00, 0xef, 
-	0xd0, 0xac, 0x70, 0x82, 0x10, 0xa3, 0xea, 0x75, 
-	0x10, 0xc1, 0xc0, 0x83, 0x30, 0x81, 0xe6, 0x7e, 
-	0xc0, 0x83, 0x20, 0x81, 0xf6, 0x7f, 0xd0, 0x40, 
-	0x30, 0x43, 0x0f, 0xc5, 0xc0, 0x43, 0x0f, 0xc5, 
-	0x00, 0xed, 0xd1, 0xa4, 0x72, 0x86, 0x15, 0xa3, 
-	0xee, 0x23, 0x15, 0xa1, 0xe6, 0x23, 0x08, 0x20, 
-	0xd0, 0x00, 0x5f, 0x00, 0xd8, 0xc4, 0x15, 0x63, 
-	0xe9, 0x7e, 0x48, 0xd5, 0x18, 0xde, 0x18, 0xe0, 
-	0xe9, 0xc2, 0x00, 0xed, 0xd1, 0xb4, 0x79, 0xc6, 
-	0x19, 0xe0, 0xe9, 0x8c, 0x00, 0xed, 0xd0, 0x3a, 
-	0x79, 0xc6, 0x69, 0xc0, 0xd9, 0xc0, 0x69, 0xc6, 
-	0x00, 0xed, 0xd0, 0x38, 0x79, 0x40, 0x19, 0x60, 
-	0xe9, 0x98, 0x00, 0x28, 0xd0, 0x24, 0x70, 0x40, 
-	0x02, 0x20, 0xd0, 0x80, 0x50, 0x42, 0x60, 0x40, 
-	0x15, 0xa3, 0xe9, 0x9f, 0x00, 0xec, 0xd1, 0xb8, 
-	0x79, 0xc6, 0x69, 0x46, 0xc9, 0x67, 0x00, 0xec, 
-	0xd9, 0xb4, 0x70, 0x66, 0x00, 0xec, 0xd1, 0xbc, 
-	0x70, 0x06, 0x10, 0x20, 0xed, 0xbe, 0x10, 0x60, 
-	0xe9, 0xc1, 0x00, 0xe0, 0xda, 0xa8, 0x7a, 0xaa, 
-	0xc0, 0x2a, 0x10, 0x1f, 0x00, 0x22, 0xd0, 0xa0, 
-	0x70, 0x82, 0x20, 0x6a, 0x00, 0x9f, 0xe9, 0xb5, 
-	0x20, 0x40, 0x19, 0x60, 0xf9, 0xb8, 0xc9, 0x41, 
-	0xb0, 0x48, 0x30, 0x65, 0xf5, 0xbd, 0xb0, 0x70, 
-	0xed, 0xbe, 0xd9, 0x40, 0x00, 0xed, 0xd1, 0xbc, 
-	0x69, 0x46, 0x69, 0x66, 0x12, 0xa4, 0xea, 0x21, 
-	0x00, 0xec, 0xd1, 0xbc, 0x73, 0xc6, 0x15, 0xa3, 
-	0xe9, 0xdf, 0x33, 0xe3, 0xe5, 0xd3, 0xed, 0xd2, 
-	0x63, 0xc6, 0x00, 0x21, 0xd1, 0xa8, 0x63, 0xc6, 
-	0x00, 0xed, 0xd1, 0xa0, 0x63, 0xc6, 0x15, 0xa1, 
-	0xf9, 0xdc, 0x12, 0xa3, 0xe5, 0xe3, 0xd3, 0xc2, 
-	0x00, 0xec, 0xd1, 0xbc, 0x63, 0xc6, 0xe1, 0xe3, 
-	0x12, 0xa3, 0xea, 0x21, 0xe1, 0xe3, 0x12, 0xa2, 
-	0xf6, 0x21, 0x13, 0xe0, 0xfa, 0x21, 0x00, 0xee, 
-	0xd1, 0x8c, 0x78, 0x06, 0xb1, 0xbc, 0x78, 0x46, 
-	0xb1, 0xbc, 0x78, 0x86, 0xd1, 0x88, 0x72, 0x46, 
-	0xd1, 0x84, 0x73, 0x06, 0x13, 0x20, 0xf9, 0xe3, 
-	0x00, 0x64, 0xd1, 0xa0, 0x70, 0x46, 0xd0, 0xa2, 
-	0x30, 0x81, 0xe9, 0xff, 0x10, 0x70, 0xea, 0x11, 
-	0x10, 0x6d, 0xea, 0x14, 0x10, 0x76, 0xea, 0x19, 
-	0x10, 0x7a, 0xea, 0x28, 0xe2, 0x3b, 0x18, 0xe0, 
-	0xea, 0x3b, 0x00, 0xed, 0xd1, 0x80, 0x70, 0x86, 
-	0xb0, 0x81, 0xd0, 0x3f, 0x40, 0x02, 0x10, 0x20, 
-	0xea, 0x0c, 0x60, 0x86, 0xf3, 0x8a, 0xe1, 0xe3, 
-	0xc0, 0x02, 0x10, 0x1a, 0x50, 0x80, 0x60, 0x86, 
-	0xe2, 0x3b, 0x15, 0xa3, 0xea, 0x21, 0xe2, 0xe9, 
-	0xd2, 0x80, 0x00, 0xed, 0xd1, 0xa4, 0x62, 0x86, 
-	0xe3, 0x0c, 0x00, 0xed, 0xd1, 0x88, 0xd0, 0x60, 
-	0x70, 0x06, 0x50, 0x40, 0x60, 0x46, 0x15, 0xa3, 
-	0xfb, 0x0c, 0xd5, 0x84, 0xe3, 0x0c, 0xd5, 0x00, 
-	0xb5, 0x01, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 
-	0x00, 0xed, 0xd1, 0x88, 0xd0, 0x60, 0x70, 0x06, 
-	0x50, 0x40, 0x60, 0x46, 0x15, 0xa2, 0xe7, 0x0c, 
-	0xee, 0x21, 0x00, 0x21, 0xd1, 0x8c, 0x18, 0xe0, 
-	0xfa, 0x39, 0x70, 0x46, 0x10, 0x61, 0xea, 0x70, 
-	0xe2, 0x21, 0x65, 0x86, 0xe2, 0x21, 0x18, 0xe0, 
-	0xea, 0x70, 0xd1, 0x80, 0x73, 0x06, 0x15, 0xa2, 
-	0xee, 0x68, 0x00, 0x22, 0xd1, 0x80, 0x70, 0x46, 
-	0x6b, 0x06, 0xcb, 0x01, 0xb1, 0xb4, 0x70, 0x46, 
-	0x6a, 0xc6, 0xca, 0xc1, 0x00, 0x65, 0xd1, 0x98, 
-	0x70, 0x46, 0x10, 0x61, 0xfa, 0x50, 0x02, 0x41, 
-	0xc3, 0x21, 0xc7, 0xe0, 0x02, 0x50, 0xea, 0x56, 
-	0xc3, 0x20, 0xc7, 0xe1, 0xd1, 0x88, 0xd0, 0x01, 
-	0x02, 0x40, 0x62, 0x46, 0x0f, 0xef, 0xd0, 0x7f, 
-	0x30, 0x6f, 0xfa, 0x5f, 0xc3, 0x20, 0xc7, 0x4c, 
-	0xd0, 0x00, 0x00, 0x65, 0xd1, 0x98, 0x70, 0x46, 
-	0x60, 0x06, 0xb0, 0x41, 0x43, 0x01, 0xe2, 0x70, 
-	0xc3, 0x22, 0xc7, 0xcc, 0xc7, 0x60, 0xc7, 0xa1, 
-	0x02, 0x50, 0xea, 0x70, 0xc7, 0x61, 0xc7, 0xa0, 
-	0xdb, 0x80, 0xd1, 0x00, 0x00, 0xef, 0xd1, 0xa8, 
-	0x70, 0x46, 0x10, 0x60, 0xfa, 0x7a, 0x00, 0xe0, 
-	0xd1, 0x88, 0x70, 0x46, 0x00, 0x22, 0xd1, 0xb0, 
-	0x70, 0x86, 0x30, 0x81, 0xea, 0x82, 0x60, 0x46, 
-	0xd0, 0x20, 0xf3, 0x06, 0x10, 0x63, 0xea, 0x87, 
-	0x10, 0x64, 0xea, 0x87, 0xe2, 0x95, 0x00, 0xef, 
-	0xd1, 0x6c, 0x71, 0x45, 0xc0, 0x05, 0x30, 0x01, 
-	0xf6, 0x95, 0xdb, 0x82, 0xd1, 0x01, 0x10, 0x63, 
-	0xea, 0x95, 0xd1, 0x02, 0x11, 0x62, 0xea, 0x95, 
-	0xd1, 0x03, 0xd1, 0x8c, 0x61, 0x06, 0xdb, 0x40, 
-	0x00, 0xe0, 0xd0, 0x00, 0x71, 0x00, 0xc0, 0x84, 
-	0x10, 0x9c, 0xb0, 0x96, 0xfa, 0xa0, 0xb1, 0x38, 
-	0xb0, 0x96, 0xfa, 0xa3, 0xb1, 0x30, 0x00, 0x29, 
-	0xd1, 0x84, 0x00, 0x22, 0xd0, 0x74, 0x70, 0x86, 
-	0x70, 0xc1, 0x61, 0x06, 0x30, 0xc2, 0xea, 0xae, 
-	0x60, 0x81, 0xdb, 0x41, 0xb0, 0x3c, 0xb1, 0xbc, 
-	0xb0, 0x7c, 0x71, 0x00, 0x70, 0x86, 0x70, 0xc1, 
-	0x61, 0x06, 0x30, 0xc2, 0xea, 0xb9, 0x60, 0x81, 
-	0xdb, 0x41, 0x00, 0xee, 0xd1, 0xb4, 0x70, 0x06, 
-	0xb1, 0xbc, 0x70, 0x46, 0x30, 0x40, 0xea, 0xc2, 
-	0x60, 0x06, 0xdb, 0x41, 0x00, 0x24, 0xd0, 0x60, 
-	0x30, 0x81, 0xea, 0xc7, 0x30, 0x81, 0x50, 0x02, 
-	0xea, 0xca, 0xd0, 0x01, 0x00, 0x22, 0xd1, 0xbc, 
-	0x70, 0x86, 0x30, 0x80, 0xea, 0xd2, 0x60, 0x06, 
-	0xd0, 0x10, 0xf3, 0x06, 0x00, 0x22, 0xd1, 0xa4, 
-	0x71, 0x06, 0xd0, 0x01, 0x41, 0x00, 0x5b, 0x44, 
-	0x5b, 0x6e, 0x6b, 0x46, 0x00, 0x28, 0xd0, 0x70, 
-	0x70, 0x41, 0x10, 0x62, 0xfa, 0xe6, 0xd1, 0x84, 
-	0x70, 0x06, 0x10, 0x20, 0xfa, 0xdf, 0x00, 0x22, 
-	0xd0, 0x00, 0xf3, 0x06, 0x02, 0x7d, 0xde, 0x68, 
-	0xe0, 0x46, 0x00, 0xed, 0xd1, 0x88, 0x71, 0x06, 
-	0x01, 0x1f, 0xfa, 0xfd, 0xd0, 0x41, 0x41, 0x01, 
-	0xd0, 0x62, 0x00, 0x65, 0xd0, 0x30, 0x70, 0x00, 
-	0x10, 0x21, 0xea, 0xfa, 0xee, 0xf9, 0x1a, 0xe1, 
-	0xfa, 0xfa, 0xd0, 0x52, 0x51, 0x01, 0x61, 0x06, 
-	0xe3, 0x0c, 0x18, 0xe0, 0xea, 0x70, 0xc7, 0x60, 
-	0xc7, 0xe1, 0x02, 0x50, 0xea, 0x70, 0xc7, 0x61, 
-	0xc7, 0xe0, 0xe2, 0x70, 0x00, 0x28, 0xdc, 0xa4, 
-	0x7c, 0x72, 0x5c, 0x40, 0x6c, 0x72, 0x0f, 0xc5, 
-	0x18, 0xe0, 0xeb, 0x82, 0xd9, 0x0d, 0x00, 0xee, 
-	0xd1, 0xa4, 0x70, 0x06, 0x10, 0x21, 0xfb, 0x7f, 
-	0xd9, 0x0c, 0x90, 0x06, 0x00, 0x10, 0xeb, 0x7f, 
-	0x00, 0x21, 0xd1, 0x88, 0x7a, 0x06, 0x1a, 0x20, 
-	0xeb, 0x7f, 0xd9, 0x00, 0x00, 0xed, 0xd1, 0xbc, 
-	0x79, 0x46, 0x19, 0x60, 0xeb, 0x7f, 0x39, 0x68, 
-	0xc0, 0xe5, 0xc0, 0x25, 0x10, 0x13, 0xb0, 0x0f, 
-	0xef, 0x7f, 0xb0, 0x22, 0xe7, 0x7f, 0x00, 0xe0, 
-	0xd1, 0xa8, 0x71, 0x46, 0x11, 0x5f, 0x29, 0x45, 
-	0x00, 0x22, 0xd0, 0x18, 0x00, 0x22, 0xd4, 0x54, 
-	0x00, 0x22, 0xd0, 0x9c, 0x70, 0x00, 0x74, 0x51, 
-	0x70, 0x42, 0x34, 0x40, 0xe7, 0x3c, 0xd0, 0x40, 
-	0x00, 0x22, 0xd4, 0x50, 0x74, 0x51, 0x34, 0x40, 
-	0xef, 0x42, 0x20, 0x45, 0x60, 0x42, 0x39, 0x41, 
-	0x19, 0x60, 0xf7, 0x5e, 0x00, 0x65, 0xd1, 0xa8, 
-	0x7a, 0x86, 0x29, 0x6a, 0x19, 0x59, 0xb9, 0x7e, 
-	0xf7, 0x75, 0x15, 0xa3, 0xf7, 0x57, 0x00, 0xed, 
-	0xd1, 0xac, 0x70, 0x06, 0x00, 0xed, 0xd1, 0xb0, 
-	0x70, 0x46, 0x30, 0x01, 0xfb, 0x7f, 0x00, 0x65, 
-	0xd1, 0x84, 0x70, 0x46, 0xb0, 0x7f, 0x60, 0x46, 
-	0xd5, 0x84, 0xe3, 0x7f, 0x11, 0x41, 0xd0, 0x4a, 
-	0x00, 0xed, 0xd1, 0xa0, 0x74, 0x46, 0xd0, 0x00, 
-	0x60, 0x06, 0x30, 0xc5, 0x39, 0x45, 0xe7, 0x6e, 
-	0x14, 0x60, 0xeb, 0x6b, 0xf3, 0x85, 0xb0, 0x41, 
-	0xef, 0x65, 0xe3, 0x71, 0x00, 0x66, 0xd1, 0xa0, 
-	0x60, 0xc6, 0x15, 0xa3, 0xeb, 0x7f, 0xf3, 0x85, 
-	0xe3, 0x7f, 0xd9, 0x01, 0x00, 0x66, 0xd1, 0xa0, 
-	0x70, 0x06, 0x30, 0x03, 0xe7, 0x7e, 0x10, 0x1d, 
-	0x10, 0x3b, 0xe7, 0x7f, 0x60, 0xc6, 0x00, 0x66, 
-	0xd1, 0xa4, 0x69, 0x06, 0x15, 0xa4, 0xea, 0x23, 
-	0xe2, 0x3b, 0x00, 0x65, 0xdd, 0x08, 0x7c, 0xf4, 
-	0xbc, 0xff, 0x6c, 0xf4, 0x00, 0xef, 0xdd, 0x10, 
-	0x7c, 0xf4, 0xbc, 0xfe, 0x6c, 0xf4, 0xc0, 0x3f, 
-	0xf1, 0x18, 0xf1, 0x16, 0xf1, 0x18, 0x00, 0x05, 
-	0x08, 0x20, 0xd0, 0x40, 0x5f, 0x01, 0x15, 0x63, 
-	0xe9, 0x77, 0x05, 0x5e, 0xeb, 0x08, 0x00, 0x22, 
-	0xd1, 0xa0, 0x6b, 0x06, 0x00, 0x22, 0xd1, 0xa8, 
-	0x6b, 0xc6, 0x00, 0x22, 0xd1, 0xac, 0x6a, 0xc6, 
-	0x00, 0xee, 0xd0, 0x0c, 0x00, 0xe6, 0xd1, 0x9c, 
-	0x70, 0x40, 0x30, 0x5f, 0xe9, 0x8d, 0xb0, 0x3c, 
-	0xb1, 0xb4, 0x70, 0x40, 0x30, 0x5f, 0xe9, 0x8d, 
-	0xb1, 0xb4, 0x00, 0xe6, 0xd0, 0x10, 0xd0, 0x83, 
-	0x70, 0x40, 0x60, 0x46, 0xb0, 0x3c, 0xb1, 0xbc, 
-	0xb0, 0x81, 0xed, 0x90, 0x00, 0xee, 0xd0, 0x0c, 
-	0x00, 0xe6, 0xd1, 0x9c, 0x70, 0x40, 0x30, 0x4c, 
-	0xe9, 0xa3, 0xb0, 0x3c, 0xb1, 0xb4, 0x70, 0x40, 
-	0x30, 0x4c, 0xe9, 0xa3, 0xb1, 0xb4, 0x00, 0xe6, 
-	0xd0, 0x00, 0x61, 0x80, 0x00, 0x21, 0xd1, 0xb4, 
-	0x70, 0x06, 0x10, 0x20, 0xe9, 0xae, 0xd0, 0x00, 
-	0x60, 0x06, 0xf1, 0x18, 0x00, 0x21, 0xd1, 0x8c, 
-	0x70, 0x46, 0x65, 0x86, 0xde, 0xc0, 0x00, 0xee, 
-	0xd0, 0x20, 0x70, 0x00, 0x10, 0x22, 0xfd, 0xb9, 
-	0xde, 0xc2, 0x00, 0x21, 0xd0, 0x04, 0x70, 0x00, 
-	0x10, 0x21, 0xe9, 0xc0, 0x15, 0xa3, 0xe9, 0xdc, 
-	0xd0, 0x02, 0x4c, 0x00, 0x10, 0x63, 0xe9, 0xc5, 
-	0xcc, 0x3b, 0xd0, 0x04, 0x63, 0x00, 0xd0, 0x00, 
-	0x70, 0x00, 0x30, 0x1f, 0xfb, 0x08, 0xd0, 0x18, 
-	0x70, 0x00, 0x10, 0x20, 0xed, 0xc7, 0xd0, 0x04, 
-	0x70, 0x80, 0x10, 0xa0, 0xeb, 0x08, 0xf1, 0x16, 
-	0x00, 0x21, 0xd0, 0x9a, 0xc0, 0x39, 0x30, 0x1f, 
-	0x10, 0x18, 0x30, 0x02, 0xfd, 0xcf, 0xe3, 0x08, 
-	0x00, 0xe0, 0xd9, 0x04, 0x79, 0x24, 0xb9, 0x38, 
-	0x19, 0x1c, 0xdc, 0x88, 0x4c, 0xac, 0xd0, 0x02, 
-	0x40, 0x2c, 0x10, 0x02, 0x0c, 0x80, 0x10, 0x63, 
-	0xea, 0x70, 0x15, 0x63, 0xf9, 0xec, 0xf1, 0x18, 
-	0x00, 0xef, 0xdc, 0x00, 0x7c, 0x30, 0x00, 0x24, 
-	0xd0, 0x30, 0x70, 0x00, 0x10, 0x21, 0xf9, 0xf6, 
-	0xbc, 0x3b, 0xe1, 0xfd, 0x10, 0x22, 0xf9, 0xfa, 
-	0xbc, 0x38, 0xe1, 0xfd, 0x10, 0x23, 0xf9, 0xfd, 
-	0xbc, 0x3c, 0x1e, 0xe0, 0xea, 0x03, 0x15, 0x63, 
-	0xfa, 0x02, 0xbe, 0xfc, 0xdc, 0x12, 0x0e, 0xde, 
-	0xfa, 0x09, 0xc0, 0x24, 0x30, 0x30, 0xf6, 0x09, 
-	0x2c, 0x00, 0xd0, 0x2c, 0x6c, 0x00, 0x1e, 0xe0, 
-	0xea, 0x0f, 0xcc, 0x24, 0x1c, 0x1f, 0xd9, 0x40, 
-	0x06, 0x50, 0xea, 0x22, 0xc0, 0x24, 0xb0, 0x12, 
-	0xfe, 0x22, 0xd9, 0x74, 0x79, 0x65, 0x19, 0x5f, 
-	0x30, 0x25, 0xee, 0x1b, 0x29, 0x40, 0x19, 0x5f, 
-	0x19, 0x41, 0xc0, 0x25, 0x20, 0x30, 0x30, 0x24, 
-	0xe6, 0x22, 0x3c, 0x00, 0xd0, 0x38, 0x69, 0x40, 
-	0x1c, 0x05, 0xbc, 0x38, 0x3c, 0x32, 0x5c, 0x3b, 
-	0xbc, 0x3f, 0xd8, 0xec, 0x78, 0xe3, 0xc0, 0xa3, 
-	0x10, 0xb2, 0xf6, 0x2f, 0xd0, 0x92, 0x02, 0xe4, 
-	0xd8, 0x00, 0xd0, 0xc0, 0x20, 0xe0, 0xb0, 0x81, 
-	0xee, 0x32, 0xd0, 0x30, 0x60, 0xc0, 0x00, 0xac, 
-	0xd0, 0x20, 0xc0, 0xc0, 0xd8, 0x40, 0xc1, 0x23, 
-	0xd4, 0x64, 0x34, 0x63, 0xdc, 0x40, 0x0c, 0x1f, 
-	0xfa, 0x5b, 0xc0, 0x65, 0xb0, 0x41, 0xe6, 0x47, 
-	0x68, 0x40, 0xb0, 0x3c, 0xe2, 0x42, 0xc0, 0xc0, 
-	0x34, 0x65, 0xdc, 0x48, 0x4c, 0x70, 0x1c, 0x5f, 
-	0x20, 0xf1, 0x15, 0x63, 0xfa, 0x5c, 0xf2, 0x54, 
-	0xc1, 0x11, 0xc0, 0x83, 0xf2, 0xa5, 0xe2, 0x6f, 
-	0xb1, 0x01, 0xe6, 0x5a, 0x68, 0x40, 0x28, 0x60, 
-	0xb0, 0x3c, 0xe2, 0x54, 0x0f, 0xc5, 0xd9, 0x40, 
-	0xb1, 0x12, 0x11, 0x01, 0x21, 0x25, 0xf2, 0x54, 
-	0xc1, 0x11, 0xb1, 0x01, 0xe6, 0x6f, 0x20, 0x31, 
-	0x68, 0x40, 0x30, 0x31, 0xb0, 0x3c, 0x28, 0x60, 
-	0x70, 0x43, 0x30, 0x31, 0x60, 0x40, 0x20, 0x31, 
-	0xb0, 0x3c, 0xb0, 0xf8, 0xe2, 0x61, 0xe2, 0xf7, 
-	0xd8, 0xec, 0x78, 0xe3, 0x00, 0xa8, 0xd0, 0x80, 
-	0x00, 0xa8, 0xd1, 0x44, 0x00, 0xac, 0xd0, 0x20, 
-	0xc0, 0xc0, 0x0c, 0x1f, 0xfa, 0xb3, 0xd9, 0x78, 
-	0x79, 0x65, 0x39, 0x25, 0x19, 0x5f, 0xc9, 0xa5, 
-	0x19, 0x83, 0x20, 0x26, 0x20, 0xe6, 0x20, 0xa6, 
-	0x21, 0x66, 0xc1, 0x23, 0xc0, 0x64, 0x10, 0x5f, 
-	0x10, 0x9d, 0x20, 0x81, 0x31, 0x01, 0x30, 0x44, 
-	0xf6, 0x8e, 0x21, 0x01, 0x30, 0x84, 0x10, 0x83, 
-	0xc4, 0x64, 0x34, 0x63, 0xdc, 0x48, 0x4c, 0x70, 
-	0x1c, 0x5f, 0x15, 0x63, 0xfa, 0xc3, 0x20, 0xb1, 
-	0xf2, 0xa5, 0xc1, 0x24, 0x11, 0x1f, 0xc0, 0x85, 
-	0x30, 0xb1, 0xf2, 0xa5, 0xc1, 0x11, 0xc0, 0x83, 
-	0x0c, 0x9d, 0xfa, 0xa3, 0xb0, 0xbc, 0xf2, 0xa5, 
-	0xe2, 0xec, 0xb1, 0x01, 0xe6, 0x5a, 0x70, 0x42, 
-	0xb0, 0xb8, 0x60, 0x40, 0xb0, 0x3c, 0xe2, 0xa5, 
-	0xb1, 0x01, 0xe6, 0x5a, 0x70, 0x42, 0xb0, 0xb8, 
-	0x60, 0x40, 0xb0, 0x38, 0xe2, 0xac, 0x00, 0xac, 
-	0xd0, 0x24, 0xc1, 0x23, 0xb1, 0x12, 0xf2, 0xac, 
-	0xd1, 0x24, 0x31, 0x23, 0x00, 0xa8, 0xd0, 0x84, 
-	0xf2, 0xac, 0xd1, 0x12, 0x00, 0xa8, 0xd0, 0x84, 
-	0xc0, 0x03, 0xf2, 0xac, 0xe2, 0xec, 0xd8, 0x82, 
-	0x48, 0x95, 0x18, 0x81, 0xb1, 0x01, 0xe6, 0xd9, 
-	0x20, 0xb1, 0x70, 0x42, 0x30, 0xb1, 0x20, 0x22, 
-	0x60, 0x40, 0x30, 0x22, 0xb0, 0xbc, 0xb0, 0x3c, 
-	0x30, 0xb1, 0x70, 0x42, 0x20, 0xb1, 0x30, 0x22, 
-	0x60, 0x40, 0x20, 0x22, 0xb0, 0xbc, 0xb0, 0x3c, 
-	0xe2, 0xc6, 0xc1, 0x11, 0xc0, 0x85, 0x30, 0xb1, 
-	0x20, 0xe2, 0xb1, 0x01, 0xe6, 0xec, 0x70, 0x42, 
-	0xb0, 0xb8, 0x20, 0x22, 0x60, 0x40, 0x30, 0x22, 
-	0xb0, 0x3c, 0x70, 0x43, 0xb0, 0xf8, 0x30, 0x22, 
-	0x60, 0x40, 0x20, 0x22, 0xb0, 0x3c, 0xe2, 0xdd, 
-	0xd0, 0x08, 0x5c, 0x00, 0x3c, 0x32, 0xd0, 0x04, 
-	0x40, 0x30, 0x3c, 0x00, 0x15, 0x63, 0xfa, 0xf7, 
-	0x1e, 0xe0, 0xea, 0xf7, 0xbc, 0x3c, 0x00, 0xac, 
-	0xd0, 0xa0, 0x00, 0xa8, 0xd0, 0x00, 0x00, 0x20, 
-	0xd1, 0x24, 0x70, 0x42, 0xb0, 0xbc, 0x60, 0x40, 
-	0xb0, 0x3c, 0xb1, 0x01, 0xee, 0xfd, 0xd0, 0x30, 
-	0x30, 0x30, 0xef, 0x03, 0xd0, 0x04, 0x63, 0x00, 
-	0x08, 0x20, 0xd0, 0x40, 0x3f, 0x01, 0x02, 0xba, 
-	0xde, 0x3c, 0xe0, 0x46, 0x50, 0x00, 0x50, 0x00, 
-	0x01, 0x46, 0xd0, 0x08, 0x94, 0x89, 0xd0, 0x8c, 
-	0x44, 0x82, 0x14, 0x9e, 0x30, 0x12, 0xd0, 0x88, 
-	0x10, 0x80, 0x00, 0xe8, 0xd1, 0x80, 0x70, 0xc6, 
-	0x00, 0x06, 0xa0, 0xbd, 0xa0, 0xfc, 0x80, 0x3f, 
-	0xb1, 0xbe, 0x60, 0xc6, 0x00, 0x06, 0x80, 0xa9, 
-	0x80, 0x3f, 0x80, 0x2a, 0x80, 0x3f, 0x00, 0x21, 
-	0xd0, 0x3c, 0x00, 0x0a, 0xb1, 0x82, 0xd0, 0x6b, 
-	0x70, 0x46, 0x00, 0x06, 0x80, 0x07, 0x01, 0x20, 
-	0xd0, 0x67, 0xa0, 0x69, 0x80, 0x2a, 0x82, 0x29, 
-	0x80, 0x6a, 0x84, 0x29, 0xd0, 0x54, 0x10, 0x4f, 
-	0xa0, 0x6a, 0x01, 0x20, 0xd0, 0x00, 0xa0, 0x29, 
-	0x80, 0x2b, 0x0c, 0x20, 0xd0, 0x00, 0x10, 0x08, 
-	0xa0, 0x27, 0x90, 0x09, 0xd0, 0x41, 0x40, 0x01, 
-	0xd0, 0x44, 0x40, 0x70, 0x20, 0x01, 0xa0, 0x27, 
-	0x80, 0x3f, 0x00, 0xc6, 0x15, 0x63, 0xe9, 0xae, 
-	0x05, 0x5e, 0xe9, 0xbe, 0x00, 0xe0, 0xd0, 0x40, 
-	0x70, 0x81, 0x10, 0x9c, 0xb0, 0x96, 0xf9, 0xb7, 
-	0x00, 0x21, 0xd0, 0x40, 0xe1, 0xbb, 0xb0, 0x96, 
-	0xf9, 0xbe, 0x00, 0x22, 0xd0, 0x40, 0x27, 0xc1, 
-	0x27, 0x41, 0x27, 0x81, 0x90, 0x83, 0x00, 0x64, 
-	0xd0, 0x10, 0x60, 0x80, 0x01, 0x46, 0x82, 0x34, 
-	0x80, 0x3f, 0x00, 0x64, 0xd0, 0x14, 0x67, 0x40, 
-	0x80, 0x34, 0x80, 0x3f, 0x00, 0xc6, 0x90, 0xae, 
-	0x00, 0x64, 0xd0, 0x18, 0x60, 0x80, 0x90, 0xa6, 
-	0x00, 0x64, 0xd0, 0x1c, 0x60, 0x80, 0x15, 0x63, 
-	0xe9, 0xe3, 0x0c, 0x1f, 0xe9, 0xe3, 0x05, 0x50, 
-	0xf9, 0xe3, 0x15, 0xa3, 0xf9, 0xe3, 0x90, 0x4d, 
-	0x10, 0x60, 0xe5, 0xdb, 0x00, 0x06, 0x05, 0x0d, 
-	0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x15, 0xa3, 
-	0xf9, 0xfb, 0x00, 0x21, 0xd0, 0x04, 0x70, 0x00, 
-	0x10, 0x21, 0xe9, 0xfb, 0xd0, 0x38, 0x70, 0x00, 
-	0x15, 0x63, 0xe9, 0xef, 0x10, 0x1f, 0x15, 0x21, 
-	0xe5, 0xe0, 0xd0, 0x64, 0x30, 0x54, 0xe5, 0xe0, 
-	0xc0, 0x40, 0xb0, 0x7f, 0x30, 0x54, 0xe9, 0xfb, 
-	0x0c, 0x09, 0x05, 0x0d, 0xe1, 0xef, 0xc0, 0x5f, 
-	0x10, 0x58, 0x10, 0x48, 0x00, 0xee, 0xd0, 0x8c, 
-	0xd0, 0xc3, 0x70, 0x02, 0x30, 0x01, 0xea, 0x10, 
-	0xb0, 0xbc, 0xb0, 0xc1, 0xee, 0x01, 0x00, 0x26, 
-	0xd0, 0x20, 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 
-	0x15, 0xa3, 0xea, 0x0f, 0xb0, 0x88, 0x77, 0xc2, 
-	0x80, 0x07, 0x09, 0x49, 0xd4, 0x00, 0xd4, 0x40, 
-	0xd4, 0x80, 0xd4, 0xc0, 0x00, 0x4d, 0xa0, 0x6c, 
-	0xd3, 0x80, 0xd0, 0xa1, 0x00, 0x88, 0xd0, 0xa9, 
-	0x00, 0x4d, 0x00, 0x50, 0xfa, 0x1a, 0x0c, 0x49, 
-	0x00, 0x8d, 0xc0, 0x42, 0x10, 0x60, 0xea, 0x2a, 
-	0xb0, 0x5e, 0xb0, 0x43, 0xfe, 0x34, 0xd0, 0x61, 
-	0x23, 0x81, 0xe2, 0x1f, 0x0c, 0x09, 0x05, 0x0d, 
-	0x15, 0x20, 0xfe, 0x31, 0xd0, 0x65, 0x30, 0x54, 
-	0xee, 0x10, 0x03, 0xb4, 0xd6, 0x29, 0xe0, 0x46, 
-	0xc6, 0xd4, 0xb6, 0xc1, 0xe6, 0x31, 0xd0, 0x64, 
-	0x30, 0x5b, 0xfe, 0x31, 0xd7, 0x00, 0xb7, 0x01, 
-	0xd3, 0x81, 0x00, 0x27, 0xd0, 0x10, 0xd0, 0x81, 
-	0x60, 0x80, 0x15, 0x63, 0xfa, 0x54, 0x00, 0x22, 
-	0xdc, 0xd8, 0x03, 0xf8, 0xd0, 0x10, 0xf0, 0x4a, 
-	0x15, 0xa3, 0xfa, 0x51, 0x02, 0xf7, 0xdc, 0x26, 
-	0x0c, 0x10, 0xf8, 0x46, 0x02, 0xfc, 0xd8, 0x22, 
-	0xe0, 0x46, 0x02, 0xf2, 0xd6, 0x2b, 0xe0, 0x46, 
-	0x00, 0x22, 0xdc, 0xd8, 0x03, 0xfa, 0xd0, 0x10, 
-	0xf0, 0x4a, 0x03, 0x35, 0xda, 0x20, 0x15, 0xa3, 
-	0xe8, 0x46, 0x03, 0x30, 0xdc, 0x27, 0xe0, 0x46, 
-	0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0xe1, 0xe0, 0xe1, 0xec, 0xe2, 0x12, 
-	0xe2, 0x14, 0xe1, 0xc7, 0xe1, 0x30, 0x30, 0x5a, 
-	0xe5, 0x8d, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54, 
-	0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a, 
-	0xb6, 0xff, 0xd0, 0x64, 0x30, 0x5b, 0xfc, 0x11, 
-	0xc0, 0x39, 0x30, 0x31, 0x10, 0x12, 0x10, 0x20, 
-	0xe9, 0x88, 0x03, 0x10, 0xe9, 0x93, 0x0f, 0x19, 
-	0xf9, 0x8f, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xde, 
-	0xf9, 0xba, 0x03, 0xdf, 0xe9, 0x99, 0xd3, 0x40, 
-	0xca, 0x50, 0xd1, 0x42, 0xe2, 0xea, 0xc0, 0x50, 
-	0x10, 0x54, 0xc0, 0x90, 0x10, 0x8c, 0x10, 0x92, 
-	0x10, 0xe0, 0xe5, 0xa8, 0xc0, 0x01, 0x10, 0x01, 
-	0x20, 0x40, 0xc0, 0x02, 0x10, 0x01, 0x20, 0x80, 
-	0x10, 0x60, 0xfd, 0xab, 0xb0, 0x7f, 0x10, 0xa0, 
-	0xfd, 0xae, 0xb0, 0xbf, 0x10, 0x5f, 0x10, 0x9f, 
-	0x00, 0xef, 0xd0, 0x3e, 0x20, 0x52, 0x20, 0x83, 
-	0x20, 0x93, 0x10, 0x4c, 0x10, 0x82, 0x40, 0x80, 
-	0x50, 0x42, 0x0f, 0xc5, 0xcb, 0xaa, 0xcb, 0xeb, 
-	0xca, 0x50, 0xd0, 0xc0, 0xb0, 0xc1, 0xf1, 0x9b, 
-	0xcb, 0x01, 0xd0, 0xc1, 0xf1, 0x9b, 0xcb, 0x41, 
-	0xba, 0x7f, 0xbb, 0x3f, 0xe2, 0xea, 0xcc, 0x5b, 
-	0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43, 
-	0x2c, 0x40, 0x1c, 0x48, 0xcc, 0xb1, 0x1c, 0x9f, 
-	0x06, 0xd0, 0xe9, 0xd5, 0x01, 0x69, 0xd0, 0x20, 
-	0x3c, 0x80, 0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f, 
-	0x2c, 0x40, 0x2c, 0x80, 0x01, 0xb5, 0xd4, 0x00, 
-	0x2c, 0x80, 0xde, 0x84, 0xde, 0xc4, 0xe3, 0x1e, 
-	0xd3, 0xc2, 0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xe5, 
-	0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xec, 0x80, 0x07, 
-	0xd4, 0x00, 0xc4, 0x50, 0xd3, 0x08, 0xe2, 0x95, 
-	0xd0, 0x71, 0x20, 0x56, 0x00, 0x48, 0xd1, 0x8c, 
-	0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xfa, 0x06, 0x5e, 
-	0xfa, 0x03, 0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3, 
-	0xf9, 0xfa, 0xd3, 0xc4, 0x06, 0x5e, 0xfa, 0x03, 
-	0xd0, 0x43, 0x40, 0x4c, 0xea, 0x03, 0x08, 0x49, 
-	0x00, 0x8d, 0x10, 0x87, 0x53, 0x02, 0x01, 0x46, 
-	0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c, 0xea, 0x0a, 
-	0x09, 0x49, 0x00, 0x0d, 0xd0, 0x9f, 0x40, 0x02, 
-	0xb0, 0x20, 0x03, 0x19, 0xea, 0x10, 0xb0, 0x20, 
-	0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x80, 
-	0xd4, 0x00, 0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0, 
-	0xe2, 0x8d, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 
-	0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0xe1, 0xd3, 0xe1, 0xdc, 0xe2, 0x00, 
-	0xe2, 0x02, 0xe1, 0xac, 0xe1, 0x30, 0x30, 0x5a, 
-	0xe5, 0x91, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54, 
-	0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a, 
-	0xb6, 0xff, 0xd0, 0x64, 0x30, 0x5b, 0xfc, 0x11, 
-	0xbc, 0x10, 0xd0, 0x10, 0x0c, 0x1e, 0xf9, 0x8e, 
-	0xbc, 0x10, 0xd0, 0x30, 0xc0, 0x40, 0x30, 0x70, 
-	0xed, 0x8e, 0x03, 0x10, 0xe9, 0x97, 0x0f, 0x19, 
-	0xf9, 0x93, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xdf, 
-	0xe9, 0xa1, 0xd3, 0x40, 0xca, 0x50, 0xcb, 0x52, 
-	0x03, 0x1d, 0xf9, 0xa8, 0xca, 0x12, 0xca, 0x52, 
-	0xe1, 0xa5, 0x03, 0x1d, 0xf9, 0xa8, 0xca, 0x12, 
-	0xca, 0x53, 0xca, 0xae, 0xca, 0xef, 0xb1, 0x7e, 
-	0x03, 0x1e, 0xfa, 0xea, 0xb1, 0x7e, 0xe2, 0xea, 
-	0x00, 0x24, 0xd0, 0x00, 0x2c, 0x40, 0x2c, 0x80, 
-	0x17, 0x20, 0xf9, 0xd2, 0x00, 0xa8, 0xd0, 0x00, 
-	0xcc, 0x5b, 0x1c, 0x5f, 0x1c, 0x43, 0x20, 0x31, 
-	0x7c, 0x40, 0xb0, 0x3c, 0x7e, 0x80, 0xcc, 0xb1, 
-	0xce, 0xfa, 0x1c, 0x9f, 0x1e, 0xdf, 0x01, 0x69, 
-	0xd0, 0x3c, 0x0c, 0x99, 0xe9, 0xc4, 0x3c, 0x80, 
-	0x0e, 0xd9, 0xe9, 0xc7, 0x3e, 0xc0, 0x3e, 0xf2, 
-	0x3e, 0xb1, 0xd0, 0x01, 0x40, 0x1b, 0x10, 0x05, 
-	0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80, 0xd0, 0x30, 
-	0x70, 0x00, 0x2c, 0x80, 0xe3, 0x1e, 0xd3, 0xc2, 
-	0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xd8, 0xf2, 0x32, 
-	0xb3, 0x81, 0xe9, 0xdc, 0x80, 0x07, 0xe2, 0x95, 
-	0x0d, 0x09, 0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c, 
-	0xe9, 0xe8, 0x06, 0x5e, 0xf9, 0xf1, 0x08, 0x89, 
-	0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xe8, 0xd3, 0xc4, 
-	0x06, 0x5e, 0xf9, 0xf1, 0xd0, 0x43, 0x40, 0x4c, 
-	0xe9, 0xf1, 0x08, 0x49, 0x00, 0x8d, 0x10, 0x87, 
-	0x53, 0x02, 0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6, 
-	0x03, 0x1c, 0xe9, 0xf8, 0x09, 0x49, 0x00, 0x0d, 
-	0xd0, 0x9f, 0x40, 0x02, 0xb0, 0x20, 0x03, 0x19, 
-	0xe9, 0xfe, 0xb0, 0x20, 0xa0, 0x2c, 0xe2, 0x5b, 
-	0x06, 0x5f, 0xfa, 0x80, 0xd4, 0x00, 0xc4, 0x50, 
-	0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00, 
-	0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0xe1, 0xc1, 0xe1, 0xca, 0xe1, 0xee, 
-	0xe1, 0xf0, 0xe1, 0xa8, 0xe1, 0x30, 0x30, 0x5a, 
-	0xe5, 0x8d, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54, 
-	0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a, 
-	0xb6, 0xff, 0xd0, 0x64, 0x30, 0x5b, 0xfc, 0x11, 
-	0xc0, 0x39, 0x30, 0x31, 0x10, 0x12, 0x10, 0x20, 
-	0xe9, 0x88, 0x03, 0x10, 0xe9, 0x93, 0x0f, 0x19, 
-	0xf9, 0x8f, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xdf, 
-	0xe9, 0x9d, 0xd3, 0x40, 0xca, 0x50, 0xcb, 0x52, 
-	0x03, 0x1d, 0xf9, 0xa4, 0xca, 0x12, 0xca, 0x52, 
-	0xe1, 0xa1, 0x03, 0x1d, 0xf9, 0xa4, 0xca, 0x12, 
-	0xca, 0x53, 0xca, 0xae, 0xca, 0xef, 0xb1, 0x7e, 
-	0x03, 0x1e, 0xfa, 0xea, 0xb1, 0x7e, 0xe2, 0xea, 
-	0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31, 
-	0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x48, 0xcc, 0xb1, 
-	0x1c, 0x9f, 0x06, 0xd0, 0xe9, 0xb6, 0x01, 0x69, 
-	0xd0, 0x20, 0x3c, 0x80, 0xc0, 0x1c, 0x10, 0x08, 
-	0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80, 0xd0, 0x30, 
-	0x70, 0x00, 0x2c, 0x80, 0xde, 0x84, 0xde, 0xc4, 
-	0xe3, 0x1e, 0xd3, 0xc2, 0xf2, 0xd3, 0x13, 0xa0, 
-	0xed, 0xc6, 0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xca, 
-	0x80, 0x07, 0xe2, 0x95, 0x0d, 0x09, 0xd1, 0x8c, 
-	0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xd6, 0x06, 0x5e, 
-	0xf9, 0xdf, 0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3, 
-	0xf9, 0xd6, 0xd3, 0xc4, 0x06, 0x5e, 0xf9, 0xdf, 
-	0xd0, 0x43, 0x40, 0x4c, 0xe9, 0xdf, 0x08, 0x49, 
-	0x00, 0x8d, 0x10, 0x87, 0x53, 0x02, 0x01, 0x46, 
-	0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c, 0xe9, 0xe6, 
-	0x09, 0x49, 0x00, 0x0d, 0xd0, 0x9f, 0x40, 0x02, 
-	0xb0, 0x20, 0x03, 0x19, 0xe9, 0xec, 0xb0, 0x20, 
-	0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x80, 
-	0xd4, 0x00, 0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0, 
-	0xe2, 0x8d, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 
-	0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0xe1, 0xdb, 0xe1, 0xe9, 0xe2, 0x00, 
-	0xe2, 0x02, 0xe1, 0xc3, 0xe1, 0x65, 0x30, 0x5a, 
-	0xe5, 0x8d, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54, 
-	0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a, 
-	0xb6, 0xff, 0xd0, 0x52, 0x30, 0x5b, 0xfc, 0x11, 
-	0xc0, 0x39, 0x30, 0x31, 0x10, 0x11, 0x10, 0x20, 
-	0xe9, 0x88, 0x03, 0x10, 0xe9, 0x93, 0x0f, 0x19, 
-	0xf9, 0x8f, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xd0, 
-	0xf9, 0x98, 0xca, 0x50, 0x03, 0xde, 0xf9, 0x9a, 
-	0xd1, 0x42, 0xe2, 0xea, 0xcb, 0xaa, 0xcb, 0xeb, 
-	0xc0, 0x50, 0x10, 0x54, 0xc0, 0x90, 0x10, 0x8c, 
-	0x10, 0x92, 0xd0, 0xc1, 0x05, 0x50, 0xe9, 0xa5, 
-	0xb0, 0xc2, 0x10, 0x60, 0xfd, 0xa8, 0xb0, 0x7f, 
-	0x10, 0xa0, 0xfd, 0xab, 0xb0, 0xbf, 0x10, 0x5f, 
-	0x10, 0x9f, 0x00, 0xef, 0xd0, 0x3e, 0x20, 0x52, 
-	0x20, 0x83, 0x20, 0x93, 0x10, 0x4c, 0x10, 0x82, 
-	0x40, 0x80, 0x50, 0x42, 0xd0, 0x81, 0x14, 0x1f, 
-	0x14, 0x01, 0x05, 0x50, 0xe9, 0xbd, 0x50, 0x42, 
-	0xe1, 0xbe, 0x54, 0x02, 0xca, 0x10, 0xca, 0x50, 
-	0xcb, 0x01, 0xcb, 0x41, 0xe2, 0xea, 0xcc, 0x5b, 
-	0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43, 
-	0x2c, 0x40, 0x1c, 0x49, 0xcc, 0xb1, 0x1c, 0x9f, 
-	0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f, 0x05, 0x50, 
-	0xf9, 0xd2, 0xb0, 0x3c, 0x2c, 0x40, 0x2c, 0x80, 
-	0x01, 0xb5, 0xd4, 0x00, 0x2c, 0x80, 0x02, 0xe4, 
-	0xde, 0x80, 0xde, 0xc1, 0xe3, 0x1e, 0xd3, 0xc0, 
-	0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xe0, 0xf2, 0x32, 
-	0xb3, 0x81, 0xe9, 0xe9, 0x80, 0x07, 0xd4, 0x02, 
-	0x44, 0x15, 0x14, 0x1f, 0xc4, 0x50, 0xd3, 0x08, 
-	0xe2, 0x95, 0xd0, 0x71, 0x20, 0x56, 0x00, 0x48, 
-	0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xf7, 
-	0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xf6, 
-	0xd3, 0xc4, 0xe1, 0xf7, 0xb3, 0xc1, 0x01, 0x46, 
-	0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c, 0xe9, 0xfe, 
-	0x09, 0x49, 0x00, 0x0d, 0xa0, 0x2c, 0xe2, 0x5b, 
-	0x06, 0x5f, 0xfa, 0x7f, 0xd4, 0x02, 0x44, 0x15, 
-	0x14, 0x1f, 0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0, 
-	0xe2, 0x8d, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 
-	0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0xe1, 0xc9, 0xe1, 0xd2, 0xe1, 0xe7, 
-	0xe1, 0xe9, 0xe1, 0xab, 0xe1, 0x30, 0x30, 0x5a, 
-	0xe5, 0x91, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54, 
-	0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a, 
-	0xb6, 0xff, 0xd0, 0x52, 0x30, 0x5b, 0xfc, 0x11, 
-	0xbc, 0x10, 0xd0, 0x10, 0x0c, 0x1e, 0xf9, 0x8e, 
-	0xbc, 0x10, 0xd0, 0x20, 0xc0, 0x40, 0x30, 0x70, 
-	0xed, 0x8e, 0x03, 0x10, 0xe9, 0x97, 0x0f, 0x19, 
-	0xf9, 0x93, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xd0, 
-	0xf9, 0xa0, 0xca, 0x50, 0xcb, 0x52, 0x03, 0x1d, 
-	0xf9, 0xa7, 0xca, 0x12, 0xca, 0x52, 0xe1, 0xa4, 
-	0x03, 0x1d, 0xf9, 0xa7, 0xca, 0x12, 0xca, 0x53, 
-	0xca, 0xae, 0xca, 0xef, 0xb1, 0x7e, 0x03, 0x1e, 
-	0xfa, 0xea, 0xb1, 0x7e, 0xe2, 0xea, 0x00, 0x24, 
-	0xd0, 0x00, 0x2c, 0x40, 0x2c, 0x80, 0x17, 0x20, 
-	0xf9, 0xc8, 0x00, 0x2a, 0xd0, 0x00, 0x20, 0x1b, 
-	0x20, 0x1b, 0x05, 0x50, 0xf9, 0xb8, 0xb0, 0x3f, 
-	0x10, 0x02, 0x7c, 0x40, 0xcc, 0xb1, 0x1c, 0x9f, 
-	0x01, 0x69, 0xd0, 0x3c, 0x0c, 0x99, 0xe9, 0xc1, 
-	0x3c, 0x80, 0xde, 0xa0, 0x2c, 0x5f, 0x2c, 0x9f, 
-	0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80, 0xde, 0xc1, 
-	0xe3, 0x1e, 0xd3, 0xc0, 0xf2, 0xd3, 0x13, 0xa0, 
-	0xed, 0xce, 0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xd2, 
-	0x80, 0x07, 0xe2, 0x95, 0x0d, 0x09, 0xd1, 0x8c, 
-	0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xde, 0x08, 0x89, 
-	0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xdd, 0xd3, 0xc4, 
-	0xe1, 0xde, 0xb3, 0xc1, 0x01, 0x46, 0x90, 0x2c, 
-	0x00, 0xc6, 0x03, 0x1c, 0xe9, 0xe5, 0x09, 0x49, 
-	0x00, 0x0d, 0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f, 
-	0xfa, 0x7f, 0xd4, 0x00, 0xc4, 0x50, 0xc4, 0x90, 
-	0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00, 0x50, 0x00, 
-	0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0xe1, 0xa3, 0xc0, 0x00, 0xc0, 0x00, 
-	0xc0, 0x00, 0xe1, 0x8a, 0xe1, 0x30, 0x30, 0x5a, 
-	0xe5, 0x87, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x64, 
-	0x30, 0x5b, 0xfd, 0xb4, 0xc0, 0x39, 0x30, 0x31, 
-	0x10, 0x12, 0x10, 0x20, 0xe9, 0x82, 0xd1, 0x42, 
-	0xd3, 0x40, 0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42, 
-	0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40, 
-	0x1c, 0x48, 0xcc, 0xb1, 0x1c, 0x9f, 0x06, 0xd0, 
-	0xe9, 0x98, 0x01, 0x69, 0xd0, 0x20, 0x3c, 0x80, 
-	0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f, 0x2c, 0x40, 
-	0x2c, 0x80, 0x01, 0xb5, 0xd4, 0x00, 0x2c, 0x80, 
-	0xde, 0x84, 0xde, 0xc4, 0xe3, 0x1e, 0xf2, 0xd3, 
-	0xc0, 0x5c, 0xb0, 0x7f, 0x30, 0x5a, 0xe5, 0xc8, 
-	0x00, 0x26, 0xd0, 0x00, 0x70, 0x00, 0x10, 0x20, 
-	0xe9, 0xbf, 0x00, 0xe0, 0xd0, 0x44, 0x70, 0x41, 
-	0x10, 0x5c, 0x30, 0x5b, 0xb0, 0x41, 0xed, 0xc8, 
-	0x0f, 0x17, 0xf9, 0xb4, 0x0f, 0x49, 0xf2, 0xd3, 
-	0x0f, 0x19, 0xf9, 0xb8, 0xdf, 0x00, 0x00, 0x06, 
-	0x03, 0xb4, 0xd6, 0x29, 0xe0, 0x46, 0xc0, 0x5b, 
-	0x30, 0x54, 0xb0, 0x7e, 0xe5, 0xc8, 0x0f, 0x17, 
-	0xf9, 0xc3, 0x02, 0xf2, 0xd6, 0x2b, 0xe0, 0x46, 
-	0xd3, 0x08, 0xd3, 0xc0, 0xe2, 0x95, 0x50, 0x00, 
-	0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0xe1, 0xb5, 0xc0, 0x00, 0xc0, 0x00, 
-	0xc0, 0x00, 0xe1, 0x8e, 0xe1, 0x30, 0x30, 0x5a, 
-	0xe5, 0x8b, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x64, 
-	0x30, 0x5b, 0xfd, 0xc6, 0xbc, 0x10, 0xd0, 0x10, 
-	0x0c, 0x1e, 0xf9, 0x88, 0xbc, 0x10, 0xd0, 0x30, 
-	0xc0, 0x40, 0x30, 0x70, 0xed, 0x88, 0xd1, 0x42, 
-	0xd3, 0x40, 0xe2, 0xea, 0x00, 0x24, 0xd0, 0x00, 
-	0x2c, 0x40, 0x2c, 0x80, 0x17, 0x20, 0xf9, 0xb4, 
-	0x00, 0xa8, 0xd0, 0x00, 0xcc, 0x5b, 0x1c, 0x5f, 
-	0x1c, 0x43, 0x20, 0x31, 0x7c, 0x40, 0xb0, 0x3c, 
-	0x7e, 0x80, 0xcc, 0xb1, 0xce, 0xfa, 0x1c, 0x9f, 
-	0x1e, 0xdf, 0x01, 0x69, 0xd0, 0x3c, 0x0c, 0x99, 
-	0xe9, 0xa6, 0x3c, 0x80, 0x0e, 0xd9, 0xe9, 0xa9, 
-	0x3e, 0xc0, 0x3e, 0xf2, 0x3e, 0xb1, 0xd0, 0x01, 
-	0x40, 0x1b, 0x10, 0x05, 0x20, 0x1f, 0x2c, 0x40, 
-	0x2c, 0x80, 0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80, 
-	0xe3, 0x1e, 0xf2, 0xd3, 0xc0, 0x5c, 0xb0, 0x7f, 
-	0x30, 0x5a, 0xe5, 0xda, 0x00, 0x26, 0xd0, 0x00, 
-	0x70, 0x00, 0x10, 0x20, 0xe9, 0xd1, 0x00, 0xe0, 
-	0xd0, 0x44, 0x70, 0x41, 0x10, 0x5c, 0x30, 0x5b, 
-	0xb0, 0x41, 0xed, 0xda, 0x0f, 0x17, 0xf9, 0xc6, 
-	0x0f, 0x49, 0xf2, 0xd3, 0x0f, 0x19, 0xf9, 0xca, 
-	0xdf, 0x00, 0x00, 0x06, 0x03, 0xb4, 0xd6, 0x29, 
-	0xe0, 0x46, 0xc0, 0x5b, 0x30, 0x54, 0xb0, 0x7e, 
-	0xe5, 0xda, 0x0f, 0x17, 0xf9, 0xd5, 0x02, 0xf7, 
-	0xdc, 0x26, 0xe0, 0x46, 0xd3, 0x08, 0xd3, 0xc0, 
-	0xe2, 0x95, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 
-	0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0xe1, 0xa2, 0xc0, 0x00, 0xc0, 0x00, 
-	0xc0, 0x00, 0xe1, 0x8a, 0xe1, 0x65, 0x30, 0x5a, 
-	0xe5, 0x87, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x52, 
-	0x30, 0x5b, 0xfd, 0xb3, 0xc0, 0x39, 0x30, 0x31, 
-	0x10, 0x11, 0x10, 0x20, 0xe9, 0x82, 0xd1, 0x42, 
-	0xd3, 0x41, 0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42, 
-	0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40, 
-	0x1c, 0x49, 0xcc, 0xb1, 0x1c, 0x9f, 0xc0, 0x1c, 
-	0x10, 0x08, 0x20, 0x1f, 0x05, 0x50, 0xf9, 0x99, 
-	0xb0, 0x3c, 0x2c, 0x40, 0x2c, 0x80, 0x01, 0xb5, 
-	0xd4, 0x00, 0x2c, 0x80, 0x02, 0xe4, 0xde, 0x80, 
-	0xde, 0xc1, 0xe3, 0x1e, 0xf2, 0xd3, 0xc0, 0x5c, 
-	0xb0, 0x7f, 0x30, 0x5a, 0xe5, 0xc7, 0x00, 0x26, 
-	0xd0, 0x00, 0x70, 0x00, 0x10, 0x20, 0xe9, 0xbe, 
-	0x00, 0xe0, 0xd0, 0x44, 0x70, 0x41, 0x10, 0x5b, 
-	0x30, 0x5b, 0xb0, 0x41, 0xed, 0xc7, 0x0f, 0x17, 
-	0xf9, 0xb3, 0x0f, 0x49, 0xf2, 0xd3, 0x0f, 0x19, 
-	0xf9, 0xb7, 0xdf, 0x00, 0x00, 0x06, 0x03, 0xb4, 
-	0xd6, 0x29, 0xe0, 0x46, 0xc0, 0x5b, 0x30, 0x54, 
-	0xb0, 0x7e, 0xe5, 0xc7, 0x0f, 0x17, 0xf9, 0xc2, 
-	0x03, 0x30, 0xdc, 0x27, 0xe0, 0x46, 0xd3, 0x08, 
-	0xd3, 0xc0, 0xe2, 0x95, 0x50, 0x00, 0x50, 0x00, 
-	0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0xe1, 0xac, 0xc0, 0x00, 0xc0, 0x00, 
-	0xc0, 0x00, 0xe1, 0x8e, 0xe1, 0x30, 0x30, 0x5a, 
-	0xe5, 0x8b, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x52, 
-	0x30, 0x5b, 0xfd, 0xbd, 0xbc, 0x10, 0xd0, 0x10, 
-	0x0c, 0x1e, 0xf9, 0x88, 0xbc, 0x10, 0xd0, 0x20, 
-	0xc0, 0x40, 0x30, 0x70, 0xed, 0x88, 0xd1, 0x42, 
-	0xd3, 0x41, 0xe2, 0xea, 0x00, 0x24, 0xd0, 0x00, 
-	0x2c, 0x40, 0x2c, 0x80, 0x17, 0x20, 0xf9, 0xab, 
-	0x00, 0x2a, 0xd0, 0x00, 0x20, 0x1b, 0x20, 0x1b, 
-	0x05, 0x50, 0xf9, 0x9b, 0xb0, 0x3f, 0x10, 0x02, 
-	0x7c, 0x40, 0xcc, 0xb1, 0x1c, 0x9f, 0x01, 0x69, 
-	0xd0, 0x3c, 0x0c, 0x99, 0xe9, 0xa4, 0x3c, 0x80, 
-	0xde, 0xa0, 0x2c, 0x5f, 0x2c, 0x9f, 0xd0, 0x30, 
-	0x70, 0x00, 0x2c, 0x80, 0xde, 0xc1, 0xe3, 0x1e, 
-	0xf2, 0xd3, 0xc0, 0x5c, 0xb0, 0x7f, 0x30, 0x5a, 
-	0xe5, 0xd1, 0x00, 0x26, 0xd0, 0x00, 0x70, 0x00, 
-	0x10, 0x20, 0xe9, 0xc8, 0x00, 0xe0, 0xd0, 0x44, 
-	0x70, 0x41, 0x10, 0x5b, 0x30, 0x5b, 0xb0, 0x41, 
-	0xed, 0xd1, 0x0f, 0x17, 0xf9, 0xbd, 0x0f, 0x49, 
-	0xf2, 0xd3, 0x0f, 0x19, 0xf9, 0xc1, 0xdf, 0x00, 
-	0x00, 0x06, 0x03, 0xb4, 0xd6, 0x29, 0xe0, 0x46, 
-	0xc0, 0x5b, 0x30, 0x54, 0xb0, 0x7e, 0xe5, 0xd1, 
-	0x0f, 0x17, 0xf9, 0xcc, 0x03, 0x35, 0xda, 0x20, 
-	0xe0, 0x46, 0xd3, 0x08, 0xd3, 0xc0, 0xe2, 0x95, 
-	0xd0, 0x61, 0x23, 0x81, 0x0c, 0x49, 0xd0, 0x61, 
-	0x00, 0x8d, 0x10, 0xa0, 0xea, 0x3b, 0x30, 0x42, 
-	0xe6, 0x30, 0x23, 0x82, 0x0f, 0xc5, 0x0c, 0x09, 
-	0x05, 0x0d, 0x15, 0x20, 0xfe, 0x45, 0xd0, 0x65, 
-	0x15, 0x63, 0xea, 0x43, 0xd0, 0x53, 0x30, 0x54, 
-	0xee, 0x4a, 0x0f, 0x17, 0xfa, 0x45, 0x03, 0xb4, 
-	0xd6, 0x29, 0xe0, 0x46, 0x80, 0x07, 0x09, 0x49, 
-	0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0, 
-	0x00, 0x4d, 0xa0, 0x6c, 0xd0, 0xa1, 0x00, 0x88, 
-	0xd0, 0xa9, 0x00, 0x4d, 0x00, 0x50, 0xfa, 0x53, 
-	0xf2, 0x32, 0xd3, 0x80, 0xe1, 0x76, 0xd1, 0xc2, 
-	0x41, 0xcf, 0x11, 0xdf, 0xd0, 0x41, 0x01, 0xc1, 
-	0x00, 0xef, 0xd0, 0xbe, 0x03, 0x10, 0xf9, 0x77, 
-	0x80, 0x07, 0x21, 0x96, 0x11, 0xa2, 0xe9, 0x78, 
-	0x03, 0x1d, 0xea, 0x73, 0xc0, 0xd7, 0xc2, 0x90, 
-	0xf2, 0xa4, 0xc4, 0x0a, 0x03, 0xd0, 0xea, 0x72, 
-	0xc2, 0x91, 0xf2, 0xa4, 0xc4, 0x4a, 0x03, 0x1e, 
-	0xea, 0x8d, 0xc0, 0xd8, 0xc2, 0x92, 0xf2, 0xa4, 
-	0xc4, 0x8a, 0x03, 0xd0, 0xea, 0x7d, 0xc2, 0x93, 
-	0xf2, 0xa4, 0xc4, 0xca, 0xe2, 0x8d, 0xd3, 0xc0, 
-	0xc0, 0xd7, 0xc2, 0x90, 0xf2, 0xa4, 0xc4, 0x0a, 
-	0x03, 0xd0, 0xea, 0x88, 0xc2, 0x91, 0xf2, 0xa4, 
-	0xc4, 0x4a, 0x08, 0x49, 0x00, 0x4d, 0x10, 0x61, 
-	0xf8, 0x11, 0x03, 0x1f, 0xea, 0x93, 0x0d, 0xc9, 
-	0x00, 0x4d, 0xd0, 0x1a, 0xe2, 0x98, 0x03, 0x10, 
-	0xfa, 0x97, 0xd0, 0x1d, 0xe2, 0x98, 0xd0, 0x18, 
-	0x0f, 0x16, 0xfa, 0x98, 0xd0, 0x4c, 0x40, 0x4c, 
-	0x10, 0x6c, 0xea, 0xa2, 0x03, 0xde, 0xfa, 0xa2, 
-	0x0f, 0x12, 0xfa, 0xa0, 0x00, 0x08, 0xe2, 0xd9, 
-	0xd2, 0x00, 0x13, 0xe1, 0xee, 0xa9, 0x08, 0x49, 
-	0x02, 0x0d, 0x00, 0xc8, 0xc2, 0xca, 0x12, 0x94, 
-	0xd0, 0x1f, 0x30, 0x07, 0x12, 0xc0, 0xc2, 0x43, 
-	0x12, 0x5a, 0x00, 0x0d, 0x03, 0xde, 0xea, 0xb6, 
-	0x0e, 0xc9, 0x04, 0x8d, 0x02, 0x48, 0x22, 0x80, 
-	0x12, 0x88, 0xd0, 0x0b, 0x30, 0x03, 0x12, 0x80, 
-	0xd0, 0x19, 0x20, 0x03, 0x12, 0x80, 0x00, 0x0d, 
-	0x22, 0xc0, 0x12, 0xc8, 0xd0, 0x0b, 0x30, 0x09, 
-	0x12, 0xc0, 0x12, 0xd8, 0xd0, 0x16, 0x20, 0x09, 
-	0x20, 0x07, 0x12, 0xc0, 0x42, 0xc2, 0x22, 0x8b, 
-	0x22, 0x88, 0x03, 0xde, 0xea, 0xd2, 0x0e, 0xc9, 
-	0xc4, 0x4a, 0x04, 0xcd, 0x0f, 0xc5, 0x01, 0x46, 
-	0x90, 0x4d, 0x00, 0xc6, 0x10, 0x60, 0xe6, 0xd3, 
-	0x0f, 0xc5, 0x01, 0xb5, 0xd4, 0x00, 0xca, 0x9d, 
-	0xcb, 0x9e, 0xca, 0xea, 0xcb, 0xee, 0x2a, 0xc0, 
-	0x2b, 0xc0, 0xca, 0x10, 0xca, 0x51, 0xcb, 0x12, 
-	0xcb, 0x53, 0xd1, 0x40, 0xd3, 0x41, 0xb7, 0x3f, 
-	0xc0, 0x5c, 0xe1, 0x7b, 0xd0, 0xc0, 0xc1, 0x28, 
-	0xc2, 0x2a, 0xc2, 0xab, 0xf1, 0x7a, 0x0f, 0x17, 
-	0xfa, 0xef, 0xcc, 0xe8, 0xcd, 0x29, 0xcd, 0x6c, 
-	0xcd, 0xad, 0xc8, 0x08, 0xc8, 0x49, 0xca, 0x0a, 
-	0xca, 0x4b, 0xf3, 0x31, 0xd0, 0xc1, 0xc1, 0x34, 
-	0xc2, 0x2a, 0xc2, 0xab, 0xf1, 0x7a, 0x00, 0x28, 
-	0xd9, 0xc0, 0xc8, 0x88, 0xc8, 0xc9, 0xa9, 0xf8, 
-	0xca, 0x8a, 0xca, 0xcb, 0x11, 0x62, 0xe9, 0x79, 
-	0xd0, 0xc0, 0xc1, 0x35, 0xc2, 0x2e, 0xc2, 0xaf, 
-	0xf1, 0x7a, 0xc9, 0x08, 0xc9, 0x49, 0xa9, 0xf8, 
-	0xcb, 0x0a, 0xcb, 0x4b, 0xd0, 0xc1, 0xc1, 0x36, 
-	0xc2, 0x2e, 0xc2, 0xaf, 0xf1, 0x7a, 0xc0, 0x27, 
-	0xc9, 0x88, 0xc9, 0xc9, 0xa0, 0x38, 0xcb, 0x8a, 
-	0xcb, 0xcb, 0xe1, 0x79, 0x5f, 0x0d, 0x07, 0x7d, 
-	0xde, 0x07, 0x11, 0x5e, 0x30, 0x05, 0xcd, 0xc0, 
-	0x00, 0x28, 0xd0, 0x00, 0xa0, 0x38, 0x11, 0x61, 
-	0xf9, 0x75, 0x00, 0xe2, 0xd0, 0x00, 0x0f, 0x1d, 
-	0xeb, 0x29, 0x00, 0x2d, 0xdf, 0x4b, 0xf3, 0x3f, 
-	0xe1, 0x75, 0x04, 0xeb, 0xd0, 0x00, 0x11, 0x62, 
-	0xeb, 0x36, 0xb0, 0x20, 0x0f, 0x19, 0xfb, 0x36, 
-	0xac, 0xe0, 0x01, 0xa4, 0xde, 0x00, 0x5e, 0x0d, 
-	0x00, 0x2d, 0xdf, 0x7a, 0xdd, 0xc0, 0xd8, 0x80, 
-	0xd9, 0x00, 0xd9, 0x80, 0x5f, 0x00, 0x01, 0x46, 
-	0x00, 0x28, 0xd0, 0x01, 0x00, 0x06, 0xa0, 0x37, 
-	0x80, 0x3f, 0x00, 0xc6, 0x0f, 0xc5, 0xad, 0xda, 
-	0xc6, 0xb1, 0xd0, 0x01, 0x01, 0xa3, 0xde, 0x1d, 
-	0x40, 0x30, 0x3e, 0x00, 0x80, 0x3f, 0x0e, 0x0a, 
-	0x66, 0xda, 0xc8, 0x28, 0xc8, 0x69, 0xc8, 0xaa, 
-	0xc8, 0xeb, 0x0c, 0x1e, 0xfb, 0x68, 0x26, 0xba, 
-	0x07, 0x7d, 0xdc, 0x00, 0x1d, 0xcf, 0x1d, 0xd1, 
-	0x5d, 0xc0, 0x00, 0x2d, 0xdf, 0x64, 0x0f, 0x87, 
-	0xad, 0xda, 0x80, 0x3f, 0x0e, 0x0a, 0x66, 0xda, 
-	0xc9, 0x2c, 0xc9, 0x6d, 0xc9, 0xae, 0xc9, 0xef, 
-	0x0f, 0x2f, 0xd0, 0x37, 0x4f, 0x00, 0x0f, 0x1a, 
-	0xeb, 0xbe, 0x01, 0xa4, 0xde, 0x20, 0xd0, 0x01, 
-	0x40, 0x3c, 0x2e, 0x00, 0x00, 0x2d, 0xdf, 0x7a, 
-	0xac, 0xe0, 0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe0, 
-	0xbf, 0x79, 0xbe, 0x3c, 0x0f, 0x1b, 0xeb, 0x9e, 
-	0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe1, 0xbf, 0x79, 
-	0xbe, 0x34, 0x18, 0xa0, 0xeb, 0xb9, 0x0f, 0x87, 
-	0xad, 0x20, 0x80, 0x3f, 0x0e, 0x0a, 0x76, 0xe2, 
-	0xbf, 0x79, 0xbe, 0x3c, 0x0f, 0x87, 0x0e, 0x0a, 
-	0x76, 0xe3, 0x0f, 0x1b, 0xeb, 0xb3, 0xbf, 0x77, 
-	0xbe, 0x0c, 0x19, 0x20, 0xeb, 0xb9, 0x0f, 0x87, 
-	0xad, 0x60, 0x80, 0x3f, 0x0e, 0x0a, 0x76, 0xe4, 
-	0xbe, 0x3c, 0xbf, 0x75, 0x0f, 0x15, 0xf8, 0x1c, 
-	0x1f, 0x0a, 0x1f, 0x16, 0x0f, 0x87, 0x0e, 0x0a, 
-	0x76, 0xe5, 0xbf, 0x79, 0xbe, 0x34, 0x19, 0xa0, 
-	0xeb, 0xb9, 0x0f, 0x87, 0xad, 0xa0, 0x80, 0x3f, 
-	0x0e, 0x0a, 0x76, 0xe6, 0xbe, 0x3c, 0xbf, 0x79, 
-	0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe7, 0x0f, 0x15, 
-	0xeb, 0xbe, 0x00, 0x2f, 0xdf, 0x72, 0x1d, 0xe0, 
-	0xf8, 0x1c, 0x00, 0x28, 0xd0, 0x01, 0xa0, 0x38, 
-	0x80, 0x3f, 0x0f, 0x87, 0xd0, 0x01, 0x4d, 0xc0, 
-	0x1f, 0x0f, 0x1f, 0x11, 0x00, 0x2f, 0xdf, 0x76, 
-	0xc6, 0xb2, 0x03, 0x7d, 0xde, 0x0e, 0x01, 0xa3, 
-	0xde, 0x2d, 0x5d, 0xc0, 0x0f, 0x87, 0x1e, 0xe1, 
-	0xeb, 0xdb, 0xad, 0xda, 0x80, 0x3f, 0x0e, 0x0a, 
-	0x66, 0xda, 0x0c, 0x1e, 0xfb, 0xe4, 0x26, 0xbb, 
-	0x03, 0xff, 0xdd, 0xff, 0x4d, 0xc0, 0x00, 0xa3, 
-	0xde, 0x2d, 0xbf, 0x56, 0x0f, 0x87, 0x07, 0x7d, 
-	0xde, 0x0e, 0x5d, 0xc0, 0x00, 0xa3, 0xde, 0x1d, 
-	0xad, 0xda, 0x80, 0x3f, 0x0e, 0x0a, 0x66, 0xda, 
-	0xdf, 0x5c, 0xd0, 0x0e, 0x4f, 0x00, 0x0f, 0x87, 
-	0xd0, 0x06, 0x40, 0x3c, 0xeb, 0xf0, 0xbf, 0x3e, 
-	0xb0, 0x04, 0xe7, 0xf2, 0xeb, 0xf6, 0xbf, 0x0c, 
-	0xbf, 0x3a, 0x0f, 0x87, 0x0f, 0x1d, 0xfb, 0x4b, 
-	0xbf, 0x38, 0x0f, 0x87, 0x0f, 0x1c, 0xfb, 0xcb, 
-	0xbf, 0x30, 0x0f, 0x87, 0x50, 0x00, 0x50, 0x00, 
-	0x0f, 0x17, 0xf9, 0x70, 0x90, 0x4d, 0x10, 0x60, 
-	0xe5, 0x72, 0x0f, 0x49, 0x90, 0x4d, 0x10, 0x60, 
-	0xe5, 0x76, 0x0f, 0x19, 0xf9, 0x79, 0x01, 0x46, 
-	0xd0, 0x11, 0xa0, 0x38, 0x80, 0x3f, 0x00, 0xc6, 
-	0xdf, 0x00, 0x00, 0x06, 0x08, 0x20, 0xd0, 0x00, 
-	0x10, 0x08, 0xa0, 0x0a, 0xa0, 0x1b, 0x0c, 0x20, 
-	0xd0, 0x00, 0x10, 0x08, 0xa0, 0x27, 0x90, 0x4d, 
-	0x0f, 0xff, 0xd8, 0x1f, 0x40, 0x40, 0xa0, 0x4d, 
-	0x80, 0x0a, 0xd0, 0x00, 0x06, 0x50, 0xf9, 0x95, 
-	0xd0, 0x01, 0xa0, 0x09, 0x80, 0x1b, 0xa0, 0x27, 
-	0x01, 0x20, 0xd0, 0x67, 0xa0, 0x69, 0x80, 0x2a, 
-	0x82, 0x29, 0x80, 0x6a, 0x84, 0x29, 0xd0, 0x54, 
-	0x10, 0x4f, 0xa0, 0x6a, 0x01, 0x20, 0xd0, 0x40, 
-	0xa0, 0x69, 0x80, 0x2b, 0x80, 0x07, 0x08, 0x20, 
-	0xdf, 0x00, 0x02, 0x30, 0xd0, 0x00, 0xa0, 0x38, 
-	0x80, 0x3f, 0x01, 0xb0, 0xd0, 0x10, 0xa0, 0x37, 
-	0x80, 0x3f, 0x02, 0x30, 0xd0, 0x01, 0xa0, 0x38, 
-	0xd0, 0x10, 0xa0, 0x38, 0x15, 0x63, 0xe9, 0xba, 
-	0x05, 0x5e, 0xf9, 0xfa, 0xc0, 0xdf, 0x00, 0xe0, 
-	0xd1, 0x80, 0x70, 0x06, 0x10, 0x1c, 0xc1, 0x40, 
-	0x11, 0x48, 0xd3, 0x10, 0x00, 0x21, 0xd0, 0x80, 
-	0xb0, 0x16, 0xe9, 0xca, 0xd3, 0x20, 0x10, 0x81, 
-	0xb0, 0x16, 0xf9, 0xfa, 0x30, 0xc2, 0xd2, 0x64, 
-	0xd0, 0x92, 0x00, 0xee, 0xd0, 0x54, 0x70, 0x41, 
-	0x30, 0x43, 0xed, 0xd7, 0xd2, 0x6c, 0x72, 0x49, 
-	0xc0, 0x89, 0xb0, 0xbf, 0x10, 0x9f, 0x22, 0x42, 
-	0x04, 0x31, 0xd0, 0x10, 0xc0, 0x42, 0x30, 0x49, 
-	0xe5, 0xde, 0x10, 0x03, 0xc1, 0x0c, 0xc1, 0x83, 
-	0xb1, 0xbe, 0x01, 0x46, 0x00, 0x06, 0xa0, 0x3d, 
-	0xa0, 0x3c, 0x60, 0x06, 0x00, 0xc6, 0xb1, 0xbc, 
-	0xb1, 0x01, 0xed, 0xe1, 0xc1, 0x0c, 0x21, 0x85, 
-	0x01, 0x46, 0x00, 0x06, 0xa0, 0x3d, 0xa0, 0x3c, 
-	0x60, 0x06, 0x00, 0xc6, 0xb1, 0xbc, 0xb1, 0x01, 
-	0xed, 0xec, 0x02, 0xe4, 0xd0, 0x00, 0x20, 0xc0, 
-	0xb2, 0x41, 0xed, 0xd8, 0x15, 0xa3, 0xfa, 0x00, 
-	0xbc, 0x10, 0x0c, 0x1e, 0xfa, 0x00, 0xbc, 0x10, 
-	0xd0, 0x04, 0x70, 0x00, 0x10, 0x20, 0xfa, 0x00, 
-	0x00, 0x27, 0xd0, 0x10, 0xd0, 0x40, 0x60, 0x40, 
-	0x00, 0x26, 0xd0, 0x14, 0x60, 0x40, 0xb0, 0x28, 
-	0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0x01, 0x7a, 
-	0xde, 0x1a, 0xe0, 0x46, 0x50, 0x00, 0x50, 0x00, 
-	0x00, 0x28, 0xd1, 0xb0, 0x70, 0x06, 0xd0, 0x81, 
-	0x60, 0x86, 0x10, 0x20, 0xe9, 0xab, 0xb0, 0x3f, 
-	0x60, 0x06, 0x00, 0xec, 0xd1, 0x84, 0x70, 0x46, 
-	0xb1, 0x84, 0x70, 0x86, 0x30, 0x42, 0xe9, 0xab, 
-	0x70, 0x42, 0xd0, 0x35, 0x30, 0x40, 0xf9, 0xab, 
-	0x00, 0x63, 0xd0, 0x3f, 0xb0, 0xbc, 0x40, 0x80, 
-	0x70, 0xc2, 0x10, 0xe3, 0xe5, 0xab, 0xb0, 0xbc, 
-	0x40, 0x80, 0x60, 0x86, 0x00, 0x28, 0xd0, 0x24, 
-	0x70, 0x40, 0x00, 0x22, 0xd0, 0x80, 0x50, 0x42, 
-	0x60, 0x40, 0x00, 0x64, 0xd0, 0x60, 0xd0, 0x90, 
-	0x60, 0x81, 0x00, 0xed, 0xd1, 0x88, 0x70, 0x46, 
-	0x10, 0xe4, 0xe9, 0xa8, 0x00, 0x21, 0xd0, 0xe8, 
-	0xd0, 0x00, 0x60, 0x03, 0xd0, 0x81, 0x40, 0x42, 
-	0x60, 0x46, 0x02, 0x3c, 0xdc, 0x89, 0xe0, 0x46, 
-	0xd0, 0x82, 0x50, 0x42, 0x60, 0x46, 0x00, 0x23, 
-	0xd5, 0x3e, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 
-	0x01, 0x46, 0xdf, 0x5c, 0x08, 0x20, 0xd1, 0x00, 
-	0xcf, 0x04, 0x11, 0x08, 0xa1, 0x0a, 0xa1, 0x1b, 
-	0x11, 0x1f, 0xa1, 0x27, 0xd2, 0x80, 0xb2, 0x81, 
-	0x90, 0x4d, 0xc0, 0x01, 0x10, 0x14, 0x00, 0x16, 
-	0xe9, 0x8d, 0x80, 0x33, 0x80, 0x3f, 0x92, 0x8b, 
-	0x00, 0x23, 0xd0, 0x3f, 0x42, 0x80, 0xe9, 0x8d, 
-	0x0f, 0xff, 0xdf, 0xff, 0x40, 0x01, 0xa0, 0x0d, 
-	0xe1, 0x94, 0xa1, 0x0a, 0x00, 0xea, 0xd0, 0x00, 
-	0xd0, 0x8e, 0x00, 0x06, 0x0f, 0x0b, 0x70, 0x80, 
-	0x80, 0x73, 0x80, 0x0a, 0xd0, 0x00, 0x06, 0x50, 
-	0xf9, 0x9a, 0xd0, 0x01, 0xd0, 0x44, 0x40, 0x70, 
-	0x20, 0x01, 0x15, 0x63, 0xf9, 0xa1, 0x80, 0x1b, 
-	0xe1, 0xa2, 0x80, 0x5b, 0xa0, 0x27, 0x01, 0x20, 
-	0xd0, 0x67, 0xa0, 0x69, 0x80, 0x2a, 0x82, 0x29, 
-	0x80, 0x6a, 0x84, 0x29, 0xd0, 0x54, 0x10, 0x4f, 
-	0xa0, 0x6a, 0x01, 0x20, 0xd0, 0x40, 0xa0, 0x69, 
-	0x80, 0x2b, 0x80, 0x07, 0x08, 0x20, 0xd0, 0x00, 
-	0xcf, 0x00, 0x02, 0x30, 0xd0, 0x00, 0xa0, 0x38, 
-	0x80, 0x3f, 0x01, 0xb2, 0xd2, 0x10, 0xa0, 0x37, 
-	0x80, 0x3f, 0x02, 0x30, 0xd0, 0x01, 0xa0, 0x38, 
-	0x00, 0x30, 0xd0, 0x10, 0xa0, 0x38, 0x80, 0x3f, 
-	0x00, 0xc6, 0x00, 0x28, 0xd1, 0x24, 0x70, 0x04, 
-	0xd0, 0x41, 0x50, 0x01, 0x60, 0x04, 0x00, 0x27, 
-	0xd0, 0x18, 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 
-	0x00, 0x26, 0xd0, 0x20, 0x70, 0x40, 0xb0, 0x7f, 
-	0x60, 0x40, 0x08, 0x20, 0xdf, 0x00, 0xd4, 0x00, 
-	0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0, 0xd3, 0x81, 
-	0x12, 0xa0, 0xed, 0xe3, 0xd0, 0x08, 0x0a, 0x09, 
-	0x00, 0x4d, 0xb0, 0x01, 0xed, 0xdf, 0x03, 0xbf, 
-	0xd4, 0x27, 0xe0, 0x46, 0x50, 0x00, 0x50, 0x00, 
-	0x02, 0x24, 0xd0, 0x00, 0xa0, 0x37, 0x00, 0x27, 
-	0xd3, 0xd0, 0x00, 0x26, 0xd0, 0x04, 0x73, 0xcf, 
-	0x13, 0xe1, 0xe9, 0x7b, 0xb0, 0x3c, 0xf2, 0x00, 
-	0x00, 0x26, 0xd0, 0x40, 0xd0, 0x00, 0x60, 0x01, 
-	0x00, 0x26, 0xd0, 0x14, 0xf2, 0x00, 0x00, 0x26, 
-	0xd0, 0x18, 0xf2, 0x00, 0x00, 0xee, 0xd0, 0x1c, 
-	0x71, 0x40, 0xd1, 0x24, 0x15, 0x63, 0xe9, 0x8d, 
-	0x11, 0x1f, 0xc7, 0x1a, 0xb7, 0x01, 0xd3, 0x81, 
-	0xc4, 0xd4, 0xf2, 0x04, 0x00, 0x26, 0xd0, 0x18, 
-	0x70, 0x40, 0xb0, 0x54, 0xfd, 0x9b, 0x00, 0xed, 
-	0xd0, 0x24, 0xd0, 0x44, 0x60, 0x40, 0x13, 0xe1, 
-	0xf9, 0xbc, 0x15, 0xa3, 0xf9, 0xa1, 0x0c, 0x10, 
-	0xe9, 0xb9, 0x11, 0x61, 0xe5, 0xb3, 0xed, 0xb9, 
-	0x15, 0xa3, 0xf9, 0xab, 0x00, 0x26, 0xd0, 0x14, 
-	0x70, 0x40, 0x10, 0x62, 0xf5, 0xb3, 0x15, 0x22, 
-	0xe5, 0xb3, 0xc0, 0x44, 0x30, 0x54, 0xe5, 0xb3, 
-	0x34, 0xd4, 0xf5, 0xb3, 0xe1, 0xbf, 0x03, 0xb4, 
-	0xd6, 0x29, 0x00, 0x26, 0xd0, 0x40, 0x60, 0x01, 
-	0xe1, 0xdb, 0x03, 0xb4, 0xd6, 0x29, 0xe0, 0x46, 
-	0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x80, 0x07, 
-	0x09, 0x49, 0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80, 
-	0xd4, 0xc0, 0x00, 0x4d, 0xa0, 0x6c, 0xd3, 0x80, 
-	0xd0, 0xa1, 0x00, 0x88, 0xd0, 0xa9, 0x00, 0x4d, 
-	0x00, 0x50, 0xf9, 0xc9, 0x0c, 0x49, 0xd0, 0x61, 
-	0x00, 0x8d, 0x10, 0xa0, 0xe9, 0x90, 0x30, 0x42, 
-	0xf5, 0xd8, 0xd0, 0x61, 0x23, 0x81, 0xe1, 0xce, 
-	0x23, 0x82, 0x13, 0xa1, 0xf9, 0x90, 0xd0, 0x42, 
-	0x15, 0xa1, 0xf9, 0xdf, 0xb0, 0x7f, 0x00, 0x26, 
-	0xd0, 0x14, 0x70, 0x00, 0x30, 0x01, 0xf5, 0xe8, 
-	0x16, 0xe0, 0xe5, 0xe8, 0xb6, 0xc1, 0xbc, 0x20, 
-	0xc0, 0x44, 0x30, 0x5b, 0xfd, 0xb9, 0xc0, 0x44, 
-	0x30, 0x54, 0xe5, 0xb9, 0x15, 0x63, 0xf9, 0xf8, 
-	0x15, 0xa3, 0xf9, 0xf5, 0x03, 0x3c, 0xd8, 0x1c, 
-	0xe0, 0x46, 0x03, 0x39, 0xda, 0x17, 0xe0, 0x46, 
-	0x15, 0xa3, 0xf9, 0xfd, 0x03, 0x72, 0xde, 0x19, 
-	0xe0, 0x46, 0x03, 0x70, 0xd0, 0x17, 0xe0, 0x46, 
-	0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0x0f, 0xc5, 
-	0xdf, 0x00, 0x0c, 0x09, 0x05, 0x0d, 0x08, 0x20, 
-	0xdf, 0x00, 0x0f, 0xc5, 0x50, 0x00, 0x50, 0x00, 
-	0x00, 0xef, 0xd0, 0x14, 0x70, 0x40, 0x10, 0x60, 
-	0xe9, 0x45, 0xb0, 0x04, 0x70, 0x40, 0xb0, 0x41, 
-	0xed, 0x44, 0x00, 0xed, 0xd0, 0x24, 0xd0, 0x44, 
-	0x60, 0x40, 0x00, 0x64, 0xd0, 0x20, 0x70, 0x00, 
-	0x10, 0x30, 0xe9, 0x45, 0x00, 0x21, 0xd0, 0x28, 
-	0x60, 0x40, 0x00, 0x64, 0xd2, 0xc0, 0x70, 0x0b, 
-	0x00, 0x11, 0xe9, 0x6a, 0x08, 0x20, 0xd0, 0x4f, 
-	0x30, 0x40, 0xe9, 0x55, 0xb0, 0x4f, 0xf9, 0x6a, 
-	0x03, 0xef, 0xdf, 0xbf, 0xaf, 0xb8, 0xdf, 0x80, 
-	0x0f, 0x87, 0xd0, 0x18, 0x70, 0x00, 0x10, 0x20, 
-	0xed, 0x6c, 0xdf, 0x84, 0xd0, 0x40, 0x60, 0x7e, 
-	0x00, 0x27, 0xd0, 0x54, 0x70, 0x41, 0x10, 0x60, 
-	0x01, 0xa0, 0xd0, 0x40, 0xa0, 0x78, 0x80, 0x34, 
-	0x80, 0x3f, 0x01, 0x3c, 0xd2, 0x39, 0x00, 0x21, 
-	0xdf, 0x86, 0x0f, 0x87, 0xd0, 0x40, 0x60, 0x4b, 
-	0x03, 0xe6, 0xd0, 0x08, 0xe0, 0x36, 0x50, 0x00, 
-	0x00, 0x28, 0xd0, 0x24, 0x72, 0xc0, 0xd0, 0x40, 
-	0x60, 0x40, 0xd0, 0x0c, 0x52, 0xc0, 0xc0, 0x1c, 
-	0x30, 0x1d, 0xf5, 0x3c, 0x20, 0x1f, 0x30, 0x1e, 
-	0x90, 0x6d, 0x20, 0x01, 0x00, 0x22, 0xd0, 0x58, 
-	0x60, 0x01, 0x00, 0xe3, 0xd0, 0x48, 0x70, 0x41, 
-	0x30, 0x40, 0xf5, 0x47, 0xb2, 0xc8, 0x00, 0xe3, 
-	0xd0, 0x4c, 0x70, 0x41, 0x30, 0x40, 0xfd, 0x4d, 
-	0xb2, 0xc4, 0x00, 0x28, 0xd0, 0x20, 0x70, 0x00, 
-	0x42, 0xc0, 0xa2, 0xc5, 0x12, 0xe0, 0xe9, 0x55, 
-	0x80, 0x40, 0x80, 0x34, 0x80, 0x3f, 0xcf, 0x95, 
-	0x82, 0x34, 0x80, 0x3f, 0x03, 0xe8, 0xd0, 0x00, 
-	0x1f, 0xa3, 0xe9, 0x60, 0x03, 0xea, 0xd0, 0x00, 
-	0x00, 0x27, 0xd0, 0x4c, 0x7f, 0x81, 0x00, 0x27, 
-	0xd0, 0x54, 0x70, 0x41, 0x10, 0x60, 0x03, 0xa0, 
-	0xd0, 0x40, 0xa0, 0x78, 0xe0, 0x3c, 0x50, 0x00, 
-	0xc0, 0x84, 0x10, 0x8c, 0x10, 0x92, 0xd0, 0x41, 
-	0x30, 0x4d, 0x40, 0x43, 0x10, 0x43, 0x20, 0x81, 
-	0xd1, 0x8f, 0x41, 0x82, 0x10, 0x9c, 0x20, 0x9b, 
-	0xc1, 0xc2, 0x10, 0x82, 0x20, 0x87, 0xc0, 0x42, 
-	0x10, 0x43, 0x20, 0x81, 0x10, 0x88, 0x22, 0x02, 
-	0x10, 0x97, 0x01, 0xd0, 0xe9, 0x48, 0xb0, 0x96, 
-	0x10, 0x88, 0x22, 0x82, 0xc0, 0x5c, 0x10, 0x48, 
-	0xc0, 0x84, 0x10, 0x91, 0x10, 0x86, 0x20, 0x42, 
-	0x41, 0x0d, 0x11, 0x02, 0x20, 0x44, 0x22, 0x01, 
-	0x22, 0x81, 0x02, 0xe4, 0xd2, 0x40, 0xc2, 0xca, 
-	0xb2, 0xe0, 0x01, 0xd0, 0xe9, 0x5e, 0xc2, 0xca, 
-	0x22, 0xc9, 0xb2, 0xa0, 0x22, 0x48, 0xd0, 0x78, 
-	0x03, 0x50, 0xf9, 0x69, 0xd0, 0x7c, 0x01, 0x9d, 
-	0xf9, 0x69, 0xc2, 0x48, 0xb2, 0x60, 0xc2, 0xca, 
-	0xb2, 0xf0, 0x11, 0x82, 0x41, 0x81, 0x22, 0x06, 
-	0x11, 0x9f, 0x41, 0x81, 0x22, 0x86, 0x0f, 0xc5, 
-	0xc0, 0x84, 0x10, 0x8c, 0x10, 0x92, 0xd1, 0x8f, 
-	0x41, 0x82, 0x10, 0x9c, 0xc1, 0xdb, 0x11, 0xc1, 
-	0x21, 0xc3, 0x20, 0x87, 0xc1, 0xc2, 0x10, 0x82, 
-	0x20, 0x87, 0xc0, 0x42, 0x10, 0x43, 0x20, 0x81, 
-	0x10, 0x88, 0x22, 0x02, 0x10, 0x97, 0x01, 0xd0, 
-	0xe9, 0x46, 0xb0, 0x96, 0x10, 0x88, 0x22, 0x82, 
-	0xc0, 0x5c, 0x10, 0x48, 0xc0, 0x84, 0x10, 0x91, 
-	0x10, 0x86, 0x20, 0x42, 0xd0, 0x81, 0x41, 0x02, 
-	0x11, 0x02, 0x20, 0x44, 0x22, 0x01, 0x22, 0x81, 
-	0x02, 0xe4, 0xd2, 0x40, 0xc2, 0xca, 0xb2, 0xe0, 
-	0x01, 0xd0, 0xe9, 0x5d, 0xc2, 0xca, 0x22, 0xc9, 
-	0xb2, 0xa0, 0x22, 0x48, 0x11, 0x9f, 0x11, 0x83, 
-	0x22, 0x06, 0x11, 0x9c, 0x11, 0x83, 0x22, 0x86, 
-	0x0f, 0xc5, 0xd0, 0x41, 0x40, 0x44, 0x20, 0x55, 
-	0x10, 0x62, 0xf9, 0x6f, 0x01, 0xb5, 0xd4, 0x00, 
-	0xc2, 0x9f, 0xc2, 0x1f, 0x22, 0x80, 0xe1, 0x30, 
-	0x0f, 0x11, 0xf9, 0x51, 0x90, 0x38, 0x80, 0x3f, 
-	0x00, 0x1b, 0xf9, 0x51, 0x00, 0x27, 0xd0, 0x04, 
-	0x70, 0x40, 0x30, 0x71, 0xf9, 0x51, 0xb0, 0x3c, 
-	0x70, 0x40, 0x30, 0x5d, 0xf9, 0x51, 0xb0, 0x08, 
-	0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0x10, 0x63, 
-	0xe5, 0x5d, 0x02, 0x20, 0xd0, 0x01, 0xa0, 0x37, 
-	0x00, 0x26, 0xd0, 0x24, 0x70, 0x40, 0xb0, 0x7f, 
-	0x60, 0x40, 0xb0, 0x08, 0x70, 0x40, 0xb0, 0x41, 
-	0x60, 0x40, 0x00, 0x26, 0xd0, 0x30, 0x70, 0x40, 
-	0xb0, 0x7f, 0x60, 0x40, 0xb0, 0x30, 0xd0, 0x40, 
-	0x60, 0x40, 0xb0, 0x3c, 0x6c, 0x40, 0xb0, 0x3c, 
-	0x67, 0x40, 0x00, 0x33, 0xdf, 0xb0, 0xe0, 0x36, 
-	0x00, 0x26, 0xd0, 0x1c, 0x70, 0x40, 0xb0, 0x7f, 
-	0x60, 0x40, 0xb0, 0x3c, 0x70, 0x40, 0xb0, 0x41, 
-	0x60, 0x40, 0x08, 0x20, 0xdf, 0x00, 0x80, 0x35, 
-	0xc0, 0x3c, 0x10, 0x08, 0xa0, 0x0a, 0xa0, 0x27, 
-	0xa0, 0x1b, 0xdf, 0x5c, 0x01, 0xa0, 0xd0, 0x00, 
-	0xa0, 0x38, 0x80, 0x3f, 0x80, 0x34, 0x80, 0x3f, 
-	0x03, 0xbb, 0xd8, 0x1e, 0xcf, 0x95, 0x82, 0x34, 
-	0x80, 0x3f, 0x03, 0xe8, 0xd0, 0x00, 0x1f, 0xa3, 
-	0xe9, 0x55, 0x1f, 0xa0, 0xe9, 0x55, 0x03, 0xea, 
-	0xd0, 0x00, 0x00, 0x21, 0xdf, 0x86, 0xe0, 0x3c, 
-	0x89, 0x78, 0x89, 0x37, 0x00, 0xee, 0xd0, 0x14, 
-	0x76, 0x00, 0xd0, 0x30, 0x76, 0x40, 0x26, 0x58, 
-	0xd6, 0xd9, 0x00, 0xee, 0xd0, 0x20, 0x75, 0x40, 
-	0xd0, 0x1c, 0x71, 0x40, 0xd0, 0x20, 0x71, 0x00, 
-	0xd0, 0x24, 0x70, 0x80, 0xc4, 0x02, 0xd0, 0x28, 
-	0x70, 0xc0, 0x00, 0x21, 0xd0, 0x10, 0x72, 0x00, 
-	0x93, 0x90, 0xd4, 0x81, 0x13, 0x96, 0x43, 0x92, 
-	0x34, 0x8e, 0x00, 0x22, 0xd1, 0xa4, 0x71, 0x86, 
-	0xde, 0x40, 0x7e, 0x79, 0xd0, 0x18, 0x70, 0x40, 
-	0xb0, 0x41, 0xf5, 0x58, 0xd3, 0x42, 0x50, 0x4d, 
-	0x60, 0x40, 0x10, 0x60, 0xe5, 0x62, 0xd0, 0x54, 
-	0x70, 0x01, 0xb0, 0x3c, 0x60, 0x01, 0x04, 0x2d, 
-	0xd0, 0x30, 0xe0, 0x36, 0x00, 0x22, 0xd0, 0x60, 
-	0x71, 0xc1, 0xd0, 0x4f, 0x41, 0xc1, 0x04, 0x20, 
-	0xd0, 0x28, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, 
-	0x04, 0x22, 0xd0, 0x18, 0xd3, 0x44, 0x72, 0x8d, 
-	0x12, 0xa0, 0xe8, 0x36, 0xc0, 0x47, 0x10, 0x5d, 
-	0x30, 0x4e, 0xf8, 0x36, 0xb2, 0x3e, 0x60, 0x4d, 
-	0x00, 0xed, 0xd0, 0x48, 0x70, 0x01, 0xde, 0x45, 
-	0x50, 0x39, 0x00, 0x1b, 0xf9, 0x44, 0xb0, 0x01, 
-	0x00, 0x1c, 0xf9, 0x47, 0xb0, 0x04, 0x60, 0x01, 
-	0xd0, 0x40, 0x62, 0x81, 0xce, 0x4a, 0xd0, 0x43, 
-	0x41, 0xc1, 0xd0, 0x58, 0x61, 0xc1, 0x90, 0x43, 
-	0x00, 0xe0, 0xd0, 0x28, 0x70, 0x00, 0x10, 0x1f, 
-	0x20, 0x40, 0xb1, 0xc1, 0xf5, 0x54, 0x00, 0x21, 
-	0xd0, 0x08, 0x60, 0x40, 0x00, 0xe6, 0xd0, 0x40, 
-	0x70, 0x41, 0xd2, 0x94, 0x60, 0x4a, 0x04, 0x2c, 
-	0xd0, 0x08, 0x01, 0x90, 0xf8, 0x36, 0x04, 0x2d, 
-	0xd0, 0x30, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, 
-	0xc0, 0x47, 0x10, 0x5d, 0x30, 0x4e, 0xf9, 0x41, 
-	0x90, 0x43, 0x00, 0xe0, 0xd0, 0x28, 0x70, 0x00, 
-	0x20, 0x40, 0x00, 0x21, 0xd0, 0x08, 0x60, 0x40, 
-	0x00, 0x26, 0xd0, 0x74, 0x70, 0x01, 0xb0, 0x3f, 
-	0x60, 0x01, 0x00, 0xed, 0xd0, 0x48, 0x70, 0x41, 
-	0x00, 0x5e, 0xf9, 0x4b, 0x00, 0x21, 0xd0, 0x00, 
-	0x73, 0x80, 0xd4, 0x81, 0x34, 0x8e, 0x00, 0x34, 
-	0xd3, 0x70, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, 
-	0xd1, 0x88, 0xd1, 0xc8, 0x01, 0x1b, 0xe9, 0x39, 
-	0x11, 0x9f, 0x11, 0xdf, 0xd4, 0x80, 0xd3, 0x81, 
-	0xe1, 0x43, 0x00, 0xed, 0xd0, 0x08, 0x70, 0x00, 
-	0x00, 0x10, 0xf9, 0x37, 0x0c, 0x1f, 0xf9, 0x36, 
-	0x13, 0xa1, 0xe9, 0x43, 0xbe, 0x7c, 0x00, 0x69, 
-	0xd2, 0x54, 0x12, 0x48, 0xc0, 0x39, 0x30, 0x18, 
-	0xe5, 0x4b, 0xd2, 0x70, 0x72, 0x49, 0x22, 0x79, 
-	0x00, 0x21, 0xd0, 0x00, 0x63, 0x80, 0x04, 0x24, 
-	0xd0, 0x38, 0x02, 0x10, 0xe9, 0x56, 0xd0, 0x41, 
-	0x51, 0x41, 0xe0, 0x36, 0x15, 0x61, 0xe8, 0x36, 
-	0xd5, 0x80, 0xd3, 0x00, 0xd3, 0x40, 0x04, 0x28, 
-	0xd0, 0x18, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, 
-	0x00, 0x21, 0xd0, 0x18, 0x73, 0x00, 0xb0, 0x04, 
-	0x73, 0x80, 0xd2, 0x80, 0xb0, 0x38, 0x72, 0xc0, 
-	0x31, 0x0d, 0xc0, 0x0e, 0x10, 0x0b, 0x10, 0x20, 
-	0xe9, 0x42, 0xf5, 0x3f, 0x22, 0x8d, 0x10, 0x01, 
-	0x13, 0x5f, 0xe1, 0x3b, 0x33, 0x8b, 0x15, 0x61, 
-	0xf9, 0x49, 0x00, 0x21, 0xd0, 0x64, 0x70, 0x41, 
-	0x33, 0x81, 0x03, 0xd0, 0xe9, 0x4c, 0x20, 0x0b, 
-	0x13, 0xdf, 0x12, 0xc1, 0x13, 0xe0, 0xf9, 0x49, 
-	0x10, 0x03, 0xc0, 0x50, 0x10, 0x4b, 0x13, 0x0b, 
-	0x23, 0x00, 0x13, 0x20, 0xe9, 0x5c, 0xf5, 0x59, 
-	0x22, 0x81, 0x13, 0x01, 0x10, 0x5f, 0xe1, 0x55, 
-	0x12, 0x99, 0x12, 0x87, 0x21, 0x0a, 0x00, 0xa0, 
-	0xd2, 0x80, 0xc3, 0x0a, 0x03, 0x90, 0xe9, 0x66, 
-	0x22, 0x82, 0x23, 0x03, 0x10, 0x81, 0x10, 0xc1, 
-	0x13, 0x9f, 0x13, 0xa0, 0xed, 0x62, 0xc0, 0x8a, 
-	0xc0, 0xcc, 0x04, 0x26, 0xd0, 0x38, 0xe0, 0x36, 
-	0x15, 0x61, 0xf9, 0x3d, 0x07, 0x32, 0xd0, 0x00, 
-	0x30, 0x03, 0xed, 0x3d, 0xc0, 0x03, 0x10, 0x1d, 
-	0x30, 0xc0, 0xc0, 0x02, 0x10, 0x1d, 0x30, 0x80, 
-	0xe1, 0x32, 0x10, 0x94, 0x10, 0xd4, 0x00, 0x21, 
-	0xd0, 0x20, 0x73, 0x00, 0xc5, 0x8c, 0xd3, 0x4e, 
-	0x01, 0x1b, 0xe9, 0x48, 0x13, 0x1f, 0xd3, 0x4f, 
-	0x43, 0x4c, 0x13, 0x1c, 0xc0, 0x0c, 0x10, 0x03, 
-	0x20, 0x0c, 0xc0, 0x40, 0x10, 0x42, 0x20, 0x40, 
-	0x10, 0x46, 0x20, 0x4d, 0x10, 0x42, 0x2e, 0x41, 
-	0x10, 0x5c, 0x10, 0x43, 0x00, 0x59, 0xe9, 0x5b, 
-	0x01, 0x69, 0xd0, 0x20, 0x30, 0x40, 0x22, 0x41, 
-	0x04, 0x28, 0xd0, 0x18, 0xe0, 0x36, 0x50, 0x00, 
-	0x2c, 0x14, 0xd0, 0x34, 0x63, 0x00, 0xd0, 0x38, 
-	0x72, 0xc0, 0xc0, 0x51, 0x10, 0x5c, 0x30, 0x4b, 
-	0x10, 0x44, 0xd4, 0xc0, 0xd5, 0x00, 0xc0, 0x18, 
-	0x30, 0x39, 0xed, 0x5f, 0xd4, 0xd0, 0xc5, 0x01, 
-	0xd0, 0x18, 0x70, 0x00, 0x0c, 0x1f, 0xe9, 0x48, 
-	0x10, 0x20, 0xfd, 0x48, 0xd4, 0xc0, 0xd5, 0x00, 
-	0x10, 0x22, 0xe5, 0x4e, 0xd4, 0xc0, 0xbc, 0x30, 
-	0xd5, 0x00, 0xb5, 0x10, 0xb0, 0x3f, 0xf9, 0x52, 
-	0x3c, 0x01, 0x3c, 0x01, 0x02, 0x1f, 0xe9, 0x5f, 
-	0x00, 0xa8, 0xd3, 0xc0, 0xd3, 0xa4, 0x00, 0xaa, 
-	0xd0, 0x10, 0x70, 0x4f, 0xb3, 0xfc, 0x60, 0x40, 
-	0xb0, 0x3c, 0xb3, 0x81, 0xed, 0x59, 0x00, 0x21, 
-	0xd0, 0x28, 0x70, 0x00, 0x10, 0x20, 0xf9, 0x69, 
-	0x02, 0x1f, 0xf9, 0x6a, 0x90, 0x10, 0x00, 0x1e, 
-	0xe9, 0x6a, 0xb1, 0x7c, 0x04, 0x2a, 0xd0, 0x18, 
-	0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 
-	0x01, 0x5e, 0xf9, 0x35, 0x01, 0x50, 0xe9, 0x35, 
-	0xb1, 0x78, 0xd2, 0x00, 0x01, 0x5c, 0xf9, 0x5f, 
-	0xc0, 0x18, 0x30, 0x39, 0xed, 0x5f, 0x11, 0x9f, 
-	0xce, 0x58, 0xc2, 0x59, 0x00, 0xaa, 0xd2, 0x10, 
-	0x14, 0x82, 0x22, 0x12, 0xc0, 0x0c, 0x10, 0x1f, 
-	0x10, 0x03, 0x22, 0x00, 0x70, 0x48, 0x03, 0x10, 
-	0xe9, 0x4c, 0xb2, 0x38, 0xbe, 0x60, 0xb2, 0x60, 
-	0x2e, 0x41, 0x10, 0x5f, 0x00, 0x59, 0xe9, 0x53, 
-	0x01, 0x69, 0xd0, 0x3c, 0x30, 0x40, 0x22, 0x41, 
-	0x13, 0x41, 0x2e, 0x4d, 0x13, 0x5d, 0x13, 0x43, 
-	0x22, 0x4d, 0x14, 0xe0, 0xe9, 0x5f, 0x33, 0x0b, 
-	0x13, 0x04, 0x2c, 0x0c, 0x35, 0x0c, 0xc3, 0x46, 
-	0xc3, 0x87, 0x04, 0x62, 0xd0, 0x10, 0x15, 0x62, 
-	0xfc, 0x36, 0x04, 0x60, 0xd0, 0x10, 0xe0, 0x36, 
-	0x00, 0x22, 0xd0, 0x74, 0x74, 0x01, 0xb0, 0x7c, 
-	0x74, 0x41, 0xb0, 0x7c, 0x71, 0x41, 0xd1, 0x18, 
-	0xc0, 0x10, 0x10, 0x1c, 0xb0, 0x16, 0xf9, 0x45, 
-	0x00, 0x24, 0xd0, 0x20, 0x30, 0x11, 0xf9, 0x45, 
-	0xb1, 0x70, 0x01, 0x50, 0xf9, 0x45, 0xb1, 0x20, 
-	0x14, 0x41, 0xc0, 0x90, 0x00, 0x2b, 0xd0, 0xd0, 
-	0x01, 0x50, 0xe9, 0x4b, 0xc0, 0xd0, 0x00, 0x35, 
-	0xdc, 0x00, 0x20, 0x11, 0x10, 0x1f, 0xa0, 0x1c, 
-	0x00, 0x21, 0xd0, 0x2c, 0x70, 0x00, 0x10, 0x05, 
-	0x51, 0x40, 0xd0, 0x1c, 0x61, 0x40, 0xd0, 0x20, 
-	0x61, 0x00, 0xd0, 0x24, 0x60, 0x80, 0xd0, 0x28, 
-	0x60, 0xc0, 0x04, 0x2d, 0xd0, 0x30, 0x00, 0x22, 
-	0xd0, 0x64, 0xb1, 0x81, 0x61, 0x81, 0xe0, 0x36, 
-	0x90, 0x50, 0xd0, 0x3c, 0x10, 0x41, 0x60, 0x40, 
-	0x15, 0x62, 0xfd, 0x3d, 0xc0, 0x10, 0x10, 0x1e, 
-	0x10, 0x07, 0x21, 0x00, 0x10, 0x16, 0x34, 0x00, 
-	0xc0, 0x90, 0xd3, 0x40, 0x00, 0x24, 0xd3, 0xc0, 
-	0x04, 0x23, 0xd0, 0x18, 0x01, 0x9f, 0xe8, 0x36, 
-	0xd0, 0x54, 0x70, 0x41, 0x73, 0x41, 0x04, 0x2e, 
-	0xd0, 0x28, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, 
-	0x00, 0xef, 0xd3, 0x30, 0x73, 0x0c, 0xd0, 0x0c, 
-	0x70, 0x00, 0xc0, 0x40, 0x13, 0x24, 0xf5, 0x42, 
-	0x13, 0x22, 0xe9, 0x41, 0xe5, 0x43, 0xd3, 0x00, 
-	0x10, 0x22, 0xf9, 0x41, 0xd0, 0x01, 0xd0, 0x43, 
-	0xd3, 0x01, 0x21, 0x00, 0xd3, 0x40, 0x03, 0x10, 
-	0xf9, 0x47, 0xd3, 0x40, 0xe1, 0x61, 0x00, 0x23, 
-	0xd0, 0x00, 0x10, 0x61, 0xe9, 0x50, 0xb0, 0x33, 
-	0x10, 0x63, 0xe9, 0x50, 0x00, 0x22, 0xd0, 0x1a, 
-	0xc3, 0xc0, 0xd2, 0xc0, 0x00, 0x10, 0xe9, 0x55, 
-	0x22, 0xd0, 0x10, 0x1f, 0x14, 0x01, 0x10, 0x20, 
-	0xed, 0x52, 0x14, 0x18, 0x12, 0xd8, 0xc0, 0x8b, 
-	0x32, 0xd0, 0x12, 0xc3, 0x33, 0x4b, 0x13, 0x47, 
-	0x21, 0x0d, 0x04, 0x23, 0xd0, 0x18, 0xe0, 0x36, 
-	0x00, 0x24, 0xd0, 0x30, 0xd0, 0x40, 0x60, 0x40, 
-	0xd3, 0xc7, 0x43, 0xc4, 0x31, 0x0f, 0xd5, 0xd4, 
-	0x25, 0xcf, 0x15, 0xc4, 0x10, 0xdf, 0xc2, 0xc6, 
-	0xc3, 0x07, 0x11, 0x81, 0xb1, 0x3b, 0x15, 0x64, 
-	0xe9, 0x47, 0x10, 0xdf, 0x12, 0xc1, 0x11, 0x81, 
-	0x11, 0xc1, 0xb1, 0x3f, 0xb5, 0xf8, 0x90, 0x10, 
-	0x00, 0x16, 0xf9, 0x5e, 0xb5, 0xfc, 0xd0, 0x20, 
-	0x40, 0x39, 0x2e, 0x4b, 0x22, 0x4c, 0x12, 0x20, 
-	0xe9, 0x59, 0x20, 0x39, 0x00, 0x1b, 0xe9, 0x59, 
-	0x2c, 0x13, 0x35, 0x13, 0x0e, 0x5a, 0xf9, 0x59, 
-	0xb2, 0x38, 0x02, 0xe3, 0xd0, 0x00, 0x0e, 0x5a, 
-	0xe9, 0x5e, 0x2e, 0x40, 0x01, 0xee, 0xd2, 0x80, 
-	0x42, 0x84, 0xc0, 0x03, 0x30, 0x02, 0xf5, 0x6b, 
-	0x31, 0x0a, 0x12, 0x98, 0x20, 0x03, 0xf5, 0x69, 
-	0x12, 0x9f, 0x12, 0x87, 0x51, 0x0a, 0x00, 0x34, 
-	0xd4, 0xf0, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, 
-	0xd3, 0xc7, 0x43, 0xc4, 0x15, 0x61, 0xf9, 0x48, 
-	0x10, 0xc1, 0xd5, 0xe0, 0xd1, 0x80, 0xd1, 0xc0, 
-	0x31, 0x0f, 0x13, 0xe1, 0xe9, 0x3c, 0xd3, 0xc0, 
-	0x00, 0x24, 0xd0, 0x30, 0x63, 0xc0, 0x25, 0xcf, 
-	0x15, 0xc2, 0xd0, 0x03, 0x40, 0x16, 0x25, 0xc0, 
-	0x15, 0xc2, 0x15, 0x81, 0x35, 0x91, 0xe1, 0x5c, 
-	0x00, 0x24, 0xd0, 0x30, 0x63, 0xc0, 0x01, 0x50, 
-	0xe9, 0x54, 0x15, 0xa0, 0xf9, 0x55, 0x00, 0x24, 
-	0xd0, 0x34, 0x70, 0x00, 0x10, 0x20, 0xe9, 0x55, 
-	0xd3, 0xc0, 0x31, 0x0f, 0xd5, 0xfc, 0x25, 0xcf, 
-	0x15, 0xc3, 0x14, 0xa0, 0xe9, 0x5c, 0xb5, 0xfc, 
-	0x00, 0x34, 0xd4, 0xf0, 0xe0, 0x36, 0x50, 0x00, 
-	0xc4, 0x91, 0x34, 0x96, 0xed, 0x34, 0xd4, 0x80, 
-	0x14, 0x84, 0xb3, 0xc1, 0xe5, 0x41, 0xc0, 0x52, 
-	0x10, 0x5e, 0x34, 0x81, 0xb3, 0xc1, 0xe5, 0x41, 
-	0xc0, 0x52, 0x10, 0x5c, 0x24, 0x81, 0xb3, 0xc1, 
-	0xe5, 0x37, 0x02, 0xe8, 0xd0, 0x00, 0xb4, 0xb0, 
-	0x14, 0x9b, 0x00, 0x24, 0xd0, 0x60, 0x30, 0x52, 
-	0xed, 0x4a, 0x24, 0x81, 0x20, 0x12, 0xa0, 0x1c, 
-	0x10, 0x8a, 0x50, 0x83, 0xa0, 0x96, 0xa1, 0x50, 
-	0xa1, 0x11, 0xc0, 0x52, 0xd4, 0x84, 0x10, 0x6c, 
-	0xed, 0x56, 0xd4, 0x81, 0xd1, 0x00, 0xb1, 0x17, 
-	0x00, 0x23, 0xd1, 0x40, 0xc2, 0xb9, 0x22, 0x86, 
-	0x12, 0x20, 0xf9, 0x66, 0x02, 0xe3, 0xd0, 0x40, 
-	0x02, 0x9a, 0xe9, 0x63, 0x22, 0x81, 0x02, 0x5a, 
-	0xe9, 0x66, 0x22, 0x41, 0x75, 0xd7, 0xc3, 0xd7, 
-	0xd0, 0xd7, 0x00, 0x21, 0xd0, 0xb6, 0x8b, 0x38, 
-	0x00, 0x33, 0xdd, 0x08, 0xe0, 0x36, 0x50, 0x00, 
-	0xd0, 0x7c, 0x60, 0x01, 0xae, 0x52, 0xd0, 0x60, 
-	0x40, 0x79, 0x00, 0x13, 0xe8, 0xc9, 0xa2, 0x94, 
-	0x22, 0x86, 0x13, 0xe0, 0xe4, 0xd0, 0x13, 0xc1, 
-	0x15, 0x62, 0xfc, 0xd1, 0x13, 0xc1, 0xe0, 0xd1, 
-	0xc3, 0xd7, 0x03, 0xd9, 0xe8, 0xd4, 0x22, 0x8d, 
-	0x15, 0x62, 0xfc, 0xda, 0x03, 0xda, 0xe8, 0xda, 
-	0x22, 0x8d, 0x22, 0x8d, 0xce, 0x4a, 0x22, 0x86, 
-	0x00, 0x14, 0xe8, 0xe0, 0xa2, 0x53, 0x22, 0x47, 
-	0x03, 0xd1, 0xe8, 0xe8, 0x22, 0x4e, 0x15, 0x62, 
-	0xfc, 0xe8, 0x03, 0xd2, 0xe8, 0xe8, 0x22, 0x4e, 
-	0x12, 0x20, 0xe9, 0x09, 0x20, 0x79, 0x00, 0x5b, 
-	0xe8, 0xf4, 0x15, 0x20, 0xfc, 0xf1, 0x2c, 0x13, 
-	0x35, 0x13, 0x0e, 0x5b, 0xe8, 0xf4, 0xb2, 0x38, 
-	0x02, 0x9a, 0xe8, 0xfb, 0x70, 0x08, 0xd0, 0x7c, 
-	0x42, 0x81, 0x22, 0x98, 0x22, 0x80, 0x02, 0x5a, 
-	0xe9, 0x11, 0x70, 0x08, 0xd0, 0x78, 0x42, 0x41, 
-	0x22, 0x59, 0x10, 0x1f, 0x22, 0x40, 0x00, 0x19, 
-	0xe9, 0x11, 0x01, 0x69, 0xd0, 0x7c, 0x32, 0x41, 
-	0xe1, 0x11, 0x02, 0xe3, 0xd0, 0x40, 0x02, 0x9a, 
-	0xe9, 0x0e, 0x22, 0x81, 0x02, 0x5a, 0xe9, 0x11, 
-	0x22, 0x41, 0x0e, 0x5a, 0xe9, 0x15, 0xce, 0x4a, 
-	0x3e, 0x46, 0x0f, 0x87, 0xdd, 0x48, 0xe1, 0x19, 
-	0xdd, 0x40, 0xdc, 0xc8, 0xdd, 0x3c, 0x7d, 0x34, 
-	0x1d, 0x19, 0x3d, 0x35, 0x4d, 0x33, 0x4c, 0xec, 
-	0x3d, 0x33, 0xf9, 0x17, 0x0f, 0xc5, 0x50, 0x00, 
-	0xd0, 0x39, 0xd0, 0x35, 0xd0, 0x1d, 0xd0, 0x2d, 
-	0xd0, 0x3f, 0xd0, 0x2e, 0xd0, 0x3c, 0xd0, 0x37, 
-	0xd0, 0x33, 0xd0, 0x19, 0xd0, 0x33, 0xd0, 0x2e, 
-	0xd0, 0x3d, 0xd0, 0x3e, 0xd0, 0x27, 0xd0, 0x3e, 
-	0xd0, 0x3a, 0xd0, 0x2f, 0xd0, 0x32, 0x00, 0x00, 
-	0x00, 0x00, 0x46, 0x44, 0x00, 0x00, 0x10, 0x00, 
-	0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x50, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 
-	0x00, 0x00, 0x02, 0xd0, 0x00, 0x00, 0x02, 0xd0, 
-	0x00, 0x00, 0x00, 0x1e, 0x00, 0x05, 0x46, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x90, 0x85, 
-	0x00, 0x00, 0xa6, 0xee, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x02, 0xd0, 0x00, 0x00, 0x01, 0xe0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x08, 0xa0, 
-	0x00, 0x08, 0x08, 0x28, 0x00, 0x08, 0x88, 0x68, 
-	0x00, 0x08, 0xa0, 0x98, 0x00, 0x08, 0x88, 0x68, 
-	0x00, 0x08, 0x28, 0x98, 0x00, 0x08, 0xac, 0xf4, 
-	0x00, 0x08, 0xb8, 0x7c, 0x00, 0x02, 0x02, 0x88, 
-	0x00, 0x02, 0x08, 0x22, 0x00, 0x02, 0x88, 0xaa, 
-	0x00, 0x02, 0x22, 0xaa, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x04, 0x24, 
-	0x00, 0x04, 0x04, 0x24, 0x00, 0x04, 0x28, 0x6c, 
-	0x00, 0x04, 0x28, 0x6c, 0x00, 0x01, 0x10, 0x44, 
-	0x00, 0x01, 0x20, 0x44, 0x00, 0x01, 0x11, 0xaa, 
-	0x00, 0x01, 0x88, 0x55, 0x00, 0x01, 0x44, 0xaa, 
-	0x00, 0x01, 0x44, 0x55, 0x00, 0x20, 0x80, 0xa0, 
-	0x00, 0x20, 0x80, 0xc0, 0x00, 0x20, 0x20, 0xa0, 
-	0x00, 0x20, 0x40, 0xc0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 
-	0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 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, 0x10, 0x13, 0x16, 
-	0x1a, 0x1b, 0x1d, 0x22, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 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, 0x10, 0x13, 0x16, 
-	0x1a, 0x1b, 0x1d, 0x22, 0x10, 0x10, 0x16, 0x18, 
-	0x1b, 0x1d, 0x22, 0x25, 0x13, 0x16, 0x1a, 0x1b, 
-	0x1d, 0x22, 0x22, 0x26, 0x16, 0x16, 0x1a, 0x1b, 
-	0x1d, 0x22, 0x25, 0x28, 0x16, 0x1a, 0x1b, 0x1d, 
-	0x20, 0x23, 0x28, 0x30, 0x1a, 0x1b, 0x1d, 0x20, 
-	0x23, 0x28, 0x30, 0x3a, 0x1a, 0x1b, 0x1d, 0x22, 
-	0x26, 0x2e, 0x38, 0x45, 0x1b, 0x1d, 0x23, 0x26, 
-	0x2e, 0x38, 0x45, 0x53, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xd6, 0x00, 
-	0x00, 0x1b, 0x08, 0x00, 0x00, 0x1f, 0xde, 0x00, 
-	0x00, 0x00, 0x50, 0x00, 0x00, 0x08, 0x39, 0x00, 
-	0x00, 0x10, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 
-	0x00, 0x00, 0x00, 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, 0x1e, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 
-	0x05, 0x28, 0x20, 0x01, 0x00, 0x00, 0x01, 0xe0, 
-	0x71, 0x01, 0x00, 0x68, 0xe0, 0x7f, 0xb0, 0x7f, 
-	0x60, 0x40, 0xe0, 0x1d, 0x90, 0x10, 0xb4, 0x81, 
-	0xe8, 0xc0, 0xe0, 0xc2, 0x90, 0x18, 0x00, 0x8a, 
-	0x70, 0xc0, 0x0f, 0x87, 0xe3, 0xe8, 0xc0, 0x00, 
-	0x70, 0x40, 0xe0, 0x01, 0xe0, 0x86, 0x00, 0x26, 
-	0xd0, 0x28, 0xe0, 0x0e, 0xd0, 0x0e, 0x0f, 0x0b, 
-	0x70, 0x1d, 0xe0, 0x67, 0x0f, 0x87, 0x0f, 0x87, 
-	0x0f, 0x87, 0x0f, 0x87, 0x0f, 0x87, 0x02, 0x20, 
-	0xd0, 0x01, 0xe0, 0x25, 0x0f, 0x45, 0x6f, 0x81, 
-	0xdf, 0xa6, 0xe0, 0x36, 0xe1, 0x30, 0xa0, 0x37, 
-	0xc0, 0x00, 0xe0, 0x26, 0x00, 0x33, 0xde, 0xc8, 
-	0xe0, 0x32, 0x0f, 0xc5, 0x0f, 0x87, 0x00, 0x27, 
-	0xd0, 0x4c, 0xe0, 0x21, 0x00, 0x33, 0xdf, 0x28, 
-	0x00, 0x27, 0xd0, 0x56, 0x60, 0x01, 0xe0, 0x2d, 
-	0x03, 0xa0, 0xd0, 0x41, 0xa0, 0x78, 0x00, 0x60, 
-	0xd0, 0x41, 0xa0, 0x77, 0x00, 0x22, 0xd0, 0x58, 
-	0xa0, 0x76, 0x00, 0x21, 0xd0, 0x7c, 0x00, 0x4a, 
-	0xd0, 0x72, 0x70, 0x40, 0x00, 0x06, 0x0f, 0x87, 
-	0x00, 0x22, 0xdc, 0xf8, 0xf0, 0x4a, 0xe1, 0x70, 
-	0x07, 0xef, 0xdd, 0xbf, 0x4f, 0x36, 0x1d, 0x99, 
-	0x4d, 0x80, 0x10, 0x18, 0xdd, 0x50, 0x60, 0x35, 
-	0xdd, 0x72, 0xdd, 0x10, 0x3d, 0xb4, 0xec, 0x57, 
-	0x2d, 0x36, 0x1d, 0x03, 0xbd, 0x04, 0xe4, 0x2b, 
-	0x01, 0x46, 0x00, 0x06, 0xac, 0xf6, 0x80, 0x3f, 
-	0x0d, 0x0a, 0x10, 0x02, 0x7d, 0x40, 0x10, 0x1e, 
-	0xb0, 0x20, 0xbc, 0xe0, 0x00, 0x06, 0x00, 0xc6, 
-	0xe0, 0x52, 0xb7, 0x60, 0xb7, 0x60, 0xc0, 0x5d, 
-	0x30, 0x5f, 0xe4, 0x72, 0xc7, 0x5e, 0x00, 0xed, 
-	0xd0, 0x28, 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 
-	0xc0, 0x1d, 0x30, 0x1c, 0xf8, 0x7e, 0x00, 0x21, 
-	0xd0, 0x01, 0x00, 0x26, 0xd0, 0x78, 0xa0, 0x38, 
-	0x80, 0x3f, 0x70, 0x01, 0xb0, 0x3f, 0x60, 0x01, 
-	0x0f, 0x87, 0x80, 0x34, 0x03, 0xef, 0xd8, 0x3f, 
-	0xa8, 0x38, 0x01, 0x35, 0xdc, 0x33, 0xe0, 0x46, 
-	0xc0, 0x1c, 0xe4, 0xa5, 0x97, 0x2e, 0x30, 0x1c, 
-	0xe8, 0x8e, 0x00, 0x21, 0xd0, 0x00, 0xa0, 0x38, 
-	0xc0, 0x5d, 0x00, 0x23, 0xd0, 0x00, 0x30, 0x40, 
-	0x30, 0x5e, 0xe4, 0x99, 0x20, 0x5e, 0xc0, 0x01, 
-	0x30, 0x1c, 0xec, 0xa4, 0xe0, 0x9d, 0x20, 0x5f, 
-	0xc0, 0x1c, 0x30, 0x01, 0xf4, 0xa5, 0xc0, 0x1c, 
-	0x30, 0x1d, 0xec, 0xa4, 0xe4, 0xa5, 0x90, 0x38, 
-	0x00, 0x1b, 0xe8, 0xa5, 0xa0, 0x66, 0xb1, 0x3f, 
-	0xe4, 0xb3, 0xe8, 0xb1, 0xc0, 0x4b, 0x30, 0x44, 
-	0xf8, 0xb3, 0x60, 0x45, 0xb1, 0x7c, 0x01, 0x20, 
-	0xd0, 0x00, 0xa0, 0x05, 0x80, 0x40, 0x72, 0xc5, 
-	0x00, 0x06, 0x90, 0x55, 0xd0, 0x01, 0x00, 0x40, 
-	0xa0, 0x55, 0x0f, 0x87, 0x01, 0x46, 0x00, 0x06, 
-	0x03, 0xef, 0xd0, 0x3f, 0xa0, 0x38, 0xb0, 0x01, 
-	0xa0, 0x37, 0x80, 0x3f, 0x82, 0x34, 0x80, 0x3f, 
-	0xf2, 0x1a, 0x80, 0x34, 0x80, 0x3f, 0xf2, 0x1a, 
-	0xd8, 0x00, 0xd8, 0x40, 0xd8, 0x80, 0xd8, 0xc0, 
-	0xd9, 0x00, 0xd9, 0x40, 0xd9, 0x80, 0xd9, 0xc0, 
-	0xda, 0x00, 0xda, 0x40, 0xda, 0x80, 0xda, 0xc0, 
-	0xdb, 0x00, 0xdb, 0x40, 0xdb, 0x80, 0xdb, 0xc0, 
-	0xdc, 0x00, 0xdc, 0x40, 0xdc, 0x80, 0xdc, 0xc0, 
-	0xdd, 0x00, 0xdd, 0x40, 0xdd, 0x80, 0xdd, 0xc0, 
-	0xde, 0x00, 0xde, 0x40, 0xde, 0x80, 0xde, 0xc0, 
-	0xdf, 0x00, 0xdf, 0x40, 0xdf, 0x80, 0xdf, 0xc0, 
-	0xde, 0x80, 0xde, 0xc1, 0x00, 0x28, 0xd0, 0x60, 
-	0x6e, 0x81, 0x80, 0x00, 0x80, 0x05, 0x00, 0xe3, 
-	0xd1, 0x88, 0x00, 0x73, 0xd5, 0x80, 0x60, 0x06, 
-	0xb1, 0xbc, 0x00, 0xfa, 0xd0, 0x80, 0x60, 0x06, 
-	0x00, 0x26, 0xd0, 0x6c, 0x6e, 0x81, 0x04, 0x32, 
-	0xd2, 0x00, 0x00, 0xee, 0xd1, 0x94, 0x60, 0x06, 
-	0x00, 0xed, 0xd0, 0x50, 0x6e, 0x81, 0x00, 0x22, 
-	0xd0, 0x70, 0x6e, 0x81, 0x00, 0xee, 0xd0, 0x74, 
-	0x6e, 0x81, 0xd0, 0x4c, 0x6e, 0x81, 0xd0, 0x02, 
-	0x00, 0xef, 0xd0, 0x6c, 0x60, 0x01, 0xd0, 0x03, 
-	0x00, 0xef, 0xd0, 0x70, 0x60, 0x01, 0x00, 0xe0, 
-	0xd0, 0x48, 0xd0, 0x02, 0x60, 0x01, 0x00, 0x32, 
-	0xd6, 0xf0, 0xa0, 0x1c, 0x00, 0x21, 0xd0, 0x60, 
-	0xa0, 0x76, 0x00, 0x34, 0xd5, 0x48, 0x80, 0x3f, 
-	0x00, 0x23, 0xd0, 0x5c, 0x00, 0x4a, 0xd0, 0x72, 
-	0x70, 0x40, 0x00, 0x06, 0x00, 0x22, 0xd1, 0xa4, 
-	0x6e, 0xc6, 0xd0, 0x58, 0x6e, 0xc1, 0xd0, 0xc9, 
-	0x00, 0xed, 0xd0, 0x54, 0x60, 0xc1, 0x00, 0x22, 
-	0xd0, 0x40, 0x60, 0xc1, 0x00, 0x22, 0xd0, 0x60, 
-	0x60, 0xc1, 0x82, 0x34, 0x80, 0x3f, 0xd6, 0xd9, 
-	0x01, 0x20, 0xd6, 0x22, 0x16, 0x08, 0xd0, 0x5e, 
-	0xd0, 0x2c, 0x60, 0x40, 0xd0, 0x70, 0x01, 0x74, 
-	0xd6, 0x00, 0x60, 0x01, 0x00, 0x2b, 0xd4, 0x10, 
-	0x00, 0x27, 0xd4, 0x60, 0x00, 0x2b, 0xd0, 0x90, 
-	0xc0, 0xc2, 0xd1, 0x08, 0xd1, 0x44, 0xa1, 0x50, 
-	0x00, 0x21, 0xd0, 0xb6, 0xd0, 0xd7, 0x00, 0x29, 
-	0xd0, 0x04, 0x64, 0x00, 0xb0, 0x3c, 0x64, 0x40, 
-	0x80, 0x34, 0x80, 0x3f, 0xd0, 0x40, 0x00, 0x35, 
-	0xd0, 0x00, 0x60, 0x01, 0xd0, 0x48, 0x6e, 0x81, 
-	0xd0, 0x44, 0x6e, 0x81, 0x00, 0x64, 0xd1, 0x80, 
-	0x6e, 0x86, 0x01, 0x3c, 0xd2, 0x39, 0xe0, 0x46, 
-	0xd0, 0x00, 0xd0, 0x40, 0xd0, 0x80, 0xd0, 0xc0, 
-	0xd1, 0x00, 0xd1, 0x40, 0xd1, 0x80, 0xd1, 0xc0, 
-	0xd2, 0x00, 0xd2, 0x40, 0xd2, 0x80, 0xd2, 0xc0, 
-	0xd3, 0x00, 0xd3, 0x40, 0xd3, 0x80, 0xd3, 0xc0, 
-	0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0, 
-	0xd5, 0x00, 0xd5, 0x40, 0xd5, 0x80, 0xd5, 0xc0, 
-	0xd6, 0x00, 0xd6, 0x40, 0xd6, 0x80, 0xd6, 0xc0, 
-	0xd7, 0x00, 0xd7, 0x40, 0xd7, 0x80, 0xd7, 0xc0, 
-	0x0f, 0xc5, 0x50, 0x00, 0x01, 0x46, 0x00, 0x06, 
-	0xde, 0x80, 0xde, 0xc1, 0x03, 0x2f, 0xd0, 0x33, 
-	0xa0, 0x38, 0xb0, 0x01, 0xa0, 0x37, 0x80, 0x3f, 
-	0x08, 0x20, 0xdf, 0x00, 0x82, 0x34, 0x80, 0x3f, 
-	0x00, 0xee, 0xd0, 0x08, 0x77, 0xc0, 0xb0, 0x04, 
-	0x77, 0x80, 0xb0, 0x04, 0xc0, 0x5f, 0x30, 0x5e, 
-	0x60, 0x40, 0xd7, 0x00, 0xb7, 0x01, 0x80, 0x34, 
-	0x80, 0x3f, 0x00, 0x60, 0xd0, 0x80, 0x00, 0xec, 
-	0xd0, 0x40, 0x60, 0x81, 0xb0, 0x7c, 0x60, 0x81, 
-	0x00, 0xa0, 0xd0, 0x80, 0xb0, 0x74, 0x60, 0x81, 
-	0xb0, 0x7c, 0x60, 0x81, 0x00, 0x68, 0xd0, 0x80, 
-	0x6e, 0x82, 0x00, 0xef, 0xd0, 0x8c, 0x6e, 0x82, 
-	0x00, 0x06, 0xd0, 0x11, 0xa0, 0x38, 0x80, 0x3f, 
-	0x08, 0x20, 0xd0, 0x40, 0x10, 0x48, 0xa0, 0x4a, 
-	0xa0, 0x5b, 0x0c, 0x20, 0xd0, 0x00, 0x10, 0x08, 
-	0xa0, 0x27, 0xa0, 0x0a, 0x90, 0x4d, 0x0f, 0xff, 
-	0xd8, 0x1f, 0x40, 0x40, 0xa0, 0x4d, 0x80, 0x0a, 
-	0x80, 0x07, 0x80, 0x1b, 0x80, 0x27, 0x00, 0x60, 
-	0xd0, 0x00, 0xa0, 0x09, 0x80, 0x28, 0x01, 0x20, 
-	0xd0, 0x67, 0xa0, 0x69, 0x80, 0x2a, 0x82, 0x29, 
-	0x80, 0x6a, 0x84, 0x29, 0xd0, 0x54, 0x10, 0x4f, 
-	0xa0, 0x6a, 0x01, 0x20, 0xd0, 0x00, 0xa0, 0x29, 
-	0x80, 0x2b, 0x02, 0x30, 0xd0, 0x00, 0xa0, 0x38, 
-	0x80, 0x3f, 0x01, 0xb0, 0xd0, 0x10, 0xa0, 0x37, 
-	0x80, 0x3f, 0x02, 0x30, 0xd0, 0x01, 0xa0, 0x38, 
-	0x00, 0xea, 0xd0, 0x00, 0xd0, 0x4e, 0x0f, 0x0b, 
-	0x70, 0x40, 0x00, 0x06, 0x00, 0x21, 0xd0, 0x88, 
-	0x00, 0xe1, 0xd0, 0x60, 0x60, 0x81, 0x00, 0x2b, 
-	0xd0, 0x80, 0x00, 0xe0, 0xd0, 0x6c, 0x60, 0x81, 
-	0xb0, 0x7c, 0x00, 0x27, 0xd0, 0xa0, 0x60, 0x81, 
-	0xb0, 0x7c, 0xd0, 0x82, 0x60, 0x81, 0xb0, 0x7c, 
-	0xd0, 0x85, 0x60, 0x81, 0xb0, 0x7c, 0x03, 0xaa, 
-	0xd0, 0x98, 0x60, 0x81, 0xb0, 0x7c, 0x6e, 0x81, 
-	0x00, 0x27, 0xd0, 0x40, 0x6e, 0x81, 0xb0, 0x7c, 
-	0x6e, 0x81, 0xb0, 0x7c, 0x6e, 0x81, 0x00, 0x27, 
-	0xd1, 0x90, 0x6e, 0x86, 0x00, 0x21, 0xd1, 0xb8, 
-	0x6e, 0x86, 0x00, 0x66, 0xd1, 0xa0, 0xd0, 0x00, 
-	0x01, 0x26, 0xd0, 0x58, 0x30, 0x01, 0x60, 0x06, 
-	0x00, 0xed, 0xd1, 0xbc, 0x6e, 0x86, 0x00, 0xec, 
-	0xd1, 0xb8, 0x6e, 0x86, 0xb1, 0x84, 0x6e, 0x86, 
-	0x00, 0xee, 0xd1, 0x84, 0x70, 0x46, 0x00, 0x65, 
-	0xd1, 0x94, 0x60, 0x46, 0x00, 0x64, 0xd1, 0xbc, 
-	0x6e, 0x86, 0x00, 0x65, 0xd1, 0x80, 0x6e, 0x86, 
-	0xb1, 0xbc, 0x6e, 0x86, 0xb1, 0xbc, 0x6e, 0x86, 
-	0x00, 0xed, 0xd1, 0xa8, 0x6e, 0x86, 0xd0, 0x0e, 
-	0xb1, 0xbc, 0x60, 0x06, 0xb1, 0xbc, 0x60, 0x06, 
-	0x00, 0x65, 0xd1, 0xa4, 0x60, 0x06, 0x00, 0x28, 
-	0xd1, 0xa4, 0x6e, 0x86, 0x00, 0x27, 0xd1, 0x98, 
-	0x6e, 0x86, 0x00, 0x64, 0xd1, 0xa4, 0x6e, 0x86, 
-	0xd2, 0x01, 0x00, 0x64, 0xd0, 0x60, 0x62, 0x01, 
-	0x00, 0x64, 0xd1, 0x80, 0x70, 0x46, 0x6e, 0x86, 
-	0x00, 0xef, 0xd1, 0x98, 0x70, 0x86, 0x08, 0x20, 
-	0xd0, 0xcf, 0x30, 0xc1, 0xea, 0x42, 0xd0, 0x81, 
-	0x00, 0x21, 0xd1, 0xa8, 0x60, 0x86, 0x00, 0xed, 
-	0xd1, 0xa0, 0x6e, 0xc6, 0x00, 0x65, 0xd1, 0x98, 
-	0x6e, 0xc6, 0x00, 0x22, 0xd0, 0x00, 0xa0, 0x05, 
-	0x80, 0x40, 0x00, 0xc6, 0x01, 0x73, 0xd4, 0x3d, 
-	0xe0, 0x46, 0x50, 0x00, 0x08, 0x20, 0xd0, 0x00, 
-	0x5f, 0x00, 0x00, 0x64, 0xd0, 0x60, 0x70, 0xc1, 
-	0x00, 0xec, 0xd0, 0x40, 0x71, 0x81, 0xb0, 0x7c, 
-	0x71, 0xc1, 0xc0, 0x87, 0x30, 0x86, 0xf9, 0x83, 
-	0x10, 0xee, 0xe9, 0x76, 0x10, 0xe1, 0xe9, 0x76, 
-	0xe2, 0x57, 0x00, 0x63, 0xd0, 0xbf, 0x72, 0x06, 
-	0xb1, 0xbc, 0x41, 0x82, 0x02, 0x1b, 0xe9, 0x8d, 
-	0x72, 0x86, 0xb1, 0xbc, 0x41, 0x82, 0xd0, 0x75, 
-	0x30, 0x48, 0xe9, 0xfe, 0xb0, 0x7f, 0xea, 0x00, 
-	0x02, 0x1c, 0xe9, 0x96, 0x15, 0xa3, 0xea, 0x57, 
-	0x10, 0xf0, 0xe9, 0x9a, 0x10, 0xfa, 0xf9, 0xa1, 
-	0x15, 0xa3, 0xea, 0x57, 0x00, 0x21, 0xd0, 0x4c, 
-	0x70, 0x41, 0x10, 0x61, 0xfa, 0x57, 0x00, 0xed, 
-	0xd0, 0x08, 0x70, 0x40, 0xd0, 0x85, 0x40, 0x42, 
-	0x60, 0x40, 0x00, 0x64, 0xd0, 0x64, 0x62, 0x01, 
-	0x12, 0x2b, 0xe9, 0xeb, 0x12, 0x3b, 0xe9, 0xd5, 
-	0x00, 0xec, 0xd0, 0x40, 0x61, 0x81, 0x12, 0x2d, 
-	0xe9, 0xbf, 0x12, 0x30, 0xe9, 0xd4, 0x12, 0x36, 
-	0xe9, 0xd4, 0x12, 0x3a, 0xe9, 0xd4, 0xd0, 0x62, 
-	0x30, 0x48, 0xe9, 0xf2, 0x12, 0x2e, 0xe9, 0xf9, 
-	0xe1, 0x76, 0x00, 0xed, 0xd0, 0x08, 0x70, 0x40, 
-	0xd0, 0x85, 0x40, 0x42, 0x60, 0x40, 0xb0, 0x08, 
-	0x00, 0x21, 0xd0, 0x41, 0x60, 0x40, 0x00, 0x64, 
-	0xd0, 0x60, 0x62, 0x01, 0xf2, 0x5a, 0x00, 0xed, 
-	0xd0, 0x20, 0xd0, 0x41, 0x60, 0x40, 0x10, 0xe1, 
-	0xea, 0x3a, 0xe2, 0x57, 0xe2, 0x53, 0x10, 0xee, 
-	0xf9, 0xe9, 0x01, 0x46, 0x82, 0x34, 0x80, 0x3f, 
-	0x97, 0x2e, 0xc7, 0x5c, 0xa7, 0x66, 0x81, 0x34, 
-	0x80, 0x3f, 0x00, 0x21, 0xd0, 0x01, 0xa0, 0x38, 
-	0x00, 0xc6, 0x00, 0x21, 0xd0, 0x15, 0x0b, 0x09, 
-	0x00, 0x4d, 0xb0, 0x01, 0xed, 0xe5, 0xd2, 0x1a, 
-	0xe1, 0xec, 0xf1, 0x18, 0x00, 0xec, 0xd0, 0x40, 
-	0x71, 0x81, 0xd0, 0x4e, 0x60, 0x46, 0xe2, 0x54, 
-	0xc0, 0x0a, 0x10, 0x06, 0x52, 0x80, 0x00, 0xed, 
-	0xd0, 0x40, 0x62, 0x81, 0xe2, 0x53, 0x00, 0x64, 
-	0xd0, 0x60, 0x62, 0x01, 0xf2, 0x5a, 0xe1, 0x70, 
-	0x12, 0xa3, 0xf6, 0x57, 0x15, 0xa1, 0xfa, 0x57, 
-	0x12, 0xa0, 0xea, 0x23, 0x00, 0x65, 0xd1, 0x1c, 
-	0xd0, 0x75, 0x30, 0x48, 0xea, 0x0a, 0xb1, 0x3c, 
-	0x71, 0x04, 0x11, 0x20, 0xfa, 0x11, 0x00, 0xec, 
-	0xd0, 0x40, 0x61, 0x81, 0xe2, 0x57, 0x12, 0xa1, 
-	0xea, 0x33, 0x00, 0xe2, 0xd0, 0x60, 0x70, 0x01, 
-	0xb0, 0x7c, 0x70, 0x41, 0x10, 0x0c, 0x50, 0x40, 
-	0x0c, 0x30, 0xd0, 0x00, 0x31, 0x01, 0xee, 0x21, 
-	0x21, 0x00, 0xe6, 0x57, 0xe2, 0x23, 0x31, 0x00, 
-	0xfe, 0x57, 0xd0, 0x75, 0x30, 0x48, 0xea, 0x28, 
-	0xf2, 0x5a, 0xe2, 0x0d, 0x00, 0xec, 0xd0, 0x40, 
-	0x71, 0x81, 0x00, 0x63, 0xd1, 0x3f, 0xb1, 0xbc, 
-	0x41, 0x84, 0x61, 0x81, 0xd0, 0x50, 0x60, 0x46, 
-	0xe2, 0x57, 0x00, 0xed, 0xd0, 0x7c, 0x70, 0x41, 
-	0x08, 0x20, 0xd0, 0x00, 0x10, 0x08, 0xe2, 0x1c, 
-	0xd2, 0x84, 0x00, 0xed, 0xd1, 0xa4, 0x62, 0x86, 
-	0xd5, 0x00, 0xb5, 0x01, 0x01, 0x46, 0x82, 0x34, 
-	0x80, 0x3f, 0xc7, 0x5e, 0x97, 0x2e, 0x81, 0x34, 
-	0x80, 0x3f, 0x02, 0xe8, 0xd0, 0x30, 0xa0, 0x37, 
-	0xa0, 0x38, 0x08, 0x20, 0xdf, 0x00, 0x80, 0x73, 
-	0x80, 0x3f, 0x00, 0xc6, 0x01, 0x7a, 0xde, 0x1a, 
-	0xe0, 0x46, 0xf2, 0x5a, 0x00, 0x64, 0xd0, 0x60, 
-	0x62, 0x01, 0x02, 0x3c, 0xda, 0x89, 0xe0, 0x46, 
-	0x00, 0x28, 0xd0, 0x64, 0x70, 0x81, 0x00, 0x22, 
-	0xd0, 0x00, 0x50, 0x80, 0x60, 0x81, 0x0f, 0xc5, 
-	0x50, 0x00, 0x50, 0x00, 0x00, 0xed, 0xd1, 0xa4, 
-	0x72, 0x86, 0x00, 0xef, 0xd1, 0x90, 0x70, 0x46, 
-	0x10, 0x5c, 0x10, 0x65, 0xed, 0x7d, 0xd0, 0x46, 
-	0xc0, 0x0a, 0x10, 0x40, 0x60, 0x46, 0x00, 0x22, 
-	0xd0, 0x73, 0x30, 0x54, 0xe9, 0x8e, 0x12, 0xa4, 
-	0xe9, 0xb5, 0x15, 0x20, 0xe9, 0xc0, 0xb0, 0x7b, 
-	0xe9, 0xc3, 0xb0, 0x41, 0xe9, 0xc9, 0xc0, 0x54, 
-	0x10, 0x5c, 0x10, 0x6e, 0xe9, 0xc6, 0xe1, 0xb5, 
-	0x00, 0x28, 0xd1, 0xb0, 0xd0, 0x00, 0x60, 0x06, 
-	0x12, 0xa4, 0xf9, 0xb2, 0x00, 0xed, 0xd1, 0x9c, 
-	0x62, 0x86, 0xd2, 0x80, 0x00, 0xed, 0xd1, 0xa4, 
-	0x62, 0x86, 0xd0, 0x02, 0x00, 0xec, 0xd1, 0xbc, 
-	0x60, 0x06, 0x00, 0x64, 0xd1, 0xa0, 0x72, 0x06, 
-	0x12, 0x21, 0xf9, 0xa6, 0xd2, 0x0d, 0x62, 0x06, 
-	0x00, 0xed, 0xd1, 0xa0, 0x61, 0x86, 0xd0, 0x0e, 
-	0x00, 0xed, 0xd1, 0xac, 0x60, 0x06, 0xb1, 0xbc, 
-	0x60, 0x06, 0x00, 0x65, 0xd1, 0xa4, 0x60, 0x06, 
-	0x01, 0x7e, 0xd2, 0x31, 0xe1, 0xcb, 0x01, 0x46, 
-	0x90, 0x49, 0x00, 0x60, 0xd0, 0x00, 0x50, 0x40, 
-	0xa0, 0x49, 0x80, 0x3f, 0x00, 0xc6, 0x0c, 0x09, 
-	0x05, 0x0d, 0xe1, 0x70, 0x01, 0xbe, 0xde, 0x41, 
-	0xe1, 0xcb, 0x01, 0xbb, 0xd8, 0x10, 0xe1, 0xcb, 
-	0x01, 0xbd, 0xd8, 0x0b, 0xe1, 0xcb, 0x03, 0xb8, 
-	0xda, 0x10, 0x01, 0x46, 0x90, 0x49, 0x00, 0x60, 
-	0xd1, 0x00, 0x50, 0x44, 0x30, 0x44, 0xa0, 0x49, 
-	0x80, 0x3f, 0x00, 0xc6, 0xe0, 0x46, 0x50, 0x00, 
-	0x50, 0x00, 0x50, 0x00, 0x01, 0xfa, 0xd2, 0x3d, 
-	0x00, 0x25, 0xdc, 0xd8, 0xf0, 0x4a, 0x00, 0x26, 
-	0xd0, 0x18, 0xd0, 0x40, 0x60, 0x40, 0x00, 0x28, 
-	0xd0, 0x24, 0x70, 0x40, 0xd0, 0x82, 0x50, 0x42, 
-	0x60, 0x40, 0x00, 0xec, 0xd0, 0xa4, 0x70, 0xc2, 
-	0x10, 0xe0, 0xf9, 0x81, 0x00, 0xec, 0xd1, 0x98, 
-	0xd0, 0x41, 0x60, 0x46, 0x70, 0xc2, 0x10, 0xe0, 
-	0xe9, 0x8e, 0xd0, 0x40, 0x60, 0x46, 0xe1, 0x81, 
-	0xd0, 0x40, 0x00, 0xe6, 0xd0, 0x10, 0x60, 0x40, 
-	0xb0, 0x3c, 0x60, 0x40, 0xb0, 0x3c, 0x60, 0x40, 
-	0xd0, 0xe0, 0x00, 0xea, 0xd0, 0x40, 0x00, 0xe8, 
-	0xd0, 0x82, 0x01, 0x46, 0x70, 0x01, 0xb0, 0x7c, 
-	0x60, 0x02, 0xb0, 0xbc, 0x00, 0x06, 0x00, 0xc6, 
-	0xb0, 0xc1, 0xed, 0x9b, 0x80, 0x49, 0xd6, 0x44, 
-	0xd5, 0x43, 0x00, 0xe0, 0xd1, 0x80, 0x00, 0x06, 
-	0x0b, 0x09, 0x01, 0x0d, 0x0b, 0x09, 0x61, 0x06, 
-	0xb1, 0xbc, 0x01, 0x4d, 0x09, 0x09, 0x61, 0x46, 
-	0xb1, 0xbc, 0x00, 0xcd, 0x09, 0x09, 0x10, 0xe4, 
-	0xed, 0xb8, 0x60, 0xc6, 0xb1, 0xbc, 0x00, 0xcd, 
-	0x60, 0xc6, 0x00, 0xed, 0xd0, 0x04, 0x70, 0x00, 
-	0x10, 0x20, 0xf9, 0xd3, 0x10, 0xe3, 0xe9, 0xc4, 
-	0x10, 0xe6, 0xf9, 0xd3, 0x01, 0x46, 0x90, 0x10, 
-	0x00, 0x20, 0xd0, 0x44, 0x50, 0x40, 0x00, 0xc6, 
-	0xa0, 0x50, 0x00, 0xa0, 0xd0, 0x00, 0xa0, 0x05, 
-	0x80, 0x40, 0x00, 0xed, 0xd1, 0xa4, 0xd0, 0x04, 
-	0x60, 0x06, 0x00, 0xee, 0xd1, 0xac, 0x73, 0x86, 
-	0x10, 0xe3, 0xe5, 0xde, 0xe9, 0xe3, 0x00, 0xe7, 
-	0xd0, 0x40, 0x00, 0xae, 0xd0, 0xbb, 0xe1, 0xe7, 
-	0x01, 0x24, 0xd0, 0x6b, 0x00, 0xea, 0xd0, 0xa6, 
-	0xe1, 0xe7, 0x01, 0x21, 0xd0, 0x7b, 0x00, 0xe8, 
-	0xd0, 0x90, 0x13, 0xa0, 0xf9, 0xea, 0xc0, 0x42, 
-	0x00, 0xe0, 0xd1, 0xa8, 0x60, 0x46, 0xb1, 0x98, 
-	0x0b, 0xc9, 0x00, 0x4d, 0x09, 0x09, 0x10, 0x44, 
-	0x00, 0x8d, 0x20, 0x42, 0x10, 0x5f, 0x60, 0x46, 
-	0xb1, 0xb8, 0x00, 0x90, 0xea, 0x17, 0x0a, 0x89, 
-	0x00, 0x8d, 0x60, 0x86, 0xb1, 0xbc, 0x08, 0x49, 
-	0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 0x08, 0x49, 
-	0x00, 0x4d, 0x60, 0x46, 0x10, 0x60, 0xea, 0x0b, 
-	0x00, 0xe8, 0xd1, 0x80, 0xf2, 0xb0, 0x10, 0x60, 
-	0xfa, 0x17, 0x08, 0x49, 0x00, 0xe0, 0xd1, 0xa4, 
-	0x00, 0x4d, 0x60, 0x46, 0x10, 0x60, 0xea, 0x1b, 
-	0x00, 0xe9, 0xd1, 0x80, 0xf2, 0xb0, 0x10, 0x60, 
-	0xea, 0x1b, 0x00, 0xe0, 0xd1, 0x88, 0xd0, 0x40, 
-	0x60, 0x46, 0xd0, 0x00, 0x00, 0xe0, 0xd1, 0xa8, 
-	0x70, 0x46, 0x00, 0xef, 0xd1, 0x9c, 0x70, 0x86, 
-	0xb0, 0xb0, 0xee, 0x25, 0xd0, 0x81, 0x00, 0x90, 
-	0xea, 0x28, 0x20, 0x01, 0x10, 0x41, 0x10, 0x9f, 
-	0x10, 0xa0, 0xee, 0x25, 0x10, 0x1c, 0x00, 0x65, 
-	0xd1, 0xa8, 0x60, 0x06, 0x01, 0xb4, 0xd4, 0x3a, 
-	0xe0, 0x46, 0x50, 0x00, 0x02, 0x31, 0xdc, 0x13, 
-	0x00, 0x27, 0xdc, 0xd8, 0xf0, 0x4a, 0x0c, 0x09, 
-	0x00, 0x06, 0x05, 0x0d, 0x00, 0x22, 0xd0, 0x72, 
-	0x30, 0x54, 0xe9, 0xea, 0xb0, 0x7d, 0xfa, 0x05, 
-	0x09, 0x09, 0x01, 0xcd, 0x11, 0xe1, 0xf9, 0xc7, 
-	0x80, 0x09, 0x80, 0x27, 0x0a, 0x09, 0xd6, 0x45, 
-	0x00, 0xe1, 0xd1, 0xa0, 0x00, 0x4d, 0x60, 0x46, 
-	0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, 
-	0x00, 0x50, 0xe9, 0x91, 0xd4, 0x01, 0xb1, 0xbc, 
-	0x08, 0x89, 0x00, 0x4d, 0x60, 0x46, 0x00, 0xe0, 
-	0xd1, 0x80, 0x08, 0x89, 0x00, 0x4d, 0x08, 0x89, 
-	0x10, 0x4c, 0x71, 0x06, 0x21, 0x01, 0x61, 0x06, 
-	0xb1, 0xbc, 0x00, 0x4d, 0x0b, 0x49, 0x10, 0x4c, 
-	0x71, 0x46, 0x21, 0x41, 0x61, 0x46, 0xb1, 0xb0, 
-	0x00, 0x4d, 0x10, 0x5f, 0x60, 0x46, 0xb1, 0xbc, 
-	0x0a, 0x09, 0x00, 0x4d, 0x10, 0x4a, 0x70, 0x86, 
-	0x20, 0x81, 0x60, 0x86, 0x00, 0xe1, 0xd1, 0xac, 
-	0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 
-	0x08, 0x89, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 
-	0x09, 0x49, 0x00, 0x8d, 0x60, 0x86, 0xc0, 0x02, 
-	0x00, 0xe0, 0xd1, 0xa8, 0x70, 0xc6, 0x10, 0xc0, 
-	0xd0, 0x20, 0x30, 0x01, 0x10, 0xc0, 0x60, 0xc6, 
-	0xe1, 0x75, 0x11, 0xe2, 0xf9, 0x75, 0x00, 0xe2, 
-	0xd1, 0x80, 0x08, 0xc9, 0x00, 0x4d, 0x60, 0x46, 
-	0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, 
-	0xb1, 0xbc, 0x10, 0x60, 0xf9, 0xd7, 0xb1, 0xb4, 
-	0xe1, 0xde, 0xd2, 0x03, 0x0a, 0x09, 0x00, 0x4d, 
-	0x60, 0x46, 0xb1, 0xbc, 0xb2, 0x01, 0xf9, 0xd8, 
-	0x0b, 0xc9, 0x00, 0x4d, 0x10, 0x49, 0x10, 0x56, 
-	0x60, 0x46, 0xb1, 0xbc, 0x0b, 0x89, 0x00, 0x4d, 
-	0x10, 0x4a, 0x10, 0x56, 0x60, 0x46, 0xe1, 0x75, 
-	0x0b, 0x2c, 0xd4, 0x40, 0xf3, 0xb0, 0xe1, 0x77, 
-	0x00, 0xe0, 0xd0, 0x6c, 0x00, 0xe0, 0xd1, 0x80, 
-	0xd0, 0x0a, 0xf1, 0xfe, 0x00, 0xe1, 0xd1, 0xb0, 
-	0xd0, 0x02, 0xf1, 0xfe, 0x00, 0xe0, 0xd1, 0x80, 
-	0x76, 0x86, 0xb1, 0xbc, 0x73, 0x46, 0xe2, 0x3c, 
-	0x70, 0x81, 0x60, 0x86, 0xb1, 0xbc, 0xb0, 0x7c, 
-	0xb0, 0x01, 0xed, 0xfe, 0x0f, 0xc5, 0x00, 0xe1, 
-	0xd1, 0xa0, 0x70, 0x46, 0xd0, 0x8f, 0x40, 0x42, 
-	0x00, 0x25, 0xd0, 0xe0, 0x00, 0x24, 0xd1, 0x20, 
-	0x10, 0x6a, 0xea, 0x1e, 0x00, 0x66, 0xd0, 0xe0, 
-	0x00, 0x62, 0xd1, 0x00, 0x10, 0x66, 0xea, 0x1e, 
-	0x00, 0x6e, 0xd0, 0xc0, 0x10, 0x64, 0xea, 0x1e, 
-	0x00, 0x2b, 0xd0, 0xd0, 0x00, 0x29, 0xd1, 0x00, 
-	0x00, 0xe0, 0xd1, 0x80, 0x76, 0x86, 0x16, 0xa0, 
-	0xe9, 0xee, 0x30, 0xda, 0xe5, 0xee, 0xb1, 0xbc, 
-	0x73, 0x46, 0x13, 0x60, 0xe9, 0xee, 0x31, 0x0d, 
-	0xe5, 0xee, 0xd0, 0x82, 0xb1, 0xbc, 0x70, 0x46, 
-	0x10, 0x60, 0xe9, 0xee, 0xb0, 0x81, 0xee, 0x2c, 
-	0x00, 0xe0, 0xd0, 0x40, 0x00, 0xe0, 0xd1, 0xac, 
-	0xd0, 0x0a, 0xf1, 0xfe, 0x00, 0xe1, 0xd0, 0x70, 
-	0xd0, 0x02, 0xf1, 0xfe, 0x00, 0xec, 0xd1, 0x98, 
-	0xd0, 0x40, 0x60, 0x46, 0x00, 0xe0, 0xd0, 0x8c, 
-	0x70, 0x82, 0x00, 0x21, 0xd0, 0x70, 0x60, 0x81, 
-	0xd0, 0x40, 0x00, 0x25, 0xd0, 0x20, 0x30, 0x1a, 
-	0xfa, 0x50, 0x00, 0x23, 0xd0, 0x30, 0x30, 0x0d, 
-	0xfa, 0x50, 0xd0, 0x41, 0x00, 0x21, 0xd1, 0x84, 
-	0x60, 0x46, 0xb6, 0xb1, 0x16, 0x9c, 0x01, 0x7a, 
-	0xde, 0x1a, 0xe0, 0x46, 0x02, 0x31, 0xdc, 0x13, 
-	0x00, 0x27, 0xdc, 0xd8, 0xf0, 0x4a, 0x00, 0xec, 
-	0xd0, 0xa8, 0x70, 0xc2, 0x10, 0xe0, 0xf9, 0x77, 
-	0x00, 0xec, 0xd1, 0x9c, 0xd0, 0x41, 0x60, 0x46, 
-	0x70, 0xc2, 0x10, 0xe0, 0xe9, 0x84, 0xd0, 0x40, 
-	0x60, 0x46, 0xe1, 0x77, 0x0b, 0x49, 0x00, 0xe2, 
-	0xd1, 0xa0, 0x00, 0x4d, 0x10, 0x5f, 0x00, 0x6f, 
-	0xd0, 0xff, 0x40, 0x43, 0x60, 0x46, 0xb1, 0xbc, 
-	0x0b, 0x09, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 
-	0x08, 0x89, 0x00, 0x4d, 0x60, 0x46, 0x10, 0x61, 
-	0xf9, 0x9b, 0xd3, 0xc2, 0x00, 0xec, 0xd1, 0xbc, 
-	0x63, 0xc6, 0x0c, 0x09, 0x90, 0x4d, 0x10, 0x60, 
-	0xe5, 0x9c, 0x00, 0x06, 0x05, 0x0d, 0x00, 0x22, 
-	0xd0, 0x72, 0x30, 0x54, 0xf9, 0xa9, 0x0b, 0xa0, 
-	0xd4, 0x40, 0xf3, 0xb0, 0xe1, 0xa0, 0x00, 0xec, 
-	0xd1, 0x9c, 0xd0, 0x40, 0x60, 0x46, 0x01, 0x7a, 
-	0xde, 0x1a, 0xe0, 0x46, 0x0b, 0x09, 0x00, 0x4d, 
-	0x0b, 0x09, 0x00, 0x4d, 0x0a, 0x09, 0x01, 0x4d, 
-	0x0a, 0x09, 0x00, 0x4d, 0x01, 0x59, 0xe9, 0x96, 
-	0x09, 0x09, 0x00, 0x4d, 0x10, 0x5f, 0x10, 0x61, 
-	0xf9, 0x96, 0x09, 0x09, 0x01, 0x4d, 0x11, 0x5f, 
-	0x0b, 0xc9, 0x00, 0x4d, 0xc0, 0x01, 0x10, 0x5f, 
-	0x11, 0x4e, 0x51, 0x41, 0x08, 0x49, 0x00, 0x4d, 
-	0x0b, 0xc9, 0x10, 0x0f, 0x00, 0x4d, 0x50, 0x01, 
-	0x00, 0xed, 0xd1, 0xb6, 0x01, 0x46, 0x00, 0x06, 
-	0xa0, 0x3c, 0xa1, 0x7d, 0x60, 0x06, 0x00, 0xc6, 
-	0xd5, 0x00, 0xb5, 0x01, 0x01, 0x7a, 0xde, 0x1a, 
-	0xe0, 0x46, 0x50, 0x00, 0x00, 0xec, 0xd0, 0xac, 
-	0x70, 0xc2, 0x10, 0xe0, 0xf9, 0x70, 0x00, 0xec, 
-	0xd1, 0xa0, 0xd0, 0x41, 0x60, 0x46, 0x70, 0xc2, 
-	0x10, 0xe0, 0xe9, 0x7f, 0xd0, 0x40, 0x60, 0x46, 
-	0xe1, 0x70, 0x0a, 0x89, 0x0b, 0xcd, 0x00, 0xe3, 
-	0xd1, 0x80, 0x6b, 0xc6, 0x08, 0xc9, 0x05, 0x8d, 
-	0x15, 0xa3, 0xee, 0x6e, 0x15, 0xa0, 0xea, 0x6e, 
-	0x90, 0x4d, 0xd0, 0x9f, 0xd0, 0xdf, 0x40, 0x81, 
-	0x10, 0x55, 0x40, 0xc1, 0x01, 0x46, 0x82, 0x34, 
-	0x80, 0x3f, 0xc8, 0x1d, 0x81, 0x34, 0x80, 0x3f, 
-	0x00, 0xc6, 0xd1, 0x23, 0x31, 0x03, 0x11, 0x02, 
-	0x38, 0x04, 0xb0, 0x8d, 0x10, 0x9d, 0x28, 0x02, 
-	0xc0, 0x60, 0x00, 0x65, 0xd1, 0x94, 0x71, 0x06, 
-	0x68, 0x06, 0x30, 0x44, 0x00, 0xed, 0xd1, 0xa8, 
-	0x70, 0x06, 0x10, 0x20, 0xe9, 0xb0, 0x00, 0xee, 
-	0xd0, 0xc0, 0x70, 0xc3, 0x20, 0x43, 0xb0, 0x01, 
-	0xf9, 0xac, 0x60, 0x06, 0x00, 0x64, 0xd1, 0xbc, 
-	0x71, 0x06, 0xc0, 0x04, 0x21, 0x01, 0x61, 0x06, 
-	0x10, 0x20, 0xf5, 0xbb, 0x11, 0x20, 0xe5, 0xbb, 
-	0xb0, 0x41, 0x00, 0x65, 0xd1, 0x80, 0x71, 0x06, 
-	0x21, 0x01, 0x61, 0x06, 0x00, 0xed, 0xd1, 0xac, 
-	0x71, 0x06, 0x15, 0xa1, 0xe9, 0xcb, 0xb1, 0x3f, 
-	0x61, 0x06, 0x15, 0xa3, 0xf9, 0xd6, 0xd0, 0xbf, 
-	0xe1, 0xd3, 0xd0, 0x40, 0x60, 0x46, 0xb1, 0xbc, 
-	0x70, 0x86, 0x61, 0x06, 0x31, 0x02, 0xe5, 0xd3, 
-	0x20, 0x84, 0x00, 0x65, 0xd1, 0xa4, 0x60, 0x86, 
-	0xd9, 0x40, 0x00, 0xec, 0xd1, 0x94, 0x79, 0x06, 
-	0xb1, 0x84, 0x78, 0xc6, 0xc0, 0x63, 0x30, 0x64, 
-	0xe9, 0xf8, 0x00, 0xa7, 0xd0, 0xff, 0x7a, 0x63, 
-	0x00, 0x65, 0xd0, 0x00, 0x71, 0x00, 0x31, 0x29, 
-	0xe5, 0xf8, 0xc0, 0x63, 0xc8, 0xc1, 0xb0, 0x78, 
-	0x40, 0x43, 0xc0, 0xa4, 0x30, 0x81, 0xe9, 0xf2, 
-	0x7a, 0x41, 0x31, 0x29, 0xf5, 0xe8, 0x21, 0x29, 
-	0x61, 0x00, 0xb8, 0xfc, 0x79, 0x63, 0xb8, 0xfc, 
-	0x48, 0xc3, 0x68, 0xc6, 0x00, 0xed, 0xd1, 0xb8, 
-	0x69, 0x46, 0x80, 0x28, 0x0b, 0xc9, 0x00, 0x4d, 
-	0x08, 0x49, 0x10, 0x41, 0x00, 0xe3, 0xd1, 0x84, 
-	0x00, 0x8d, 0x20, 0x42, 0x60, 0x46, 0x00, 0xee, 
-	0xd1, 0xa4, 0x70, 0x86, 0x10, 0xa1, 0xee, 0x18, 
-	0xe6, 0x6b, 0x90, 0x86, 0x00, 0x90, 0xea, 0x18, 
-	0x00, 0xed, 0xd0, 0x1c, 0x70, 0x80, 0xb0, 0x81, 
-	0xe6, 0x6b, 0x60, 0x80, 0xb1, 0xa8, 0x70, 0x86, 
-	0x10, 0xa0, 0xfa, 0x6b, 0x00, 0x21, 0xd0, 0x38, 
-	0x70, 0x80, 0x10, 0xa0, 0xfa, 0x6b, 0x0f, 0xef, 
-	0xd0, 0xbf, 0x30, 0x81, 0xfa, 0x22, 0x60, 0x00, 
-	0x08, 0x20, 0xd0, 0x00, 0x5f, 0x00, 0x15, 0xa3, 
-	0xea, 0x6b, 0x00, 0xee, 0xd1, 0x80, 0x79, 0x46, 
-	0x00, 0xf8, 0xd0, 0x00, 0xc4, 0x40, 0x00, 0xe3, 
-	0xd1, 0x84, 0x78, 0x46, 0x0f, 0xef, 0xd0, 0x3f, 
-	0x30, 0x21, 0xea, 0x48, 0x00, 0xe0, 0xd1, 0x90, 
-	0x78, 0x06, 0xc0, 0xa1, 0x18, 0x43, 0x28, 0x42, 
-	0x18, 0x43, 0x28, 0x42, 0x18, 0x1e, 0xd8, 0x80, 
-	0x08, 0x11, 0xea, 0x41, 0x28, 0xa1, 0x18, 0x01, 
-	0x18, 0x5f, 0x18, 0x60, 0xee, 0x3e, 0xc0, 0x51, 
-	0x30, 0x62, 0xee, 0x4e, 0xc8, 0x91, 0x18, 0x9f, 
-	0x00, 0x21, 0xd1, 0xb8, 0xd0, 0x01, 0x60, 0x06, 
-	0x00, 0xef, 0xd0, 0x10, 0xd0, 0x72, 0x60, 0x40, 
-	0x01, 0x46, 0x82, 0x34, 0x80, 0x3f, 0xc8, 0xdc, 
-	0xc9, 0x1d, 0x81, 0x34, 0x80, 0x3f, 0x00, 0xc6, 
-	0x38, 0xe4, 0xee, 0x5e, 0xea, 0x52, 0x28, 0xe5, 
-	0x01, 0x46, 0x90, 0x6d, 0x28, 0xc1, 0x00, 0xc6, 
-	0x38, 0xe2, 0xf6, 0x6b, 0xdb, 0x08, 0xf1, 0x16, 
-	0xf1, 0x18, 0x00, 0x21, 0xd1, 0xb4, 0x61, 0x86, 
-	0xe2, 0x52, 0x01, 0xf7, 0xd0, 0x19, 0xe0, 0x46, 
-	0xd5, 0x00, 0xb5, 0x01, 0x01, 0x7a, 0xde, 0x1a, 
-	0xe0, 0x46, 0x50, 0x00, 0x02, 0x31, 0xdc, 0x13, 
-	0x00, 0x27, 0xdc, 0xd8, 0xf0, 0x4a, 0xdb, 0x09, 
-	0x00, 0xe3, 0xd0, 0x1c, 0x6b, 0x00, 0xda, 0xc1, 
-	0x00, 0xe6, 0xd1, 0x98, 0x70, 0x06, 0xb1, 0x84, 
-	0x60, 0x06, 0xb1, 0x84, 0x60, 0x06, 0x05, 0x9f, 
-	0xe9, 0x9f, 0x08, 0x49, 0xd1, 0x17, 0x46, 0x44, 
-	0x00, 0x4d, 0x10, 0x43, 0x26, 0x41, 0x08, 0xc9, 
-	0x05, 0xcd, 0xb5, 0xc1, 0xe5, 0xcc, 0xc0, 0x57, 
-	0x15, 0xc6, 0x25, 0xc1, 0x15, 0xa3, 0xf9, 0x9f, 
-	0x08, 0x49, 0xd1, 0x0f, 0x46, 0x44, 0x00, 0x4d, 
-	0x10, 0x44, 0x26, 0x41, 0x08, 0xc9, 0x06, 0x0d, 
-	0xb6, 0x01, 0xe5, 0xcc, 0xc0, 0x58, 0x16, 0x06, 
-	0x26, 0x01, 0x08, 0x49, 0x00, 0x4d, 0x10, 0x60, 
-	0xe9, 0xa6, 0x0a, 0x09, 0x00, 0x4d, 0xe1, 0x9f, 
-	0x0c, 0x09, 0x90, 0x4d, 0x10, 0x60, 0xe5, 0xa7, 
-	0x00, 0x06, 0x05, 0x0d, 0x00, 0x22, 0xd0, 0x72, 
-	0x30, 0x54, 0xf9, 0xb3, 0xd4, 0x40, 0xf3, 0xb0, 
-	0xe1, 0xab, 0xb0, 0x7d, 0xf9, 0xb8, 0x02, 0x34, 
-	0xd2, 0x44, 0xe0, 0x46, 0x00, 0xec, 0xd1, 0xa0, 
-	0xd0, 0x40, 0x60, 0x46, 0x02, 0x3c, 0xda, 0x89, 
-	0x00, 0xec, 0xd1, 0x80, 0x70, 0x46, 0xb1, 0xbc, 
-	0x70, 0x86, 0x30, 0x81, 0xe8, 0x46, 0x15, 0x63, 
-	0xe9, 0xc9, 0x05, 0x5e, 0xe8, 0x46, 0x01, 0x73, 
-	0xd4, 0x3d, 0xe0, 0x46, 0xd5, 0x00, 0xb5, 0x01, 
-	0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x50, 0x00, 
-	0x50, 0x00, 0x50, 0x00, 0xcc, 0xc0, 0xcd, 0x01, 
-	0xcd, 0x42, 0xcd, 0x83, 0x00, 0xa0, 0xd0, 0x01, 
-	0xa0, 0x38, 0xc8, 0x7f, 0xc8, 0x06, 0xb1, 0xbe, 
-	0xf3, 0x96, 0xc8, 0x80, 0xf3, 0x92, 0x58, 0x80, 
-	0xf3, 0x96, 0xc8, 0xc0, 0xf3, 0x96, 0xc9, 0x00, 
-	0xf3, 0x92, 0x58, 0xc0, 0xf3, 0x96, 0xc9, 0x40, 
-	0xf3, 0x92, 0x59, 0x40, 0xc0, 0x22, 0xc0, 0x65, 
-	0xc0, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc8, 0x80, 
-	0xf3, 0x92, 0x59, 0x00, 0xf3, 0x96, 0xc9, 0x40, 
-	0xf3, 0x96, 0xc9, 0x80, 0xf3, 0x92, 0x59, 0x40, 
-	0xf3, 0x96, 0xc9, 0xc0, 0xf3, 0x92, 0x58, 0x80, 
-	0xc0, 0x23, 0xc0, 0x62, 0xd0, 0x88, 0x20, 0x86, 
-	0xf3, 0x9a, 0xf3, 0x96, 0xc8, 0xc0, 0xf3, 0x92, 
-	0x58, 0xc0, 0xf3, 0x96, 0xc8, 0x80, 0xf3, 0x92, 
-	0x59, 0xc0, 0xc0, 0x24, 0xc0, 0x67, 0xd0, 0x90, 
-	0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x00, 
-	0xf3, 0x92, 0x59, 0x80, 0xf3, 0x96, 0xc9, 0xc0, 
-	0xf3, 0x96, 0xca, 0x00, 0xf3, 0x92, 0x59, 0xc0, 
-	0xf3, 0x96, 0xca, 0x40, 0xf3, 0x92, 0x59, 0x00, 
-	0xc0, 0x25, 0xc0, 0x64, 0xd0, 0x98, 0x20, 0x86, 
-	0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x92, 
-	0x58, 0x80, 0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92, 
-	0x59, 0x00, 0xc0, 0x23, 0xc0, 0x64, 0xd0, 0x84, 
-	0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc8, 0xc0, 
-	0xf3, 0x92, 0x59, 0x40, 0xf3, 0x96, 0xc9, 0x00, 
-	0xf3, 0x92, 0x5a, 0x40, 0xc0, 0x26, 0xc0, 0x69, 
-	0xd0, 0xa0, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 
-	0xc9, 0x80, 0xf3, 0x92, 0x5a, 0x00, 0xf3, 0x96, 
-	0xca, 0x40, 0xf3, 0x92, 0x5a, 0x40, 0xf3, 0x96, 
-	0xca, 0x80, 0xf3, 0x92, 0x59, 0x80, 0xc0, 0x27, 
-	0xc0, 0x66, 0xd0, 0xa8, 0x20, 0x86, 0xf3, 0x9a, 
-	0xf3, 0x96, 0xc9, 0xc0, 0xf3, 0x92, 0x59, 0x00, 
-	0xf3, 0x96, 0xc9, 0x80, 0xf3, 0x92, 0x58, 0xc0, 
-	0xc0, 0x22, 0xc0, 0x63, 0xd0, 0x8c, 0x20, 0x86, 
-	0xf3, 0x9a, 0xf3, 0x92, 0x59, 0x80, 0xc0, 0x25, 
-	0xc0, 0x66, 0xd0, 0x94, 0x20, 0x86, 0xf3, 0x9a, 
-	0xf3, 0x96, 0xc8, 0x80, 0xf3, 0x92, 0x59, 0xc0, 
-	0xf3, 0x96, 0xc8, 0xc0, 0xf3, 0x92, 0x5a, 0x80, 
-	0xc0, 0x28, 0xc0, 0x6a, 0xd0, 0xb0, 0x20, 0x86, 
-	0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x92, 
-	0x59, 0x40, 0xc0, 0x29, 0xc0, 0x65, 0xd0, 0xb8, 
-	0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x80, 
-	0xf3, 0x92, 0x58, 0xc0, 0xf3, 0x96, 0xca, 0x00, 
-	0xf3, 0x92, 0x58, 0x80, 0xc0, 0x24, 0xc0, 0x62, 
-	0xd0, 0x9c, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x92, 
-	0x5a, 0x00, 0xc0, 0x27, 0xc0, 0x68, 0xd0, 0xa4, 
-	0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xca, 0x80, 
-	0xf3, 0x92, 0x59, 0x80, 0xf3, 0x96, 0xca, 0x40, 
-	0xf3, 0x92, 0x5a, 0x40, 0xf3, 0x96, 0xc9, 0x40, 
-	0xf3, 0x92, 0x5a, 0x80, 0xc0, 0x23, 0xc0, 0x6a, 
-	0xd0, 0xac, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x92, 
-	0x59, 0x40, 0xc0, 0x26, 0xc0, 0x65, 0xd0, 0xb4, 
-	0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x00, 
-	0xf3, 0x92, 0x59, 0x00, 0xc0, 0x29, 0xc0, 0x64, 
-	0xd0, 0xbc, 0x20, 0x86, 0xf3, 0x9a, 0xc0, 0x33, 
-	0xc0, 0x74, 0xc0, 0xb5, 0xc0, 0xf6, 0xd0, 0x40, 
-	0x00, 0xa0, 0xd8, 0x00, 0xa8, 0x38, 0x08, 0x45, 
-	0x0a, 0x09, 0x00, 0x0d, 0x0f, 0xc5, 0x50, 0x00, 
-	0x0a, 0x09, 0x00, 0x0d, 0x10, 0x08, 0x0f, 0xc5, 
-	0x01, 0x46, 0x00, 0x06, 0xa0, 0x7c, 0xa0, 0x3d, 
-	0x60, 0x42, 0x00, 0xc6, 0x0f, 0xc5, 0x50, 0x00, 
-	0x50, 0x00, 0x50, 0x00, 0x14, 0x48, 0xd0, 0x81, 
-	0x00, 0xef, 0xd1, 0x8c, 0x71, 0x46, 0x11, 0x60, 
-	0xfb, 0xb1, 0x60, 0x86, 0x71, 0x46, 0x31, 0x42, 
-	0xfb, 0xb1, 0x00, 0xec, 0xd1, 0x0c, 0x74, 0x84, 
-	0x00, 0x68, 0xd0, 0x80, 0x70, 0x02, 0x10, 0x20, 
-	0xfb, 0xc4, 0xc4, 0x82, 0xc4, 0xd2, 0xb4, 0xfc, 
-	0xda, 0x00, 0xda, 0x4f, 0x0a, 0x09, 0x0f, 0xef, 
-	0xd0, 0x3f, 0xb4, 0x7f, 0xca, 0x29, 0x1a, 0x18, 
-	0x4a, 0x00, 0x1a, 0x48, 0x00, 0x8d, 0x2a, 0x42, 
-	0xd0, 0x03, 0x40, 0x11, 0xfb, 0xe3, 0xb4, 0x44, 
-	0x00, 0xa0, 0xd0, 0xc0, 0x30, 0xd3, 0xff, 0xe3, 
-	0xb4, 0xfe, 0x01, 0x46, 0x00, 0x06, 0xaa, 0x3d, 
-	0xaa, 0x7c, 0x6a, 0x53, 0x00, 0xc6, 0xb4, 0xfe, 
-	0xb4, 0x7c, 0x1a, 0x61, 0xfb, 0xc8, 0xb4, 0x43, 
-	0x00, 0xef, 0xd0, 0x3f, 0x40, 0x11, 0xeb, 0xf7, 
-	0xb0, 0xc4, 0xe7, 0xf7, 0xeb, 0xee, 0x61, 0x53, 
-	0x64, 0x52, 0x64, 0xc4, 0x00, 0x28, 0xd1, 0x24, 
-	0x70, 0x04, 0x00, 0x21, 0xd0, 0x80, 0x50, 0x02, 
-	0x60, 0x04, 0x61, 0x46, 0x0a, 0x09, 0x0f, 0xc5, 
-	0x50, 0x00, 0x50, 0x00, 0x02, 0x31, 0xdc, 0x13, 
-	0x00, 0x27, 0xdc, 0xd8, 0xf0, 0x4a, 0x01, 0xfa, 
-	0xd2, 0x3d, 0x00, 0x25, 0xdc, 0xd8, 0xf0, 0x4a, 
-	0x09, 0x09, 0x01, 0xcd, 0x11, 0xe8, 0xf9, 0xe2, 
-	0x00, 0xe3, 0xd1, 0x9c, 0x09, 0x09, 0x05, 0xcd, 
-	0xb5, 0xc1, 0x09, 0x09, 0x00, 0x4d, 0xb0, 0x41, 
-	0x10, 0x46, 0x25, 0xc1, 0x09, 0x09, 0x06, 0x0d, 
-	0xb6, 0x01, 0x09, 0x09, 0x00, 0x4d, 0x08, 0x89, 
-	0xb0, 0x41, 0x10, 0x46, 0x26, 0x01, 0x00, 0x8d, 
-	0x08, 0x89, 0x10, 0x82, 0xd0, 0x04, 0xc0, 0x55, 
-	0x00, 0x40, 0x40, 0x40, 0x05, 0x4d, 0x08, 0x49, 
-	0x0b, 0x0d, 0xd1, 0x00, 0x15, 0x63, 0xe9, 0xa2, 
-	0xd1, 0x01, 0x55, 0x41, 0xdb, 0x01, 0x4b, 0x15, 
-	0xa1, 0x1b, 0x08, 0x89, 0x00, 0x4d, 0x08, 0x49, 
-	0x10, 0x41, 0xd1, 0x19, 0x46, 0x44, 0x26, 0x41, 
-	0x00, 0xcd, 0x08, 0x49, 0x10, 0xc4, 0x00, 0x4d, 
-	0x08, 0x49, 0x10, 0x41, 0x20, 0x81, 0xa0, 0x89, 
-	0x00, 0x4d, 0x10, 0x43, 0x20, 0xc1, 0xa0, 0xe8, 
-	0x08, 0x49, 0x00, 0x4d, 0x1b, 0x03, 0x5b, 0x01, 
-	0xbb, 0x3f, 0x6b, 0x06, 0x08, 0x49, 0xb1, 0xbc, 
-	0x00, 0x4d, 0x60, 0x46, 0x08, 0x49, 0xb1, 0xbc, 
-	0x0a, 0xcd, 0x1a, 0xc2, 0x4a, 0xd9, 0x1a, 0xde, 
-	0x6a, 0xc6, 0x08, 0x49, 0xb1, 0xbc, 0x00, 0x4d, 
-	0x60, 0x46, 0x10, 0x60, 0xea, 0x3e, 0xb1, 0xbc, 
-	0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 
-	0x08, 0xc9, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 
-	0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 
-	0x09, 0xc9, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 
-	0x0a, 0x09, 0x00, 0x4d, 0x60, 0x46, 0xe2, 0x3e, 
-	0x11, 0xe3, 0xfa, 0x00, 0x00, 0xe7, 0xd0, 0xc0, 
-	0xd0, 0x84, 0xb0, 0x81, 0xe6, 0x3e, 0x08, 0x49, 
-	0x00, 0x4d, 0x60, 0x43, 0xb0, 0xfc, 0x10, 0x60, 
-	0xe9, 0xe7, 0x10, 0xa3, 0xf9, 0xf4, 0x00, 0xe8, 
-	0xd1, 0x80, 0xe1, 0xf8, 0x10, 0xa2, 0xf9, 0xfa, 
-	0x00, 0xe9, 0xd1, 0x80, 0xf2, 0xb0, 0xe1, 0xe7, 
-	0xd2, 0x3f, 0x0a, 0x09, 0x00, 0x4d, 0xb2, 0x01, 
-	0xf5, 0xfb, 0xe1, 0xe7, 0x11, 0xe7, 0xfa, 0x3e, 
-	0xd4, 0x01, 0x00, 0xe1, 0xd0, 0x24, 0x70, 0x00, 
-	0x10, 0x21, 0xea, 0x0d, 0x15, 0x63, 0xfa, 0x0d, 
-	0xd4, 0x03, 0x44, 0x2c, 0xb4, 0x3f, 0x00, 0xe6, 
-	0xd1, 0x90, 0x0b, 0x09, 0x00, 0x4d, 0x09, 0x49, 
-	0x10, 0x45, 0x00, 0x8d, 0x50, 0x81, 0xd0, 0x40, 
-	0x10, 0x87, 0x10, 0x98, 0x30, 0x42, 0xf2, 0x61, 
-	0x60, 0x46, 0xb1, 0xbc, 0x0b, 0x09, 0x00, 0x0d, 
-	0x09, 0x49, 0x00, 0x0d, 0xb4, 0x01, 0xfa, 0x0f, 
-	0x00, 0xe6, 0xd0, 0x18, 0x30, 0x06, 0xe6, 0x29, 
-	0x60, 0x46, 0xb1, 0xbc, 0xe2, 0x22, 0x00, 0xe0, 
-	0xd1, 0x88, 0x70, 0x46, 0x10, 0x63, 0xea, 0x39, 
-	0x10, 0x64, 0xea, 0x39, 0x00, 0xe6, 0xd1, 0x90, 
-	0xd0, 0x00, 0x60, 0x06, 0xb1, 0xbc, 0x60, 0x06, 
-	0xb1, 0xbc, 0x60, 0x06, 0xe2, 0x3e, 0x00, 0xef, 
-	0xd1, 0x84, 0x70, 0x46, 0x10, 0x60, 0xfa, 0x30, 
-	0x0c, 0x09, 0x90, 0x4d, 0x10, 0x60, 0xe6, 0x3f, 
-	0x00, 0x06, 0x05, 0x0d, 0x00, 0x22, 0xd0, 0x72, 
-	0x30, 0x54, 0xfa, 0x4b, 0xd4, 0x40, 0xf3, 0xb0, 
-	0xe2, 0x43, 0xb0, 0x7d, 0xe9, 0x7a, 0x00, 0xec, 
-	0xd1, 0xa0, 0xd0, 0x40, 0x60, 0x46, 0x02, 0x3c, 
-	0xda, 0x89, 0x00, 0xec, 0xd1, 0x80, 0x70, 0x46, 
-	0xb1, 0xbc, 0x70, 0x86, 0x30, 0x81, 0xe8, 0x46, 
-	0x15, 0x63, 0xea, 0x5e, 0x05, 0x5e, 0xe8, 0x46, 
-	0x01, 0x73, 0xd4, 0x3d, 0xe0, 0x46, 0x00, 0xe0, 
-	0xd0, 0x00, 0x70, 0xc0, 0x10, 0xc1, 0x00, 0xe0, 
-	0xd0, 0x08, 0x70, 0x00, 0x10, 0x23, 0xea, 0x75, 
-	0xc0, 0x83, 0x10, 0x9d, 0x30, 0xc2, 0x10, 0x9f, 
-	0x30, 0xc2, 0x00, 0xef, 0xd0, 0xac, 0x70, 0x82, 
-	0x10, 0xa3, 0xea, 0x75, 0x10, 0xc1, 0xc0, 0x83, 
-	0x30, 0x81, 0xe6, 0x7e, 0xc0, 0x83, 0x20, 0x81, 
-	0xf6, 0x7f, 0xd0, 0x40, 0x30, 0x43, 0x0f, 0xc5, 
-	0xc0, 0x43, 0x0f, 0xc5, 0x00, 0xed, 0xd1, 0xa4, 
-	0x72, 0x86, 0x15, 0xa3, 0xee, 0x23, 0x15, 0xa1, 
-	0xe6, 0x23, 0x08, 0x20, 0xd0, 0x00, 0x5f, 0x00, 
-	0xd8, 0xc4, 0x15, 0x63, 0xe9, 0x7e, 0x48, 0xd5, 
-	0x18, 0xde, 0x18, 0xe0, 0xe9, 0xc2, 0x00, 0xed, 
-	0xd1, 0xb4, 0x79, 0xc6, 0x19, 0xe0, 0xe9, 0x8c, 
-	0x00, 0xed, 0xd0, 0x3a, 0x79, 0xc6, 0x69, 0xc0, 
-	0xd9, 0xc0, 0x69, 0xc6, 0x00, 0xed, 0xd0, 0x38, 
-	0x79, 0x40, 0x19, 0x60, 0xe9, 0x98, 0x00, 0x28, 
-	0xd0, 0x24, 0x70, 0x40, 0x02, 0x20, 0xd0, 0x80, 
-	0x50, 0x42, 0x60, 0x40, 0x15, 0xa3, 0xe9, 0x9f, 
-	0x00, 0xec, 0xd1, 0xb8, 0x79, 0xc6, 0x69, 0x46, 
-	0xc9, 0x67, 0x00, 0xec, 0xd9, 0xb4, 0x70, 0x66, 
-	0x00, 0xec, 0xd1, 0xbc, 0x70, 0x06, 0x10, 0x20, 
-	0xed, 0xbe, 0x10, 0x60, 0xe9, 0xc1, 0x00, 0xe0, 
-	0xda, 0xa8, 0x7a, 0xaa, 0xc0, 0x2a, 0x10, 0x1f, 
-	0x00, 0x22, 0xd0, 0xa0, 0x70, 0x82, 0x20, 0x6a, 
-	0x00, 0x9f, 0xe9, 0xb5, 0x20, 0x40, 0x19, 0x60, 
-	0xf9, 0xb8, 0xc9, 0x41, 0xb0, 0x48, 0x30, 0x65, 
-	0xf5, 0xbd, 0xb0, 0x70, 0xed, 0xbe, 0xd9, 0x40, 
-	0x00, 0xed, 0xd1, 0xbc, 0x69, 0x46, 0x69, 0x66, 
-	0x12, 0xa4, 0xea, 0x21, 0x00, 0xec, 0xd1, 0xbc, 
-	0x73, 0xc6, 0x15, 0xa3, 0xe9, 0xdf, 0x33, 0xe3, 
-	0xe5, 0xd3, 0xed, 0xd2, 0x63, 0xc6, 0x00, 0x21, 
-	0xd1, 0xa8, 0x63, 0xc6, 0x00, 0xed, 0xd1, 0xa0, 
-	0x63, 0xc6, 0x15, 0xa1, 0xf9, 0xdc, 0x12, 0xa3, 
-	0xe5, 0xe3, 0xd3, 0xc2, 0x00, 0xec, 0xd1, 0xbc, 
-	0x63, 0xc6, 0xe1, 0xe3, 0x12, 0xa3, 0xea, 0x21, 
-	0xe1, 0xe3, 0x12, 0xa2, 0xf6, 0x21, 0x13, 0xe0, 
-	0xfa, 0x21, 0x00, 0xee, 0xd1, 0x8c, 0x78, 0x06, 
-	0xb1, 0xbc, 0x78, 0x46, 0xb1, 0xbc, 0x78, 0x86, 
-	0xd1, 0x88, 0x72, 0x46, 0xd1, 0x84, 0x73, 0x06, 
-	0x13, 0x20, 0xf9, 0xe3, 0x00, 0x64, 0xd1, 0xa0, 
-	0x70, 0x46, 0xd0, 0xa2, 0x30, 0x81, 0xe9, 0xff, 
-	0x10, 0x70, 0xea, 0x11, 0x10, 0x6d, 0xea, 0x14, 
-	0x10, 0x76, 0xea, 0x19, 0x10, 0x7a, 0xea, 0x28, 
-	0xe2, 0x3b, 0x18, 0xe0, 0xea, 0x3b, 0x00, 0xed, 
-	0xd1, 0x80, 0x70, 0x86, 0xb0, 0x81, 0xd0, 0x3f, 
-	0x40, 0x02, 0x10, 0x20, 0xea, 0x0c, 0x60, 0x86, 
-	0xf3, 0x8a, 0xe1, 0xe3, 0xc0, 0x02, 0x10, 0x1a, 
-	0x50, 0x80, 0x60, 0x86, 0xe2, 0x3b, 0x15, 0xa3, 
-	0xea, 0x21, 0xe2, 0xe9, 0xd2, 0x80, 0x00, 0xed, 
-	0xd1, 0xa4, 0x62, 0x86, 0xe3, 0x0c, 0x00, 0xed, 
-	0xd1, 0x88, 0xd0, 0x60, 0x70, 0x06, 0x50, 0x40, 
-	0x60, 0x46, 0x15, 0xa3, 0xfb, 0x0c, 0xd5, 0x84, 
-	0xe3, 0x0c, 0xd5, 0x00, 0xb5, 0x01, 0x01, 0x7a, 
-	0xde, 0x1a, 0xe0, 0x46, 0x00, 0xed, 0xd1, 0x88, 
-	0xd0, 0x60, 0x70, 0x06, 0x50, 0x40, 0x60, 0x46, 
-	0x15, 0xa2, 0xe7, 0x0c, 0xee, 0x21, 0x00, 0x21, 
-	0xd1, 0x8c, 0x18, 0xe0, 0xfa, 0x39, 0x70, 0x46, 
-	0x10, 0x61, 0xea, 0x70, 0xe2, 0x21, 0x65, 0x86, 
-	0xe2, 0x21, 0x18, 0xe0, 0xea, 0x70, 0xd1, 0x80, 
-	0x73, 0x06, 0x15, 0xa2, 0xee, 0x68, 0x00, 0x22, 
-	0xd1, 0x80, 0x70, 0x46, 0x6b, 0x06, 0xcb, 0x01, 
-	0xb1, 0xb4, 0x70, 0x46, 0x6a, 0xc6, 0xca, 0xc1, 
-	0x00, 0x65, 0xd1, 0x98, 0x70, 0x46, 0x10, 0x61, 
-	0xfa, 0x50, 0x02, 0x41, 0xc3, 0x21, 0xc7, 0xe0, 
-	0x02, 0x50, 0xea, 0x56, 0xc3, 0x20, 0xc7, 0xe1, 
-	0xd1, 0x88, 0xd0, 0x01, 0x02, 0x40, 0x62, 0x46, 
-	0x0f, 0xef, 0xd0, 0x7f, 0x30, 0x6f, 0xfa, 0x5f, 
-	0xc3, 0x20, 0xc7, 0x4c, 0xd0, 0x00, 0x00, 0x65, 
-	0xd1, 0x98, 0x70, 0x46, 0x60, 0x06, 0xb0, 0x41, 
-	0x43, 0x01, 0xe2, 0x70, 0xc3, 0x22, 0xc7, 0xcc, 
-	0xc7, 0x60, 0xc7, 0xa1, 0x02, 0x50, 0xea, 0x70, 
-	0xc7, 0x61, 0xc7, 0xa0, 0xdb, 0x80, 0xd1, 0x00, 
-	0x00, 0xef, 0xd1, 0xa8, 0x70, 0x46, 0x10, 0x60, 
-	0xfa, 0x7a, 0x00, 0xe0, 0xd1, 0x88, 0x70, 0x46, 
-	0x00, 0x22, 0xd1, 0xb0, 0x70, 0x86, 0x30, 0x81, 
-	0xea, 0x82, 0x60, 0x46, 0xd0, 0x20, 0xf3, 0x06, 
-	0x10, 0x63, 0xea, 0x87, 0x10, 0x64, 0xea, 0x87, 
-	0xe2, 0x95, 0x00, 0xef, 0xd1, 0x6c, 0x71, 0x45, 
-	0xc0, 0x05, 0x30, 0x01, 0xf6, 0x95, 0xdb, 0x82, 
-	0xd1, 0x01, 0x10, 0x63, 0xea, 0x95, 0xd1, 0x02, 
-	0x11, 0x62, 0xea, 0x95, 0xd1, 0x03, 0xd1, 0x8c, 
-	0x61, 0x06, 0xdb, 0x40, 0x00, 0xe0, 0xd0, 0x00, 
-	0x71, 0x00, 0xc0, 0x84, 0x10, 0x9c, 0xb0, 0x96, 
-	0xfa, 0xa0, 0xb1, 0x38, 0xb0, 0x96, 0xfa, 0xa3, 
-	0xb1, 0x30, 0x00, 0x29, 0xd1, 0x84, 0x00, 0x22, 
-	0xd0, 0x74, 0x70, 0x86, 0x70, 0xc1, 0x61, 0x06, 
-	0x30, 0xc2, 0xea, 0xae, 0x60, 0x81, 0xdb, 0x41, 
-	0xb0, 0x3c, 0xb1, 0xbc, 0xb0, 0x7c, 0x71, 0x00, 
-	0x70, 0x86, 0x70, 0xc1, 0x61, 0x06, 0x30, 0xc2, 
-	0xea, 0xb9, 0x60, 0x81, 0xdb, 0x41, 0x00, 0xee, 
-	0xd1, 0xb4, 0x70, 0x06, 0xb1, 0xbc, 0x70, 0x46, 
-	0x30, 0x40, 0xea, 0xc2, 0x60, 0x06, 0xdb, 0x41, 
-	0x00, 0x23, 0xd0, 0x70, 0x30, 0x81, 0xea, 0xc7, 
-	0x30, 0x81, 0x50, 0x02, 0xea, 0xca, 0xd0, 0x01, 
-	0x00, 0x22, 0xd1, 0xbc, 0x70, 0x86, 0x30, 0x80, 
-	0xea, 0xd2, 0x60, 0x06, 0xd0, 0x10, 0xf3, 0x06, 
-	0x00, 0x22, 0xd1, 0xa4, 0x71, 0x06, 0xd0, 0x01, 
-	0x41, 0x00, 0x5b, 0x44, 0x5b, 0x6e, 0x6b, 0x46, 
-	0x00, 0x28, 0xd0, 0x70, 0x70, 0x41, 0x10, 0x62, 
-	0xfa, 0xe6, 0xd1, 0x84, 0x70, 0x06, 0x10, 0x20, 
-	0xfa, 0xdf, 0x00, 0x22, 0xd0, 0x00, 0xf3, 0x06, 
-	0x02, 0x7d, 0xdc, 0x62, 0xe0, 0x46, 0x00, 0xed, 
-	0xd1, 0x88, 0x71, 0x06, 0x01, 0x1f, 0xfa, 0xfd, 
-	0xd0, 0x41, 0x41, 0x01, 0xd0, 0x62, 0x00, 0x65, 
-	0xd0, 0x30, 0x70, 0x00, 0x10, 0x21, 0xea, 0xfa, 
-	0xee, 0xf9, 0x1a, 0xe1, 0xfa, 0xfa, 0xd0, 0x52, 
-	0x51, 0x01, 0x61, 0x06, 0xe3, 0x0c, 0x18, 0xe0, 
-	0xea, 0x70, 0xc7, 0x60, 0xc7, 0xe1, 0x02, 0x50, 
-	0xea, 0x70, 0xc7, 0x61, 0xc7, 0xe0, 0xe2, 0x70, 
-	0x00, 0x28, 0xdc, 0xa4, 0x7c, 0x72, 0x5c, 0x40, 
-	0x6c, 0x72, 0x0f, 0xc5, 0x18, 0xe0, 0xeb, 0x82, 
-	0xd9, 0x0d, 0x00, 0xee, 0xd1, 0xa4, 0x70, 0x06, 
-	0x10, 0x21, 0xfb, 0x7f, 0xd9, 0x0c, 0x90, 0x06, 
-	0x00, 0x10, 0xeb, 0x7f, 0x00, 0x21, 0xd1, 0x88, 
-	0x7a, 0x06, 0x1a, 0x20, 0xeb, 0x7f, 0xd9, 0x00, 
-	0x00, 0xed, 0xd1, 0xbc, 0x79, 0x46, 0x19, 0x60, 
-	0xeb, 0x7f, 0x39, 0x68, 0xc0, 0xe5, 0xc0, 0x25, 
-	0x10, 0x13, 0xb0, 0x0f, 0xef, 0x7f, 0xb0, 0x22, 
-	0xe7, 0x7f, 0x00, 0xe0, 0xd1, 0xa8, 0x71, 0x46, 
-	0x11, 0x5f, 0x29, 0x45, 0x00, 0x22, 0xd0, 0x18, 
-	0x00, 0x22, 0xd4, 0x54, 0x00, 0x22, 0xd0, 0x9c, 
-	0x70, 0x00, 0x74, 0x51, 0x70, 0x42, 0x34, 0x40, 
-	0xe7, 0x3c, 0xd0, 0x40, 0x00, 0x22, 0xd4, 0x50, 
-	0x74, 0x51, 0x34, 0x40, 0xef, 0x42, 0x20, 0x45, 
-	0x60, 0x42, 0x39, 0x41, 0x19, 0x60, 0xf7, 0x5e, 
-	0x00, 0x65, 0xd1, 0xa8, 0x7a, 0x86, 0x29, 0x6a, 
-	0x19, 0x59, 0xb9, 0x7e, 0xf7, 0x75, 0x15, 0xa3, 
-	0xf7, 0x57, 0x00, 0xed, 0xd1, 0xac, 0x70, 0x06, 
-	0x00, 0xed, 0xd1, 0xb0, 0x70, 0x46, 0x30, 0x01, 
-	0xfb, 0x7f, 0x00, 0x65, 0xd1, 0x84, 0x70, 0x46, 
-	0xb0, 0x7f, 0x60, 0x46, 0xd5, 0x84, 0xe3, 0x7f, 
-	0x11, 0x41, 0xd0, 0x4a, 0x00, 0xed, 0xd1, 0xa0, 
-	0x74, 0x46, 0xd0, 0x00, 0x60, 0x06, 0x30, 0xc5, 
-	0x39, 0x45, 0xe7, 0x6e, 0x14, 0x60, 0xeb, 0x6b, 
-	0xf3, 0x85, 0xb0, 0x41, 0xef, 0x65, 0xe3, 0x71, 
-	0x00, 0x66, 0xd1, 0xa0, 0x60, 0xc6, 0x15, 0xa3, 
-	0xeb, 0x7f, 0xf3, 0x85, 0xe3, 0x7f, 0xd9, 0x01, 
-	0x00, 0x66, 0xd1, 0xa0, 0x70, 0x06, 0x30, 0x03, 
-	0xe7, 0x7e, 0x10, 0x1d, 0x10, 0x3b, 0xe7, 0x7f, 
-	0x60, 0xc6, 0x00, 0x66, 0xd1, 0xa4, 0x69, 0x06, 
-	0x15, 0xa4, 0xea, 0x23, 0xe2, 0x3b, 0x00, 0x65, 
-	0xdd, 0x08, 0x7c, 0xf4, 0xbc, 0xff, 0x6c, 0xf4, 
-	0x00, 0xef, 0xdd, 0x10, 0x7c, 0xf4, 0xbc, 0xfe, 
-	0x6c, 0xf4, 0xc0, 0x3f, 0xf1, 0x18, 0xf1, 0x16, 
-	0xf1, 0x18, 0x00, 0x05, 0x08, 0x20, 0xd0, 0x40, 
-	0x5f, 0x01, 0x15, 0x63, 0xe9, 0x77, 0x05, 0x5e, 
-	0xea, 0xf2, 0x00, 0x22, 0xd1, 0xa0, 0x6b, 0x06, 
-	0x00, 0x22, 0xd1, 0xa8, 0x6b, 0xc6, 0x00, 0x22, 
-	0xd1, 0xac, 0x6a, 0xc6, 0x00, 0xee, 0xd0, 0x0c, 
-	0x00, 0xe6, 0xd1, 0x9c, 0x70, 0x40, 0x30, 0x5f, 
-	0xe9, 0x8d, 0xb0, 0x3c, 0xb1, 0xb4, 0x70, 0x40, 
-	0x30, 0x5f, 0xe9, 0x8d, 0xb1, 0xb4, 0x00, 0xe6, 
-	0xd0, 0x10, 0xd0, 0x83, 0x70, 0x40, 0x60, 0x46, 
-	0xb0, 0x3c, 0xb1, 0xbc, 0xb0, 0x81, 0xed, 0x90, 
-	0x00, 0xee, 0xd0, 0x0c, 0x00, 0xe6, 0xd1, 0x9c, 
-	0x70, 0x40, 0x30, 0x4c, 0xe9, 0xa3, 0xb0, 0x3c, 
-	0xb1, 0xb4, 0x70, 0x40, 0x30, 0x4c, 0xe9, 0xa3, 
-	0xb1, 0xb4, 0x00, 0xe6, 0xd0, 0x00, 0x61, 0x80, 
-	0x00, 0x21, 0xd1, 0xb4, 0x70, 0x06, 0x10, 0x20, 
-	0xe9, 0xae, 0xd0, 0x00, 0x60, 0x06, 0xf1, 0x18, 
-	0x00, 0x21, 0xd1, 0x8c, 0x70, 0x46, 0x65, 0x86, 
-	0xde, 0xc0, 0x00, 0xee, 0xd0, 0x20, 0x70, 0x00, 
-	0x10, 0x22, 0xfd, 0xb9, 0xde, 0xc2, 0x00, 0x21, 
-	0xd0, 0x04, 0x70, 0x00, 0x10, 0x21, 0xe9, 0xc0, 
-	0x15, 0xa3, 0xe9, 0xdc, 0xd0, 0x02, 0x4c, 0x00, 
-	0x10, 0x63, 0xe9, 0xc5, 0xcc, 0x3b, 0xd0, 0x04, 
-	0x63, 0x00, 0xd0, 0x00, 0x70, 0x00, 0x30, 0x1f, 
-	0xfa, 0xf2, 0xd0, 0x18, 0x70, 0x00, 0x10, 0x20, 
-	0xed, 0xc7, 0xd0, 0x04, 0x70, 0x80, 0x10, 0xa0, 
-	0xea, 0xf2, 0xf1, 0x16, 0x00, 0x21, 0xd0, 0x9a, 
-	0xc0, 0x39, 0x30, 0x1f, 0x10, 0x18, 0x30, 0x02, 
-	0xfd, 0xcf, 0xe2, 0xf2, 0x00, 0xe0, 0xd9, 0x04, 
-	0x79, 0x24, 0xb9, 0x38, 0x19, 0x1c, 0xd0, 0x1e, 
-	0x30, 0x24, 0xf5, 0xe5, 0x29, 0x00, 0xdc, 0x88, 
-	0x4c, 0xac, 0xd0, 0x02, 0x40, 0x2c, 0x10, 0x02, 
-	0x0c, 0x80, 0x10, 0x63, 0xea, 0x5a, 0x15, 0x63, 
-	0xf9, 0xf0, 0xf1, 0x18, 0xdc, 0x1e, 0x1e, 0xe0, 
-	0xe9, 0xf6, 0x15, 0x63, 0xf9, 0xf6, 0xbe, 0xfc, 
-	0xd0, 0x2c, 0x6c, 0x00, 0xcc, 0x24, 0xd9, 0x40, 
-	0x06, 0x50, 0xea, 0x0c, 0xc0, 0x24, 0xb0, 0x0f, 
-	0xfe, 0x0c, 0xd9, 0x74, 0x79, 0x65, 0x19, 0x5f, 
-	0x30, 0x25, 0xee, 0x05, 0x29, 0x40, 0x19, 0x5f, 
-	0x19, 0x41, 0xc0, 0x25, 0x20, 0x30, 0x30, 0x24, 
-	0xe6, 0x0c, 0x3c, 0x00, 0xd0, 0x38, 0x69, 0x40, 
-	0x1c, 0x05, 0xbc, 0x38, 0x3c, 0x32, 0x5c, 0x3b, 
-	0xbc, 0x3f, 0xd8, 0xec, 0x78, 0xe3, 0xc0, 0xa3, 
-	0x10, 0xaf, 0xf6, 0x19, 0xd0, 0x8f, 0x02, 0xe4, 
-	0xd8, 0x00, 0xd0, 0xc0, 0x20, 0xe0, 0xb0, 0x81, 
-	0xee, 0x1c, 0xd0, 0x30, 0x60, 0xc0, 0x00, 0xab, 
-	0xd0, 0x30, 0xc0, 0xc0, 0xd8, 0x40, 0xc1, 0x23, 
-	0xd4, 0x5e, 0x34, 0x63, 0xdc, 0x40, 0x0c, 0x1f, 
-	0xfa, 0x45, 0xc0, 0x65, 0xb0, 0x41, 0xe6, 0x31, 
-	0x68, 0x40, 0xb0, 0x3c, 0xe2, 0x2c, 0xc0, 0xc0, 
-	0x34, 0x65, 0xdc, 0x48, 0x4c, 0x70, 0x1c, 0x5f, 
-	0x20, 0xf1, 0x15, 0x63, 0xfa, 0x46, 0xf2, 0x3e, 
-	0xc1, 0x11, 0xc0, 0x83, 0xf2, 0x8f, 0xe2, 0x59, 
-	0xb1, 0x01, 0xe6, 0x44, 0x68, 0x40, 0x28, 0x60, 
-	0xb0, 0x3c, 0xe2, 0x3e, 0x0f, 0xc5, 0xd9, 0x40, 
-	0xb1, 0x0f, 0x11, 0x01, 0x21, 0x25, 0xf2, 0x3e, 
-	0xc1, 0x11, 0xb1, 0x01, 0xe6, 0x59, 0x20, 0x31, 
-	0x68, 0x40, 0x30, 0x31, 0xb0, 0x3c, 0x28, 0x60, 
-	0x70, 0x43, 0x30, 0x31, 0x60, 0x40, 0x20, 0x31, 
-	0xb0, 0x3c, 0xb0, 0xf8, 0xe2, 0x4b, 0xe2, 0xe1, 
-	0xd8, 0xec, 0x78, 0xe3, 0x00, 0xa8, 0xd0, 0x80, 
-	0x00, 0xa8, 0xd1, 0x44, 0x00, 0xab, 0xd0, 0x30, 
-	0xc0, 0xc0, 0x0c, 0x1f, 0xfa, 0x9d, 0xd9, 0x78, 
-	0x79, 0x65, 0x39, 0x25, 0x19, 0x5f, 0xc9, 0xa5, 
-	0x19, 0x83, 0x20, 0x26, 0x20, 0xe6, 0x20, 0xa6, 
-	0x21, 0x66, 0xc1, 0x23, 0xc0, 0x64, 0x10, 0x5f, 
-	0x10, 0x9d, 0x20, 0x81, 0x31, 0x01, 0x30, 0x44, 
-	0xf6, 0x78, 0x21, 0x01, 0x30, 0x84, 0x10, 0x83, 
-	0xc4, 0x64, 0x34, 0x63, 0xdc, 0x48, 0x4c, 0x70, 
-	0x1c, 0x5f, 0x15, 0x63, 0xfa, 0xad, 0x20, 0xb1, 
-	0xf2, 0x8f, 0xc1, 0x24, 0x11, 0x1f, 0xc0, 0x85, 
-	0x30, 0xb1, 0xf2, 0x8f, 0xc1, 0x11, 0xc0, 0x83, 
-	0x0c, 0x9d, 0xfa, 0x8d, 0xb0, 0xbc, 0xf2, 0x8f, 
-	0xe2, 0xd6, 0xb1, 0x01, 0xe6, 0x44, 0x70, 0x42, 
-	0xb0, 0xb8, 0x60, 0x40, 0xb0, 0x3c, 0xe2, 0x8f, 
-	0xb1, 0x01, 0xe6, 0x44, 0x70, 0x42, 0xb0, 0xb8, 
-	0x60, 0x40, 0xb0, 0x38, 0xe2, 0x96, 0x00, 0xab, 
-	0xd0, 0x34, 0xc1, 0x23, 0xb1, 0x0f, 0xf2, 0x96, 
-	0xd1, 0x1e, 0x31, 0x23, 0x00, 0xa8, 0xd0, 0x84, 
-	0xf2, 0x96, 0xd1, 0x0f, 0x00, 0xa8, 0xd0, 0x84, 
-	0xc0, 0x03, 0xf2, 0x96, 0xe2, 0xd6, 0xd8, 0x82, 
-	0x48, 0x95, 0x18, 0x81, 0xb1, 0x01, 0xe6, 0xc3, 
-	0x20, 0xb1, 0x70, 0x42, 0x30, 0xb1, 0x20, 0x22, 
-	0x60, 0x40, 0x30, 0x22, 0xb0, 0xbc, 0xb0, 0x3c, 
-	0x30, 0xb1, 0x70, 0x42, 0x20, 0xb1, 0x30, 0x22, 
-	0x60, 0x40, 0x20, 0x22, 0xb0, 0xbc, 0xb0, 0x3c, 
-	0xe2, 0xb0, 0xc1, 0x11, 0xc0, 0x85, 0x30, 0xb1, 
-	0x20, 0xe2, 0xb1, 0x01, 0xe6, 0xd6, 0x70, 0x42, 
-	0xb0, 0xb8, 0x20, 0x22, 0x60, 0x40, 0x30, 0x22, 
-	0xb0, 0x3c, 0x70, 0x43, 0xb0, 0xf8, 0x30, 0x22, 
-	0x60, 0x40, 0x20, 0x22, 0xb0, 0x3c, 0xe2, 0xc7, 
-	0xd0, 0x08, 0x5c, 0x00, 0x3c, 0x32, 0xd0, 0x04, 
-	0x40, 0x30, 0x3c, 0x00, 0x15, 0x63, 0xfa, 0xe1, 
-	0x1e, 0xe0, 0xea, 0xe1, 0xbc, 0x3c, 0x00, 0xab, 
-	0xd0, 0xb0, 0x00, 0xa8, 0xd0, 0x00, 0x00, 0x20, 
-	0xd1, 0x1e, 0x70, 0x42, 0xb0, 0xbc, 0x60, 0x40, 
-	0xb0, 0x3c, 0xb1, 0x01, 0xee, 0xe7, 0xd0, 0x30, 
-	0x30, 0x30, 0xee, 0xed, 0xd0, 0x04, 0x63, 0x00, 
-	0x08, 0x20, 0xd0, 0x40, 0x3f, 0x01, 0x02, 0xba, 
-	0xd0, 0x3c, 0xe0, 0x46, 0x01, 0x46, 0xd0, 0x08, 
-	0x94, 0x89, 0xd0, 0x8c, 0x44, 0x82, 0x14, 0x9e, 
-	0x30, 0x12, 0xd0, 0x88, 0x10, 0x80, 0x00, 0xe8, 
-	0xd1, 0x80, 0x70, 0xc6, 0x00, 0x06, 0xa0, 0xbd, 
-	0xa0, 0xfc, 0x80, 0x3f, 0xb1, 0xbe, 0x60, 0xc6, 
-	0x00, 0x06, 0x80, 0xa9, 0x80, 0x3f, 0x80, 0x2a, 
-	0x80, 0x3f, 0x00, 0x21, 0xd0, 0x3c, 0x00, 0x0a, 
-	0xb1, 0x82, 0xd0, 0x6b, 0x70, 0x46, 0x00, 0x06, 
-	0x80, 0x07, 0x01, 0x20, 0xd0, 0x67, 0xa0, 0x69, 
-	0x80, 0x2a, 0x82, 0x29, 0x80, 0x6a, 0x84, 0x29, 
-	0xd0, 0x54, 0x10, 0x4f, 0xa0, 0x6a, 0x01, 0x20, 
-	0xd0, 0x00, 0xa0, 0x29, 0x80, 0x2b, 0x0c, 0x20, 
-	0xd0, 0x00, 0x10, 0x08, 0xa0, 0x27, 0x90, 0x09, 
-	0xd0, 0x41, 0x40, 0x01, 0xd0, 0x44, 0x40, 0x70, 
-	0x20, 0x01, 0xa0, 0x27, 0x80, 0x3f, 0x00, 0xc6, 
-	0x15, 0x63, 0xe9, 0xae, 0x05, 0x5e, 0xe9, 0xbe, 
-	0x00, 0xe0, 0xd0, 0x40, 0x70, 0x81, 0x10, 0x9c, 
-	0xb0, 0x96, 0xf9, 0xb7, 0x00, 0x21, 0xd0, 0x40, 
-	0xe1, 0xbb, 0xb0, 0x96, 0xf9, 0xbe, 0x00, 0x22, 
-	0xd0, 0x40, 0x27, 0xc1, 0x27, 0x41, 0x27, 0x81, 
-	0x90, 0x83, 0x00, 0x64, 0xd0, 0x10, 0x60, 0x80, 
-	0x01, 0x46, 0x82, 0x34, 0x80, 0x3f, 0x00, 0x64, 
-	0xd0, 0x14, 0x67, 0x40, 0x80, 0x34, 0x80, 0x3f, 
-	0x00, 0xc6, 0x90, 0xae, 0x00, 0x64, 0xd0, 0x18, 
-	0x60, 0x80, 0x90, 0xa6, 0x00, 0x64, 0xd0, 0x1c, 
-	0x60, 0x80, 0x15, 0x63, 0xe9, 0xe3, 0x0c, 0x1f, 
-	0xe9, 0xe3, 0x05, 0x50, 0xf9, 0xe3, 0x15, 0xa3, 
-	0xf9, 0xe3, 0x90, 0x4d, 0x10, 0x60, 0xe5, 0xdb, 
-	0x00, 0x06, 0x05, 0x0d, 0x01, 0x7a, 0xde, 0x1a, 
-	0xe0, 0x46, 0x15, 0xa3, 0xf9, 0xfb, 0x00, 0x21, 
-	0xd0, 0x04, 0x70, 0x00, 0x10, 0x21, 0xe9, 0xfb, 
-	0xd0, 0x38, 0x70, 0x00, 0x15, 0x63, 0xe9, 0xef, 
-	0x10, 0x1f, 0x15, 0x21, 0xe5, 0xe0, 0xd0, 0x5e, 
-	0x30, 0x54, 0xe5, 0xe0, 0xc0, 0x40, 0xb0, 0x7f, 
-	0x30, 0x54, 0xe9, 0xfb, 0x0c, 0x09, 0x05, 0x0d, 
-	0xe1, 0xef, 0xc0, 0x5f, 0x10, 0x58, 0x10, 0x48, 
-	0x00, 0xee, 0xd0, 0x8c, 0xd0, 0xc3, 0x70, 0x02, 
-	0x30, 0x01, 0xea, 0x10, 0xb0, 0xbc, 0xb0, 0xc1, 
-	0xee, 0x01, 0x00, 0x26, 0xd0, 0x20, 0x70, 0x40, 
-	0xb0, 0x7f, 0x60, 0x40, 0x15, 0xa3, 0xea, 0x0f, 
-	0xb0, 0x88, 0x77, 0xc2, 0x80, 0x07, 0x09, 0x49, 
-	0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0, 
-	0x00, 0x4d, 0xa0, 0x6c, 0xd3, 0x80, 0xd0, 0xa1, 
-	0x00, 0x88, 0xd0, 0xa9, 0x00, 0x4d, 0x00, 0x50, 
-	0xfa, 0x1a, 0x0c, 0x49, 0x00, 0x8d, 0xc0, 0x42, 
-	0x10, 0x60, 0xea, 0x2a, 0xb0, 0x5e, 0xb0, 0x43, 
-	0xfe, 0x34, 0xd0, 0x61, 0x23, 0x81, 0xe2, 0x1f, 
-	0x0c, 0x09, 0x05, 0x0d, 0x15, 0x20, 0xfe, 0x31, 
-	0xd0, 0x5f, 0x30, 0x54, 0xee, 0x10, 0x03, 0xb3, 
-	0xd8, 0x29, 0xe0, 0x46, 0xc6, 0xd4, 0xb6, 0xc1, 
-	0xe6, 0x31, 0xd0, 0x5e, 0x30, 0x5b, 0xfe, 0x31, 
-	0xd7, 0x00, 0xb7, 0x01, 0xd3, 0x81, 0x00, 0x27, 
-	0xd0, 0x10, 0xd0, 0x81, 0x60, 0x80, 0x15, 0x63, 
-	0xfa, 0x54, 0x00, 0x22, 0xdc, 0xd8, 0x03, 0xf7, 
-	0xd2, 0x10, 0xf0, 0x4a, 0x15, 0xa3, 0xfa, 0x51, 
-	0x02, 0xf6, 0xde, 0x26, 0x0c, 0x10, 0xf8, 0x46, 
-	0x02, 0xfb, 0xda, 0x22, 0xe0, 0x46, 0x02, 0xf1, 
-	0xd8, 0x2b, 0xe0, 0x46, 0x00, 0x22, 0xdc, 0xd8, 
-	0x03, 0xf9, 0xd2, 0x10, 0xf0, 0x4a, 0x03, 0x34, 
-	0xdc, 0x20, 0x15, 0xa3, 0xe8, 0x46, 0x02, 0xff, 
-	0xde, 0x27, 0xe0, 0x46, 0x03, 0x75, 0xd2, 0x73, 
-	0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xe0, 
-	0xe1, 0xec, 0xe2, 0x12, 0xe2, 0x14, 0xe1, 0xc7, 
-	0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x8d, 0x06, 0x50, 
-	0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42, 
-	0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x5e, 
-	0x30, 0x5b, 0xfc, 0x11, 0xc0, 0x39, 0x30, 0x31, 
-	0x10, 0x12, 0x10, 0x20, 0xe9, 0x88, 0x03, 0x10, 
-	0xe9, 0x93, 0x0f, 0x19, 0xf9, 0x8f, 0xd1, 0x44, 
-	0xe1, 0x79, 0x03, 0xde, 0xf9, 0xba, 0x03, 0xdf, 
-	0xe9, 0x99, 0xd3, 0x40, 0xca, 0x50, 0xd1, 0x42, 
-	0xe2, 0xea, 0xc0, 0x50, 0x10, 0x54, 0xc0, 0x90, 
-	0x10, 0x8c, 0x10, 0x92, 0x10, 0xe0, 0xe5, 0xa8, 
-	0xc0, 0x01, 0x10, 0x01, 0x20, 0x40, 0xc0, 0x02, 
-	0x10, 0x01, 0x20, 0x80, 0x10, 0x60, 0xfd, 0xab, 
-	0xb0, 0x7f, 0x10, 0xa0, 0xfd, 0xae, 0xb0, 0xbf, 
-	0x10, 0x5f, 0x10, 0x9f, 0x00, 0xef, 0xd0, 0x3e, 
-	0x20, 0x52, 0x20, 0x83, 0x20, 0x93, 0x10, 0x4c, 
-	0x10, 0x82, 0x40, 0x80, 0x50, 0x42, 0x0f, 0xc5, 
-	0xcb, 0xaa, 0xcb, 0xeb, 0xca, 0x50, 0xd0, 0xc0, 
-	0xb0, 0xc1, 0xf1, 0x9b, 0xcb, 0x01, 0xd0, 0xc1, 
-	0xf1, 0x9b, 0xcb, 0x41, 0xba, 0x7f, 0xbb, 0x3f, 
-	0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b, 
-	0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x48, 
-	0xcc, 0xb1, 0x1c, 0x9f, 0x06, 0xd0, 0xe9, 0xd5, 
-	0x01, 0x69, 0xd0, 0x20, 0x3c, 0x80, 0xc0, 0x1c, 
-	0x10, 0x08, 0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80, 
-	0x01, 0x74, 0xd6, 0x00, 0x2c, 0x80, 0xde, 0x84, 
-	0xde, 0xc4, 0xe3, 0x1e, 0xd3, 0xc2, 0xf2, 0xd3, 
-	0x13, 0xa0, 0xed, 0xe5, 0xf2, 0x32, 0xb3, 0x81, 
-	0xe9, 0xec, 0x80, 0x07, 0xd4, 0x00, 0xc4, 0x50, 
-	0xd3, 0x08, 0xe2, 0x95, 0xd0, 0x71, 0x20, 0x56, 
-	0x00, 0x48, 0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c, 
-	0xe9, 0xfa, 0x06, 0x5e, 0xfa, 0x03, 0x08, 0x89, 
-	0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xfa, 0xd3, 0xc4, 
-	0x06, 0x5e, 0xfa, 0x03, 0xd0, 0x43, 0x40, 0x4c, 
-	0xea, 0x03, 0x08, 0x49, 0x00, 0x8d, 0x10, 0x87, 
-	0x53, 0x02, 0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6, 
-	0x03, 0x1c, 0xea, 0x0a, 0x09, 0x49, 0x00, 0x0d, 
-	0xd0, 0x9f, 0x40, 0x02, 0xb0, 0x20, 0x03, 0x19, 
-	0xea, 0x10, 0xb0, 0x20, 0xa0, 0x2c, 0xe2, 0x5b, 
-	0x06, 0x5f, 0xfa, 0x80, 0xd4, 0x00, 0xc4, 0x50, 
-	0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00, 
-	0x50, 0x00, 0x50, 0x00, 0x03, 0x75, 0xd2, 0x73, 
-	0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xd3, 
-	0xe1, 0xdc, 0xe2, 0x00, 0xe2, 0x02, 0xe1, 0xac, 
-	0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x91, 0x06, 0x50, 
-	0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42, 
-	0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x5e, 
-	0x30, 0x5b, 0xfc, 0x11, 0xbc, 0x10, 0xd0, 0x10, 
-	0x0c, 0x1e, 0xf9, 0x8e, 0xbc, 0x10, 0xd0, 0x30, 
-	0xc0, 0x40, 0x30, 0x70, 0xed, 0x8e, 0x03, 0x10, 
-	0xe9, 0x97, 0x0f, 0x19, 0xf9, 0x93, 0xd1, 0x44, 
-	0xe1, 0x79, 0x03, 0xdf, 0xe9, 0xa1, 0xd3, 0x40, 
-	0xca, 0x50, 0xcb, 0x52, 0x03, 0x1d, 0xf9, 0xa8, 
-	0xca, 0x12, 0xca, 0x52, 0xe1, 0xa5, 0x03, 0x1d, 
-	0xf9, 0xa8, 0xca, 0x12, 0xca, 0x53, 0xca, 0xae, 
-	0xca, 0xef, 0xb1, 0x7e, 0x03, 0x1e, 0xfa, 0xea, 
-	0xb1, 0x7e, 0xe2, 0xea, 0x00, 0x24, 0xd0, 0x00, 
-	0x2c, 0x40, 0x2c, 0x80, 0x17, 0x20, 0xf9, 0xd2, 
-	0x00, 0xa8, 0xd0, 0x00, 0xcc, 0x5b, 0x1c, 0x5f, 
-	0x1c, 0x43, 0x20, 0x31, 0x7c, 0x40, 0xb0, 0x3c, 
-	0x7e, 0x80, 0xcc, 0xb1, 0xce, 0xfa, 0x1c, 0x9f, 
-	0x1e, 0xdf, 0x01, 0x69, 0xd0, 0x3c, 0x0c, 0x99, 
-	0xe9, 0xc4, 0x3c, 0x80, 0x0e, 0xd9, 0xe9, 0xc7, 
-	0x3e, 0xc0, 0x3e, 0xf2, 0x3e, 0xb1, 0xd0, 0x01, 
-	0x40, 0x1b, 0x10, 0x05, 0x20, 0x1f, 0x2c, 0x40, 
-	0x2c, 0x80, 0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80, 
-	0xe3, 0x1e, 0xd3, 0xc2, 0xf2, 0xd3, 0x13, 0xa0, 
-	0xed, 0xd8, 0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xdc, 
-	0x80, 0x07, 0xe2, 0x95, 0x0d, 0x09, 0xd1, 0x8c, 
-	0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xe8, 0x06, 0x5e, 
-	0xf9, 0xf1, 0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3, 
-	0xf9, 0xe8, 0xd3, 0xc4, 0x06, 0x5e, 0xf9, 0xf1, 
-	0xd0, 0x43, 0x40, 0x4c, 0xe9, 0xf1, 0x08, 0x49, 
-	0x00, 0x8d, 0x10, 0x87, 0x53, 0x02, 0x01, 0x46, 
-	0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c, 0xe9, 0xf8, 
-	0x09, 0x49, 0x00, 0x0d, 0xd0, 0x9f, 0x40, 0x02, 
-	0xb0, 0x20, 0x03, 0x19, 0xe9, 0xfe, 0xb0, 0x20, 
-	0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x80, 
-	0xd4, 0x00, 0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0, 
-	0xe2, 0x8d, 0x50, 0x00, 0x03, 0x75, 0xd2, 0x73, 
-	0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xc1, 
-	0xe1, 0xca, 0xe1, 0xee, 0xe1, 0xf0, 0xe1, 0xa8, 
-	0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x8d, 0x06, 0x50, 
-	0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42, 
-	0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x5e, 
-	0x30, 0x5b, 0xfc, 0x11, 0xc0, 0x39, 0x30, 0x31, 
-	0x10, 0x12, 0x10, 0x20, 0xe9, 0x88, 0x03, 0x10, 
-	0xe9, 0x93, 0x0f, 0x19, 0xf9, 0x8f, 0xd1, 0x44, 
-	0xe1, 0x79, 0x03, 0xdf, 0xe9, 0x9d, 0xd3, 0x40, 
-	0xca, 0x50, 0xcb, 0x52, 0x03, 0x1d, 0xf9, 0xa4, 
-	0xca, 0x12, 0xca, 0x52, 0xe1, 0xa1, 0x03, 0x1d, 
-	0xf9, 0xa4, 0xca, 0x12, 0xca, 0x53, 0xca, 0xae, 
-	0xca, 0xef, 0xb1, 0x7e, 0x03, 0x1e, 0xfa, 0xea, 
-	0xb1, 0x7e, 0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42, 
-	0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40, 
-	0x1c, 0x48, 0xcc, 0xb1, 0x1c, 0x9f, 0x06, 0xd0, 
-	0xe9, 0xb6, 0x01, 0x69, 0xd0, 0x20, 0x3c, 0x80, 
-	0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f, 0x2c, 0x40, 
-	0x2c, 0x80, 0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80, 
-	0xde, 0x84, 0xde, 0xc4, 0xe3, 0x1e, 0xd3, 0xc2, 
-	0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xc6, 0xf2, 0x32, 
-	0xb3, 0x81, 0xe9, 0xca, 0x80, 0x07, 0xe2, 0x95, 
-	0x0d, 0x09, 0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c, 
-	0xe9, 0xd6, 0x06, 0x5e, 0xf9, 0xdf, 0x08, 0x89, 
-	0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xd6, 0xd3, 0xc4, 
-	0x06, 0x5e, 0xf9, 0xdf, 0xd0, 0x43, 0x40, 0x4c, 
-	0xe9, 0xdf, 0x08, 0x49, 0x00, 0x8d, 0x10, 0x87, 
-	0x53, 0x02, 0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6, 
-	0x03, 0x1c, 0xe9, 0xe6, 0x09, 0x49, 0x00, 0x0d, 
-	0xd0, 0x9f, 0x40, 0x02, 0xb0, 0x20, 0x03, 0x19, 
-	0xe9, 0xec, 0xb0, 0x20, 0xa0, 0x2c, 0xe2, 0x5b, 
-	0x06, 0x5f, 0xfa, 0x80, 0xd4, 0x00, 0xc4, 0x50, 
-	0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00, 
-	0x50, 0x00, 0x50, 0x00, 0x03, 0x75, 0xd2, 0x73, 
-	0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xdb, 
-	0xe1, 0xe9, 0xe2, 0x00, 0xe2, 0x02, 0xe1, 0xc3, 
-	0xe1, 0x65, 0x30, 0x5a, 0xe5, 0x8d, 0x06, 0x50, 
-	0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42, 
-	0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x4f, 
-	0x30, 0x5b, 0xfc, 0x11, 0xc0, 0x39, 0x30, 0x31, 
-	0x10, 0x11, 0x10, 0x20, 0xe9, 0x88, 0x03, 0x10, 
-	0xe9, 0x93, 0x0f, 0x19, 0xf9, 0x8f, 0xd1, 0x44, 
-	0xe1, 0x79, 0x03, 0xd0, 0xf9, 0x98, 0xca, 0x50, 
-	0x03, 0xde, 0xf9, 0x9a, 0xd1, 0x42, 0xe2, 0xea, 
-	0xcb, 0xaa, 0xcb, 0xeb, 0xc0, 0x50, 0x10, 0x54, 
-	0xc0, 0x90, 0x10, 0x8c, 0x10, 0x92, 0xd0, 0xc1, 
-	0x05, 0x50, 0xe9, 0xa5, 0xb0, 0xc2, 0x10, 0x60, 
-	0xfd, 0xa8, 0xb0, 0x7f, 0x10, 0xa0, 0xfd, 0xab, 
-	0xb0, 0xbf, 0x10, 0x5f, 0x10, 0x9f, 0x00, 0xef, 
-	0xd0, 0x3e, 0x20, 0x52, 0x20, 0x83, 0x20, 0x93, 
-	0x10, 0x4c, 0x10, 0x82, 0x40, 0x80, 0x50, 0x42, 
-	0xd0, 0x81, 0x14, 0x1f, 0x14, 0x01, 0x05, 0x50, 
-	0xe9, 0xbd, 0x50, 0x42, 0xe1, 0xbe, 0x54, 0x02, 
-	0xca, 0x10, 0xca, 0x50, 0xcb, 0x01, 0xcb, 0x41, 
-	0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b, 
-	0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x49, 
-	0xcc, 0xb1, 0x1c, 0x9f, 0xc0, 0x1c, 0x10, 0x08, 
-	0x20, 0x1f, 0x05, 0x50, 0xf9, 0xd2, 0xb0, 0x3c, 
-	0x2c, 0x40, 0x2c, 0x80, 0x01, 0x74, 0xd6, 0x00, 
-	0x2c, 0x80, 0x02, 0xe4, 0xde, 0x80, 0xde, 0xc1, 
-	0xe3, 0x1e, 0xd3, 0xc0, 0xf2, 0xd3, 0x13, 0xa0, 
-	0xed, 0xe0, 0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xe9, 
-	0x80, 0x07, 0xd4, 0x02, 0x44, 0x15, 0x14, 0x1f, 
-	0xc4, 0x50, 0xd3, 0x08, 0xe2, 0x95, 0xd0, 0x71, 
-	0x20, 0x56, 0x00, 0x48, 0xd1, 0x8c, 0x03, 0x0d, 
-	0x41, 0x8c, 0xe9, 0xf7, 0x08, 0x89, 0x03, 0xcd, 
-	0x13, 0xe3, 0xf9, 0xf6, 0xd3, 0xc4, 0xe1, 0xf7, 
-	0xb3, 0xc1, 0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6, 
-	0x03, 0x1c, 0xe9, 0xfe, 0x09, 0x49, 0x00, 0x0d, 
-	0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x7f, 
-	0xd4, 0x02, 0x44, 0x15, 0x14, 0x1f, 0xc4, 0x50, 
-	0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00, 
-	0x50, 0x00, 0x50, 0x00, 0x03, 0x75, 0xd2, 0x73, 
-	0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xc9, 
-	0xe1, 0xd2, 0xe1, 0xe7, 0xe1, 0xe9, 0xe1, 0xab, 
-	0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x91, 0x06, 0x50, 
-	0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42, 
-	0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x4f, 
-	0x30, 0x5b, 0xfc, 0x11, 0xbc, 0x10, 0xd0, 0x10, 
-	0x0c, 0x1e, 0xf9, 0x8e, 0xbc, 0x10, 0xd0, 0x20, 
-	0xc0, 0x40, 0x30, 0x70, 0xed, 0x8e, 0x03, 0x10, 
-	0xe9, 0x97, 0x0f, 0x19, 0xf9, 0x93, 0xd1, 0x44, 
-	0xe1, 0x79, 0x03, 0xd0, 0xf9, 0xa0, 0xca, 0x50, 
-	0xcb, 0x52, 0x03, 0x1d, 0xf9, 0xa7, 0xca, 0x12, 
-	0xca, 0x52, 0xe1, 0xa4, 0x03, 0x1d, 0xf9, 0xa7, 
-	0xca, 0x12, 0xca, 0x53, 0xca, 0xae, 0xca, 0xef, 
-	0xb1, 0x7e, 0x03, 0x1e, 0xfa, 0xea, 0xb1, 0x7e, 
-	0xe2, 0xea, 0x00, 0x24, 0xd0, 0x00, 0x2c, 0x40, 
-	0x2c, 0x80, 0x17, 0x20, 0xf9, 0xc8, 0x00, 0x2a, 
-	0xd0, 0x00, 0x20, 0x1b, 0x20, 0x1b, 0x05, 0x50, 
-	0xf9, 0xb8, 0xb0, 0x3f, 0x10, 0x02, 0x7c, 0x40, 
-	0xcc, 0xb1, 0x1c, 0x9f, 0x01, 0x69, 0xd0, 0x3c, 
-	0x0c, 0x99, 0xe9, 0xc1, 0x3c, 0x80, 0xde, 0xa0, 
-	0x2c, 0x5f, 0x2c, 0x9f, 0xd0, 0x30, 0x70, 0x00, 
-	0x2c, 0x80, 0xde, 0xc1, 0xe3, 0x1e, 0xd3, 0xc0, 
-	0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xce, 0xf2, 0x32, 
-	0xb3, 0x81, 0xe9, 0xd2, 0x80, 0x07, 0xe2, 0x95, 
-	0x0d, 0x09, 0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c, 
-	0xe9, 0xde, 0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3, 
-	0xf9, 0xdd, 0xd3, 0xc4, 0xe1, 0xde, 0xb3, 0xc1, 
-	0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c, 
-	0xe9, 0xe5, 0x09, 0x49, 0x00, 0x0d, 0xa0, 0x2c, 
-	0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x7f, 0xd4, 0x00, 
-	0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d, 
-	0x50, 0x00, 0x50, 0x00, 0x03, 0x75, 0xd2, 0x73, 
-	0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xa3, 
-	0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xe1, 0x8a, 
-	0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x87, 0x37, 0x1a, 
-	0xb6, 0xff, 0xd0, 0x5e, 0x30, 0x5b, 0xfd, 0xb4, 
-	0xc0, 0x39, 0x30, 0x31, 0x10, 0x12, 0x10, 0x20, 
-	0xe9, 0x82, 0xd1, 0x42, 0xd3, 0x40, 0xe2, 0xea, 
-	0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31, 
-	0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x48, 0xcc, 0xb1, 
-	0x1c, 0x9f, 0x06, 0xd0, 0xe9, 0x98, 0x01, 0x69, 
-	0xd0, 0x20, 0x3c, 0x80, 0xc0, 0x1c, 0x10, 0x08, 
-	0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80, 0x01, 0x74, 
-	0xd6, 0x00, 0x2c, 0x80, 0xde, 0x84, 0xde, 0xc4, 
-	0xe3, 0x1e, 0xf2, 0xd3, 0xc0, 0x5c, 0xb0, 0x7f, 
-	0x30, 0x5a, 0xe5, 0xc8, 0x00, 0x26, 0xd0, 0x00, 
-	0x70, 0x00, 0x10, 0x20, 0xe9, 0xbf, 0x00, 0xe0, 
-	0xd0, 0x44, 0x70, 0x41, 0x10, 0x5c, 0x30, 0x5b, 
-	0xb0, 0x41, 0xed, 0xc8, 0x0f, 0x17, 0xf9, 0xb4, 
-	0x0f, 0x49, 0xf2, 0xd3, 0x0f, 0x19, 0xf9, 0xb8, 
-	0xdf, 0x00, 0x00, 0x06, 0x03, 0xb3, 0xd8, 0x29, 
-	0xe0, 0x46, 0xc0, 0x5b, 0x30, 0x54, 0xb0, 0x7e, 
-	0xe5, 0xc8, 0x0f, 0x17, 0xf9, 0xc3, 0x02, 0xf1, 
-	0xd8, 0x2b, 0xe0, 0x46, 0xd3, 0x08, 0xd3, 0xc0, 
-	0xe2, 0x95, 0x50, 0x00, 0x03, 0x75, 0xd2, 0x73, 
-	0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xb5, 
-	0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xe1, 0x8e, 
-	0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x8b, 0x37, 0x1a, 
-	0xb6, 0xff, 0xd0, 0x5e, 0x30, 0x5b, 0xfd, 0xc6, 
-	0xbc, 0x10, 0xd0, 0x10, 0x0c, 0x1e, 0xf9, 0x88, 
-	0xbc, 0x10, 0xd0, 0x30, 0xc0, 0x40, 0x30, 0x70, 
-	0xed, 0x88, 0xd1, 0x42, 0xd3, 0x40, 0xe2, 0xea, 
-	0x00, 0x24, 0xd0, 0x00, 0x2c, 0x40, 0x2c, 0x80, 
-	0x17, 0x20, 0xf9, 0xb4, 0x00, 0xa8, 0xd0, 0x00, 
-	0xcc, 0x5b, 0x1c, 0x5f, 0x1c, 0x43, 0x20, 0x31, 
-	0x7c, 0x40, 0xb0, 0x3c, 0x7e, 0x80, 0xcc, 0xb1, 
-	0xce, 0xfa, 0x1c, 0x9f, 0x1e, 0xdf, 0x01, 0x69, 
-	0xd0, 0x3c, 0x0c, 0x99, 0xe9, 0xa6, 0x3c, 0x80, 
-	0x0e, 0xd9, 0xe9, 0xa9, 0x3e, 0xc0, 0x3e, 0xf2, 
-	0x3e, 0xb1, 0xd0, 0x01, 0x40, 0x1b, 0x10, 0x05, 
-	0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80, 0xd0, 0x30, 
-	0x70, 0x00, 0x2c, 0x80, 0xe3, 0x1e, 0xf2, 0xd3, 
-	0xc0, 0x5c, 0xb0, 0x7f, 0x30, 0x5a, 0xe5, 0xda, 
-	0x00, 0x26, 0xd0, 0x00, 0x70, 0x00, 0x10, 0x20, 
-	0xe9, 0xd1, 0x00, 0xe0, 0xd0, 0x44, 0x70, 0x41, 
-	0x10, 0x5c, 0x30, 0x5b, 0xb0, 0x41, 0xed, 0xda, 
-	0x0f, 0x17, 0xf9, 0xc6, 0x0f, 0x49, 0xf2, 0xd3, 
-	0x0f, 0x19, 0xf9, 0xca, 0xdf, 0x00, 0x00, 0x06, 
-	0x03, 0xb3, 0xd8, 0x29, 0xe0, 0x46, 0xc0, 0x5b, 
-	0x30, 0x54, 0xb0, 0x7e, 0xe5, 0xda, 0x0f, 0x17, 
-	0xf9, 0xd5, 0x02, 0xf6, 0xde, 0x26, 0xe0, 0x46, 
-	0xd3, 0x08, 0xd3, 0xc0, 0xe2, 0x95, 0x50, 0x00, 
-	0x50, 0x00, 0x50, 0x00, 0x03, 0x75, 0xd2, 0x73, 
-	0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xa2, 
-	0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xe1, 0x8a, 
-	0xe1, 0x65, 0x30, 0x5a, 0xe5, 0x87, 0x37, 0x1a, 
-	0xb6, 0xff, 0xd0, 0x4f, 0x30, 0x5b, 0xfd, 0xb3, 
-	0xc0, 0x39, 0x30, 0x31, 0x10, 0x11, 0x10, 0x20, 
-	0xe9, 0x82, 0xd1, 0x42, 0xd3, 0x41, 0xe2, 0xea, 
-	0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31, 
-	0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x49, 0xcc, 0xb1, 
-	0x1c, 0x9f, 0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f, 
-	0x05, 0x50, 0xf9, 0x99, 0xb0, 0x3c, 0x2c, 0x40, 
-	0x2c, 0x80, 0x01, 0x74, 0xd6, 0x00, 0x2c, 0x80, 
-	0x02, 0xe4, 0xde, 0x80, 0xde, 0xc1, 0xe3, 0x1e, 
-	0xf2, 0xd3, 0xc0, 0x5c, 0xb0, 0x7f, 0x30, 0x5a, 
-	0xe5, 0xc7, 0x00, 0x26, 0xd0, 0x00, 0x70, 0x00, 
-	0x10, 0x20, 0xe9, 0xbe, 0x00, 0xe0, 0xd0, 0x44, 
-	0x70, 0x41, 0x10, 0x5b, 0x30, 0x5b, 0xb0, 0x41, 
-	0xed, 0xc7, 0x0f, 0x17, 0xf9, 0xb3, 0x0f, 0x49, 
-	0xf2, 0xd3, 0x0f, 0x19, 0xf9, 0xb7, 0xdf, 0x00, 
-	0x00, 0x06, 0x03, 0xb3, 0xd8, 0x29, 0xe0, 0x46, 
-	0xc0, 0x5b, 0x30, 0x54, 0xb0, 0x7e, 0xe5, 0xc7, 
-	0x0f, 0x17, 0xf9, 0xc2, 0x02, 0xff, 0xde, 0x27, 
-	0xe0, 0x46, 0xd3, 0x08, 0xd3, 0xc0, 0xe2, 0x95, 
-	0x50, 0x00, 0x50, 0x00, 0x03, 0x75, 0xd2, 0x73, 
-	0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xac, 
-	0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xe1, 0x8e, 
-	0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x8b, 0x37, 0x1a, 
-	0xb6, 0xff, 0xd0, 0x4f, 0x30, 0x5b, 0xfd, 0xbd, 
-	0xbc, 0x10, 0xd0, 0x10, 0x0c, 0x1e, 0xf9, 0x88, 
-	0xbc, 0x10, 0xd0, 0x20, 0xc0, 0x40, 0x30, 0x70, 
-	0xed, 0x88, 0xd1, 0x42, 0xd3, 0x41, 0xe2, 0xea, 
-	0x00, 0x24, 0xd0, 0x00, 0x2c, 0x40, 0x2c, 0x80, 
-	0x17, 0x20, 0xf9, 0xab, 0x00, 0x2a, 0xd0, 0x00, 
-	0x20, 0x1b, 0x20, 0x1b, 0x05, 0x50, 0xf9, 0x9b, 
-	0xb0, 0x3f, 0x10, 0x02, 0x7c, 0x40, 0xcc, 0xb1, 
-	0x1c, 0x9f, 0x01, 0x69, 0xd0, 0x3c, 0x0c, 0x99, 
-	0xe9, 0xa4, 0x3c, 0x80, 0xde, 0xa0, 0x2c, 0x5f, 
-	0x2c, 0x9f, 0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80, 
-	0xde, 0xc1, 0xe3, 0x1e, 0xf2, 0xd3, 0xc0, 0x5c, 
-	0xb0, 0x7f, 0x30, 0x5a, 0xe5, 0xd1, 0x00, 0x26, 
-	0xd0, 0x00, 0x70, 0x00, 0x10, 0x20, 0xe9, 0xc8, 
-	0x00, 0xe0, 0xd0, 0x44, 0x70, 0x41, 0x10, 0x5b, 
-	0x30, 0x5b, 0xb0, 0x41, 0xed, 0xd1, 0x0f, 0x17, 
-	0xf9, 0xbd, 0x0f, 0x49, 0xf2, 0xd3, 0x0f, 0x19, 
-	0xf9, 0xc1, 0xdf, 0x00, 0x00, 0x06, 0x03, 0xb3, 
-	0xd8, 0x29, 0xe0, 0x46, 0xc0, 0x5b, 0x30, 0x54, 
-	0xb0, 0x7e, 0xe5, 0xd1, 0x0f, 0x17, 0xf9, 0xcc, 
-	0x03, 0x34, 0xdc, 0x20, 0xe0, 0x46, 0xd3, 0x08, 
-	0xd3, 0xc0, 0xe2, 0x95, 0xd0, 0x61, 0x23, 0x81, 
-	0x0c, 0x49, 0xd0, 0x61, 0x00, 0x8d, 0x10, 0xa0, 
-	0xea, 0x3b, 0x30, 0x42, 0xe6, 0x30, 0x23, 0x82, 
-	0x0f, 0xc5, 0x0c, 0x09, 0x05, 0x0d, 0x15, 0x20, 
-	0xfe, 0x45, 0xd0, 0x5f, 0x15, 0x63, 0xea, 0x43, 
-	0xd0, 0x50, 0x30, 0x54, 0xee, 0x4a, 0x0f, 0x17, 
-	0xfa, 0x45, 0x03, 0xb3, 0xd8, 0x29, 0xe0, 0x46, 
-	0x80, 0x07, 0x09, 0x49, 0xd4, 0x00, 0xd4, 0x40, 
-	0xd4, 0x80, 0xd4, 0xc0, 0x00, 0x4d, 0xa0, 0x6c, 
-	0xd0, 0xa1, 0x00, 0x88, 0xd0, 0xa9, 0x00, 0x4d, 
-	0x00, 0x50, 0xfa, 0x53, 0xf2, 0x32, 0xd3, 0x80, 
-	0xe1, 0x76, 0xd1, 0xc2, 0x41, 0xcf, 0x11, 0xdf, 
-	0xd0, 0x41, 0x01, 0xc1, 0x00, 0xef, 0xd0, 0xbe, 
-	0x03, 0x10, 0xf9, 0x77, 0x80, 0x07, 0x21, 0x96, 
-	0x11, 0xa2, 0xe9, 0x78, 0x03, 0x1d, 0xea, 0x73, 
-	0xc0, 0xd7, 0xc2, 0x90, 0xf2, 0xa4, 0xc4, 0x0a, 
-	0x03, 0xd0, 0xea, 0x72, 0xc2, 0x91, 0xf2, 0xa4, 
-	0xc4, 0x4a, 0x03, 0x1e, 0xea, 0x8d, 0xc0, 0xd8, 
-	0xc2, 0x92, 0xf2, 0xa4, 0xc4, 0x8a, 0x03, 0xd0, 
-	0xea, 0x7d, 0xc2, 0x93, 0xf2, 0xa4, 0xc4, 0xca, 
-	0xe2, 0x8d, 0xd3, 0xc0, 0xc0, 0xd7, 0xc2, 0x90, 
-	0xf2, 0xa4, 0xc4, 0x0a, 0x03, 0xd0, 0xea, 0x88, 
-	0xc2, 0x91, 0xf2, 0xa4, 0xc4, 0x4a, 0x08, 0x49, 
-	0x00, 0x4d, 0x10, 0x61, 0xf8, 0x11, 0x03, 0x1f, 
-	0xea, 0x93, 0x0d, 0xc9, 0x00, 0x4d, 0xd0, 0x1a, 
-	0xe2, 0x98, 0x03, 0x10, 0xfa, 0x97, 0xd0, 0x1d, 
-	0xe2, 0x98, 0xd0, 0x18, 0x0f, 0x16, 0xfa, 0x98, 
-	0xd0, 0x4c, 0x40, 0x4c, 0x10, 0x6c, 0xea, 0xa2, 
-	0x03, 0xde, 0xfa, 0xa2, 0x0f, 0x12, 0xfa, 0xa0, 
-	0x00, 0x08, 0xe2, 0xd9, 0xd2, 0x00, 0x13, 0xe1, 
-	0xee, 0xa9, 0x08, 0x49, 0x02, 0x0d, 0x00, 0xc8, 
-	0xc2, 0xca, 0x12, 0x94, 0xd0, 0x1f, 0x30, 0x07, 
-	0x12, 0xc0, 0xc2, 0x43, 0x12, 0x5a, 0x00, 0x0d, 
-	0x03, 0xde, 0xea, 0xb6, 0x0e, 0xc9, 0x04, 0x8d, 
-	0x02, 0x48, 0x22, 0x80, 0x12, 0x88, 0xd0, 0x0b, 
-	0x30, 0x03, 0x12, 0x80, 0xd0, 0x19, 0x20, 0x03, 
-	0x12, 0x80, 0x00, 0x0d, 0x22, 0xc0, 0x12, 0xc8, 
-	0xd0, 0x0b, 0x30, 0x09, 0x12, 0xc0, 0x12, 0xd8, 
-	0xd0, 0x16, 0x20, 0x09, 0x20, 0x07, 0x12, 0xc0, 
-	0x42, 0xc2, 0x22, 0x8b, 0x22, 0x88, 0x03, 0xde, 
-	0xea, 0xd2, 0x0e, 0xc9, 0xc4, 0x4a, 0x04, 0xcd, 
-	0x0f, 0xc5, 0x01, 0x46, 0x90, 0x4d, 0x00, 0xc6, 
-	0x10, 0x60, 0xe6, 0xd3, 0x0f, 0xc5, 0x01, 0x74, 
-	0xd6, 0x00, 0xca, 0x9d, 0xcb, 0x9e, 0xca, 0xea, 
-	0xcb, 0xee, 0x2a, 0xc0, 0x2b, 0xc0, 0xca, 0x10, 
-	0xca, 0x51, 0xcb, 0x12, 0xcb, 0x53, 0xd1, 0x40, 
-	0xd3, 0x41, 0xb7, 0x3f, 0xc0, 0x5c, 0xe1, 0x7b, 
-	0xd0, 0xc0, 0xc1, 0x28, 0xc2, 0x2a, 0xc2, 0xab, 
-	0xf1, 0x7a, 0x0f, 0x17, 0xfa, 0xef, 0xcc, 0xe8, 
-	0xcd, 0x29, 0xcd, 0x6c, 0xcd, 0xad, 0xc8, 0x08, 
-	0xc8, 0x49, 0xca, 0x0a, 0xca, 0x4b, 0xf3, 0x31, 
-	0xd0, 0xc1, 0xc1, 0x34, 0xc2, 0x2a, 0xc2, 0xab, 
-	0xf1, 0x7a, 0x00, 0x28, 0xd9, 0xc0, 0xc8, 0x88, 
-	0xc8, 0xc9, 0xa9, 0xf8, 0xca, 0x8a, 0xca, 0xcb, 
-	0x11, 0x62, 0xe9, 0x79, 0xd0, 0xc0, 0xc1, 0x35, 
-	0xc2, 0x2e, 0xc2, 0xaf, 0xf1, 0x7a, 0xc9, 0x08, 
-	0xc9, 0x49, 0xa9, 0xf8, 0xcb, 0x0a, 0xcb, 0x4b, 
-	0xd0, 0xc1, 0xc1, 0x36, 0xc2, 0x2e, 0xc2, 0xaf, 
-	0xf1, 0x7a, 0xc0, 0x27, 0xc9, 0x88, 0xc9, 0xc9, 
-	0xa0, 0x38, 0xcb, 0x8a, 0xcb, 0xcb, 0xe1, 0x79, 
-	0x5f, 0x0d, 0x07, 0x7d, 0xde, 0x07, 0x11, 0x5e, 
-	0x30, 0x05, 0xcd, 0xc0, 0x00, 0x28, 0xd0, 0x00, 
-	0xa0, 0x38, 0x11, 0x61, 0xf9, 0x75, 0x00, 0xe2, 
-	0xd0, 0x00, 0x0f, 0x1d, 0xeb, 0x29, 0x00, 0x2d, 
-	0xdf, 0x4b, 0xf3, 0x3f, 0xe1, 0x75, 0x04, 0xeb, 
-	0xd0, 0x00, 0x11, 0x62, 0xeb, 0x36, 0xb0, 0x20, 
-	0x0f, 0x19, 0xfb, 0x36, 0xac, 0xe0, 0x01, 0xa4, 
-	0xde, 0x00, 0x5e, 0x0d, 0x00, 0x2d, 0xdf, 0x7a, 
-	0xdd, 0xc0, 0xd8, 0x80, 0xd9, 0x00, 0xd9, 0x80, 
-	0x5f, 0x00, 0x01, 0x46, 0x00, 0x28, 0xd0, 0x01, 
-	0x00, 0x06, 0xa0, 0x37, 0x80, 0x3f, 0x00, 0xc6, 
-	0x0f, 0xc5, 0xad, 0xda, 0xc6, 0xb1, 0xd0, 0x01, 
-	0x01, 0xa3, 0xde, 0x1d, 0x40, 0x30, 0x3e, 0x00, 
-	0x80, 0x3f, 0x0e, 0x0a, 0x66, 0xda, 0xc8, 0x28, 
-	0xc8, 0x69, 0xc8, 0xaa, 0xc8, 0xeb, 0x0c, 0x1e, 
-	0xfb, 0x68, 0x26, 0xba, 0x07, 0x7d, 0xdc, 0x00, 
-	0x1d, 0xcf, 0x1d, 0xd1, 0x5d, 0xc0, 0x00, 0x2d, 
-	0xdf, 0x64, 0x0f, 0x87, 0xad, 0xda, 0x80, 0x3f, 
-	0x0e, 0x0a, 0x66, 0xda, 0xc9, 0x2c, 0xc9, 0x6d, 
-	0xc9, 0xae, 0xc9, 0xef, 0x0f, 0x2f, 0xd0, 0x37, 
-	0x4f, 0x00, 0x0f, 0x1a, 0xeb, 0xbe, 0x01, 0xa4, 
-	0xde, 0x20, 0xd0, 0x01, 0x40, 0x3c, 0x2e, 0x00, 
-	0x00, 0x2d, 0xdf, 0x7a, 0xac, 0xe0, 0x0f, 0x87, 
-	0x0e, 0x0a, 0x76, 0xe0, 0xbf, 0x79, 0xbe, 0x3c, 
-	0x0f, 0x1b, 0xeb, 0x9e, 0x0f, 0x87, 0x0e, 0x0a, 
-	0x76, 0xe1, 0xbf, 0x79, 0xbe, 0x34, 0x18, 0xa0, 
-	0xeb, 0xb9, 0x0f, 0x87, 0xad, 0x20, 0x80, 0x3f, 
-	0x0e, 0x0a, 0x76, 0xe2, 0xbf, 0x79, 0xbe, 0x3c, 
-	0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe3, 0x0f, 0x1b, 
-	0xeb, 0xb3, 0xbf, 0x77, 0xbe, 0x0c, 0x19, 0x20, 
-	0xeb, 0xb9, 0x0f, 0x87, 0xad, 0x60, 0x80, 0x3f, 
-	0x0e, 0x0a, 0x76, 0xe4, 0xbe, 0x3c, 0xbf, 0x75, 
-	0x0f, 0x15, 0xf8, 0x1c, 0x1f, 0x0a, 0x1f, 0x16, 
-	0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe5, 0xbf, 0x79, 
-	0xbe, 0x34, 0x19, 0xa0, 0xeb, 0xb9, 0x0f, 0x87, 
-	0xad, 0xa0, 0x80, 0x3f, 0x0e, 0x0a, 0x76, 0xe6, 
-	0xbe, 0x3c, 0xbf, 0x79, 0x0f, 0x87, 0x0e, 0x0a, 
-	0x76, 0xe7, 0x0f, 0x15, 0xeb, 0xbe, 0x00, 0x2f, 
-	0xdf, 0x72, 0x1d, 0xe0, 0xf8, 0x1c, 0x00, 0x28, 
-	0xd0, 0x01, 0xa0, 0x38, 0x80, 0x3f, 0x0f, 0x87, 
-	0xd0, 0x01, 0x4d, 0xc0, 0x1f, 0x0f, 0x1f, 0x11, 
-	0x00, 0x2f, 0xdf, 0x76, 0xc6, 0xb2, 0x03, 0x7d, 
-	0xde, 0x0e, 0x01, 0xa3, 0xde, 0x2d, 0x5d, 0xc0, 
-	0x0f, 0x87, 0x1e, 0xe1, 0xeb, 0xdb, 0xad, 0xda, 
-	0x80, 0x3f, 0x0e, 0x0a, 0x66, 0xda, 0x0c, 0x1e, 
-	0xfb, 0xe4, 0x26, 0xbb, 0x03, 0xff, 0xdd, 0xff, 
-	0x4d, 0xc0, 0x00, 0xa3, 0xde, 0x2d, 0xbf, 0x56, 
-	0x0f, 0x87, 0x07, 0x7d, 0xde, 0x0e, 0x5d, 0xc0, 
-	0x00, 0xa3, 0xde, 0x1d, 0xad, 0xda, 0x80, 0x3f, 
-	0x0e, 0x0a, 0x66, 0xda, 0xdf, 0x5c, 0xd0, 0x0e, 
-	0x4f, 0x00, 0x0f, 0x87, 0xd0, 0x06, 0x40, 0x3c, 
-	0xeb, 0xf0, 0xbf, 0x3e, 0xb0, 0x04, 0xe7, 0xf2, 
-	0xeb, 0xf6, 0xbf, 0x0c, 0xbf, 0x3a, 0x0f, 0x87, 
-	0x0f, 0x1d, 0xfb, 0x4b, 0xbf, 0x38, 0x0f, 0x87, 
-	0x0f, 0x1c, 0xfb, 0xcb, 0xbf, 0x30, 0x0f, 0x87, 
-	0x50, 0x00, 0x50, 0x00, 0x0f, 0x17, 0xf9, 0x70, 
-	0x90, 0x4d, 0x10, 0x60, 0xe5, 0x72, 0x0f, 0x49, 
-	0x90, 0x4d, 0x10, 0x60, 0xe5, 0x76, 0x0f, 0x19, 
-	0xf9, 0x79, 0x01, 0x46, 0xd0, 0x11, 0xa0, 0x38, 
-	0x80, 0x3f, 0x00, 0xc6, 0xdf, 0x00, 0x00, 0x06, 
-	0x08, 0x20, 0xd0, 0x00, 0x10, 0x08, 0xa0, 0x0a, 
-	0xa0, 0x1b, 0x0c, 0x20, 0xd0, 0x00, 0x10, 0x08, 
-	0xa0, 0x27, 0x90, 0x4d, 0x0f, 0xff, 0xd8, 0x1f, 
-	0x40, 0x40, 0xa0, 0x4d, 0x80, 0x0a, 0xd0, 0x00, 
-	0x06, 0x50, 0xf9, 0x95, 0xd0, 0x01, 0xa0, 0x09, 
-	0x80, 0x1b, 0xa0, 0x27, 0x01, 0x20, 0xd0, 0x67, 
-	0xa0, 0x69, 0x80, 0x2a, 0x82, 0x29, 0x80, 0x6a, 
-	0x84, 0x29, 0xd0, 0x54, 0x10, 0x4f, 0xa0, 0x6a, 
-	0x01, 0x20, 0xd0, 0x40, 0xa0, 0x69, 0x80, 0x2b, 
-	0x80, 0x07, 0x08, 0x20, 0xdf, 0x00, 0x02, 0x30, 
-	0xd0, 0x00, 0xa0, 0x38, 0x80, 0x3f, 0x01, 0xb0, 
-	0xd0, 0x10, 0xa0, 0x37, 0x80, 0x3f, 0x02, 0x30, 
-	0xd0, 0x01, 0xa0, 0x38, 0xd0, 0x10, 0xa0, 0x38, 
-	0x15, 0x63, 0xe9, 0xba, 0x05, 0x5e, 0xf9, 0xfa, 
-	0xc0, 0xdf, 0x00, 0xe0, 0xd1, 0x80, 0x70, 0x06, 
-	0x10, 0x1c, 0xc1, 0x40, 0x11, 0x48, 0xd3, 0x10, 
-	0x00, 0x21, 0xd0, 0x80, 0xb0, 0x16, 0xe9, 0xca, 
-	0xd3, 0x20, 0x10, 0x81, 0xb0, 0x16, 0xf9, 0xfa, 
-	0x30, 0xc2, 0xd2, 0x5e, 0xd0, 0x8f, 0x00, 0xee, 
-	0xd0, 0x54, 0x70, 0x41, 0x30, 0x43, 0xed, 0xd7, 
-	0xd2, 0x6c, 0x72, 0x49, 0xc0, 0x89, 0xb0, 0xbf, 
-	0x10, 0x9f, 0x22, 0x42, 0x04, 0x31, 0xd0, 0x10, 
-	0xc0, 0x42, 0x30, 0x49, 0xe5, 0xde, 0x10, 0x03, 
-	0xc1, 0x0c, 0xc1, 0x83, 0xb1, 0xbe, 0x01, 0x46, 
-	0x00, 0x06, 0xa0, 0x3d, 0xa0, 0x3c, 0x60, 0x06, 
-	0x00, 0xc6, 0xb1, 0xbc, 0xb1, 0x01, 0xed, 0xe1, 
-	0xc1, 0x0c, 0x21, 0x85, 0x01, 0x46, 0x00, 0x06, 
-	0xa0, 0x3d, 0xa0, 0x3c, 0x60, 0x06, 0x00, 0xc6, 
-	0xb1, 0xbc, 0xb1, 0x01, 0xed, 0xec, 0x02, 0xe4, 
-	0xd0, 0x00, 0x20, 0xc0, 0xb2, 0x41, 0xed, 0xd8, 
-	0x15, 0xa3, 0xfa, 0x00, 0xbc, 0x10, 0x0c, 0x1e, 
-	0xfa, 0x00, 0xbc, 0x10, 0xd0, 0x04, 0x70, 0x00, 
-	0x10, 0x20, 0xfa, 0x00, 0x00, 0x27, 0xd0, 0x10, 
-	0xd0, 0x40, 0x60, 0x40, 0x00, 0x26, 0xd0, 0x14, 
-	0x60, 0x40, 0xb0, 0x28, 0x70, 0x40, 0xb0, 0x7f, 
-	0x60, 0x40, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 
-	0x50, 0x00, 0x50, 0x00, 0x00, 0x28, 0xd1, 0xb0, 
-	0x70, 0x06, 0xd0, 0x81, 0x60, 0x86, 0x10, 0x20, 
-	0xe9, 0xab, 0xb0, 0x3f, 0x60, 0x06, 0x00, 0xec, 
-	0xd1, 0x84, 0x70, 0x46, 0xb1, 0x84, 0x70, 0x86, 
-	0x30, 0x42, 0xe9, 0xab, 0x70, 0x42, 0xd0, 0x35, 
-	0x30, 0x40, 0xf9, 0xab, 0x00, 0x63, 0xd0, 0x3f, 
-	0xb0, 0xbc, 0x40, 0x80, 0x70, 0xc2, 0x10, 0xe3, 
-	0xe5, 0xab, 0xb0, 0xbc, 0x40, 0x80, 0x60, 0x86, 
-	0x00, 0x28, 0xd0, 0x24, 0x70, 0x40, 0x00, 0x22, 
-	0xd0, 0x80, 0x50, 0x42, 0x60, 0x40, 0x00, 0x64, 
-	0xd0, 0x60, 0xd0, 0x90, 0x60, 0x81, 0x00, 0xed, 
-	0xd1, 0x88, 0x70, 0x46, 0x10, 0xe4, 0xe9, 0xa8, 
-	0x00, 0x21, 0xd0, 0xe8, 0xd0, 0x00, 0x60, 0x03, 
-	0xd0, 0x81, 0x40, 0x42, 0x60, 0x46, 0x02, 0x3c, 
-	0xda, 0x89, 0xe0, 0x46, 0xd0, 0x82, 0x50, 0x42, 
-	0x60, 0x46, 0x00, 0x23, 0xd5, 0x3e, 0x01, 0x7a, 
-	0xde, 0x1a, 0xe0, 0x46, 0x01, 0x46, 0xdf, 0x5c, 
-	0x08, 0x20, 0xd1, 0x00, 0xcf, 0x04, 0x11, 0x08, 
-	0xa1, 0x0a, 0xa1, 0x1b, 0x11, 0x1f, 0xa1, 0x27, 
-	0xd2, 0x80, 0xb2, 0x81, 0x90, 0x4d, 0xc0, 0x01, 
-	0x10, 0x14, 0x00, 0x16, 0xe9, 0x8d, 0x80, 0x33, 
-	0x80, 0x3f, 0x92, 0x8b, 0x00, 0x23, 0xd0, 0x3f, 
-	0x42, 0x80, 0xe9, 0x8d, 0x0f, 0xff, 0xdf, 0xff, 
-	0x40, 0x01, 0xa0, 0x0d, 0xe1, 0x94, 0xa1, 0x0a, 
-	0x00, 0xea, 0xd0, 0x00, 0xd0, 0x8e, 0x00, 0x06, 
-	0x0f, 0x0b, 0x70, 0x80, 0x80, 0x73, 0x80, 0x0a, 
-	0xd0, 0x00, 0x06, 0x50, 0xf9, 0x9a, 0xd0, 0x01, 
-	0xd0, 0x44, 0x40, 0x70, 0x20, 0x01, 0x15, 0x63, 
-	0xf9, 0xa1, 0x80, 0x1b, 0xe1, 0xa2, 0x80, 0x5b, 
-	0xa0, 0x27, 0x01, 0x20, 0xd0, 0x67, 0xa0, 0x69, 
-	0x80, 0x2a, 0x82, 0x29, 0x80, 0x6a, 0x84, 0x29, 
-	0xd0, 0x54, 0x10, 0x4f, 0xa0, 0x6a, 0x01, 0x20, 
-	0xd0, 0x40, 0xa0, 0x69, 0x80, 0x2b, 0x80, 0x07, 
-	0x08, 0x20, 0xd0, 0x00, 0xcf, 0x00, 0x02, 0x30, 
-	0xd0, 0x00, 0xa0, 0x38, 0x80, 0x3f, 0x01, 0xb2, 
-	0xd2, 0x10, 0xa0, 0x37, 0x80, 0x3f, 0x02, 0x30, 
-	0xd0, 0x01, 0xa0, 0x38, 0x00, 0x30, 0xd0, 0x10, 
-	0xa0, 0x38, 0x80, 0x3f, 0x00, 0xc6, 0x00, 0x28, 
-	0xd1, 0x24, 0x70, 0x04, 0xd0, 0x41, 0x50, 0x01, 
-	0x60, 0x04, 0x00, 0x27, 0xd0, 0x18, 0x70, 0x40, 
-	0xb0, 0x7f, 0x60, 0x40, 0x00, 0x26, 0xd0, 0x20, 
-	0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0x08, 0x20, 
-	0xdf, 0x00, 0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80, 
-	0xd4, 0xc0, 0xd3, 0x81, 0x12, 0xa0, 0xed, 0xe3, 
-	0xd0, 0x08, 0x0a, 0x09, 0x00, 0x4d, 0xb0, 0x01, 
-	0xed, 0xdf, 0x03, 0xbe, 0xd6, 0x27, 0xe0, 0x46, 
-	0x50, 0x00, 0x50, 0x00, 0x02, 0x24, 0xd0, 0x00, 
-	0xa0, 0x37, 0x00, 0x27, 0xd3, 0xd0, 0x00, 0x26, 
-	0xd0, 0x04, 0x73, 0xcf, 0x13, 0xe1, 0xe9, 0x7b, 
-	0xb0, 0x3c, 0xf2, 0x00, 0x00, 0x26, 0xd0, 0x40, 
-	0xd0, 0x00, 0x60, 0x01, 0x00, 0x26, 0xd0, 0x14, 
-	0xf2, 0x00, 0x00, 0x26, 0xd0, 0x18, 0xf2, 0x00, 
-	0x00, 0xee, 0xd0, 0x1c, 0x71, 0x40, 0xd1, 0x1e, 
-	0x15, 0x63, 0xe9, 0x8d, 0x11, 0x1f, 0xc7, 0x1a, 
-	0xb7, 0x01, 0xd3, 0x81, 0xc4, 0xd4, 0xf2, 0x04, 
-	0x00, 0x26, 0xd0, 0x18, 0x70, 0x40, 0xb0, 0x54, 
-	0xfd, 0x9b, 0x00, 0xed, 0xd0, 0x24, 0xd0, 0x44, 
-	0x60, 0x40, 0x13, 0xe1, 0xf9, 0xbc, 0x15, 0xa3, 
-	0xf9, 0xa1, 0x0c, 0x10, 0xe9, 0xb9, 0x11, 0x61, 
-	0xe5, 0xb3, 0xed, 0xb9, 0x15, 0xa3, 0xf9, 0xab, 
-	0x00, 0x26, 0xd0, 0x14, 0x70, 0x40, 0x10, 0x62, 
-	0xf5, 0xb3, 0x15, 0x22, 0xe5, 0xb3, 0xc0, 0x44, 
-	0x30, 0x54, 0xe5, 0xb3, 0x34, 0xd4, 0xf5, 0xb3, 
-	0xe1, 0xbf, 0x03, 0xb3, 0xd8, 0x29, 0x00, 0x26, 
-	0xd0, 0x40, 0x60, 0x01, 0xe1, 0xdb, 0x03, 0xb3, 
-	0xd8, 0x29, 0xe0, 0x46, 0x01, 0x7a, 0xde, 0x1a, 
-	0xe0, 0x46, 0x80, 0x07, 0x09, 0x49, 0xd4, 0x00, 
-	0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0, 0x00, 0x4d, 
-	0xa0, 0x6c, 0xd3, 0x80, 0xd0, 0xa1, 0x00, 0x88, 
-	0xd0, 0xa9, 0x00, 0x4d, 0x00, 0x50, 0xf9, 0xc9, 
-	0x0c, 0x49, 0xd0, 0x61, 0x00, 0x8d, 0x10, 0xa0, 
-	0xe9, 0x90, 0x30, 0x42, 0xf5, 0xd8, 0xd0, 0x61, 
-	0x23, 0x81, 0xe1, 0xce, 0x23, 0x82, 0x13, 0xa1, 
-	0xf9, 0x90, 0xd0, 0x42, 0x15, 0xa1, 0xf9, 0xdf, 
-	0xb0, 0x7f, 0x00, 0x26, 0xd0, 0x14, 0x70, 0x00, 
-	0x30, 0x01, 0xf5, 0xe8, 0x16, 0xe0, 0xe5, 0xe8, 
-	0xb6, 0xc1, 0xbc, 0x20, 0xc0, 0x44, 0x30, 0x5b, 
-	0xfd, 0xb9, 0xc0, 0x44, 0x30, 0x54, 0xe5, 0xb9, 
-	0x15, 0x63, 0xf9, 0xf8, 0x15, 0xa3, 0xf9, 0xf5, 
-	0x03, 0x3b, 0xda, 0x1c, 0xe0, 0x46, 0x03, 0x38, 
-	0xdc, 0x17, 0xe0, 0x46, 0x15, 0xa3, 0xf9, 0xfd, 
-	0x03, 0x72, 0xd0, 0x19, 0xe0, 0x46, 0x03, 0x3f, 
-	0xd2, 0x17, 0xe0, 0x46, 0x70, 0x40, 0xb0, 0x7f, 
-	0x60, 0x40, 0x0f, 0xc5, 0xdf, 0x00, 0x0c, 0x09, 
-	0x05, 0x0d, 0x08, 0x20, 0xdf, 0x00, 0x0f, 0xc5, 
-	0x50, 0x00, 0x50, 0x00, 0x00, 0xef, 0xd0, 0x14, 
-	0x70, 0x40, 0x10, 0x60, 0xe9, 0x45, 0xb0, 0x04, 
-	0x70, 0x40, 0xb0, 0x41, 0xed, 0x44, 0x00, 0xed, 
-	0xd0, 0x24, 0xd0, 0x44, 0x60, 0x40, 0x00, 0x64, 
-	0xd0, 0x20, 0x70, 0x00, 0x10, 0x30, 0xe9, 0x45, 
-	0x00, 0x21, 0xd0, 0x28, 0x60, 0x40, 0x00, 0x64, 
-	0xd2, 0xc0, 0x70, 0x0b, 0x00, 0x11, 0xe9, 0x6a, 
-	0x08, 0x20, 0xd0, 0x4f, 0x30, 0x40, 0xe9, 0x55, 
-	0xb0, 0x4f, 0xf9, 0x6a, 0x03, 0xef, 0xdf, 0xbf, 
-	0xaf, 0xb8, 0xdf, 0x80, 0x0f, 0x87, 0xd0, 0x18, 
-	0x70, 0x00, 0x10, 0x20, 0xed, 0x6c, 0xdf, 0x84, 
-	0xd0, 0x40, 0x60, 0x7e, 0x00, 0x27, 0xd0, 0x54, 
-	0x70, 0x41, 0x10, 0x60, 0x01, 0xa0, 0xd0, 0x40, 
-	0xa0, 0x78, 0x80, 0x34, 0x80, 0x3f, 0x01, 0x3c, 
-	0xd2, 0x39, 0x00, 0x21, 0xdf, 0x86, 0x0f, 0x87, 
-	0xd0, 0x40, 0x60, 0x4b, 0x03, 0xe5, 0xd0, 0x10, 
-	0xe0, 0x36, 0x50, 0x00, 0x00, 0x28, 0xd0, 0x24, 
-	0x72, 0xc0, 0xd0, 0x40, 0x60, 0x40, 0xd0, 0x0c, 
-	0x52, 0xc0, 0xc0, 0x1c, 0x30, 0x1d, 0xf5, 0x3c, 
-	0x20, 0x1f, 0x30, 0x1e, 0x90, 0x6d, 0x20, 0x01, 
-	0x00, 0x22, 0xd0, 0x58, 0x60, 0x01, 0x00, 0xe3, 
-	0xd0, 0x48, 0x70, 0x41, 0x30, 0x40, 0xf5, 0x47, 
-	0xb2, 0xc8, 0x00, 0xe3, 0xd0, 0x4c, 0x70, 0x41, 
-	0x30, 0x40, 0xfd, 0x4d, 0xb2, 0xc4, 0x00, 0x28, 
-	0xd0, 0x20, 0x70, 0x00, 0x42, 0xc0, 0xa2, 0xc5, 
-	0x12, 0xe0, 0xe9, 0x55, 0x80, 0x40, 0x80, 0x34, 
-	0x80, 0x3f, 0xcf, 0x95, 0x82, 0x34, 0x80, 0x3f, 
-	0x03, 0xe7, 0xd0, 0x08, 0x1f, 0xa3, 0xe9, 0x60, 
-	0x03, 0xe9, 0xd0, 0x08, 0x00, 0x27, 0xd0, 0x4c, 
-	0x7f, 0x81, 0x00, 0x27, 0xd0, 0x54, 0x70, 0x41, 
-	0x10, 0x60, 0x03, 0xa0, 0xd0, 0x40, 0xa0, 0x78, 
-	0xe0, 0x3c, 0x50, 0x00, 0xc0, 0x84, 0x10, 0x8c, 
-	0x10, 0x92, 0xd0, 0x41, 0x30, 0x4d, 0x40, 0x43, 
-	0x10, 0x43, 0x20, 0x81, 0xd1, 0x8f, 0x41, 0x82, 
-	0x10, 0x9c, 0x20, 0x9b, 0xc1, 0xc2, 0x10, 0x82, 
-	0x20, 0x87, 0xc0, 0x42, 0x10, 0x43, 0x20, 0x81, 
-	0x10, 0x88, 0x22, 0x02, 0x10, 0x97, 0x01, 0xd0, 
-	0xe9, 0x48, 0xb0, 0x96, 0x10, 0x88, 0x22, 0x82, 
-	0xc0, 0x5c, 0x10, 0x48, 0xc0, 0x84, 0x10, 0x91, 
-	0x10, 0x86, 0x20, 0x42, 0x41, 0x0d, 0x11, 0x02, 
-	0x20, 0x44, 0x22, 0x01, 0x22, 0x81, 0x02, 0xe4, 
-	0xd2, 0x40, 0xc2, 0xca, 0xb2, 0xe0, 0x01, 0xd0, 
-	0xe9, 0x5e, 0xc2, 0xca, 0x22, 0xc9, 0xb2, 0xa0, 
-	0x22, 0x48, 0xd0, 0x78, 0x03, 0x50, 0xf9, 0x69, 
-	0xd0, 0x7c, 0x01, 0x9d, 0xf9, 0x69, 0xc2, 0x48, 
-	0xb2, 0x60, 0xc2, 0xca, 0xb2, 0xf0, 0x11, 0x82, 
-	0x41, 0x81, 0x22, 0x06, 0x11, 0x9f, 0x41, 0x81, 
-	0x22, 0x86, 0x0f, 0xc5, 0xc0, 0x84, 0x10, 0x8c, 
-	0x10, 0x92, 0xd1, 0x8f, 0x41, 0x82, 0x10, 0x9c, 
-	0xc1, 0xdb, 0x11, 0xc1, 0x21, 0xc3, 0x20, 0x87, 
-	0xc1, 0xc2, 0x10, 0x82, 0x20, 0x87, 0xc0, 0x42, 
-	0x10, 0x43, 0x20, 0x81, 0x10, 0x88, 0x22, 0x02, 
-	0x10, 0x97, 0x01, 0xd0, 0xe9, 0x46, 0xb0, 0x96, 
-	0x10, 0x88, 0x22, 0x82, 0xc0, 0x5c, 0x10, 0x48, 
-	0xc0, 0x84, 0x10, 0x91, 0x10, 0x86, 0x20, 0x42, 
-	0xd0, 0x81, 0x41, 0x02, 0x11, 0x02, 0x20, 0x44, 
-	0x22, 0x01, 0x22, 0x81, 0x02, 0xe4, 0xd2, 0x40, 
-	0xc2, 0xca, 0xb2, 0xe0, 0x01, 0xd0, 0xe9, 0x5d, 
-	0xc2, 0xca, 0x22, 0xc9, 0xb2, 0xa0, 0x22, 0x48, 
-	0x11, 0x9f, 0x11, 0x83, 0x22, 0x06, 0x11, 0x9c, 
-	0x11, 0x83, 0x22, 0x86, 0x0f, 0xc5, 0xd0, 0x41, 
-	0x40, 0x44, 0x20, 0x55, 0x10, 0x62, 0xf9, 0x6f, 
-	0x01, 0x74, 0xd6, 0x00, 0xc2, 0x9f, 0xc2, 0x1f, 
-	0x22, 0x80, 0xe1, 0x30, 0x0f, 0x11, 0xf9, 0x51, 
-	0x90, 0x38, 0x80, 0x3f, 0x00, 0x1b, 0xf9, 0x51, 
-	0x00, 0x27, 0xd0, 0x04, 0x70, 0x40, 0x30, 0x71, 
-	0xf9, 0x51, 0xb0, 0x3c, 0x70, 0x40, 0x30, 0x5d, 
-	0xf9, 0x51, 0xb0, 0x08, 0x70, 0x40, 0xb0, 0x7f, 
-	0x60, 0x40, 0x10, 0x63, 0xe5, 0x5d, 0x02, 0x20, 
-	0xd0, 0x01, 0xa0, 0x37, 0x00, 0x26, 0xd0, 0x24, 
-	0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0xb0, 0x08, 
-	0x70, 0x40, 0xb0, 0x41, 0x60, 0x40, 0x00, 0x26, 
-	0xd0, 0x30, 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 
-	0xb0, 0x30, 0xd0, 0x40, 0x60, 0x40, 0xb0, 0x3c, 
-	0x6c, 0x40, 0xb0, 0x3c, 0x67, 0x40, 0x00, 0x33, 
-	0xdf, 0x78, 0xe0, 0x36, 0x00, 0x26, 0xd0, 0x1c, 
-	0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0xb0, 0x3c, 
-	0x70, 0x40, 0xb0, 0x41, 0x60, 0x40, 0x08, 0x20, 
-	0xdf, 0x00, 0x80, 0x35, 0xc0, 0x3c, 0x10, 0x08, 
-	0xa0, 0x0a, 0xa0, 0x27, 0xa0, 0x1b, 0xdf, 0x5c, 
-	0x01, 0xa0, 0xd0, 0x00, 0xa0, 0x38, 0x80, 0x3f, 
-	0x80, 0x34, 0x80, 0x3f, 0x03, 0xba, 0xda, 0x1e, 
-	0xcf, 0x95, 0x82, 0x34, 0x80, 0x3f, 0x03, 0xe7, 
-	0xd0, 0x08, 0x1f, 0xa3, 0xe9, 0x55, 0x1f, 0xa0, 
-	0xe9, 0x55, 0x03, 0xe9, 0xd0, 0x08, 0x00, 0x21, 
-	0xdf, 0x86, 0xe0, 0x3c, 0x89, 0x78, 0x89, 0x37, 
-	0x00, 0xee, 0xd0, 0x14, 0x76, 0x00, 0xd0, 0x30, 
-	0x76, 0x40, 0x26, 0x58, 0xd6, 0xd9, 0x00, 0xee, 
-	0xd0, 0x20, 0x75, 0x40, 0xd0, 0x1c, 0x71, 0x40, 
-	0xd0, 0x20, 0x71, 0x00, 0xd0, 0x24, 0x70, 0x80, 
-	0xc4, 0x02, 0xd0, 0x28, 0x70, 0xc0, 0x00, 0x21, 
-	0xd0, 0x10, 0x72, 0x00, 0x93, 0x90, 0xd4, 0x81, 
-	0x13, 0x96, 0x43, 0x92, 0x34, 0x8e, 0x00, 0x22, 
-	0xd1, 0xa4, 0x71, 0x86, 0xde, 0x40, 0x7e, 0x79, 
-	0xd0, 0x18, 0x70, 0x40, 0xb0, 0x41, 0xf5, 0x58, 
-	0xd3, 0x42, 0x50, 0x4d, 0x60, 0x40, 0x10, 0x60, 
-	0xe5, 0x62, 0xd0, 0x54, 0x70, 0x01, 0xb0, 0x3c, 
-	0x60, 0x01, 0x04, 0x2d, 0xd0, 0x08, 0xe0, 0x36, 
-	0x00, 0x22, 0xd0, 0x60, 0x71, 0xc1, 0xd0, 0x4f, 
-	0x41, 0xc1, 0x03, 0xef, 0xd0, 0x30, 0xe0, 0x36, 
-	0x50, 0x00, 0x50, 0x00, 0x04, 0x21, 0xd0, 0x20, 
-	0xd3, 0x44, 0x72, 0x8d, 0x12, 0xa0, 0xe8, 0x36, 
-	0xc0, 0x47, 0x10, 0x5d, 0x30, 0x4e, 0xf8, 0x36, 
-	0xb2, 0x3e, 0x60, 0x4d, 0x00, 0xed, 0xd0, 0x48, 
-	0x70, 0x01, 0xde, 0x45, 0x50, 0x39, 0x00, 0x1b, 
-	0xf9, 0x44, 0xb0, 0x01, 0x00, 0x1c, 0xf9, 0x47, 
-	0xb0, 0x04, 0x60, 0x01, 0xd0, 0x40, 0x62, 0x81, 
-	0xce, 0x4a, 0xd0, 0x43, 0x41, 0xc1, 0xd0, 0x58, 
-	0x61, 0xc1, 0x90, 0x43, 0x00, 0xe0, 0xd0, 0x28, 
-	0x70, 0x00, 0x10, 0x1f, 0x20, 0x40, 0xb1, 0xc1, 
-	0xf5, 0x54, 0x00, 0x21, 0xd0, 0x08, 0x60, 0x40, 
-	0x00, 0xe6, 0xd0, 0x40, 0x70, 0x41, 0xd2, 0x94, 
-	0x60, 0x4a, 0x04, 0x2b, 0xd0, 0x10, 0x01, 0x90, 
-	0xf8, 0x36, 0x04, 0x2d, 0xd0, 0x08, 0xe0, 0x36, 
-	0x50, 0x00, 0x50, 0x00, 0xc0, 0x47, 0x10, 0x5d, 
-	0x30, 0x4e, 0xf9, 0x41, 0x90, 0x43, 0x00, 0xe0, 
-	0xd0, 0x28, 0x70, 0x00, 0x20, 0x40, 0x00, 0x21, 
-	0xd0, 0x08, 0x60, 0x40, 0x00, 0x26, 0xd0, 0x74, 
-	0x70, 0x01, 0xb0, 0x3f, 0x60, 0x01, 0x00, 0xed, 
-	0xd0, 0x48, 0x70, 0x41, 0x00, 0x5e, 0xf9, 0x4b, 
-	0x00, 0x21, 0xd0, 0x00, 0x73, 0x80, 0xd4, 0x81, 
-	0x34, 0x8e, 0x00, 0x34, 0xd3, 0x48, 0xe0, 0x36, 
-	0x50, 0x00, 0x50, 0x00, 0xd1, 0x88, 0xd1, 0xc8, 
-	0x01, 0x1b, 0xe9, 0x39, 0x11, 0x9f, 0x11, 0xdf, 
-	0xd4, 0x80, 0xd3, 0x81, 0xe1, 0x43, 0x00, 0xed, 
-	0xd0, 0x08, 0x70, 0x00, 0x00, 0x10, 0xf9, 0x37, 
-	0x0c, 0x1f, 0xf9, 0x36, 0x13, 0xa1, 0xe9, 0x43, 
-	0xbe, 0x7c, 0x00, 0x65, 0xd2, 0x46, 0x12, 0x48, 
-	0xc0, 0x39, 0x30, 0x18, 0xe5, 0x4b, 0xd2, 0x70, 
-	0x72, 0x49, 0x22, 0x79, 0x00, 0x21, 0xd0, 0x00, 
-	0x63, 0x80, 0x04, 0x24, 0xd0, 0x00, 0x02, 0x10, 
-	0xe9, 0x56, 0xd0, 0x41, 0x51, 0x41, 0xe0, 0x36, 
-	0x15, 0x61, 0xe8, 0x36, 0xd5, 0x80, 0xd3, 0x00, 
-	0xd3, 0x40, 0x04, 0x27, 0xd0, 0x20, 0xe0, 0x36, 
-	0x50, 0x00, 0x50, 0x00, 0x00, 0x21, 0xd0, 0x18, 
-	0x73, 0x00, 0xb0, 0x04, 0x73, 0x80, 0xd2, 0x80, 
-	0xb0, 0x38, 0x72, 0xc0, 0x31, 0x0d, 0xc0, 0x0e, 
-	0x10, 0x0b, 0x10, 0x20, 0xe9, 0x42, 0xf5, 0x3f, 
-	0x22, 0x8d, 0x10, 0x01, 0x13, 0x5f, 0xe1, 0x3b, 
-	0x33, 0x8b, 0x15, 0x61, 0xf9, 0x49, 0x00, 0x21, 
-	0xd0, 0x64, 0x70, 0x41, 0x33, 0x81, 0x03, 0xd0, 
-	0xe9, 0x4c, 0x20, 0x0b, 0x13, 0xdf, 0x12, 0xc1, 
-	0x13, 0xe0, 0xf9, 0x49, 0x10, 0x03, 0xc0, 0x50, 
-	0x10, 0x4b, 0x13, 0x0b, 0x23, 0x00, 0x13, 0x20, 
-	0xe9, 0x5c, 0xf5, 0x59, 0x22, 0x81, 0x13, 0x01, 
-	0x10, 0x5f, 0xe1, 0x55, 0x12, 0x99, 0x12, 0x87, 
-	0x21, 0x0a, 0x00, 0xa0, 0xd2, 0x80, 0xc3, 0x0a, 
-	0x03, 0x90, 0xe9, 0x66, 0x22, 0x82, 0x23, 0x03, 
-	0x10, 0x81, 0x10, 0xc1, 0x13, 0x9f, 0x13, 0xa0, 
-	0xed, 0x62, 0xc0, 0x8a, 0xc0, 0xcc, 0x04, 0x26, 
-	0xd0, 0x00, 0xe0, 0x36, 0x15, 0x61, 0xf9, 0x3d, 
-	0x07, 0x32, 0xd0, 0x00, 0x30, 0x03, 0xed, 0x3d, 
-	0xc0, 0x03, 0x10, 0x1d, 0x30, 0xc0, 0xc0, 0x02, 
-	0x10, 0x1d, 0x30, 0x80, 0xe1, 0x32, 0x10, 0x94, 
-	0x10, 0xd4, 0x00, 0x21, 0xd0, 0x20, 0x73, 0x00, 
-	0xc5, 0x8c, 0xd3, 0x4e, 0x01, 0x1b, 0xe9, 0x48, 
-	0x13, 0x1f, 0xd3, 0x4f, 0x43, 0x4c, 0x13, 0x1c, 
-	0xc0, 0x0c, 0x10, 0x03, 0x20, 0x0c, 0xc0, 0x40, 
-	0x10, 0x42, 0x20, 0x40, 0x10, 0x46, 0x20, 0x4d, 
-	0x10, 0x42, 0x2e, 0x41, 0x10, 0x5c, 0x10, 0x43, 
-	0x00, 0x59, 0xe9, 0x5b, 0x01, 0x69, 0xd0, 0x20, 
-	0x30, 0x40, 0x22, 0x41, 0x04, 0x27, 0xd0, 0x20, 
-	0xe0, 0x36, 0x50, 0x00, 0x2c, 0x14, 0xd0, 0x34, 
-	0x63, 0x00, 0xd0, 0x38, 0x72, 0xc0, 0xc0, 0x51, 
-	0x10, 0x5c, 0x30, 0x4b, 0x10, 0x44, 0xd4, 0xc0, 
-	0xd5, 0x00, 0xc0, 0x18, 0x30, 0x39, 0xed, 0x5f, 
-	0xd4, 0xd0, 0xc5, 0x01, 0xd0, 0x18, 0x70, 0x00, 
-	0x0c, 0x1f, 0xe9, 0x48, 0x10, 0x20, 0xfd, 0x48, 
-	0xd4, 0xc0, 0xd5, 0x00, 0x10, 0x22, 0xe5, 0x4e, 
-	0xd4, 0xc0, 0xbc, 0x30, 0xd5, 0x00, 0xb5, 0x10, 
-	0xb0, 0x3f, 0xf9, 0x52, 0x3c, 0x01, 0x3c, 0x01, 
-	0x02, 0x1f, 0xe9, 0x5f, 0x00, 0xa8, 0xd3, 0xc0, 
-	0xd3, 0x9e, 0x00, 0xa9, 0xd0, 0x38, 0x70, 0x4f, 
-	0xb3, 0xfc, 0x60, 0x40, 0xb0, 0x3c, 0xb3, 0x81, 
-	0xed, 0x59, 0x00, 0x21, 0xd0, 0x28, 0x70, 0x00, 
-	0x10, 0x20, 0xf9, 0x69, 0x02, 0x1f, 0xf9, 0x6a, 
-	0x90, 0x10, 0x00, 0x1e, 0xe9, 0x6a, 0xb1, 0x7c, 
-	0x04, 0x29, 0xd0, 0x20, 0xe0, 0x36, 0x50, 0x00, 
-	0x50, 0x00, 0x50, 0x00, 0x01, 0x5e, 0xf9, 0x35, 
-	0x01, 0x50, 0xe9, 0x35, 0xb1, 0x78, 0xd2, 0x00, 
-	0x01, 0x5c, 0xf9, 0x5f, 0xc0, 0x18, 0x30, 0x39, 
-	0xed, 0x5f, 0x11, 0x9f, 0xce, 0x58, 0xc2, 0x59, 
-	0x00, 0xa9, 0xd2, 0x38, 0x14, 0x82, 0x22, 0x12, 
-	0xc0, 0x0c, 0x10, 0x1f, 0x10, 0x03, 0x22, 0x00, 
-	0x70, 0x48, 0x03, 0x10, 0xe9, 0x4c, 0xb2, 0x38, 
-	0xbe, 0x60, 0xb2, 0x60, 0x2e, 0x41, 0x10, 0x5f, 
-	0x00, 0x59, 0xe9, 0x53, 0x01, 0x69, 0xd0, 0x3c, 
-	0x30, 0x40, 0x22, 0x41, 0x13, 0x41, 0x2e, 0x4d, 
-	0x13, 0x5d, 0x13, 0x43, 0x22, 0x4d, 0x14, 0xe0, 
-	0xe9, 0x5f, 0x33, 0x0b, 0x13, 0x04, 0x2c, 0x0c, 
-	0x35, 0x0c, 0xc3, 0x46, 0xc3, 0x87, 0x04, 0x61, 
-	0xd0, 0x28, 0x15, 0x62, 0xfc, 0x36, 0x04, 0x2f, 
-	0xd0, 0x28, 0xe0, 0x36, 0x00, 0x22, 0xd0, 0x74, 
-	0x74, 0x01, 0xb0, 0x7c, 0x74, 0x41, 0xb0, 0x7c, 
-	0x00, 0x27, 0xd0, 0x20, 0x30, 0x11, 0xf5, 0x3b, 
-	0x24, 0x40, 0x71, 0x41, 0xd1, 0x08, 0xc0, 0x10, 
-	0x10, 0x1c, 0xb0, 0x16, 0xf9, 0x4a, 0x00, 0x23, 
-	0xd0, 0x30, 0x30, 0x11, 0xf9, 0x4a, 0xb1, 0x70, 
-	0x01, 0x50, 0xf9, 0x4a, 0xb1, 0x20, 0x14, 0x41, 
-	0xc0, 0x90, 0x00, 0x2b, 0xd0, 0xd0, 0x01, 0x50, 
-	0xe9, 0x50, 0xc0, 0xd0, 0x00, 0x34, 0xdc, 0x00, 
-	0x20, 0x11, 0x10, 0x1f, 0xa0, 0x1c, 0x00, 0x21, 
-	0xd0, 0x2c, 0x70, 0x00, 0x10, 0x05, 0x51, 0x40, 
-	0xd0, 0x1c, 0x61, 0x40, 0xd0, 0x20, 0x61, 0x00, 
-	0xd0, 0x24, 0x60, 0x80, 0xd0, 0x28, 0x60, 0xc0, 
-	0x04, 0x2d, 0xd0, 0x08, 0x00, 0x22, 0xd0, 0x64, 
-	0xb1, 0x81, 0x61, 0x81, 0xe0, 0x36, 0x50, 0x00, 
-	0x50, 0x00, 0x50, 0x00, 0x90, 0x50, 0xd0, 0x3c, 
-	0x10, 0x41, 0x60, 0x40, 0x15, 0x62, 0xfd, 0x3d, 
-	0xc0, 0x10, 0x10, 0x1e, 0x10, 0x07, 0x21, 0x00, 
-	0x10, 0x16, 0x34, 0x00, 0xc0, 0x90, 0xd3, 0x40, 
-	0x00, 0x24, 0xd3, 0xc0, 0x04, 0x22, 0xd0, 0x20, 
-	0x01, 0x9f, 0xe8, 0x36, 0xd0, 0x54, 0x70, 0x41, 
-	0x73, 0x41, 0x04, 0x2e, 0xd0, 0x00, 0xe0, 0x36, 
-	0x50, 0x00, 0x50, 0x00, 0x00, 0xef, 0xd3, 0x30, 
-	0x73, 0x0c, 0xd0, 0x0c, 0x70, 0x00, 0xc0, 0x40, 
-	0x13, 0x24, 0xf5, 0x42, 0x13, 0x22, 0xe9, 0x41, 
-	0xe5, 0x43, 0xd3, 0x00, 0x10, 0x22, 0xf9, 0x41, 
-	0xd0, 0x01, 0xd0, 0x43, 0xd3, 0x01, 0x21, 0x00, 
-	0xd3, 0x40, 0x03, 0x10, 0xf9, 0x47, 0xd3, 0x40, 
-	0xe1, 0x61, 0x00, 0x23, 0xd0, 0x00, 0x10, 0x61, 
-	0xe9, 0x50, 0xb0, 0x33, 0x10, 0x63, 0xe9, 0x50, 
-	0x00, 0x22, 0xd0, 0x1a, 0xc3, 0xc0, 0xd2, 0xc0, 
-	0x00, 0x10, 0xe9, 0x55, 0x22, 0xd0, 0x10, 0x1f, 
-	0x14, 0x01, 0x10, 0x20, 0xed, 0x52, 0x14, 0x18, 
-	0x12, 0xd8, 0xc0, 0x8b, 0x32, 0xd0, 0x12, 0xc3, 
-	0x33, 0x4b, 0x13, 0x47, 0x21, 0x0d, 0x04, 0x22, 
-	0xd0, 0x20, 0xe0, 0x36, 0x00, 0x24, 0xd0, 0x30, 
-	0xd0, 0x40, 0x60, 0x40, 0xd3, 0xc7, 0x43, 0xc4, 
-	0x31, 0x0f, 0xd5, 0xd4, 0x25, 0xcf, 0x15, 0xc4, 
-	0x10, 0xdf, 0xc2, 0xc6, 0xc3, 0x07, 0x11, 0x81, 
-	0xb1, 0x3b, 0x15, 0x64, 0xe9, 0x47, 0x10, 0xdf, 
-	0x12, 0xc1, 0x11, 0x81, 0x11, 0xc1, 0xb1, 0x3f, 
-	0xb5, 0xf8, 0x90, 0x10, 0x00, 0x16, 0xf9, 0x5e, 
-	0xb5, 0xfc, 0xd0, 0x20, 0x40, 0x39, 0x2e, 0x4b, 
-	0x22, 0x4c, 0x12, 0x20, 0xe9, 0x59, 0x20, 0x39, 
-	0x00, 0x1b, 0xe9, 0x59, 0x2c, 0x13, 0x35, 0x13, 
-	0x0e, 0x5a, 0xf9, 0x59, 0xb2, 0x38, 0x02, 0xe3, 
-	0xd0, 0x00, 0x0e, 0x5a, 0xe9, 0x5e, 0x2e, 0x40, 
-	0x01, 0xee, 0xd2, 0x80, 0x42, 0x84, 0xc0, 0x03, 
-	0x30, 0x02, 0xf5, 0x6b, 0x31, 0x0a, 0x12, 0x98, 
-	0x20, 0x03, 0xf5, 0x69, 0x12, 0x9f, 0x12, 0x87, 
-	0x51, 0x0a, 0x00, 0x34, 0xd4, 0xc8, 0xe0, 0x36, 
-	0x50, 0x00, 0x50, 0x00, 0xd3, 0xc7, 0x43, 0xc4, 
-	0x15, 0x61, 0xf9, 0x48, 0x10, 0xc1, 0xd5, 0xe0, 
-	0xd1, 0x80, 0xd1, 0xc0, 0x31, 0x0f, 0x13, 0xe1, 
-	0xe9, 0x3c, 0xd3, 0xc0, 0x00, 0x24, 0xd0, 0x30, 
-	0x63, 0xc0, 0x25, 0xcf, 0x15, 0xc2, 0xd0, 0x03, 
-	0x40, 0x16, 0x25, 0xc0, 0x15, 0xc2, 0x15, 0x81, 
-	0x35, 0x91, 0xe1, 0x5c, 0x00, 0x24, 0xd0, 0x30, 
-	0x63, 0xc0, 0x01, 0x50, 0xe9, 0x54, 0x15, 0xa0, 
-	0xf9, 0x55, 0x00, 0x24, 0xd0, 0x34, 0x70, 0x00, 
-	0x10, 0x20, 0xe9, 0x55, 0xd3, 0xc0, 0x31, 0x0f, 
-	0xd5, 0xfc, 0x25, 0xcf, 0x15, 0xc3, 0x14, 0xa0, 
-	0xe9, 0x5c, 0xb5, 0xfc, 0x00, 0x34, 0xd4, 0xc8, 
-	0xe0, 0x36, 0x50, 0x00, 0xc4, 0x91, 0x34, 0x96, 
-	0xed, 0x34, 0xd4, 0x80, 0x14, 0x84, 0xb3, 0xc1, 
-	0xe5, 0x41, 0xc0, 0x52, 0x10, 0x5e, 0x34, 0x81, 
-	0xb3, 0xc1, 0xe5, 0x41, 0xc0, 0x52, 0x10, 0x5c, 
-	0x24, 0x81, 0xb3, 0xc1, 0xe5, 0x37, 0x02, 0x68, 
-	0xd0, 0x00, 0xb4, 0xb0, 0x14, 0x9b, 0x00, 0x23, 
-	0xd0, 0x70, 0x30, 0x52, 0xed, 0x4a, 0x24, 0x81, 
-	0x20, 0x12, 0xa0, 0x1c, 0x10, 0x8a, 0x50, 0x83, 
-	0xa0, 0x96, 0xa1, 0x50, 0xa1, 0x11, 0xc0, 0x52, 
-	0xd4, 0x84, 0x10, 0x6c, 0xed, 0x56, 0xd4, 0x81, 
-	0xd1, 0x00, 0xb1, 0x13, 0x00, 0x23, 0xd1, 0x40, 
-	0xc2, 0xb9, 0x22, 0x86, 0x12, 0x20, 0xf9, 0x66, 
-	0x02, 0xe3, 0xd0, 0x40, 0x02, 0x9a, 0xe9, 0x63, 
-	0x22, 0x81, 0x02, 0x5a, 0xe9, 0x66, 0x22, 0x41, 
-	0x75, 0xd7, 0xc3, 0xd7, 0xd0, 0xd7, 0x00, 0x21, 
-	0xd0, 0xb6, 0x8b, 0x38, 0x00, 0x33, 0xdc, 0xd0, 
-	0xe0, 0x36, 0x50, 0x00, 0xd0, 0x7c, 0x60, 0x01, 
-	0xae, 0x52, 0xd0, 0x60, 0x40, 0x79, 0x00, 0x13, 
-	0xe8, 0xc9, 0xa2, 0x94, 0x22, 0x86, 0x13, 0xe0, 
-	0xe4, 0xd0, 0x13, 0xc1, 0x15, 0x62, 0xfc, 0xd1, 
-	0x13, 0xc1, 0xe0, 0xd1, 0xc3, 0xd7, 0x03, 0xd9, 
-	0xe8, 0xd4, 0x22, 0x8d, 0x15, 0x62, 0xfc, 0xda, 
-	0x03, 0xda, 0xe8, 0xda, 0x22, 0x8d, 0x22, 0x8d, 
-	0xce, 0x4a, 0x22, 0x86, 0x00, 0x14, 0xe8, 0xe0, 
-	0xa2, 0x53, 0x22, 0x47, 0x03, 0xd1, 0xe8, 0xe8, 
-	0x22, 0x4e, 0x15, 0x62, 0xfc, 0xe8, 0x03, 0xd2, 
-	0xe8, 0xe8, 0x22, 0x4e, 0x12, 0x20, 0xe9, 0x09, 
-	0x20, 0x79, 0x00, 0x5b, 0xe8, 0xf4, 0x15, 0x20, 
-	0xfc, 0xf1, 0x2c, 0x13, 0x35, 0x13, 0x0e, 0x5b, 
-	0xe8, 0xf4, 0xb2, 0x38, 0x02, 0x9a, 0xe8, 0xfb, 
-	0x70, 0x08, 0xd0, 0x7c, 0x42, 0x81, 0x22, 0x98, 
-	0x22, 0x80, 0x02, 0x5a, 0xe9, 0x11, 0x70, 0x08, 
-	0xd0, 0x78, 0x42, 0x41, 0x22, 0x59, 0x10, 0x1f, 
-	0x22, 0x40, 0x00, 0x19, 0xe9, 0x11, 0x01, 0x69, 
-	0xd0, 0x7c, 0x32, 0x41, 0xe1, 0x11, 0x02, 0xe3, 
-	0xd0, 0x40, 0x02, 0x9a, 0xe9, 0x0e, 0x22, 0x81, 
-	0x02, 0x5a, 0xe9, 0x11, 0x22, 0x41, 0x0e, 0x5a, 
-	0xe9, 0x15, 0xce, 0x4a, 0x3e, 0x46, 0x0f, 0x87, 
-	0xdd, 0x48, 0xe1, 0x19, 0xdd, 0x40, 0xdc, 0xc8, 
-	0xdd, 0x3c, 0x7d, 0x34, 0x1d, 0x19, 0x3d, 0x35, 
-	0x4d, 0x33, 0x4c, 0xec, 0x3d, 0x33, 0xf9, 0x17, 
-	0x0f, 0xc5, 0x50, 0x00, 0xd0, 0x39, 0xd0, 0x35, 
-	0xd0, 0x1d, 0xd0, 0x2d, 0xd0, 0x3f, 0xd0, 0x2e, 
-	0xd0, 0x3c, 0xd0, 0x37, 0xd0, 0x38, 0xd0, 0x19, 
-	0xd0, 0x33, 0xd0, 0x2e, 0xd0, 0x3d, 0xd0, 0x3e, 
-	0xd0, 0x27, 0xd0, 0x3e, 0xd0, 0x3a, 0xd0, 0x2f, 
-	0xd0, 0x32, 0x00, 0x00, 0x47, 0x78, 0x46, 0xc0, 
-	0xe1, 0x01, 0x00, 0x90, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x00, 
-	0xe5, 0x9f, 0x20, 0x6c, 0xe0, 0x21, 0x10, 0x01, 
-	0xe1, 0x02, 0x00, 0x91, 0xe3, 0x50, 0x00, 0x00, 
-	0x1a, 0x00, 0x00, 0x02, 0xe3, 0xa0, 0x00, 0x00, 
-	0xeb, 0x00, 0x38, 0x99, 0xea, 0xff, 0xff, 0xf7, 
-	0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xb5, 0x00, 0x4a, 0x12, 0x68, 0x10, 0x28, 0x00, 
-	0xd1, 0x03, 0x20, 0x00, 0xf7, 0xf1, 0xff, 0xc6, 
-	0xe7, 0xf7, 0xbd, 0x00, 0x47, 0x78, 0x00, 0x00, 
-	0xe9, 0x2d, 0x40, 0x00, 0xe5, 0x9f, 0x20, 0x2c, 
-	0xe3, 0xa0, 0x10, 0x01, 0xe1, 0x02, 0x00, 0x91, 
-	0xe3, 0x50, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x02, 
-	0xe3, 0xa0, 0x00, 0x00, 0xeb, 0x00, 0x38, 0x88, 
-	0xea, 0xff, 0xff, 0xf7, 0xe8, 0xbd, 0x00, 0x01, 
-	0xe1, 0x2f, 0xff, 0x10, 0x48, 0x02, 0x40, 0x49, 
-	0x60, 0x01, 0x47, 0x70, 0x70, 0x00, 0x00, 0x34, 
-	0x2e, 0x08, 0x1f, 0xa8, 0x47, 0x78, 0x46, 0xc0, 
-	0xe1, 0xa0, 0x09, 0x00, 0xe1, 0xb0, 0x10, 0x01, 
-	0x03, 0xc0, 0x01, 0x02, 0x13, 0x80, 0x01, 0x02, 
-	0xe3, 0xa0, 0x13, 0x3f, 0xe3, 0xa0, 0x30, 0x0e, 
-	0xe1, 0xb0, 0x10, 0x81, 0x3a, 0x00, 0x00, 0x04, 
-	0xe1, 0xb0, 0x00, 0x80, 0x32, 0x21, 0x13, 0x03, 
-	0xe2, 0x53, 0x30, 0x01, 0x1a, 0xff, 0xff, 0xf9, 
-	0xea, 0x00, 0x00, 0x03, 0xe1, 0xb0, 0x00, 0x80, 
-	0x22, 0x21, 0x13, 0x03, 0xe2, 0x53, 0x30, 0x01, 
-	0x1a, 0xff, 0xff, 0xf4, 0xe1, 0xa0, 0x0d, 0x21, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe9, 0x2d, 0x41, 0xf0, 
-	0xe2, 0x4d, 0xd0, 0x14, 0xe3, 0xa0, 0xc0, 0x44, 
-	0xe2, 0x8c, 0xc4, 0x66, 0xe5, 0x9c, 0xc0, 0x00, 
-	0xe5, 0x9f, 0x01, 0x94, 0xe5, 0x80, 0xc0, 0x00, 
-	0xe1, 0xa0, 0xc1, 0x4c, 0xe2, 0x0c, 0xc0, 0x03, 
-	0xe5, 0x9f, 0x01, 0x88, 0xe5, 0xc0, 0xc0, 0x00, 
-	0xe5, 0x9f, 0x01, 0x84, 0xe5, 0x90, 0x00, 0x00, 
-	0xe0, 0x80, 0x64, 0x0c, 0xe1, 0xa0, 0x70, 0x06, 
-	0xe8, 0xb7, 0x00, 0x01, 0xe2, 0x00, 0x40, 0x1f, 
-	0xe2, 0x8f, 0x2f, 0x69, 0xe7, 0x92, 0x21, 0x04, 
-	0xe3, 0x52, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x51, 
-	0xe5, 0x9f, 0x32, 0x1c, 0xe2, 0x83, 0x50, 0xbc, 
-	0xe5, 0x9f, 0x12, 0x1c, 0xe1, 0x55, 0x00, 0x01, 
-	0x03, 0xa0, 0x50, 0x00, 0xe5, 0x9f, 0x12, 0x04, 
-	0xe1, 0x51, 0x00, 0x05, 0x0a, 0x00, 0x00, 0x45, 
-	0xe5, 0x9f, 0x81, 0xf4, 0xe0, 0x88, 0x80, 0x03, 
-	0xe5, 0x9f, 0x11, 0x5c, 0xe1, 0xa0, 0x36, 0x20, 
-	0xe2, 0x03, 0x30, 0x0f, 0xe1, 0x81, 0x10, 0x03, 
-	0xe5, 0x9f, 0x21, 0x48, 0xe7, 0x92, 0x31, 0x04, 
-	0xe1, 0xa0, 0x39, 0x83, 0xe1, 0xa0, 0x35, 0xa3, 
-	0xe1, 0x81, 0x10, 0x03, 0xe1, 0xa0, 0x33, 0xa0, 
-	0xe2, 0x03, 0x30, 0x01, 0xe1, 0xa0, 0x3b, 0x03, 
-	0xe1, 0x81, 0x10, 0x03, 0xe1, 0xa0, 0x35, 0x20, 
-	0xe2, 0x03, 0x30, 0x03, 0xe1, 0xa0, 0x32, 0x03, 
-	0xe1, 0x81, 0x10, 0x03, 0xe1, 0xa0, 0x3a, 0xa0, 
-	0xe2, 0x03, 0x30, 0x01, 0xe1, 0xa0, 0x3b, 0x83, 
-	0xe1, 0x81, 0x10, 0x03, 0xe1, 0xa0, 0x34, 0xa0, 
-	0xe2, 0x03, 0x30, 0x01, 0xe1, 0xa0, 0x3a, 0x83, 
-	0xe1, 0x81, 0x10, 0x03, 0xe2, 0x00, 0x30, 0x60, 
-	0xe1, 0xa0, 0x30, 0x83, 0xe1, 0x81, 0x10, 0x03, 
-	0xe8, 0xa8, 0x00, 0x02, 0xe5, 0x9f, 0x00, 0xf0, 
-	0xe3, 0xa0, 0x10, 0x30, 0xe5, 0x80, 0x10, 0x00, 
-	0xe5, 0x9f, 0x00, 0x9c, 0xe5, 0xd0, 0x40, 0x00, 
-	0xe2, 0x84, 0x10, 0x01, 0xe5, 0xc0, 0x10, 0x00, 
-	0xe2, 0x04, 0x40, 0x00, 0xe5, 0x9f, 0x00, 0x98, 
-	0xe5, 0x90, 0x10, 0x00, 0xe3, 0x11, 0x00, 0x10, 
-	0x1a, 0x00, 0x00, 0x1a, 0xe5, 0x80, 0x10, 0x00, 
-	0xe5, 0x8f, 0x51, 0x4c, 0xe1, 0xa0, 0x22, 0x04, 
-	0xe1, 0x82, 0x10, 0x0c, 0xe5, 0x9f, 0x00, 0xac, 
-	0xe0, 0x80, 0x02, 0x01, 0xe5, 0x80, 0x70, 0x00, 
-	0xe5, 0x80, 0x80, 0x04, 0xe5, 0x9f, 0x10, 0x5c, 
-	0xe5, 0x80, 0x10, 0x08, 0xe5, 0x9f, 0x10, 0x58, 
-	0xe5, 0x80, 0x10, 0x0c, 0xe5, 0x9f, 0x00, 0x58, 
-	0xe5, 0x90, 0x10, 0x00, 0xe0, 0x84, 0x00, 0x01, 
-	0xe3, 0xa0, 0x20, 0x01, 0xe1, 0xa0, 0x00, 0x12, 
-	0xe3, 0xa0, 0x10, 0x40, 0xe2, 0x81, 0x14, 0x66, 
-	0xe5, 0x81, 0x00, 0x00, 0xe3, 0xa0, 0x10, 0x01, 
-	0xe1, 0xa0, 0x0c, 0x11, 0xe3, 0xa0, 0x10, 0xb8, 
-	0xe2, 0x81, 0x14, 0x66, 0xe5, 0x81, 0x00, 0x00, 
-	0xe2, 0x8d, 0xd0, 0x14, 0xe8, 0xbd, 0x81, 0xf0, 
-	0xe5, 0x9f, 0x10, 0xf0, 0xe2, 0x81, 0x10, 0x01, 
-	0xe5, 0x8f, 0x10, 0xe8, 0xea, 0xff, 0xff, 0xf4, 
-	0xe5, 0x9f, 0xf0, 0x08, 0xa0, 0x00, 0x05, 0xc4, 
-	0x80, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x10, 
-	0x00, 0x00, 0x06, 0xf4, 0xa0, 0x00, 0x04, 0x28, 
-	0xa0, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x05, 0x50, 
-	0x2c, 0x00, 0x1f, 0xe8, 0x2c, 0x00, 0x1f, 0xea, 
-	0x2c, 0x00, 0x1f, 0xf4, 0x00, 0x00, 0x05, 0xe0, 
-	0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x12, 
-	0x2c, 0x00, 0x02, 0x00, 0x64, 0x00, 0x04, 0x00, 
-	0x64, 0x00, 0x00, 0x80, 0x47, 0x00, 0x00, 0x00, 
-	0x9e, 0x00, 0x00, 0xc0, 0x66, 0x00, 0x00, 0x50, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, 0x07, 
-	0xe1, 0xb0, 0xf0, 0x0e, 0xe5, 0x9f, 0xf1, 0x00, 
-	0xe2, 0x5e, 0xf0, 0x04, 0xe2, 0x5e, 0xf0, 0x08, 
-	0xea, 0x00, 0x00, 0x02, 0xe5, 0x9f, 0xf0, 0xec, 
-	0xe2, 0x5e, 0xf0, 0x04, 0x2c, 0x00, 0x00, 0xe8, 
-	0xe1, 0x0f, 0x00, 0x00, 0xe3, 0xc0, 0x00, 0x1f, 
-	0xe3, 0x80, 0x00, 0x1b, 0xe1, 0x29, 0xf0, 0x00, 
-	0xe5, 0x9f, 0xd0, 0xd8, 0xe5, 0x9f, 0x00, 0xd8, 
-	0xe0, 0x8d, 0xd0, 0x00, 0xe1, 0x0f, 0x00, 0x00, 
-	0xe3, 0xc0, 0x00, 0x1f, 0xe3, 0x80, 0x00, 0x13, 
-	0xe1, 0x29, 0xf0, 0x00, 0xe5, 0x9f, 0xd0, 0xc4, 
-	0xe5, 0x9f, 0x00, 0xc4, 0xe0, 0x8d, 0xd0, 0x00, 
-	0xe1, 0x0f, 0x00, 0x00, 0xe3, 0xc0, 0x00, 0x1f, 
-	0xe3, 0x80, 0x00, 0x12, 0xe1, 0x29, 0xf0, 0x00, 
-	0xe5, 0x9f, 0xd0, 0xb0, 0xe5, 0x9f, 0x00, 0xb0, 
-	0xe0, 0x8d, 0xd0, 0x00, 0xe1, 0x0f, 0x00, 0x00, 
-	0xe3, 0xc0, 0x00, 0x9f, 0xe3, 0x80, 0x00, 0x10, 
-	0xe1, 0x29, 0xf0, 0x00, 0xe5, 0x9f, 0xd0, 0x60, 
-	0xeb, 0x00, 0x00, 0x08, 0xe5, 0x9f, 0x00, 0x64, 
-	0xe5, 0x9f, 0x10, 0x5c, 0xeb, 0x00, 0x37, 0xa7, 
-	0xe5, 0x9f, 0x00, 0x60, 0xe5, 0x9f, 0x10, 0x58, 
-	0xeb, 0x00, 0x37, 0xa7, 0xe5, 0x9f, 0xe0, 0x58, 
-	0xe3, 0x8e, 0xe0, 0x01, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe5, 0x9f, 0x00, 0x8c, 0xe5, 0x9f, 0x10, 0x8c, 
-	0xe5, 0x9f, 0x30, 0x8c, 0xe1, 0x50, 0x00, 0x01, 
-	0x0a, 0x00, 0x00, 0x03, 0xe1, 0x51, 0x00, 0x03, 
-	0x34, 0x90, 0x20, 0x04, 0x34, 0x81, 0x20, 0x04, 
-	0x3a, 0xff, 0xff, 0xfb, 0xe5, 0x9f, 0x10, 0x74, 
-	0xe3, 0xa0, 0x20, 0x00, 0xe1, 0x53, 0x00, 0x01, 
-	0x34, 0x83, 0x20, 0x04, 0x3a, 0xff, 0xff, 0xfc, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x1b, 0xff, 0xf0, 
-	0x2e, 0x1b, 0x7f, 0xf0, 0x2e, 0x1b, 0x7f, 0xef, 
-	0x2e, 0x08, 0x9a, 0x00, 0xcc, 0x1f, 0xff, 0xef, 
-	0xcc, 0x1f, 0x7f, 0xf0, 0x2e, 0x00, 0x1c, 0x39, 
-	0x2e, 0x01, 0xca, 0x48, 0x2e, 0x01, 0xcb, 0x40, 
-	0x2e, 0x08, 0x32, 0xf4, 0x00, 0x00, 0x08, 0x00, 
-	0x2e, 0x08, 0x22, 0xf4, 0x00, 0x00, 0x08, 0x00, 
-	0x2e, 0x08, 0x2a, 0xf4, 0x00, 0x00, 0x08, 0x00, 
-	0x2e, 0x08, 0x59, 0xb0, 0xe5, 0x9f, 0xf0, 0x04, 
-	0xe5, 0x9f, 0xf0, 0x04, 0xe5, 0x9f, 0xf0, 0x04, 
-	0x2e, 0x08, 0x59, 0xb0, 0x2e, 0x08, 0x59, 0xb1, 
-	0x2e, 0x08, 0x59, 0xb2, 0x2e, 0x03, 0x3b, 0xfc, 
-	0x2e, 0x08, 0x00, 0x00, 0x2e, 0x08, 0x3b, 0x70, 
-	0x2e, 0x08, 0x99, 0xfc, 0x1d, 0x77, 0x1e, 0x16, 
-	0x03, 0x00, 0x03, 0x03, 0x1d, 0x7f, 0x50, 0x50, 
-	0x4f, 0x5d, 0x49, 0x5d, 0x40, 0x4a, 0x44, 0x43, 
-	0x01, 0x49, 0x4d, 0x56, 0x48, 0x4b, 0x5d, 0x4f, 
-	0x5d, 0x4d, 0x4f, 0x0a, 0x78, 0x71, 0x73, 0x7f, 
-	0x70, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x1b, 
-	0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 
-	0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 
-	0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 
-	0x08, 0x0f, 0x0f, 0x0d, 0x13, 0x0d, 0x11, 0x0e, 
-	0x07, 0x08, 0x09, 0x0d, 0x0d, 0x15, 0x10, 0x05, 
-	0x08, 0x08, 0x09, 0x0e, 0x07, 0x08, 0x07, 0x07, 
-	0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 
-	0x0d, 0x0d, 0x07, 0x07, 0x0e, 0x0e, 0x0e, 0x0d, 
-	0x18, 0x0f, 0x10, 0x11, 0x11, 0x10, 0x0f, 0x13, 
-	0x11, 0x06, 0x0c, 0x10, 0x0d, 0x13, 0x11, 0x13, 
-	0x10, 0x13, 0x11, 0x10, 0x0e, 0x11, 0x0f, 0x17, 
-	0x0f, 0x10, 0x0f, 0x07, 0x07, 0x07, 0x0c, 0x0d, 
-	0x08, 0x0d, 0x0e, 0x0c, 0x0e, 0x0d, 0x07, 0x0e, 
-	0x0e, 0x05, 0x06, 0x0c, 0x06, 0x14, 0x0e, 0x0d, 
-	0x0e, 0x0e, 0x08, 0x0c, 0x07, 0x0e, 0x0b, 0x11, 
-	0x0b, 0x0c, 0x0c, 0x08, 0x06, 0x08, 0x0e, 0x12, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 
-	0x07, 0xc0, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 
-	0x0f, 0xfe, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x07, 0xc0, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 
-	0x1e, 0x0f, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00, 
-	0x06, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00, 
-	0x0e, 0xe0, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 
-	0x30, 0x01, 0x80, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00, 
-	0x0c, 0x60, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x3f, 0xe0, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0xc0, 0x00, 0x00, 
-	0x0c, 0x60, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00, 
-	0x60, 0x00, 0xc0, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0xc0, 0x00, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 
-	0x60, 0x00, 0xc0, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0xc0, 0x00, 0x00, 
-	0x18, 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 
-	0x60, 0x00, 0xc0, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0xf0, 0x00, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 
-	0x60, 0x00, 0xc0, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0xfe, 0x00, 0x00, 0x00, 0x30, 0x78, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 
-	0x60, 0x00, 0xc0, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0xfe, 0x00, 0x00, 0x00, 0x30, 0x1c, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x3e, 0x60, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x70, 0x60, 0x00, 0x00, 
-	0x30, 0x01, 0x80, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x32, 0x0c, 0x00, 0x00, 
-	0x60, 0x0c, 0x00, 0x00, 0x60, 0xe0, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x38, 0x0e, 0x00, 0x00, 0x30, 0x70, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x37, 0x1c, 0x00, 0x00, 
-	0x60, 0x0c, 0x00, 0x00, 0x71, 0xe0, 0x00, 0x00, 
-	0x1e, 0x0f, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x1c, 0x1c, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x33, 0xf8, 0x00, 0x00, 
-	0xe0, 0x0e, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, 
-	0x0f, 0xfe, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 
-	0x0f, 0xf8, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x31, 0xf0, 0x00, 0x00, 
-	0xc0, 0x06, 0x00, 0x00, 0x1e, 0x30, 0x00, 0x00, 
-	0x03, 0xf8, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x07, 0xf0, 0x00, 0x00, 0x0f, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x66, 0x00, 0x00, 0x00, 0x06, 0x30, 0x00, 0x00, 
-	0x1f, 0xc0, 0x00, 0x00, 0x1e, 0x03, 0x00, 0x00, 
-	0x07, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x06, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x66, 0x00, 0x00, 0x00, 0x0e, 0x70, 0x00, 0x00, 
-	0x3f, 0xe0, 0x00, 0x00, 0x33, 0x07, 0x00, 0x00, 
-	0x0f, 0xc0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x0c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x66, 0x00, 0x00, 0x00, 0x0e, 0x70, 0x00, 0x00, 
-	0x7a, 0xf0, 0x00, 0x00, 0x61, 0x86, 0x00, 0x00, 
-	0x1c, 0xe0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x66, 0x00, 0x00, 0x00, 0x0c, 0x60, 0x00, 0x00, 
-	0x62, 0x30, 0x00, 0x00, 0x61, 0x8e, 0x00, 0x00, 
-	0x18, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x3f, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x66, 0x00, 0x00, 0x00, 0x0c, 0x60, 0x00, 0x00, 
-	0x62, 0x00, 0x00, 0x00, 0x61, 0x8c, 0x00, 0x00, 
-	0x18, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x1e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x66, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, 
-	0x72, 0x00, 0x00, 0x00, 0x61, 0x9c, 0x00, 0x00, 
-	0x0c, 0xe0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x33, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, 
-	0x7a, 0x00, 0x00, 0x00, 0x61, 0xb8, 0x00, 0x00, 
-	0x0f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x33, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0xc0, 0x00, 0x00, 
-	0x3f, 0x80, 0x00, 0x00, 0x33, 0x30, 0x00, 0x00, 
-	0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0xc0, 0x00, 0x00, 
-	0x0f, 0xe0, 0x00, 0x00, 0x1e, 0x73, 0xc0, 0x00, 
-	0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x7f, 0xf8, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0xc0, 0x00, 0x00, 
-	0x02, 0xe0, 0x00, 0x00, 0x00, 0x66, 0x60, 0x00, 
-	0x39, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x7f, 0xf8, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x39, 0xc0, 0x00, 0x00, 
-	0x02, 0x70, 0x00, 0x00, 0x00, 0xec, 0x30, 0x00, 
-	0x70, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, 
-	0x02, 0x30, 0x00, 0x00, 0x00, 0xcc, 0x30, 0x00, 
-	0x60, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, 
-	0x62, 0x30, 0x00, 0x00, 0x01, 0xcc, 0x30, 0x00, 
-	0x60, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x31, 0x80, 0x00, 0x00, 
-	0x72, 0x70, 0x00, 0x00, 0x01, 0x8c, 0x30, 0x00, 
-	0x70, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00, 
-	0x3a, 0xf0, 0x00, 0x00, 0x03, 0x8c, 0x30, 0x00, 
-	0x38, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00, 
-	0x3f, 0xe0, 0x00, 0x00, 0x03, 0x06, 0x60, 0x00, 
-	0x3f, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x00, 0x07, 0x03, 0xc0, 0x00, 
-	0x0f, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x0f, 0xc0, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 
-	0x0f, 0xc0, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 
-	0x3f, 0xe0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 
-	0x3f, 0xe0, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x01, 0xc0, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 
-	0x1f, 0xe0, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, 
-	0x1f, 0xc0, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 
-	0x38, 0xe0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 
-	0x38, 0xf0, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00, 
-	0x03, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x70, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 
-	0x38, 0xe0, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, 
-	0x70, 0x60, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x70, 0x70, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 
-	0x03, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 
-	0x30, 0x60, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x70, 0x70, 0x00, 0x00, 0x1d, 0x80, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 
-	0x06, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 
-	0x30, 0x60, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x78, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 
-	0x00, 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 
-	0x0e, 0xc0, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 
-	0x30, 0x60, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x03, 0xe0, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, 
-	0x3e, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x00, 0x70, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 
-	0x0c, 0xc0, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, 
-	0x67, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x38, 0xe0, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x00, 0x60, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 
-	0x1c, 0xc0, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00, 
-	0x7f, 0xe0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 
-	0x1f, 0xc0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 
-	0x38, 0xc0, 0x00, 0x00, 0x60, 0x70, 0x00, 0x00, 
-	0x78, 0xe0, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x1f, 0xc0, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x70, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 
-	0x30, 0xc0, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x70, 0x70, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x30, 0xe0, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0xe0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x70, 0xc0, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x60, 0x70, 0x00, 0x00, 0x0f, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x7f, 0xf0, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0xe0, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, 
-	0x3e, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x7f, 0xf0, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x78, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x70, 0x70, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x30, 0x70, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0xe0, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x38, 0xe0, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x38, 0x60, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3f, 0xe0, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x7f, 0xf0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x1f, 0xe0, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x3f, 0xe0, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x1f, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x7f, 0xf0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0xff, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x30, 0x0f, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 
-	0x38, 0x06, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 
-	0x03, 0xff, 0xc0, 0x00, 0x07, 0xc0, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x30, 0x1e, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, 
-	0x38, 0x06, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 
-	0x07, 0xc1, 0xe0, 0x00, 0x07, 0xc0, 0x00, 0x00, 
-	0x30, 0x1c, 0x00, 0x00, 0x1e, 0x1e, 0x00, 0x00, 
-	0x30, 0x1c, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x30, 0x3c, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, 
-	0x3c, 0x06, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00, 
-	0x0e, 0x00, 0x70, 0x00, 0x06, 0xc0, 0x00, 0x00, 
-	0x30, 0x0c, 0x00, 0x00, 0x38, 0x07, 0x00, 0x00, 
-	0x30, 0x0e, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x38, 0x03, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x30, 0x70, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, 
-	0x3e, 0x06, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 
-	0x1c, 0x79, 0xb8, 0x00, 0x0e, 0xe0, 0x00, 0x00, 
-	0x30, 0x0c, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00, 
-	0x30, 0x07, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x03, 0x80, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x30, 0xe0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x36, 0x0d, 0x80, 0x00, 
-	0x36, 0x06, 0x00, 0x00, 0x30, 0x01, 0x80, 0x00, 
-	0x39, 0xff, 0x9c, 0x00, 0x0c, 0x60, 0x00, 0x00, 
-	0x30, 0x0c, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x30, 0x07, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x31, 0xc0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x36, 0x0d, 0x80, 0x00, 
-	0x37, 0x06, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, 
-	0x31, 0xcf, 0x9c, 0x00, 0x0c, 0x60, 0x00, 0x00, 
-	0x30, 0x1c, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x30, 0x03, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x37, 0x80, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x36, 0x0d, 0x80, 0x00, 
-	0x33, 0x06, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 
-	0x33, 0x87, 0x0c, 0x00, 0x1c, 0x70, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x30, 0x03, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x3f, 0xfe, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x37, 0x1d, 0x80, 0x00, 
-	0x31, 0x86, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 
-	0x77, 0x03, 0x0c, 0x00, 0x18, 0x30, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x30, 0x03, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x60, 0x3f, 0x80, 0x00, 
-	0x3f, 0xfe, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x33, 0x19, 0x80, 0x00, 
-	0x31, 0xc6, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 
-	0x67, 0x03, 0x0c, 0x00, 0x38, 0x38, 0x00, 0x00, 
-	0x30, 0x1c, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x30, 0x03, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x60, 0x3f, 0x80, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x3d, 0xe0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x33, 0x19, 0x80, 0x00, 
-	0x30, 0xc6, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 
-	0x66, 0x03, 0x0c, 0x00, 0x3f, 0xf8, 0x00, 0x00, 
-	0x30, 0x0e, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x30, 0x03, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x60, 0x01, 0x80, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x33, 0x19, 0x80, 0x00, 
-	0x30, 0x66, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 
-	0x66, 0x07, 0x1c, 0x00, 0x3f, 0xf8, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x70, 0x03, 0x00, 0x00, 
-	0x30, 0x07, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x70, 0x01, 0x80, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x30, 0x70, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x31, 0xb1, 0x80, 0x00, 
-	0x30, 0x76, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, 
-	0x66, 0x06, 0x18, 0x00, 0x70, 0x1c, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x01, 0x80, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x60, 0xc0, 0x00, 0x00, 0x30, 0x38, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x31, 0xb1, 0x80, 0x00, 
-	0x30, 0x36, 0x00, 0x00, 0x30, 0x01, 0x80, 0x00, 
-	0x67, 0x0e, 0x38, 0x00, 0x60, 0x0c, 0x00, 0x00, 
-	0x30, 0x0e, 0x00, 0x00, 0x38, 0x06, 0x00, 0x00, 
-	0x30, 0x0e, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x60, 0xc0, 0x00, 0x00, 0x30, 0x3c, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x31, 0xf1, 0x80, 0x00, 
-	0x30, 0x3e, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 
-	0x77, 0x1e, 0x70, 0x00, 0x60, 0x0c, 0x00, 0x00, 
-	0x30, 0x1e, 0x00, 0x00, 0x1e, 0x1e, 0x00, 0x00, 
-	0x30, 0x1c, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x1e, 0x0f, 0x80, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x71, 0xc0, 0x00, 0x00, 0x30, 0x1c, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x31, 0xf1, 0x80, 0x00, 
-	0x30, 0x1e, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00, 
-	0x73, 0xff, 0xe0, 0x00, 0xe0, 0x0e, 0x00, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x3f, 0x80, 0x00, 0x00, 0x30, 0x0e, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0x30, 0xe1, 0x80, 0x00, 
-	0x30, 0x0e, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 
-	0x39, 0xe7, 0xc0, 0x00, 0xc0, 0x06, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x1f, 0x00, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0x30, 0xe1, 0x80, 0x00, 
-	0x30, 0x0e, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 
-	0x3c, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1e, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0xc0, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 
-	0xff, 0xfc, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0xc0, 0x06, 0x00, 0x00, 0xc0, 0x38, 0x06, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 
-	0x7f, 0xfc, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
-	0xc0, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 
-	0xff, 0xfc, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0xe0, 0x0e, 0x00, 0x00, 0xe0, 0x7c, 0x0e, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x7f, 0xfc, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
-	0xe0, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x1e, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00, 
-	0x30, 0x1e, 0x00, 0x00, 0x3c, 0x1c, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0x60, 0x0c, 0x00, 0x00, 0xe0, 0x7c, 0x0e, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x30, 0x1c, 0x00, 0x00, 
-	0x00, 0x38, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x0e, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x0e, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x60, 0x6c, 0x0c, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x01, 0x80, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x60, 0xec, 0x0c, 0x00, 
-	0x0e, 0xe0, 0x00, 0x00, 0x1c, 0x38, 0x00, 0x00, 
-	0x00, 0x70, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x19, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0x30, 0x18, 0x00, 0x00, 0x70, 0xee, 0x1c, 0x00, 
-	0x06, 0xc0, 0x00, 0x00, 0x0e, 0x70, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x39, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x0e, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 
-	0x30, 0x1e, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x70, 0xc6, 0x1c, 0x00, 
-	0x07, 0xc0, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, 
-	0x01, 0xc0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x30, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x1c, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0x18, 0x30, 0x00, 0x00, 0x30, 0xc6, 0x18, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x70, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0x18, 0x30, 0x00, 0x00, 0x31, 0xc7, 0x18, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 
-	0x30, 0xe0, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x31, 0x83, 0x18, 0x00, 
-	0x07, 0xc0, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x18, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 
-	0x30, 0x70, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0x0c, 0x60, 0x00, 0x00, 0x39, 0x83, 0x38, 0x00, 
-	0x0e, 0xe0, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x18, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, 
-	0x30, 0x38, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0x0e, 0xe0, 0x00, 0x00, 0x1b, 0x83, 0xb0, 0x00, 
-	0x0e, 0xe0, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x31, 0x80, 0x00, 
-	0x30, 0x38, 0x00, 0x00, 0x70, 0x06, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0x0e, 0xe0, 0x00, 0x00, 0x1b, 0x01, 0xb0, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x38, 0x3f, 0x80, 0x00, 
-	0x30, 0x1c, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 
-	0x07, 0xc0, 0x00, 0x00, 0x1f, 0x01, 0xf0, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x1e, 0x1f, 0x00, 0x00, 
-	0x30, 0x1e, 0x00, 0x00, 0x3c, 0x1c, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 
-	0x07, 0xc0, 0x00, 0x00, 0x1f, 0x01, 0xf0, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x80, 0x00, 
-	0x30, 0x0e, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x1e, 0x00, 0xe0, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0xff, 0xfc, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x03, 0xff, 0xc0, 0x00, 
-	0x30, 0x07, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x0e, 0x00, 0xe0, 0x00, 
-	0xe0, 0x0e, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0xff, 0xfc, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x06, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0xff, 0xf8, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0xff, 0xf8, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 
-	0x33, 0xc0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x0f, 0xb0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0xfe, 0x00, 0x00, 0x00, 0x0f, 0x30, 0x00, 0x00, 
-	0x33, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x37, 0xcf, 0x80, 0x00, 
-	0x33, 0xc0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x3f, 0xe0, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 
-	0xfe, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, 
-	0x3f, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0xc0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x3f, 0xdf, 0x80, 0x00, 
-	0x37, 0xe0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00, 
-	0x3c, 0x70, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x38, 0xf0, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, 
-	0x3c, 0x70, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x31, 0x80, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x3c, 0xf9, 0xc0, 0x00, 
-	0x3c, 0x70, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x70, 0x60, 0x00, 0x00, 
-	0x70, 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x38, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x70, 0xc0, 0x00, 
-	0x38, 0x30, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 
-	0x30, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 
-	0x30, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 
-	0x30, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3e, 0x60, 0x00, 0x00, 
-	0x30, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x33, 0x80, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x60, 0x00, 0x00, 
-	0x30, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x33, 0x80, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x60, 0xe0, 0x00, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x70, 0x60, 0x00, 0x00, 
-	0x70, 0x70, 0x00, 0x00, 0x70, 0x30, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x31, 0xc0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x71, 0xe0, 0x00, 0x00, 
-	0x3c, 0x70, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x38, 0xf0, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0xe0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, 
-	0x3f, 0xe0, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x1f, 0xf0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1e, 0x30, 0x00, 0x00, 
-	0x33, 0xc0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x0f, 0x30, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x0f, 0x30, 0x00, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x70, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x0f, 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, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x60, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-	0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-	0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x37, 0xc0, 0x00, 0x00, 0x0f, 0x30, 0x00, 0x00, 
-	0x37, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 
-	0xfe, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0xc0, 0x60, 0x00, 0x00, 0xc0, 0x81, 0x80, 0x00, 
-	0xe0, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 
-	0x3f, 0xe0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 
-	0x3f, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0xfe, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0xc0, 0x60, 0x00, 0x00, 0xc1, 0xc1, 0x80, 0x00, 
-	0x60, 0xc0, 0x00, 0x00, 0x60, 0xe0, 0x00, 0x00, 
-	0x3f, 0xe0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x3c, 0x70, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0xe0, 0xe0, 0x00, 0x00, 0xe1, 0xc1, 0x80, 0x00, 
-	0x31, 0xc0, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00, 
-	0x01, 0xe0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x60, 0xc0, 0x00, 0x00, 0x63, 0xe3, 0x00, 0x00, 
-	0x3b, 0x80, 0x00, 0x00, 0x30, 0xc0, 0x00, 0x00, 
-	0x01, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x3e, 0x08, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x30, 0x18, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x71, 0xc0, 0x00, 0x00, 0x63, 0x63, 0x00, 0x00, 
-	0x1f, 0x00, 0x00, 0x00, 0x31, 0xc0, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x7f, 0x98, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x30, 0x18, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x31, 0x80, 0x00, 0x00, 0x67, 0x63, 0x00, 0x00, 
-	0x0f, 0x00, 0x00, 0x00, 0x39, 0xc0, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x67, 0xf8, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x30, 0x18, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x31, 0x80, 0x00, 0x00, 0x37, 0x76, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x41, 0xf0, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x30, 0x18, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x3b, 0x80, 0x00, 0x00, 0x36, 0x36, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x30, 0x18, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x1b, 0x00, 0x00, 0x00, 0x3e, 0x3e, 0x00, 0x00, 
-	0x1f, 0x00, 0x00, 0x00, 0x1d, 0x80, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x70, 0x00, 0x00, 
-	0x1f, 0x00, 0x00, 0x00, 0x1e, 0x3c, 0x00, 0x00, 
-	0x3b, 0x80, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x3c, 0x70, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 
-	0x31, 0x80, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x37, 0xe0, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x3e, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 
-	0x60, 0xc0, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 
-	0x7f, 0xe0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x33, 0xc0, 0x00, 0x00, 0x0f, 0x30, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 
-	0x1e, 0x00, 0x00, 0x00, 0x0f, 0x30, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x00, 0x00, 
-	0xe0, 0xe0, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x7f, 0xe0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 
-	0x00, 0x00, 0x00, 0x21, 0x16, 0x16, 0x16, 0x16, 
-	0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 
-	0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 
-	0x16, 0x16, 0x16, 0x16, 0x0a, 0x12, 0x13, 0x10, 
-	0x17, 0x10, 0x15, 0x10, 0x08, 0x09, 0x0a, 0x10, 
-	0x10, 0x1a, 0x13, 0x06, 0x0a, 0x0a, 0x0b, 0x11, 
-	0x08, 0x0a, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 
-	0x11, 0x11, 0x11, 0x10, 0x1d, 0x13, 0x13, 0x15, 
-	0x15, 0x13, 0x12, 0x17, 0x15, 0x07, 0x0f, 0x13, 
-	0x10, 0x17, 0x15, 0x17, 0x13, 0x17, 0x15, 0x13, 
-	0x13, 0x15, 0x13, 0x1e, 0x13, 0x13, 0x12, 0x08, 
-	0x08, 0x08, 0x0e, 0x10, 0x0a, 0x10, 0x10, 0x0f, 
-	0x10, 0x10, 0x08, 0x10, 0x10, 0x07, 0x07, 0x0e, 
-	0x07, 0x19, 0x10, 0x10, 0x10, 0x10, 0x0a, 0x0f, 
-	0x08, 0x10, 0x0d, 0x15, 0x0d, 0x0d, 0x0e, 0x0a, 
-	0x08, 0x0a, 0x11, 0x16, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0xc7, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x8e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0xc7, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x8e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0xc7, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x8e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0xf8, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x07, 0xff, 0x80, 0x00, 
-	0x0e, 0x38, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1e, 0x1c, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 
-	0x0e, 0x38, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3c, 0x0c, 0x00, 0x00, 0x03, 0xb8, 0x00, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x1f, 0x83, 0xf0, 0x00, 
-	0x0e, 0x38, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x07, 0xbc, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0xf8, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 
-	0x0f, 0xf0, 0x00, 0x00, 0x78, 0x00, 0x3c, 0x00, 
-	0x07, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x0f, 0x1e, 0x00, 0x00, 
-	0x1f, 0xf8, 0x00, 0x00, 0x78, 0x00, 0x3c, 0x00, 
-	0x1f, 0xf8, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x70, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, 
-	0x3c, 0x7c, 0x00, 0x00, 0x70, 0x00, 0x1c, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x70, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x70, 0x00, 0x1c, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x70, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x70, 0x00, 0x1c, 0x00, 
-	0x78, 0x1e, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x78, 0x00, 0x00, 0x1c, 0x07, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x70, 0x00, 0x1c, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x7f, 0x80, 0x00, 0x00, 
-	0x38, 0x3e, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 
-	0x00, 0xfc, 0x00, 0x00, 0x70, 0x00, 0x1c, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x7f, 0x80, 0x00, 0x00, 
-	0x38, 0x1f, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, 
-	0x1f, 0xfc, 0x00, 0x00, 0x78, 0x00, 0x3c, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x7f, 0x80, 0x00, 0x00, 
-	0x38, 0x07, 0x80, 0x00, 0x3f, 0xff, 0x80, 0x00, 
-	0x3f, 0x9c, 0x00, 0x00, 0x78, 0x00, 0x3c, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 
-	0x78, 0x1c, 0x00, 0x00, 0x3c, 0x00, 0x78, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x3c, 0x01, 0xe0, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x78, 0x03, 0xc0, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x1e, 0x00, 0xf8, 0x00, 
-	0x78, 0x1e, 0x00, 0x00, 0x3c, 0x01, 0xe0, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x39, 0xc3, 0x80, 0x00, 0x70, 0x01, 0xc0, 0x00, 
-	0x70, 0x3c, 0x00, 0x00, 0x1f, 0x83, 0xf0, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x1f, 0x07, 0xc0, 0x00, 
-	0x38, 0x3c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x39, 0xe7, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, 
-	0x78, 0x7c, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x0f, 0xff, 0x80, 0x00, 
-	0x3c, 0x7c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0xff, 0x00, 0x00, 0xe0, 0x01, 0xe0, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x03, 0xff, 0xc0, 0x00, 
-	0x1f, 0xf8, 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, 
-	0x1f, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x7c, 0x00, 0x00, 0xe0, 0x00, 0xe0, 0x00, 
-	0x1f, 0x8e, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 
-	0x07, 0xe0, 0x00, 0x00, 0x03, 0xfe, 0x00, 0x00, 
-	0x0f, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 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, 
-	0x1c, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00, 
-	0x07, 0x1c, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 
-	0x0f, 0x80, 0x60, 0x00, 0x03, 0xe0, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 
-	0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00, 
-	0x07, 0x1c, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 
-	0x1f, 0xc0, 0xe0, 0x00, 0x07, 0xf0, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00, 
-	0x0f, 0x3c, 0x00, 0x00, 0x3d, 0xb8, 0x00, 0x00, 
-	0x38, 0xe0, 0xc0, 0x00, 0x0f, 0x78, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x76, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00, 
-	0x0e, 0x38, 0x00, 0x00, 0x79, 0xbc, 0x00, 0x00, 
-	0x30, 0x61, 0xc0, 0x00, 0x0e, 0x38, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00, 
-	0x0e, 0x38, 0x00, 0x00, 0x71, 0x9c, 0x00, 0x00, 
-	0x30, 0x61, 0x80, 0x00, 0x0e, 0x38, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00, 
-	0xff, 0xfe, 0x00, 0x00, 0x71, 0x80, 0x00, 0x00, 
-	0x30, 0x63, 0x80, 0x00, 0x0e, 0x38, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00, 
-	0xff, 0xfe, 0x00, 0x00, 0x79, 0x80, 0x00, 0x00, 
-	0x30, 0x63, 0x00, 0x00, 0x0f, 0x78, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xff, 0xfe, 0x00, 0x00, 0x7d, 0x80, 0x00, 0x00, 
-	0x30, 0x67, 0x00, 0x00, 0x07, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x39, 0xc0, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1e, 0x78, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 
-	0x38, 0xe6, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 
-	0x1f, 0xce, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 
-	0x0f, 0x8c, 0x7c, 0x00, 0x1f, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x7f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 
-	0x00, 0x1c, 0xfe, 0x00, 0x3e, 0xe2, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x7f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3c, 0xf0, 0x00, 0x00, 0x01, 0xbe, 0x00, 0x00, 
-	0x00, 0x19, 0xc7, 0x00, 0x38, 0x73, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xff, 0xfe, 0x00, 0x00, 0x01, 0x9e, 0x00, 0x00, 
-	0x00, 0x39, 0x83, 0x00, 0x78, 0x3f, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xff, 0xfe, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 
-	0x00, 0x31, 0x83, 0x00, 0x70, 0x3f, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xff, 0xfe, 0x00, 0x00, 0x71, 0x8e, 0x00, 0x00, 
-	0x00, 0x71, 0x83, 0x00, 0x70, 0x1f, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0xe0, 0x00, 0x00, 0x71, 0x8e, 0x00, 0x00, 
-	0x00, 0x61, 0x83, 0x00, 0x70, 0x0f, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0xe0, 0x00, 0x00, 0x79, 0x9e, 0x00, 0x00, 
-	0x00, 0xe1, 0x83, 0x00, 0x78, 0x1f, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x79, 0xe0, 0x00, 0x00, 0x3d, 0xbc, 0x00, 0x00, 
-	0x00, 0xc1, 0xc7, 0x00, 0x3c, 0x7f, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x71, 0xc0, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 
-	0x01, 0xc0, 0xfe, 0x00, 0x1f, 0xfb, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x71, 0xc0, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 
-	0x01, 0x80, 0x7c, 0x00, 0x0f, 0xe1, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 
-	0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 
-	0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 
-	0x00, 0x60, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 
-	0x0f, 0xe0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x1f, 0xfc, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 
-	0x3f, 0xfe, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 
-	0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0xf0, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, 
-	0x1f, 0xf0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x1f, 0xfc, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 
-	0x3f, 0xfe, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 
-	0x1f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xf8, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 
-	0x01, 0xe0, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 
-	0x3f, 0xfe, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, 
-	0x03, 0xe0, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00, 
-	0x7c, 0x7c, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x3e, 0x3e, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x1e, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x0f, 0xe0, 0x00, 0x00, 0x78, 0x3c, 0x00, 0x00, 
-	0x70, 0x3c, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x78, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x78, 0x0e, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, 
-	0x1e, 0xe0, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x1c, 0xe0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x03, 0xb8, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x00, 0x78, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 
-	0x7f, 0xfe, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x10, 0xe0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x3c, 0x00, 0x00, 0x07, 0x38, 0x00, 0x00, 
-	0x7b, 0xe0, 0x00, 0x00, 0x73, 0xf0, 0x00, 0x00, 
-	0x00, 0x70, 0x00, 0x00, 0x1c, 0x38, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 
-	0x7f, 0xfe, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, 
-	0x00, 0x1e, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 
-	0x00, 0x78, 0x00, 0x00, 0x0f, 0x38, 0x00, 0x00, 
-	0x7f, 0xf8, 0x00, 0x00, 0x77, 0xf8, 0x00, 0x00, 
-	0x00, 0xf0, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 
-	0x7f, 0xfe, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 
-	0x00, 0x3c, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x03, 0xf0, 0x00, 0x00, 0x0e, 0x38, 0x00, 0x00, 
-	0x7f, 0xfc, 0x00, 0x00, 0x7f, 0xfc, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 
-	0x78, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 
-	0x00, 0x78, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x03, 0xf8, 0x00, 0x00, 0x1c, 0x38, 0x00, 0x00, 
-	0x78, 0x3c, 0x00, 0x00, 0x7c, 0x3e, 0x00, 0x00, 
-	0x01, 0xe0, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 
-	0x3c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 
-	0x00, 0xf0, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 
-	0x00, 0x3c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 
-	0x00, 0x1e, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, 
-	0x01, 0xc0, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, 
-	0x3f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 
-	0x01, 0xe0, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 
-	0x00, 0x1e, 0x00, 0x00, 0x78, 0x38, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x01, 0xc0, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, 
-	0x1f, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 
-	0x7f, 0xfe, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 
-	0x03, 0xc0, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x03, 0xc0, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x0f, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 
-	0x7f, 0xfe, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 
-	0x7f, 0xfe, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x78, 0x0e, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x78, 0x1e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x78, 0x1e, 0x00, 0x00, 0x38, 0x1e, 0x00, 0x00, 
-	0x07, 0x80, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, 
-	0x07, 0x80, 0x00, 0x00, 0x7c, 0x3e, 0x00, 0x00, 
-	0x78, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x7f, 0xfc, 0x00, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x7f, 0xfc, 0x00, 0x00, 
-	0x1f, 0xf8, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x1f, 0xf8, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 
-	0x1f, 0xf0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x7f, 0xfc, 0x00, 0x00, 
-	0x07, 0xe0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x07, 0xe0, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 
-	0x0f, 0xc0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 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, 
-	0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 
-	0x01, 0xf0, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 
-	0x01, 0xfe, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x3f, 0xff, 0x80, 0x00, 0x3f, 0xff, 0x80, 0x00, 
-	0x00, 0xff, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x38, 0x01, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x7c, 0x00, 0x7c, 0x00, 0x3c, 0x00, 0xe0, 0x00, 
-	0x01, 0xff, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 
-	0x03, 0xf8, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00, 
-	0x07, 0xff, 0x80, 0x00, 0x3f, 0xff, 0x00, 0x00, 
-	0x3f, 0xff, 0x80, 0x00, 0x3f, 0xff, 0x80, 0x00, 
-	0x07, 0xff, 0xc0, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x38, 0x03, 0xc0, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x7c, 0x00, 0x7c, 0x00, 0x3c, 0x00, 0xe0, 0x00, 
-	0x07, 0xff, 0x80, 0x00, 0x01, 0xff, 0xff, 0x00, 
-	0x03, 0xf8, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x3f, 0xff, 0xc0, 0x00, 
-	0x3f, 0xff, 0x80, 0x00, 0x3f, 0xff, 0x80, 0x00, 
-	0x0f, 0xff, 0xe0, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x38, 0x07, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x7e, 0x00, 0xfc, 0x00, 0x3e, 0x00, 0xe0, 0x00, 
-	0x0f, 0xff, 0xe0, 0x00, 0x03, 0xf8, 0x3f, 0x80, 
-	0x03, 0xb8, 0x00, 0x00, 0x38, 0x0f, 0x80, 0x00, 
-	0x1f, 0x83, 0xe0, 0x00, 0x38, 0x07, 0xc0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x1f, 0x83, 0xf0, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x38, 0x0f, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x7e, 0x00, 0xfc, 0x00, 0x3f, 0x00, 0xe0, 0x00, 
-	0x1f, 0x83, 0xf0, 0x00, 0x07, 0xc0, 0x07, 0xc0, 
-	0x07, 0xbc, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 
-	0x3e, 0x01, 0xe0, 0x00, 0x38, 0x01, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3e, 0x00, 0xf0, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x38, 0x1e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x7f, 0x01, 0xfc, 0x00, 0x3f, 0x00, 0xe0, 0x00, 
-	0x3e, 0x00, 0xf8, 0x00, 0x07, 0x80, 0x03, 0xe0, 
-	0x07, 0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 
-	0x3c, 0x00, 0xf0, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3c, 0x00, 0x78, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x38, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x77, 0x01, 0xdc, 0x00, 0x3b, 0x80, 0xe0, 0x00, 
-	0x3c, 0x00, 0x78, 0x00, 0x0f, 0x0f, 0x1d, 0xe0, 
-	0x07, 0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 
-	0x78, 0x00, 0x70, 0x00, 0x38, 0x00, 0xf0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x30, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x38, 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x77, 0x01, 0xdc, 0x00, 0x3b, 0xc0, 0xe0, 0x00, 
-	0x78, 0x00, 0x3c, 0x00, 0x1e, 0x3f, 0xbc, 0xf0, 
-	0x0f, 0x1e, 0x00, 0x00, 0x38, 0x0f, 0x00, 0x00, 
-	0x78, 0x00, 0x00, 0x00, 0x38, 0x00, 0x70, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x78, 0x00, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x38, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x77, 0x83, 0xdc, 0x00, 0x39, 0xc0, 0xe0, 0x00, 
-	0x78, 0x00, 0x3c, 0x00, 0x1e, 0x7f, 0xfc, 0xf0, 
-	0x0e, 0x0e, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x70, 0x00, 
-	0x3f, 0xff, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x39, 0xe0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x73, 0x83, 0x9c, 0x00, 0x38, 0xe0, 0xe0, 0x00, 
-	0x70, 0x00, 0x1c, 0x00, 0x1c, 0xf9, 0xf8, 0x70, 
-	0x0e, 0x0e, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x70, 0x00, 
-	0x3f, 0xff, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x3b, 0xe0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x73, 0x83, 0x9c, 0x00, 0x38, 0xe0, 0xe0, 0x00, 
-	0x70, 0x00, 0x1c, 0x00, 0x3c, 0xf0, 0xf8, 0x70, 
-	0x1e, 0x0f, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x70, 0x00, 
-	0x3f, 0xff, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x70, 0x0f, 0xf8, 0x00, 0x3f, 0xff, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x73, 0xc7, 0x9c, 0x00, 0x38, 0x70, 0xe0, 0x00, 
-	0x70, 0x00, 0x1c, 0x00, 0x39, 0xe0, 0x78, 0x70, 
-	0x1c, 0x07, 0x00, 0x00, 0x38, 0x07, 0x80, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x70, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0x0f, 0xf8, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x71, 0xc7, 0x1c, 0x00, 0x38, 0x38, 0xe0, 0x00, 
-	0x70, 0x00, 0x1c, 0x00, 0x39, 0xe0, 0x78, 0x70, 
-	0x1f, 0xff, 0x00, 0x00, 0x38, 0x03, 0xc0, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x70, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0x0f, 0xf8, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x3e, 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x71, 0xc7, 0x1c, 0x00, 0x38, 0x38, 0xe0, 0x00, 
-	0x70, 0x00, 0x1c, 0x00, 0x39, 0xc0, 0x70, 0x70, 
-	0x3f, 0xff, 0x80, 0x00, 0x38, 0x01, 0xc0, 0x00, 
-	0x78, 0x00, 0x60, 0x00, 0x38, 0x00, 0xf0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x78, 0x00, 0x38, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x71, 0xef, 0x1c, 0x00, 0x38, 0x1c, 0xe0, 0x00, 
-	0x78, 0x00, 0x3c, 0x00, 0x39, 0xc0, 0xf0, 0xf0, 
-	0x3f, 0xff, 0x80, 0x00, 0x38, 0x01, 0xc0, 0x00, 
-	0x78, 0x00, 0xf0, 0x00, 0x38, 0x00, 0xf0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x78, 0x00, 0x38, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x70, 0x38, 0x00, 0x00, 
-	0x38, 0x3e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0xee, 0x1c, 0x00, 0x38, 0x1e, 0xe0, 0x00, 
-	0x78, 0x00, 0x3c, 0x00, 0x39, 0xc0, 0xf0, 0xe0, 
-	0x38, 0x03, 0x80, 0x00, 0x38, 0x01, 0xc0, 0x00, 
-	0x3c, 0x00, 0xf0, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3c, 0x00, 0x38, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x70, 0x38, 0x00, 0x00, 
-	0x38, 0x1e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0xee, 0x1c, 0x00, 0x38, 0x0e, 0xe0, 0x00, 
-	0x3c, 0x00, 0x78, 0x00, 0x39, 0xe1, 0xe1, 0xc0, 
-	0x78, 0x03, 0xc0, 0x00, 0x38, 0x03, 0xc0, 0x00, 
-	0x3e, 0x01, 0xe0, 0x00, 0x38, 0x01, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3e, 0x00, 0x78, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x78, 0x78, 0x00, 0x00, 
-	0x38, 0x0f, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0xfe, 0x1c, 0x00, 0x38, 0x07, 0xe0, 0x00, 
-	0x1e, 0x00, 0xf8, 0x00, 0x3d, 0xe3, 0xe3, 0xc0, 
-	0x70, 0x01, 0xc0, 0x00, 0x38, 0x07, 0xc0, 0x00, 
-	0x1f, 0x87, 0xe0, 0x00, 0x38, 0x07, 0xc0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x1f, 0x81, 0xf8, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x7c, 0xf8, 0x00, 0x00, 
-	0x38, 0x07, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0x7c, 0x1c, 0x00, 0x38, 0x07, 0xe0, 0x00, 
-	0x1f, 0x83, 0xf0, 0x00, 0x3c, 0xff, 0xe7, 0x80, 
-	0x70, 0x01, 0xc0, 0x00, 0x3f, 0xff, 0x80, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x3f, 0xff, 0x80, 0x00, 
-	0x3f, 0xff, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x0f, 0xff, 0xf0, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 
-	0x38, 0x07, 0x80, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x70, 0x7c, 0x1c, 0x00, 0x38, 0x03, 0xe0, 0x00, 
-	0x0f, 0xff, 0xe0, 0x00, 0x1e, 0xfe, 0xff, 0x00, 
-	0xe0, 0x01, 0xe0, 0x00, 0x3f, 0xff, 0x00, 0x00, 
-	0x07, 0xff, 0x80, 0x00, 0x3f, 0xff, 0x00, 0x00, 
-	0x3f, 0xff, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x03, 0xff, 0xe0, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 
-	0x38, 0x03, 0xc0, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x70, 0x7c, 0x1c, 0x00, 0x38, 0x01, 0xe0, 0x00, 
-	0x03, 0xff, 0xc0, 0x00, 0x1e, 0x3c, 0x7c, 0x78, 
-	0xe0, 0x00, 0xe0, 0x00, 0x3f, 0xfc, 0x00, 0x00, 
-	0x01, 0xfe, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 
-	0x3f, 0xff, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0xff, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 
-	0x38, 0x01, 0xe0, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x70, 0x38, 0x1c, 0x00, 0x38, 0x01, 0xe0, 0x00, 
-	0x00, 0xfe, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xf0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x01, 0xf0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x0f, 0xe0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 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, 0xff, 0xff, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x01, 0xff, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00, 
-	0x03, 0xf8, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0xe0, 0x00, 
-	0xe0, 0x0f, 0x80, 0x38, 0x78, 0x03, 0xc0, 0x00, 
-	0xf0, 0x01, 0xe0, 0x00, 0x7f, 0xff, 0x00, 0x00, 
-	0x3f, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 
-	0xfc, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00, 
-	0x07, 0xff, 0xc0, 0x00, 0x3f, 0xff, 0x80, 0x00, 
-	0x0f, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0xf0, 0x01, 0xe0, 0x00, 
-	0xf0, 0x0f, 0x80, 0x78, 0x3c, 0x07, 0x80, 0x00, 
-	0x70, 0x03, 0xc0, 0x00, 0x7f, 0xff, 0x00, 0x00, 
-	0x3f, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 
-	0xfc, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, 
-	0x0f, 0xff, 0xe0, 0x00, 0x3f, 0xff, 0xc0, 0x00, 
-	0x1f, 0xff, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x70, 0x01, 0xc0, 0x00, 
-	0xf0, 0x1f, 0xc0, 0x78, 0x1c, 0x07, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x7f, 0xff, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x07, 0xc0, 0x00, 
-	0x1f, 0x83, 0xf0, 0x00, 0x38, 0x03, 0xe0, 0x00, 
-	0x3e, 0x0f, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x70, 0x01, 0xc0, 0x00, 
-	0x70, 0x1f, 0xc0, 0x70, 0x1e, 0x0f, 0x00, 0x00, 
-	0x3c, 0x07, 0x80, 0x00, 0x00, 0x0f, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0xc0, 0x00, 
-	0x1e, 0x00, 0xf8, 0x00, 0x38, 0x01, 0xe0, 0x00, 
-	0x3c, 0x07, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x78, 0x03, 0xc0, 0x00, 
-	0x70, 0x1d, 0xc0, 0x70, 0x0f, 0x1e, 0x00, 0x00, 
-	0x1e, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x01, 0xc0, 0x00, 
-	0x3c, 0x00, 0x78, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x38, 0x03, 0x80, 0x00, 
-	0x78, 0x1d, 0xc0, 0xf0, 0x07, 0xbc, 0x00, 0x00, 
-	0x0e, 0x0e, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x1c, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x01, 0xc0, 0x00, 
-	0x38, 0x00, 0x3c, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x38, 0x07, 0x80, 0x00, 
-	0x78, 0x3d, 0xe0, 0xf0, 0x07, 0xbc, 0x00, 0x00, 
-	0x0f, 0x1e, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x1c, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x01, 0xc0, 0x00, 
-	0x78, 0x00, 0x3c, 0x00, 0x38, 0x01, 0xe0, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x3c, 0x07, 0x80, 0x00, 
-	0x38, 0x38, 0xe0, 0xe0, 0x03, 0xf8, 0x00, 0x00, 
-	0x07, 0x1c, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x38, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0xc0, 0x00, 
-	0x70, 0x00, 0x1c, 0x00, 0x38, 0x03, 0xe0, 0x00, 
-	0x1f, 0x80, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x1c, 0x07, 0x00, 0x00, 
-	0x38, 0x38, 0xe0, 0xe0, 0x01, 0xf0, 0x00, 0x00, 
-	0x07, 0xbc, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x38, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x07, 0xc0, 0x00, 
-	0x70, 0x00, 0x1c, 0x00, 0x3f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xf8, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x1e, 0x0f, 0x00, 0x00, 
-	0x3c, 0x38, 0xe1, 0xe0, 0x00, 0xe0, 0x00, 0x00, 
-	0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x78, 0x78, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, 
-	0x70, 0x00, 0x1c, 0x00, 0x3f, 0xff, 0x80, 0x00, 
-	0x03, 0xfe, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x1e, 0x0f, 0x00, 0x00, 
-	0x3c, 0x78, 0xf1, 0xe0, 0x01, 0xf0, 0x00, 0x00, 
-	0x01, 0xf0, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x70, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00, 
-	0x70, 0x00, 0x1c, 0x00, 0x3f, 0xff, 0x00, 0x00, 
-	0x00, 0x7f, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x0e, 0x0e, 0x00, 0x00, 
-	0x1c, 0x70, 0x71, 0xc0, 0x01, 0xf0, 0x00, 0x00, 
-	0x01, 0xf0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x70, 0x00, 0x1c, 0x00, 0x38, 0x3c, 0x00, 0x00, 
-	0x00, 0x07, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x0f, 0x1e, 0x00, 0x00, 
-	0x1c, 0x70, 0x71, 0xc0, 0x03, 0xb8, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x78, 0x00, 0x3c, 0x00, 0x38, 0x1e, 0x00, 0x00, 
-	0x00, 0x03, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x07, 0x1c, 0x00, 0x00, 
-	0x1e, 0x70, 0x73, 0xc0, 0x07, 0xbc, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x78, 0x08, 0x38, 0x00, 0x38, 0x0f, 0x00, 0x00, 
-	0x70, 0x03, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x07, 0x1c, 0x00, 0x00, 
-	0x1e, 0xf0, 0x7b, 0xc0, 0x0f, 0x1e, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3c, 0x0e, 0x78, 0x00, 0x38, 0x07, 0x80, 0x00, 
-	0x78, 0x03, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x3c, 0x01, 0xe0, 0x00, 0x07, 0xbc, 0x00, 0x00, 
-	0x0e, 0xe0, 0x3b, 0x80, 0x0f, 0x1e, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x1e, 0x0f, 0xf0, 0x00, 0x38, 0x03, 0x80, 0x00, 
-	0x78, 0x07, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x3c, 0x01, 0xe0, 0x00, 0x03, 0xb8, 0x00, 0x00, 
-	0x0e, 0xe0, 0x3b, 0x80, 0x1e, 0x0f, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x1f, 0x83, 0xe0, 0x00, 0x38, 0x03, 0xc0, 0x00, 
-	0x3e, 0x0f, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x1f, 0x07, 0xc0, 0x00, 0x03, 0xf8, 0x00, 0x00, 
-	0x0f, 0xe0, 0x3f, 0x80, 0x3c, 0x07, 0x80, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x0f, 0xff, 0xf0, 0x00, 0x38, 0x01, 0xe0, 0x00, 
-	0x1f, 0xff, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x0f, 0xff, 0x80, 0x00, 0x03, 0xf8, 0x00, 0x00, 
-	0x0f, 0xe0, 0x3f, 0x80, 0x38, 0x03, 0x80, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x03, 0xff, 0xf8, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x0f, 0xfe, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x07, 0xff, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 
-	0x07, 0xc0, 0x1f, 0x00, 0x78, 0x03, 0xc0, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x01, 0xff, 0x3c, 0x00, 0x38, 0x00, 0xf0, 0x00, 
-	0x07, 0xf8, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x03, 0xfe, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 
-	0x07, 0xc0, 0x1f, 0x00, 0xf0, 0x01, 0xe0, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-	0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-	0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0xf0, 0x00, 0x00, 0x39, 0xf0, 0x00, 0x00, 
-	0x07, 0xe0, 0x00, 0x00, 0x0f, 0x9c, 0x00, 0x00, 
-	0x07, 0xe0, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 
-	0x0f, 0x9c, 0x00, 0x00, 0x39, 0xf0, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x39, 0xf0, 0xf8, 0x00, 0x39, 0xf0, 0x00, 0x00, 
-	0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xf8, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, 
-	0x1f, 0xf0, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 
-	0x1f, 0xf8, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 
-	0x1f, 0xfc, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3f, 0xfb, 0xfc, 0x00, 0x3f, 0xf8, 0x00, 0x00, 
-	0x1f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3c, 0x7c, 0x00, 0x00, 0x3e, 0x3c, 0x00, 0x00, 
-	0x3c, 0x78, 0x00, 0x00, 0x3c, 0x7c, 0x00, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3c, 0x7c, 0x00, 0x00, 0x3e, 0x3c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3e, 0x3f, 0x1e, 0x00, 0x3e, 0x3c, 0x00, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x3c, 0x1c, 0x00, 0x00, 
-	0x38, 0x3c, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x3c, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x39, 0xe0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3c, 0x1e, 0x0e, 0x00, 0x3c, 0x1c, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x38, 0x1e, 0x00, 0x00, 
-	0x78, 0x1c, 0x00, 0x00, 0x78, 0x3c, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x78, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3b, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x78, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3f, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0xfc, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, 
-	0x7f, 0xfe, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3f, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xfc, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, 
-	0x7f, 0xfe, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3f, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3f, 0x9c, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3b, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x78, 0x1c, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x39, 0xe0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x3c, 0x1e, 0x00, 0x00, 
-	0x78, 0x1c, 0x00, 0x00, 0x78, 0x3c, 0x00, 0x00, 
-	0x78, 0x0e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x78, 0x3c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x78, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x3c, 0x00, 0x00, 0x3c, 0x1c, 0x00, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00, 
-	0x38, 0x1e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x3c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x78, 0x7c, 0x00, 0x00, 0x3e, 0x3c, 0x00, 0x00, 
-	0x3c, 0x78, 0x00, 0x00, 0x3c, 0x7c, 0x00, 0x00, 
-	0x3e, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3c, 0x7c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, 
-	0x1f, 0xf0, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 
-	0x1f, 0xf8, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x1f, 0xfc, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x1f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0x8e, 0x00, 0x00, 0x39, 0xf0, 0x00, 0x00, 
-	0x07, 0xe0, 0x00, 0x00, 0x0f, 0x9c, 0x00, 0x00, 
-	0x07, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x0f, 0x9c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x78, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x7c, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x39, 0xf0, 0x00, 0x00, 
-	0x0f, 0x9c, 0x00, 0x00, 0x3b, 0xc0, 0x00, 0x00, 
-	0x1f, 0xe0, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0xe0, 0x38, 0x00, 0x01, 
-	0xe0, 0x70, 0x3c, 0x00, 0xe0, 0x38, 0x00, 0x00, 
-	0xe0, 0x38, 0x00, 0x00, 0x7f, 0xf8, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x3f, 0xf8, 0x00, 0x00, 
-	0x1f, 0xfc, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0xf0, 0x78, 0x00, 0x00, 
-	0xe0, 0x70, 0x38, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0xf0, 0x78, 0x00, 0x00, 0x7f, 0xf8, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x3e, 0x3c, 0x00, 0x00, 
-	0x3c, 0x7c, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 
-	0x78, 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0xe0, 0xf8, 0x38, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x70, 0x70, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x1f, 0x01, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x3c, 0x1c, 0x00, 0x00, 
-	0x38, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x70, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0xe0, 0xf8, 0x38, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x70, 0x70, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x7f, 0xe3, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x38, 0x1e, 0x00, 0x00, 
-	0x78, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x70, 0xd8, 0x70, 0x00, 0x1d, 0xc0, 0x00, 0x00, 
-	0x78, 0xf0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x38, 0x0e, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x7c, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x71, 0xdc, 0x70, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x38, 0xe0, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 
-	0x1e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1e, 0x00, 0x00, 0x00, 0x61, 0xff, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x38, 0x0e, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3f, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x71, 0x8c, 0x70, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x38, 0xe0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x0f, 0x00, 0x00, 0x00, 0x40, 0x7c, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x38, 0x0e, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x1f, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x31, 0x8c, 0x60, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x39, 0xe0, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x78, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x38, 0x0e, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x03, 0xf8, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x1d, 0xc0, 0x00, 0x00, 
-	0x33, 0x8e, 0xe0, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x1d, 0xc0, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x78, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x38, 0x0e, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x1d, 0xc0, 0x00, 0x00, 
-	0x3b, 0x06, 0xe0, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x1d, 0xc0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x3c, 0x1e, 0x00, 0x00, 
-	0x78, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x0d, 0x80, 0x00, 0x00, 
-	0x1b, 0x06, 0xe0, 0x00, 0x1d, 0xc0, 0x00, 0x00, 
-	0x1f, 0xc0, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x1e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x3c, 0x1c, 0x00, 0x00, 
-	0x38, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x78, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x3c, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x1f, 0x07, 0xc0, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x3e, 0x3c, 0x00, 0x00, 
-	0x3c, 0x7c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3c, 0x7c, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x1e, 0x07, 0xc0, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x3f, 0xf8, 0x00, 0x00, 
-	0x1f, 0xfc, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x1f, 0xf8, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 
-	0x1f, 0xfc, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x1e, 0x03, 0xc0, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x39, 0xe0, 0x00, 0x00, 
-	0x07, 0x9c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x0f, 0xe0, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 
-	0x0f, 0x9c, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x0e, 0x03, 0x80, 0x00, 0xe0, 0x38, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x27, 
-	0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 
-	0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 
-	0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 
-	0x0b, 0x15, 0x17, 0x13, 0x1a, 0x13, 0x19, 0x13, 
-	0x09, 0x0b, 0x0c, 0x13, 0x13, 0x1e, 0x17, 0x06, 
-	0x0b, 0x0b, 0x0d, 0x14, 0x09, 0x0b, 0x09, 0x09, 
-	0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 
-	0x13, 0x13, 0x09, 0x09, 0x14, 0x14, 0x14, 0x13, 
-	0x23, 0x17, 0x17, 0x19, 0x19, 0x17, 0x15, 0x1a, 
-	0x19, 0x09, 0x11, 0x17, 0x13, 0x1d, 0x19, 0x1a, 
-	0x17, 0x1a, 0x19, 0x17, 0x15, 0x19, 0x17, 0x22, 
-	0x17, 0x15, 0x15, 0x09, 0x09, 0x09, 0x11, 0x13, 
-	0x0b, 0x12, 0x12, 0x11, 0x12, 0x12, 0x0a, 0x12, 
-	0x13, 0x07, 0x07, 0x11, 0x07, 0x1b, 0x13, 0x12, 
-	0x12, 0x12, 0x0b, 0x11, 0x09, 0x13, 0x11, 0x17, 
-	0x10, 0x11, 0x10, 0x0b, 0x09, 0x0b, 0x14, 0x1a, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 
-	0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 
-	0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 
-	0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 
-	0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 
-	0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 
-	0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 
-	0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 
-	0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 
-	0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 
-	0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 
-	0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 
-	0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 
-	0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 
-	0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 
-	0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 
-	0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 
-	0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 
-	0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x01, 0xc7, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe3, 
-	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, 0x01, 0xc7, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe3, 
-	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, 0x01, 0xc7, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe3, 
-	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, 0x01, 0xf8, 0x00, 
-	0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfe, 0x00, 
-	0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 
-	0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x07, 
-	0x1c, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf0, 0x00, 
-	0x00, 0x07, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0x00, 
-	0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 
-	0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 
-	0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 
-	0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 
-	0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x1f, 0x00, 
-	0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x07, 
-	0x1c, 0x00, 0x00, 0x00, 0x07, 0xe1, 0xf8, 0x00, 
-	0x00, 0x07, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x07, 0x00, 
-	0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x07, 
-	0x1c, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x7c, 0x00, 
-	0x00, 0x07, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x07, 0x00, 
-	0x00, 0x00, 0x01, 0xef, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x07, 0x00, 
-	0x00, 0x00, 0x01, 0xc7, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x07, 0x00, 
-	0x00, 0x00, 0x03, 0xc7, 0x80, 0x00, 0x00, 0x0f, 
-	0xf8, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00, 
-	0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0e, 0x00, 
-	0x00, 0x00, 0x03, 0xc7, 0x80, 0x00, 0x00, 0x1f, 
-	0xfe, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0f, 0x00, 
-	0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0e, 0x00, 
-	0x00, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x3f, 
-	0xff, 0x00, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 
-	0x00, 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00, 
-	0x00, 0x00, 0x07, 0x83, 0xc0, 0x00, 0x00, 0x78, 
-	0x1f, 0x00, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 
-	0x00, 0x3e, 0x1f, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00, 
-	0x00, 0x00, 0x07, 0x01, 0xc0, 0x00, 0x00, 0x70, 
-	0x07, 0x00, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 
-	0x00, 0x3c, 0x0f, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00, 
-	0x00, 0x00, 0x0f, 0x01, 0xe0, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 
-	0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1f, 0x00, 
-	0x00, 0x00, 0x0f, 0x01, 0xe0, 0x00, 0x00, 0x00, 
-	0x3f, 0x00, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 
-	0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0f, 0x80, 
-	0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x00, 0x07, 
-	0xff, 0x00, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 
-	0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x7f, 0xc0, 0x00, 0x00, 0x00, 0x1c, 0x07, 0xc0, 
-	0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x1f, 
-	0xff, 0x00, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 
-	0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x7f, 0xc0, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xe0, 
-	0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x3f, 
-	0xf7, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0f, 0x00, 
-	0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x7f, 0xc0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0xf0, 
-	0x00, 0x00, 0x1c, 0x00, 0x70, 0x00, 0x00, 0x7c, 
-	0x07, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00, 
-	0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x70, 
-	0x00, 0x00, 0x3c, 0x00, 0x78, 0x00, 0x00, 0x70, 
-	0x07, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00, 
-	0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x1e, 0x00, 
-	0x3c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x20, 0x70, 
-	0x00, 0x00, 0x38, 0x00, 0x38, 0x00, 0x00, 0x70, 
-	0x0f, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00, 
-	0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x1e, 0x00, 
-	0x3c, 0x00, 0x00, 0x38, 0x07, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xf0, 0xf0, 
-	0x00, 0x00, 0x78, 0x00, 0x3c, 0x00, 0x00, 0x70, 
-	0x1f, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x7c, 0x00, 
-	0x00, 0x3c, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 
-	0x78, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xf9, 0xf0, 
-	0x00, 0x00, 0x78, 0x00, 0x3c, 0x00, 0x00, 0x7c, 
-	0x3f, 0x00, 0x00, 0x00, 0x07, 0xe1, 0xf8, 0x00, 
-	0x00, 0x3e, 0x1f, 0x00, 0x00, 0x00, 0x0f, 0xc1, 
-	0xf8, 0x00, 0x00, 0x3e, 0x1f, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x7f, 0xe0, 
-	0x00, 0x00, 0x70, 0x00, 0x1c, 0x00, 0x00, 0x3f, 
-	0xff, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf0, 0x00, 
-	0x00, 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x07, 0xff, 
-	0xf0, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x3f, 0xc0, 
-	0x00, 0x00, 0xf0, 0x00, 0x1e, 0x00, 0x00, 0x3f, 
-	0xf7, 0x80, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00, 
-	0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x03, 0xff, 
-	0xe0, 0x00, 0x00, 0x1f, 0xfb, 0x80, 0x00, 0x00, 
-	0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 
-	0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 
-	0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 
-	0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 
-	0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1f, 0x80, 
-	0x00, 0x00, 0xe0, 0x00, 0x0e, 0x00, 0x00, 0x0f, 
-	0xe3, 0x80, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 
-	0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xff, 
-	0x80, 0x00, 0x00, 0x07, 0xe3, 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, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x01, 
-	0xc3, 0x80, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 
-	0x00, 0x07, 0xc0, 0x0e, 0x00, 0x00, 0x00, 0xf8, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x01, 
-	0xc7, 0x80, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 
-	0x00, 0x1f, 0xe0, 0x1e, 0x00, 0x00, 0x01, 0xfe, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x03, 
-	0xc7, 0x80, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x00, 0x1c, 0x70, 0x1c, 0x00, 0x00, 0x03, 0xfe, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x03, 
-	0xc7, 0x00, 0x00, 0x00, 0x3e, 0xde, 0x00, 0x00, 
-	0x00, 0x3c, 0x78, 0x3c, 0x00, 0x00, 0x07, 0x8f, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x76, 0xe0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x03, 
-	0x87, 0x00, 0x00, 0x00, 0x3c, 0xcf, 0x00, 0x00, 
-	0x00, 0x38, 0x38, 0x38, 0x00, 0x00, 0x07, 0x07, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x03, 
-	0x87, 0x00, 0x00, 0x00, 0x38, 0xc7, 0x00, 0x00, 
-	0x00, 0x38, 0x38, 0x78, 0x00, 0x00, 0x07, 0x07, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x03, 
-	0x8f, 0x00, 0x00, 0x00, 0x38, 0xc0, 0x00, 0x00, 
-	0x00, 0x38, 0x38, 0x70, 0x00, 0x00, 0x07, 0x07, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x7f, 
-	0xff, 0xc0, 0x00, 0x00, 0x38, 0xc0, 0x00, 0x00, 
-	0x00, 0x38, 0x38, 0xf0, 0x00, 0x00, 0x07, 0x8f, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x1e, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 
-	0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x70, 0xc0, 0x00, 0x00, 0x00, 0x7f, 
-	0xff, 0xc0, 0x00, 0x00, 0x3c, 0xc0, 0x00, 0x00, 
-	0x00, 0x38, 0x38, 0xe0, 0x00, 0x00, 0x03, 0x9e, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x39, 0xc0, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 
-	0xff, 0xc0, 0x00, 0x00, 0x1e, 0xc0, 0x00, 0x00, 
-	0x00, 0x3c, 0x79, 0xe0, 0x00, 0x00, 0x03, 0xfc, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 
-	0x0e, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 
-	0x00, 0x1c, 0x71, 0xc0, 0x00, 0x00, 0x01, 0xf8, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 
-	0x1e, 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 
-	0x00, 0x1f, 0xe3, 0xc0, 0x00, 0x00, 0x03, 0xf0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 
-	0x1e, 0x00, 0x00, 0x00, 0x03, 0xfe, 0x00, 0x00, 
-	0x00, 0x07, 0xc3, 0x8f, 0x80, 0x00, 0x07, 0xf0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 
-	0x00, 0x00, 0x07, 0xbf, 0xc0, 0x00, 0x0f, 0x78, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, 
-	0x00, 0x00, 0x07, 0x38, 0xe0, 0x00, 0x1e, 0x3c, 
-	0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 
-	0xff, 0xc0, 0x00, 0x00, 0x00, 0xc7, 0x80, 0x00, 
-	0x00, 0x00, 0x0f, 0x78, 0xf0, 0x00, 0x3c, 0x1e, 
-	0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x7f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 
-	0xff, 0xc0, 0x00, 0x00, 0x00, 0xc3, 0x80, 0x00, 
-	0x00, 0x00, 0x0e, 0x70, 0x70, 0x00, 0x38, 0x1e, 
-	0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x7f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 
-	0xff, 0xc0, 0x00, 0x00, 0x00, 0xc3, 0x80, 0x00, 
-	0x00, 0x00, 0x1e, 0x70, 0x70, 0x00, 0x38, 0x0f, 
-	0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x7f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 
-	0x38, 0x00, 0x00, 0x00, 0x70, 0xc3, 0x80, 0x00, 
-	0x00, 0x00, 0x1c, 0x70, 0x70, 0x00, 0x38, 0x07, 
-	0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 
-	0x38, 0x00, 0x00, 0x00, 0x78, 0xc7, 0x80, 0x00, 
-	0x00, 0x00, 0x3c, 0x70, 0x70, 0x00, 0x3c, 0x03, 
-	0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 
-	0x38, 0x00, 0x00, 0x00, 0x78, 0xc7, 0x80, 0x00, 
-	0x00, 0x00, 0x38, 0x70, 0x70, 0x00, 0x3c, 0x07, 
-	0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 
-	0x78, 0x00, 0x00, 0x00, 0x3e, 0xdf, 0x00, 0x00, 
-	0x00, 0x00, 0x70, 0x78, 0xf0, 0x00, 0x1f, 0x1f, 
-	0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 
-	0x78, 0x00, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x00, 0x00, 0x70, 0x38, 0xe0, 0x00, 0x0f, 0xff, 
-	0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 
-	0x70, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 
-	0x00, 0x00, 0xe0, 0x3f, 0xc0, 0x00, 0x07, 0xfe, 
-	0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x70, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 
-	0x00, 0x00, 0xe0, 0x0f, 0x80, 0x00, 0x03, 0xf8, 
-	0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 
-	0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x07, 
-	0xf8, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x01, 0xfc, 
-	0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, 
-	0x03, 0xf8, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 
-	0x0f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x0f, 
-	0xfe, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x07, 0xff, 
-	0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, 
-	0x0f, 0xfe, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 
-	0x1f, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 
-	0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x1f, 
-	0xff, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 
-	0x00, 0x3f, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 
-	0x80, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, 
-	0x1f, 0xff, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x00, 
-	0x1f, 0x1f, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 
-	0x00, 0x00, 0x3e, 0x0f, 0x80, 0x00, 0x00, 0x3e, 
-	0x1f, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 
-	0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x0f, 
-	0x80, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 
-	0x1e, 0x0f, 0x00, 0x00, 0x00, 0x3e, 0x0f, 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, 0x1f, 0x1f, 0x00, 0x00, 0x00, 
-	0x3c, 0x07, 0x80, 0x00, 0x00, 0x03, 0xf0, 0x00, 
-	0x00, 0x00, 0x78, 0x03, 0xc0, 0x00, 0x00, 0x78, 
-	0x07, 0x80, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 
-	0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x03, 
-	0xc0, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x3c, 0x07, 0x80, 0x00, 0x00, 0x3c, 0x03, 0x80, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 
-	0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x0f, 0xf0, 0x00, 
-	0x00, 0x00, 0x70, 0x03, 0xc0, 0x00, 0x00, 0x70, 
-	0x03, 0x80, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 
-	0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x01, 
-	0xc0, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x78, 0x03, 0x80, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 
-	0x00, 0x00, 0x00, 0x3c, 0x03, 0x80, 0x00, 0x00, 
-	0x78, 0x03, 0xc0, 0x00, 0x00, 0x1f, 0x70, 0x00, 
-	0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 
-	0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 0x01, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 
-	0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x78, 0x03, 0xc0, 0x00, 0x00, 0x1e, 0x70, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x01, 0xee, 0x00, 0x00, 
-	0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 0x01, 0xc0, 
-	0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x00, 0x18, 0x70, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 
-	0x07, 0x80, 0x00, 0x00, 0x03, 0xce, 0x00, 0x00, 
-	0x00, 0x3b, 0xf8, 0x00, 0x00, 0x00, 0x78, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x3c, 0x07, 0x80, 0x00, 0x00, 0x70, 0x01, 0xc0, 
-	0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, 
-	0x00, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x07, 0xf8, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 
-	0x1f, 0x00, 0x00, 0x00, 0x03, 0xce, 0x00, 0x00, 
-	0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x71, 0xfc, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x1e, 0x0f, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 
-	0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 
-	0x00, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x01, 0xfe, 
-	0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x01, 
-	0xfe, 0x00, 0x00, 0x00, 0x07, 0x8e, 0x00, 0x00, 
-	0x00, 0x7f, 0xff, 0x00, 0x00, 0x00, 0x77, 0xfe, 
-	0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
-	0x0f, 0xfe, 0x00, 0x00, 0x00, 0x78, 0x03, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 
-	0x00, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x3f, 
-	0x80, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x01, 
-	0xfe, 0x00, 0x00, 0x00, 0x0f, 0x0e, 0x00, 0x00, 
-	0x00, 0x7c, 0x0f, 0x80, 0x00, 0x00, 0x7f, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x07, 0xfc, 0x00, 0x00, 0x00, 0x78, 0x07, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 
-	0xc0, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 
-	0xff, 0x80, 0x00, 0x00, 0x1e, 0x0e, 0x00, 0x00, 
-	0x00, 0x78, 0x03, 0x80, 0x00, 0x00, 0x7e, 0x0f, 
-	0x80, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 
-	0x1f, 0xff, 0x00, 0x00, 0x00, 0x3e, 0x0f, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 
-	0xc0, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0x80, 0x00, 0x00, 0x1e, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x7c, 0x03, 
-	0xc0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 
-	0x3e, 0x0f, 0x80, 0x00, 0x00, 0x1f, 0xff, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 
-	0xc0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0xc0, 0x00, 0x00, 0x3c, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x78, 0x03, 
-	0xc0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 
-	0x78, 0x03, 0x80, 0x00, 0x00, 0x0f, 0xfd, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0x80, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0xc0, 0x00, 0x00, 0x78, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x70, 0x01, 
-	0xc0, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 
-	0x78, 0x03, 0xc0, 0x00, 0x00, 0x07, 0xf1, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 
-	0x00, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x01, 0xfe, 
-	0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 
-	0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x70, 0x01, 
-	0xc0, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, 
-	0x00, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x07, 0xf8, 
-	0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 
-	0x78, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 
-	0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x70, 0x01, 
-	0xc0, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 
-	0x00, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x1f, 0xc0, 
-	0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 
-	0x78, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x70, 
-	0x01, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 
-	0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, 0x70, 0x01, 
-	0xc0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x03, 0x80, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x78, 
-	0x03, 0xc0, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x78, 0x03, 0xc0, 0x00, 0x00, 0x38, 0x03, 
-	0xc0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 
-	0x78, 0x03, 0xc0, 0x00, 0x00, 0x70, 0x07, 0x80, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3c, 0x07, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x78, 
-	0x07, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x3c, 0x03, 
-	0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 
-	0x78, 0x03, 0xc0, 0x00, 0x00, 0x78, 0x07, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x3e, 
-	0x0f, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x3e, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x0f, 
-	0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 
-	0x3e, 0x0f, 0x80, 0x00, 0x00, 0x3c, 0x1f, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, 0x1f, 
-	0xff, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x0f, 0xff, 
-	0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xff, 0x00, 0x00, 0x00, 0x3f, 0xfe, 0x00, 
-	0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 
-	0x0f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, 0x0f, 
-	0xfe, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x07, 0xfe, 
-	0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 
-	0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 
-	0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, 0x03, 
-	0xf8, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x03, 0xf8, 
-	0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0xf8, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, 
-	0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x07, 0xfe, 0x00, 0x00, 0x00, 0x7c, 0x00, 
-	0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00, 
-	0x7f, 0x80, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 
-	0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff, 
-	0xe0, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0x7c, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1f, 0x00, 0x07, 0xc0, 0x00, 0x1e, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 
-	0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x7c, 0x00, 
-	0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x01, 
-	0xff, 0xc0, 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 
-	0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff, 
-	0xe0, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0xf8, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1f, 0x80, 0x0f, 0xc0, 0x00, 0x1e, 0x00, 
-	0x1c, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00, 0x00, 
-	0x00, 0x7f, 0xff, 0xe0, 0x00, 0x00, 0xfe, 0x00, 
-	0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x03, 
-	0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, 
-	0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff, 
-	0xe0, 0x00, 0x00, 0x03, 0xff, 0xf8, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x01, 0xf0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1f, 0x80, 0x0f, 0xc0, 0x00, 0x1f, 0x00, 
-	0x1c, 0x00, 0x00, 0x03, 0xff, 0xf0, 0x00, 0x00, 
-	0x00, 0xfe, 0x07, 0xf0, 0x00, 0x00, 0xfe, 0x00, 
-	0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x07, 
-	0xc1, 0xf0, 0x00, 0x00, 0x1c, 0x01, 0xf8, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x07, 0xe0, 0xfc, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x03, 0xe0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1f, 0x80, 0x0f, 0xc0, 0x00, 0x1f, 0x80, 
-	0x1c, 0x00, 0x00, 0x07, 0xe1, 0xf8, 0x00, 0x00, 
-	0x01, 0xf0, 0x00, 0xf8, 0x00, 0x00, 0xee, 0x00, 
-	0x00, 0x00, 0x1c, 0x00, 0xf0, 0x00, 0x00, 0x0f, 
-	0x00, 0x78, 0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0x80, 0x1e, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x07, 0xc0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1f, 0xc0, 0x1f, 0xc0, 0x00, 0x1f, 0x80, 
-	0x1c, 0x00, 0x00, 0x0f, 0x80, 0x7c, 0x00, 0x00, 
-	0x03, 0xc0, 0x00, 0x7c, 0x00, 0x01, 0xef, 0x00, 
-	0x00, 0x00, 0x1c, 0x00, 0x70, 0x00, 0x00, 0x1e, 
-	0x00, 0x3c, 0x00, 0x00, 0x1c, 0x00, 0x3c, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0x00, 0x0e, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x0f, 0x80, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1d, 0xc0, 0x1d, 0xc0, 0x00, 0x1f, 0xc0, 
-	0x1c, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x00, 
-	0x07, 0x80, 0x00, 0x3c, 0x00, 0x01, 0xc7, 0x00, 
-	0x00, 0x00, 0x1c, 0x00, 0x70, 0x00, 0x00, 0x1c, 
-	0x00, 0x3c, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x1e, 0x00, 0x0f, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x1f, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1d, 0xc0, 0x1d, 0xc0, 0x00, 0x1d, 0xc0, 
-	0x1c, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x00, 
-	0x0f, 0x03, 0xe3, 0x9e, 0x00, 0x03, 0xc7, 0x80, 
-	0x00, 0x00, 0x1c, 0x00, 0x70, 0x00, 0x00, 0x1c, 
-	0x00, 0x18, 0x00, 0x00, 0x1c, 0x00, 0x1e, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x06, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x3e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1d, 0xe0, 0x1d, 0xc0, 0x00, 0x1c, 0xe0, 
-	0x1c, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00, 0x00, 
-	0x0f, 0x0f, 0xf7, 0x8e, 0x00, 0x03, 0xc7, 0x80, 
-	0x00, 0x00, 0x1c, 0x00, 0xf0, 0x00, 0x00, 0x3c, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1e, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x7c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0xe0, 0x39, 0xc0, 0x00, 0x1c, 0xf0, 
-	0x1c, 0x00, 0x00, 0x3c, 0x00, 0x0f, 0x00, 0x00, 
-	0x1e, 0x1f, 0xff, 0x8f, 0x00, 0x03, 0x83, 0x80, 
-	0x00, 0x00, 0x1c, 0x01, 0xe0, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0xf8, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0xe0, 0x39, 0xc0, 0x00, 0x1c, 0x70, 
-	0x1c, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 
-	0x1c, 0x3e, 0x3f, 0x0f, 0x00, 0x07, 0x83, 0xc0, 
-	0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xff, 0xfc, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1d, 
-	0xf0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0xf0, 0x39, 0xc0, 0x00, 0x1c, 0x78, 
-	0x1c, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 
-	0x1c, 0x3c, 0x1f, 0x07, 0x00, 0x07, 0x01, 0xc0, 
-	0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00, 
-	0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff, 
-	0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xff, 0xfc, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1f, 
-	0xf8, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0xf0, 0x79, 0xc0, 0x00, 0x1c, 0x3c, 
-	0x1c, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 
-	0x3c, 0x78, 0x0f, 0x07, 0x00, 0x0f, 0x01, 0xe0, 
-	0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00, 
-	0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff, 
-	0x80, 0x00, 0x00, 0x38, 0x03, 0xff, 0x00, 0x00, 
-	0x1f, 0xff, 0xfc, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1f, 
-	0xfc, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x70, 0x71, 0xc0, 0x00, 0x1c, 0x1c, 
-	0x1c, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 
-	0x38, 0x70, 0x0f, 0x07, 0x00, 0x0f, 0x01, 0xe0, 
-	0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00, 
-	0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff, 
-	0x80, 0x00, 0x00, 0x38, 0x03, 0xff, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1f, 
-	0x9c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x70, 0x71, 0xc0, 0x00, 0x1c, 0x1e, 
-	0x1c, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 
-	0x38, 0xf0, 0x0f, 0x07, 0x00, 0x0f, 0xff, 0xe0, 
-	0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x38, 0x03, 0xff, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1f, 
-	0x1e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x78, 0xf1, 0xc0, 0x00, 0x1c, 0x0f, 
-	0x1c, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 
-	0x38, 0xe0, 0x0e, 0x07, 0x00, 0x1f, 0xff, 0xf0, 
-	0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1e, 
-	0x0f, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x38, 0xe1, 0xc0, 0x00, 0x1c, 0x07, 
-	0x1c, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 
-	0x38, 0xe0, 0x0e, 0x0f, 0x00, 0x1f, 0xff, 0xf0, 
-	0x00, 0x00, 0x1c, 0x00, 0x38, 0x00, 0x00, 0x3c, 
-	0x00, 0x0c, 0x00, 0x00, 0x1c, 0x00, 0x1e, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x3c, 0x00, 0x07, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x07, 0x80, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x38, 0xe1, 0xc0, 0x00, 0x1c, 0x07, 
-	0x9c, 0x00, 0x00, 0x3c, 0x00, 0x0f, 0x00, 0x00, 
-	0x38, 0xe0, 0x1e, 0x0e, 0x00, 0x1c, 0x00, 0x70, 
-	0x00, 0x00, 0x1c, 0x00, 0x38, 0x00, 0x00, 0x1c, 
-	0x00, 0x1e, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x07, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x03, 0x80, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x3d, 0xe1, 0xc0, 0x00, 0x1c, 0x03, 
-	0x9c, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00, 0x00, 
-	0x38, 0xe0, 0x1e, 0x1e, 0x00, 0x3c, 0x00, 0x78, 
-	0x00, 0x00, 0x1c, 0x00, 0x38, 0x00, 0x00, 0x1e, 
-	0x00, 0x1e, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x1e, 0x00, 0x07, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x03, 0xc0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x1d, 0xc1, 0xc0, 0x00, 0x1c, 0x01, 
-	0xdc, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x00, 
-	0x38, 0xe0, 0x3c, 0x1c, 0x00, 0x38, 0x00, 0x38, 
-	0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x00, 0x1e, 
-	0x00, 0x3c, 0x00, 0x00, 0x1c, 0x00, 0x3c, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0x00, 0x07, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x01, 0xe0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x1d, 0xc1, 0xc0, 0x00, 0x1c, 0x01, 
-	0xfc, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x00, 
-	0x3c, 0xf0, 0x7c, 0x3c, 0x00, 0x78, 0x00, 0x3c, 
-	0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x00, 0x0f, 
-	0x00, 0x7c, 0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0x80, 0x1f, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x78, 0x3c, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0xf0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x1f, 0xc1, 0xc0, 0x00, 0x1c, 0x00, 
-	0xfc, 0x00, 0x00, 0x0f, 0x80, 0x7c, 0x00, 0x00, 
-	0x3c, 0x78, 0xfc, 0xf8, 0x00, 0x78, 0x00, 0x3c, 
-	0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x07, 
-	0xe1, 0xf8, 0x00, 0x00, 0x1c, 0x01, 0xf8, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x07, 0xe0, 0x7f, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x7c, 0x78, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0x70, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x1f, 0x81, 0xc0, 0x00, 0x1c, 0x00, 
-	0xfc, 0x00, 0x00, 0x07, 0xe1, 0xf8, 0x00, 0x00, 
-	0x1c, 0x7f, 0xff, 0xf0, 0x00, 0x70, 0x00, 0x1c, 
-	0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x03, 
-	0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, 
-	0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0x78, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 
-	0x00, 0x1c, 0x0f, 0x81, 0xc0, 0x00, 0x1c, 0x00, 
-	0x7c, 0x00, 0x00, 0x03, 0xff, 0xf0, 0x00, 0x00, 
-	0x1e, 0x3f, 0xdf, 0xe0, 0x00, 0xf0, 0x00, 0x1e, 
-	0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x01, 
-	0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 
-	0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0x3c, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 
-	0x00, 0x1c, 0x0f, 0x81, 0xc0, 0x00, 0x1c, 0x00, 
-	0x3c, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00, 0x00, 
-	0x0f, 0x1f, 0x0f, 0x87, 0x80, 0xe0, 0x00, 0x0e, 
-	0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x00, 
-	0x7f, 0x80, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 
-	0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0x1e, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 
-	0x00, 0x1c, 0x0f, 0x01, 0xc0, 0x00, 0x1c, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0xc0, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0xf0, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0xfe, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x3f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x07, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x7f, 0x00, 
-	0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x01, 
-	0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xf0, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0xe0, 0x00, 
-	0x0e, 0x00, 0x00, 0xe0, 0x03, 0xe0, 0x03, 0x80, 
-	0x3c, 0x00, 0x78, 0x00, 0x00, 0xf0, 0x00, 0x78, 
-	0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x3f, 
-	0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 
-	0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xc0, 
-	0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x03, 
-	0xff, 0x80, 0x00, 0x00, 0x7f, 0xff, 0xf0, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0xf0, 0x00, 
-	0x1e, 0x00, 0x00, 0xf0, 0x03, 0xe0, 0x07, 0x80, 
-	0x1e, 0x00, 0xf0, 0x00, 0x00, 0x70, 0x00, 0x70, 
-	0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x3f, 
-	0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 
-	0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xff, 0xf0, 0x00, 0x00, 0x03, 0xff, 0xe0, 
-	0x00, 0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, 0x0f, 
-	0xff, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0xf0, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0xf0, 0x00, 
-	0x1e, 0x00, 0x00, 0xf0, 0x07, 0xe0, 0x07, 0x80, 
-	0x0e, 0x00, 0xe0, 0x00, 0x00, 0x78, 0x00, 0xf0, 
-	0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x3f, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0xf0, 0x00, 0x00, 0x07, 0xc1, 0xf0, 
-	0x00, 0x00, 0x1c, 0x00, 0xf8, 0x00, 0x00, 0x0f, 
-	0x83, 0xe0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x78, 0x00, 
-	0x3c, 0x00, 0x00, 0x70, 0x07, 0xf0, 0x07, 0x00, 
-	0x0f, 0x01, 0xe0, 0x00, 0x00, 0x3c, 0x01, 0xe0, 
-	0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x78, 0x00, 0x00, 0x0f, 0x00, 0x78, 
-	0x00, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x00, 0x1e, 
-	0x00, 0xf0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x78, 0x00, 
-	0x3c, 0x00, 0x00, 0x70, 0x07, 0x70, 0x07, 0x00, 
-	0x07, 0x83, 0xc0, 0x00, 0x00, 0x1c, 0x01, 0xc0, 
-	0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x07, 0x70, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x78, 0x00, 0x00, 0x1e, 0x00, 0x3c, 
-	0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 
-	0x00, 0xf0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, 0x00, 
-	0x38, 0x00, 0x00, 0x78, 0x07, 0x70, 0x0f, 0x00, 
-	0x03, 0x83, 0x80, 0x00, 0x00, 0x1e, 0x03, 0xc0, 
-	0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x78, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x38, 0x00, 0x00, 0x1c, 0x00, 0x3c, 
-	0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 
-	0x00, 0x70, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x3c, 0x00, 
-	0x78, 0x00, 0x00, 0x78, 0x0f, 0x78, 0x0f, 0x00, 
-	0x03, 0xc7, 0x80, 0x00, 0x00, 0x0f, 0x07, 0x80, 
-	0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x38, 0x00, 0x00, 0x1c, 0x00, 0x1c, 
-	0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x3c, 0x00, 
-	0x78, 0x00, 0x00, 0x38, 0x0e, 0x38, 0x0e, 0x00, 
-	0x01, 0xef, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x3c, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x38, 0x00, 0x00, 0x3c, 0x00, 0x1e, 
-	0x00, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x00, 0x1e, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 
-	0x70, 0x00, 0x00, 0x38, 0x0e, 0x38, 0x0e, 0x00, 
-	0x00, 0xfe, 0x00, 0x00, 0x00, 0x07, 0x8f, 0x00, 
-	0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1c, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x78, 0x00, 0x00, 0x38, 0x00, 0x0e, 
-	0x00, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x00, 0x0f, 
-	0x80, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1e, 0x00, 
-	0xf0, 0x00, 0x00, 0x3c, 0x0e, 0x38, 0x1e, 0x00, 
-	0x00, 0x7c, 0x00, 0x00, 0x00, 0x03, 0x8e, 0x00, 
-	0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x1e, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x78, 0x00, 0x00, 0x38, 0x00, 0x0e, 
-	0x00, 0x00, 0x1c, 0x00, 0xf8, 0x00, 0x00, 0x0f, 
-	0xf8, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1e, 0x00, 
-	0xf0, 0x00, 0x00, 0x3c, 0x1e, 0x3c, 0x1e, 0x00, 
-	0x00, 0x7c, 0x00, 0x00, 0x00, 0x03, 0xde, 0x00, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x01, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x0e, 
-	0x00, 0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, 0x07, 
-	0xff, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x0f, 0x01, 
-	0xe0, 0x00, 0x00, 0x1c, 0x1c, 0x1c, 0x1c, 0x00, 
-	0x00, 0x7c, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00, 
-	0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xff, 0xe0, 0x00, 0x00, 0x38, 0x00, 0x0e, 
-	0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x01, 
-	0xff, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x0f, 0x01, 
-	0xe0, 0x00, 0x00, 0x1c, 0x1c, 0x1c, 0x1c, 0x00, 
-	0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 
-	0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xff, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x0e, 
-	0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x00, 
-	0x3f, 0xe0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x07, 0x01, 
-	0xc0, 0x00, 0x00, 0x1e, 0x3c, 0x1c, 0x3c, 0x00, 
-	0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 
-	0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xff, 0x80, 0x00, 0x00, 0x38, 0x00, 0x0e, 
-	0x00, 0x00, 0x1c, 0x0f, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0xf0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x07, 0x83, 
-	0xc0, 0x00, 0x00, 0x1e, 0x3c, 0x1e, 0x3c, 0x00, 
-	0x01, 0xef, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x0e, 
-	0x00, 0x00, 0x1c, 0x07, 0x80, 0x00, 0x00, 0x00, 
-	0x00, 0xf8, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x07, 0x83, 
-	0xc0, 0x00, 0x00, 0x0e, 0x38, 0x0e, 0x38, 0x00, 
-	0x01, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x1e, 
-	0x00, 0x00, 0x1c, 0x07, 0xc0, 0x00, 0x00, 0x38, 
-	0x00, 0x78, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x03, 0xc7, 
-	0x80, 0x00, 0x00, 0x0e, 0x38, 0x0e, 0x38, 0x00, 
-	0x03, 0xc7, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, 
-	0x00, 0x00, 0x1c, 0x03, 0xe0, 0x00, 0x00, 0x38, 
-	0x00, 0x38, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x03, 0xc7, 
-	0x80, 0x00, 0x00, 0x0f, 0x78, 0x0f, 0x78, 0x00, 
-	0x07, 0x83, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x07, 0x3c, 
-	0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x3c, 
-	0x00, 0x38, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1e, 0x00, 0x3c, 0x00, 0x00, 0x01, 0xc7, 
-	0x00, 0x00, 0x00, 0x0f, 0x70, 0x07, 0x78, 0x00, 
-	0x0f, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x07, 0xb8, 
-	0x00, 0x00, 0x1c, 0x00, 0xf0, 0x00, 0x00, 0x1c, 
-	0x00, 0x78, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1e, 0x00, 0x3c, 0x00, 0x00, 0x01, 0xef, 
-	0x00, 0x00, 0x00, 0x07, 0x70, 0x07, 0x70, 0x00, 
-	0x0e, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x07, 0xf8, 
-	0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x00, 0x1e, 
-	0x00, 0xf8, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x0f, 0x00, 0x78, 0x00, 0x00, 0x01, 0xef, 
-	0x00, 0x00, 0x00, 0x07, 0xf0, 0x07, 0xf0, 0x00, 
-	0x1e, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0xc1, 0xf0, 
-	0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x00, 0x0f, 
-	0xc1, 0xf0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x0f, 0xc1, 0xf8, 0x00, 0x00, 0x00, 0xfe, 
-	0x00, 0x00, 0x00, 0x07, 0xf0, 0x07, 0xf0, 0x00, 
-	0x3c, 0x00, 0x78, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf8, 
-	0x00, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x00, 0x0f, 
-	0xff, 0xe0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x07, 0xff, 0xf0, 0x00, 0x00, 0x00, 0xfe, 
-	0x00, 0x00, 0x00, 0x07, 0xe0, 0x03, 0xf0, 0x00, 
-	0x38, 0x00, 0x38, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x7f, 0xff, 0xf0, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfe, 
-	0x00, 0x00, 0x1c, 0x00, 0x3e, 0x00, 0x00, 0x03, 
-	0xff, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x03, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x7c, 
-	0x00, 0x00, 0x00, 0x03, 0xe0, 0x03, 0xe0, 0x00, 
-	0x78, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x7f, 0xff, 0xf0, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x9f, 
-	0x00, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x00, 0x00, 
-	0xff, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, 0x7c, 
-	0x00, 0x00, 0x00, 0x03, 0xe0, 0x03, 0xe0, 0x00, 
-	0xf0, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x7f, 0xff, 0xf0, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xe0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xe0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x00, 
-	0x00, 0x00, 0x39, 0xf8, 0x00, 0x00, 0x00, 0x03, 
-	0xf0, 0x00, 0x00, 0x00, 0x07, 0xe7, 0x00, 0x00, 
-	0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0xff, 0x80, 
-	0x00, 0x00, 0x00, 0x07, 0xe7, 0x00, 0x00, 0x00, 
-	0x38, 0xfc, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x0f, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x39, 0xf0, 0x7e, 0x00, 0x00, 0x39, 0xfc, 
-	0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe, 0x00, 
-	0x00, 0x00, 0x3b, 0xfc, 0x00, 0x00, 0x00, 0x0f, 
-	0xfc, 0x00, 0x00, 0x00, 0x0f, 0xf7, 0x00, 0x00, 
-	0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0xff, 0x80, 
-	0x00, 0x00, 0x00, 0x0f, 0xf7, 0x00, 0x00, 0x00, 
-	0x3b, 0xfe, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x1f, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x3b, 0xfc, 0xff, 0x00, 0x00, 0x3b, 0xff, 
-	0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x00, 
-	0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 0x00, 0x1f, 
-	0xfe, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 
-	0x00, 0x1f, 0xfe, 0x00, 0x00, 0x00, 0xff, 0x80, 
-	0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 
-	0x3f, 0xff, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x3e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x3f, 0xfd, 0xff, 0x80, 0x00, 0x3f, 0xff, 
-	0x00, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x1f, 0x00, 
-	0x00, 0x00, 0x3f, 0x1f, 0x00, 0x00, 0x00, 0x3e, 
-	0x1e, 0x00, 0x00, 0x00, 0x3e, 0x3f, 0x00, 0x00, 
-	0x00, 0x3e, 0x1f, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x3e, 0x3f, 0x00, 0x00, 0x00, 
-	0x3f, 0x0f, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x78, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x3f, 0x1f, 0x8f, 0x80, 0x00, 0x3f, 0x0f, 
-	0x80, 0x00, 0x00, 0x3e, 0x1f, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 
-	0x00, 0x00, 0x3e, 0x07, 0x00, 0x00, 0x00, 0x3c, 
-	0x0f, 0x00, 0x00, 0x00, 0x38, 0x1f, 0x00, 0x00, 
-	0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x3c, 0x1f, 0x00, 0x00, 0x00, 
-	0x3c, 0x07, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0xf0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x3c, 0x1f, 0x07, 0x80, 0x00, 0x3c, 0x07, 
-	0x80, 0x00, 0x00, 0x3c, 0x0f, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 
-	0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, 0x00, 0x78, 
-	0x07, 0x00, 0x00, 0x00, 0x78, 0x0f, 0x00, 0x00, 
-	0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x78, 0x0f, 0x00, 0x00, 0x00, 
-	0x3c, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x39, 
-	0xe0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x3c, 0x0f, 0x03, 0x80, 0x00, 0x3c, 0x03, 
-	0x80, 0x00, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 
-	0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 
-	0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3b, 
-	0xc0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03, 
-	0x80, 0x00, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x00, 
-	0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 
-	0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0xc0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03, 
-	0x80, 0x00, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 
-	0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 
-	0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0xe0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03, 
-	0x80, 0x00, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf7, 0x00, 
-	0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 
-	0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0xe0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03, 
-	0x80, 0x00, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x07, 0x00, 
-	0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 
-	0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3c, 
-	0xf0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03, 
-	0x80, 0x00, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 
-	0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 
-	0x07, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 
-	0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x78, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03, 
-	0x80, 0x00, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x0f, 0x00, 
-	0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, 0x00, 0x78, 
-	0x0f, 0x00, 0x00, 0x00, 0x78, 0x0f, 0x00, 0x00, 
-	0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x78, 0x0f, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x78, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03, 
-	0x80, 0x00, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x1f, 0x00, 
-	0x00, 0x00, 0x3c, 0x0f, 0x00, 0x00, 0x00, 0x38, 
-	0x0f, 0x00, 0x00, 0x00, 0x3c, 0x0f, 0x00, 0x00, 
-	0x00, 0x3c, 0x07, 0x80, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x38, 0x0f, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x3c, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03, 
-	0x80, 0x00, 0x00, 0x3c, 0x0f, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x3f, 0x00, 
-	0x00, 0x00, 0x3f, 0x1f, 0x00, 0x00, 0x00, 0x3e, 
-	0x3e, 0x00, 0x00, 0x00, 0x3e, 0x3f, 0x00, 0x00, 
-	0x00, 0x3e, 0x0f, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x3e, 0x3f, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x1e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03, 
-	0x80, 0x00, 0x00, 0x3e, 0x1f, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x00, 
-	0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 0x00, 0x1f, 
-	0xfc, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 
-	0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x1e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03, 
-	0x80, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf7, 0x80, 
-	0x00, 0x00, 0x3b, 0xfc, 0x00, 0x00, 0x00, 0x0f, 
-	0xf8, 0x00, 0x00, 0x00, 0x0f, 0xf7, 0x00, 0x00, 
-	0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x0f, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03, 
-	0x80, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe3, 0x80, 
-	0x00, 0x00, 0x39, 0xf8, 0x00, 0x00, 0x00, 0x07, 
-	0xf0, 0x00, 0x00, 0x00, 0x07, 0xe7, 0x00, 0x00, 
-	0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x07, 0xe7, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x07, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03, 
-	0x80, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x78, 0x0f, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x7c, 0x3e, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x01, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 
-	0xc0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 
-	0xc0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 
-	0xc0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x39, 0xf8, 0x00, 0x00, 0x00, 0x07, 0xe7, 0x00, 
-	0x00, 0x00, 0x39, 0xe0, 0x00, 0x00, 0x00, 0x0f, 
-	0xf0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0xf0, 0x07, 
-	0x80, 0x00, 0x01, 0xe0, 0x38, 0x0f, 0x00, 0x00, 
-	0xf0, 0x0f, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 
-	0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x3b, 0xfc, 0x00, 0x00, 0x00, 0x0f, 0xf7, 0x00, 
-	0x00, 0x00, 0x3b, 0xe0, 0x00, 0x00, 0x00, 0x1f, 
-	0xf8, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0xf0, 0x07, 
-	0x80, 0x00, 0x00, 0xe0, 0x3c, 0x0e, 0x00, 0x00, 
-	0x78, 0x0f, 0x00, 0x00, 0x00, 0x78, 0x0f, 0x00, 
-	0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x3f, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 
-	0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 0x00, 0x3f, 
-	0xfc, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 0x07, 
-	0x00, 0x00, 0x00, 0xf0, 0x7c, 0x1e, 0x00, 0x00, 
-	0x38, 0x1e, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x00, 
-	0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x3f, 0x1f, 0x00, 0x00, 0x00, 0x3e, 0x3f, 0x00, 
-	0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x78, 
-	0x3e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x78, 0x0f, 
-	0x00, 0x00, 0x00, 0xf0, 0x7c, 0x1e, 0x00, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x00, 
-	0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 
-	0x40, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x3e, 0x0f, 0x00, 0x00, 0x00, 0x38, 0x1f, 0x00, 
-	0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x70, 
-	0x0e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x0e, 
-	0x00, 0x00, 0x00, 0x70, 0x7c, 0x1c, 0x00, 0x00, 
-	0x1e, 0x38, 0x00, 0x00, 0x00, 0x3c, 0x1e, 0x00, 
-	0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, 
-	0xc0, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x3c, 0x07, 0x80, 0x00, 0x00, 0x78, 0x0f, 0x00, 
-	0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x70, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x0e, 
-	0x00, 0x00, 0x00, 0x70, 0xec, 0x1c, 0x00, 0x00, 
-	0x0e, 0x78, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x1e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xf1, 
-	0xc0, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x3c, 0x03, 0x80, 0x00, 0x00, 0x70, 0x0f, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x7e, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x3c, 0x1e, 
-	0x00, 0x00, 0x00, 0x78, 0xee, 0x3c, 0x00, 0x00, 
-	0x0f, 0xf0, 0x00, 0x00, 0x00, 0x1e, 0x1c, 0x00, 
-	0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x3c, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x71, 0xff, 
-	0xc0, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 0x07, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0xe0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x1c, 0x1c, 
-	0x00, 0x00, 0x00, 0x38, 0xee, 0x38, 0x00, 0x00, 
-	0x07, 0xe0, 0x00, 0x00, 0x00, 0x1e, 0x1c, 0x00, 
-	0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x78, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x60, 0x7f, 
-	0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 0x07, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0xfc, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x1e, 0x3c, 
-	0x00, 0x00, 0x00, 0x38, 0xe6, 0x38, 0x00, 0x00, 
-	0x03, 0xe0, 0x00, 0x00, 0x00, 0x0e, 0x38, 0x00, 
-	0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x70, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x40, 0x1f, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 0x07, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x0f, 
-	0xfe, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x0e, 0x38, 
-	0x00, 0x00, 0x00, 0x3d, 0xc6, 0x78, 0x00, 0x00, 
-	0x03, 0xc0, 0x00, 0x00, 0x00, 0x0f, 0x38, 0x00, 
-	0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x78, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 0x07, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x01, 
-	0xff, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x0e, 0x38, 
-	0x00, 0x00, 0x00, 0x1d, 0xc7, 0x70, 0x00, 0x00, 
-	0x07, 0xe0, 0x00, 0x00, 0x00, 0x0f, 0x38, 0x00, 
-	0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x3c, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 0x07, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x0f, 0x78, 
-	0x00, 0x00, 0x00, 0x1d, 0xc7, 0x70, 0x00, 0x00, 
-	0x07, 0xf0, 0x00, 0x00, 0x00, 0x07, 0x70, 0x00, 
-	0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x1e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x3c, 0x07, 0x80, 0x00, 0x00, 0x78, 0x0f, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x70, 
-	0x07, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x07, 0x80, 0x00, 0x00, 0x07, 0x70, 
-	0x00, 0x00, 0x00, 0x1d, 0xc3, 0x70, 0x00, 0x00, 
-	0x0f, 0x70, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, 
-	0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x3c, 0x0f, 0x00, 0x00, 0x00, 0x3c, 0x0f, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x78, 
-	0x07, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x3c, 0x07, 0x80, 0x00, 0x00, 0x07, 0xf0, 
-	0x00, 0x00, 0x00, 0x0f, 0x83, 0xe0, 0x00, 0x00, 
-	0x1e, 0x78, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, 
-	0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x3f, 0x1f, 0x00, 0x00, 0x00, 0x3e, 0x3f, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3c, 
-	0x1f, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x00, 0x3e, 0x1f, 0x80, 0x00, 0x00, 0x03, 0xe0, 
-	0x00, 0x00, 0x00, 0x0f, 0x83, 0xe0, 0x00, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 
-	0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x3f, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0xfe, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 
-	0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x03, 0xe0, 
-	0x00, 0x00, 0x00, 0x0f, 0x83, 0xe0, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 
-	0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x3b, 0xfc, 0x00, 0x00, 0x00, 0x0f, 0xf7, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x1f, 
-	0xfc, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 
-	0x00, 0x1f, 0xfb, 0x80, 0x00, 0x00, 0x03, 0xe0, 
-	0x00, 0x00, 0x00, 0x0f, 0x03, 0xc0, 0x00, 0x00, 
-	0x78, 0x1e, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 
-	0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x39, 0xf0, 0x00, 0x00, 0x00, 0x03, 0xe7, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x07, 
-	0xf0, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 
-	0x00, 0x07, 0xe3, 0x80, 0x00, 0x00, 0x01, 0xc0, 
-	0x00, 0x00, 0x00, 0x07, 0x01, 0xc0, 0x00, 0x00, 
-	0xf0, 0x0f, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 
-	0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 
-	0xc0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 
-	0xc0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 
-	0xc0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 
-	0xf0, 0x24, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x0c, 0x94, 
-	0xea, 0xff, 0xfd, 0x70, 0xea, 0x00, 0x00, 0x01, 
-	0xe3, 0x5c, 0x00, 0xb7, 0xa5, 0x9f, 0xf0, 0x04, 
-	0xe0, 0x86, 0xc0, 0x0c, 0xe5, 0x9f, 0xf0, 0x00, 
-	0x00, 0x00, 0x0f, 0x74, 0x00, 0x00, 0x0c, 0x98, 
-	0x00, 0x00, 0x00, 0x0f, 0xf0, 0x24, 0x00, 0x09, 
-	0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 
-	0x00, 0x00, 0x0e, 0x4c, 0xea, 0xff, 0xfd, 0x03, 
-	0xea, 0x00, 0x00, 0x07, 0xe5, 0x9f, 0xc0, 0x1c, 
-	0xe5, 0x9c, 0x30, 0x00, 0xe3, 0x83, 0x33, 0x33, 
-	0xe1, 0x52, 0x00, 0x03, 0x05, 0x9f, 0xc0, 0x10, 
-	0x05, 0x9c, 0xc0, 0x00, 0x03, 0x8c, 0x23, 0x33, 
-	0xe5, 0x9f, 0xc0, 0x08, 0xe5, 0x9f, 0xf0, 0x08, 
-	0x66, 0x00, 0x00, 0x60, 0x66, 0x00, 0x00, 0x5c, 
-	0x66, 0x00, 0x00, 0x58, 0x00, 0x00, 0x0e, 0x50, 
-	0x00, 0x00, 0x00, 0x01, 0xf0, 0x24, 0x00, 0x09, 
-	0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xff, 
-	0x00, 0x00, 0x02, 0x6c, 0xa0, 0x00, 0x0b, 0x38, 
-	0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x0f, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-	0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 
-	0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 
-	0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 
-	0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x13, 
-	0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x18, 
-	0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1a, 
-	0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x19, 
-	0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x18, 
-	0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1f, 
-	0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 
-	0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 
-	0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 
-	0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 
-	0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x18, 
-	0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x3f, 0xfe, 0xb1, 0x72, 0x17, 0xf7, 
-	0xd1, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xcd, 
-	0xf3, 0x57, 0x93, 0xc0, 0x00, 0x00, 0x00, 0x00, 
-	0x80, 0x00, 0x3f, 0xfe, 0xca, 0x20, 0xad, 0x9a, 
-	0xb5, 0xe9, 0x46, 0xe9, 0x00, 0x00, 0x40, 0x03, 
-	0x83, 0x12, 0x51, 0x00, 0xb5, 0x7f, 0x65, 0x09, 
-	0x80, 0x00, 0x40, 0x05, 0x80, 0x3f, 0xf8, 0x95, 
-	0x9d, 0xac, 0xd2, 0x28, 0x80, 0x00, 0x40, 0x04, 
-	0x8e, 0xac, 0x02, 0x5b, 0x3e, 0x70, 0x76, 0xbb, 
-	0x00, 0x00, 0x40, 0x07, 0x9c, 0x04, 0x1f, 0xd0, 
-	0xa9, 0x33, 0xef, 0x60, 0x80, 0x00, 0x40, 0x08, 
-	0xc0, 0x5f, 0xf4, 0xe0, 0x6c, 0x83, 0xbb, 0x96, 
-	0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfe, 
-	0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 
-	0xc9, 0x0f, 0xda, 0xa2, 0x21, 0x68, 0xc2, 0x35, 
-	0x00, 0x00, 0x3f, 0xfe, 0xb1, 0x73, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 
-	0xff, 0xfe, 0x2f, 0xf1, 0x48, 0x3b, 0x9d, 0x27, 
-	0x00, 0x00, 0x3f, 0xee, 0xe8, 0x08, 0x97, 0x58, 
-	0x10, 0x16, 0xb3, 0x7d, 0x40, 0x40, 0x40, 0x40, 
-	0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 
-	0x41, 0x41, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 
-	0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 
-	0x40, 0x40, 0x40, 0x40, 0x05, 0x02, 0x02, 0x02, 
-	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
-	0x02, 0x02, 0x02, 0x02, 0x20, 0x20, 0x20, 0x20, 
-	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x02, 0x02, 
-	0x02, 0x02, 0x02, 0x02, 0x02, 0x90, 0x90, 0x90, 
-	0x90, 0x90, 0x90, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x02, 
-	0x02, 0x02, 0x02, 0x02, 0x02, 0x88, 0x88, 0x88, 
-	0x88, 0x88, 0x88, 0x08, 0x08, 0x08, 0x08, 0x08, 
-	0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 
-	0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x02, 
-	0x02, 0x02, 0x02, 0x40, 0xe5, 0x9f, 0xc0, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1c, 0x2e, 0x01, 0x79, 0x19, 
-	0xe5, 0x9f, 0xc0, 0x00, 0xe1, 0x2f, 0xff, 0x1c, 
-	0x2e, 0x00, 0x5c, 0x7b, 0xe5, 0x9f, 0xc0, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1c, 0x2e, 0x00, 0x5d, 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, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x2e, 0x01, 0xc9, 0x08, 0x2e, 0x01, 0xca, 0x20, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xc9, 0x08, 
-	0xff, 0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 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, 0x03, 
-	0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 
-	0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x02, 0xcf, 0x00, 0x00, 0x02, 0x40, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x2c, 0x00, 0x01, 0x00, 0x43, 0x6f, 0x70, 0x79, 
-	0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x46, 0x75, 
-	0x6a, 0x69, 0x74, 0x73, 0x75, 0x20, 0x53, 0x69, 
-	0x65, 0x6d, 0x65, 0x6e, 0x73, 0x20, 0x26, 0x20, 
-	0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x67, 0x65, 
-	0x6e, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 
-	0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6d, 
-	0x65, 0x64, 0x69, 0x61, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x57, 0x5e, 0x61, 0xa3, 
-	0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x0c, 
-	0x6c, 0x00, 0x00, 0x24, 0x64, 0x00, 0x00, 0x28, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x4e, 0x20, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x07, 0xd0, 0x00, 0x00, 0x07, 0xd0, 
-	0x00, 0x00, 0x13, 0x88, 0x02, 0x02, 0x01, 0x00, 
-	0x00, 0x00, 0x4e, 0x20, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x07, 0xd0, 0x00, 0x00, 0x07, 0xd0, 
-	0x00, 0x00, 0x13, 0x88, 0x02, 0x02, 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, 0x2e, 0x08, 0x05, 0xc4, 
-	0x2e, 0x08, 0x05, 0xc4, 0x2e, 0x08, 0x05, 0xcc, 
-	0x2e, 0x08, 0x05, 0xcc, 0x2e, 0x08, 0x05, 0xd4, 
-	0x2e, 0x08, 0x05, 0xd4, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd, 
-	0x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7e, 0xff, 0xdb, 0xff, 0xff, 0xc3, 
-	0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 
-	0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe, 
-	0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0xe7, 0xe7, 
-	0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 
-	0x7e, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 
-	0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xc3, 
-	0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 
-	0x42, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd, 
-	0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 
-	0x00, 0x00, 0x1e, 0x0e, 0x1a, 0x32, 0x78, 0xcc, 
-	0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 
-	0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30, 
-	0x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7f, 0x63, 0x7f, 0x63, 0x63, 0x63, 
-	0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 
-	0x3c, 0xdb, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8, 
-	0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x02, 0x06, 0x0e, 0x1e, 0x3e, 0xfe, 0x3e, 
-	0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 
-	0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 
-	0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7f, 0xdb, 0xdb, 0xdb, 0x7b, 0x1b, 
-	0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 
-	0x6c, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 
-	0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0xfe, 
-	0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 
-	0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 
-	0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x6c, 0xfe, 
-	0x6c, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 
-	0x7c, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c, 
-	0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 
-	0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 
-	0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 
-	0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 
-	0x06, 0x86, 0xc6, 0x7c, 0x18, 0x18, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18, 
-	0x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x76, 0xdc, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 
-	0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x30, 0x18, 0x0c, 0x0c, 0x0c, 0x0c, 
-	0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 
-	0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 
-	0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0c, 0x18, 
-	0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xd6, 0xd6, 
-	0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7c, 0xc6, 0x06, 0x0c, 0x18, 0x30, 
-	0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 
-	0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe, 
-	0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xfc, 0x06, 
-	0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18, 
-	0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 
-	0x06, 0x06, 0x0c, 0x78, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 
-	0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 
-	0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 
-	0x30, 0x18, 0x0c, 0x06, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 
-	0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06, 
-	0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, 
-	0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xde, 0xde, 
-	0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 
-	0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 
-	0x66, 0x66, 0x66, 0xfc, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 
-	0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xf8, 0x6c, 0x66, 0x66, 0x66, 0x66, 
-	0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 
-	0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 
-	0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xde, 
-	0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x1e, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 
-	0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78, 
-	0x6c, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60, 
-	0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xc6, 0xee, 0xfe, 0xfe, 0xd6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 
-	0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x60, 
-	0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 
-	0xc6, 0xd6, 0xde, 0x7c, 0x0c, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c, 
-	0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x60, 0x38, 0x0c, 
-	0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7e, 0x7e, 0x5a, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 
-	0xc6, 0x6c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xd6, 
-	0xd6, 0xfe, 0xee, 0x6c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xc6, 0xc6, 0x6c, 0x7c, 0x38, 0x38, 
-	0x7c, 0x6c, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 
-	0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xfe, 0xc6, 0x86, 0x0c, 0x18, 0x30, 
-	0x60, 0xc2, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, 
-	0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0x70, 0x38, 
-	0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 
-	0x0c, 0x0c, 0x0c, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 
-	0x00, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xe0, 0x60, 0x60, 0x78, 0x6c, 0x66, 
-	0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 
-	0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 
-	0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x1c, 0x36, 0x32, 0x30, 0x78, 0x30, 
-	0x30, 0x30, 0x30, 0x78, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 
-	0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00, 
-	0x00, 0x00, 0xe0, 0x60, 0x60, 0x6c, 0x76, 0x66, 
-	0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06, 
-	0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00, 
-	0x00, 0x00, 0xe0, 0x60, 0x60, 0x66, 0x6c, 0x78, 
-	0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xfe, 0xd6, 
-	0xd6, 0xd6, 0xd6, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 
-	0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 
-	0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 
-	0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 
-	0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60, 
-	0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x10, 0x30, 0x30, 0xfc, 0x30, 0x30, 
-	0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xd6, 
-	0xd6, 0xd6, 0xfe, 0x6c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x6c, 0x38, 
-	0x38, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xcc, 0x18, 
-	0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 
-	0x18, 0x18, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0e, 0x18, 
-	0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 
-	0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 
-	0xc0, 0xc2, 0x66, 0x3c, 0x18, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe, 
-	0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x10, 0x38, 0x6c, 0x00, 0x78, 0x0c, 0x7c, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x6c, 0x38, 0x00, 0x78, 0x0c, 0x7c, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 
-	0xc0, 0xc0, 0xc6, 0x7c, 0x18, 0x70, 0x00, 0x00, 
-	0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe, 
-	0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 
-	0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 
-	0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x18, 0x3c, 0x66, 0x00, 0x38, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 
-	0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x6c, 0x38, 0x10, 0x38, 0x6c, 0xc6, 0xfe, 
-	0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x0c, 0x18, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 
-	0x68, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x36, 0x36, 
-	0x7e, 0xd8, 0xd8, 0x6e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x3e, 0x6c, 0xcc, 0xcc, 0xfe, 0xcc, 
-	0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xc6, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00, 
-	0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x18, 0x18, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 
-	0xc6, 0x7c, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 
-	0x60, 0x60, 0xe6, 0xfc, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 
-	0x7e, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0xf8, 0xcc, 0xcc, 0xf8, 0xc4, 0xcc, 0xde, 
-	0xcc, 0xcc, 0xcc, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 
-	0x18, 0x18, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x0c, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x76, 0xdc, 0x00, 0xdc, 0x66, 0x66, 
-	0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 
-	0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 
-	0xce, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 
-	0xc0, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, 
-	0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 
-	0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x60, 0xe0, 0x62, 0x66, 0x6c, 0x18, 0x30, 
-	0x60, 0xdc, 0x86, 0x0c, 0x18, 0x3e, 0x00, 0x00, 
-	0x00, 0x60, 0xe0, 0x62, 0x66, 0x6c, 0x18, 0x30, 
-	0x66, 0xce, 0x9a, 0x3f, 0x06, 0x06, 0x00, 0x00, 
-	0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 
-	0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 
-	0x6c, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36, 
-	0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 
-	0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 
-	0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 
-	0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 
-	0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 
-	0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xf6, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xfe, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3f, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf7, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xf7, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
-	0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 
-	0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 
-	0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 
-	0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0xd8, 
-	0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, 
-	0xc6, 0xc6, 0xc6, 0xcc, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0, 
-	0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x6c, 0x6c, 
-	0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x18, 
-	0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8, 
-	0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 
-	0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66, 0x66, 
-	0x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 
-	0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 
-	0x6c, 0x6c, 0x6c, 0xee, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66, 
-	0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xdb, 0xdb, 
-	0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb, 
-	0xf3, 0x7e, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60, 
-	0x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 
-	0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 
-	0x18, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x30, 0x18, 0x0c, 0x06, 0x0c, 
-	0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 
-	0x18, 0x0c, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x7e, 
-	0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 
-	0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 
-	0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xec, 
-	0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x6c, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x3c, 0x66, 0x0c, 0x18, 0x32, 0x7e, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x7e, 0x7e, 
-	0x7e, 0x7e, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0x2e, 0x00, 0x67, 0x20, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 
-	0x2e, 0x08, 0x07, 0x98, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 
-	0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 
-	0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x39, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x21, 
-	0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 
-	0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x39, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0xb1, 0x0e, 0xa6, 0x06, 0x53, 
-	0x2e, 0x08, 0x17, 0xdc, 0x00, 0x00, 0x00, 0x02, 
-	0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x13, 
-	0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x19, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 
-	0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 
-	0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0f, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0a, 
-	0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x04, 
-	0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 
-	0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x10, 
-	0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 
-	0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 
-	0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 
-	0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x19, 
-	0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x04, 0xf5, 0x11, 0x38, 0x06, 0x53, 
-	0x2e, 0x08, 0x19, 0x0c, 0x2e, 0x08, 0x19, 0x00, 
-	0x2e, 0x08, 0x1a, 0x30, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 
-	0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 
-	0x00, 0x80, 0x10, 0x80, 0x00, 0x80, 0xda, 0x80, 
-	0x00, 0x5a, 0x51, 0xf0, 0x00, 0x36, 0x91, 0x22, 
-	0x00, 0xf0, 0x29, 0x6e, 0x00, 0x10, 0xd2, 0x92, 
-	0x00, 0xca, 0x6a, 0xde, 0x00, 0xa6, 0xaa, 0x10, 
-	0x00, 0x80, 0x3b, 0x80, 0x00, 0x80, 0xbc, 0x80, 
-	0x00, 0x80, 0x7e, 0x80, 0x00, 0xcf, 0x22, 0x73, 
-	0x00, 0x93, 0x48, 0x5d, 0x00, 0xa2, 0x73, 0x93, 
-	0x00, 0x25, 0xae, 0xad, 0x00, 0xa7, 0x9f, 0x60, 
-	0x00, 0x10, 0x10, 0x10, 0x00, 0x59, 0x10, 0x10, 
-	0x00, 0xa2, 0x10, 0x10, 0x00, 0xeb, 0x10, 0x10, 
-	0x00, 0x10, 0x10, 0x59, 0x00, 0x59, 0x10, 0x59, 
-	0x00, 0xa2, 0x10, 0x59, 0x00, 0xeb, 0x10, 0x59, 
-	0x00, 0x10, 0x10, 0xa2, 0x00, 0x59, 0x10, 0xa2, 
-	0x00, 0xa2, 0x10, 0xa2, 0x00, 0xeb, 0x10, 0xa2, 
-	0x00, 0x10, 0x10, 0xeb, 0x00, 0x59, 0x10, 0xeb, 
-	0x00, 0xa2, 0x10, 0xeb, 0x00, 0xeb, 0x10, 0xeb, 
-	0x00, 0x10, 0x2f, 0x10, 0x00, 0x59, 0x2f, 0x10, 
-	0x00, 0xa2, 0x2f, 0x10, 0x00, 0xeb, 0x2f, 0x10, 
-	0x00, 0x10, 0x2f, 0x59, 0x00, 0x59, 0x2f, 0x59, 
-	0x00, 0xa2, 0x2f, 0x59, 0x00, 0xeb, 0x2f, 0x59, 
-	0x00, 0x10, 0x2f, 0xa2, 0x00, 0x59, 0x2f, 0xa2, 
-	0x00, 0xa2, 0x2f, 0xa2, 0x00, 0xeb, 0x2f, 0xa2, 
-	0x00, 0x10, 0x2f, 0xeb, 0x00, 0x59, 0x2f, 0xeb, 
-	0x00, 0xa2, 0x2f, 0xeb, 0x00, 0xeb, 0x2f, 0xeb, 
-	0x00, 0x10, 0x4e, 0x10, 0x00, 0x59, 0x4e, 0x10, 
-	0x00, 0xa2, 0x4e, 0x10, 0x00, 0xeb, 0x4e, 0x10, 
-	0x00, 0x10, 0x4e, 0x59, 0x00, 0x59, 0x4e, 0x59, 
-	0x00, 0xa2, 0x4e, 0x59, 0x00, 0xeb, 0x4e, 0x59, 
-	0x00, 0x10, 0x4e, 0xa2, 0x00, 0x59, 0x4e, 0xa2, 
-	0x00, 0xa2, 0x4e, 0xa2, 0x00, 0xeb, 0x4e, 0xa2, 
-	0x00, 0x10, 0x4e, 0xeb, 0x00, 0x59, 0x4e, 0xeb, 
-	0x00, 0xa2, 0x4e, 0xeb, 0x00, 0xeb, 0x4e, 0xeb, 
-	0x00, 0x10, 0x6d, 0x10, 0x00, 0x59, 0x6d, 0x10, 
-	0x00, 0xa2, 0x6d, 0x10, 0x00, 0xeb, 0x6d, 0x10, 
-	0x00, 0x10, 0x6d, 0x59, 0x00, 0x59, 0x6d, 0x59, 
-	0x00, 0xa2, 0x6d, 0x59, 0x00, 0xeb, 0x6d, 0x59, 
-	0x00, 0x10, 0x6d, 0xa2, 0x00, 0x59, 0x6d, 0xa2, 
-	0x00, 0xa2, 0x6d, 0xa2, 0x00, 0xeb, 0x6d, 0xa2, 
-	0x00, 0x10, 0x6d, 0xeb, 0x00, 0x59, 0x6d, 0xeb, 
-	0x00, 0xa2, 0x6d, 0xeb, 0x00, 0xeb, 0x6d, 0xeb, 
-	0x00, 0x10, 0x8c, 0x10, 0x00, 0x59, 0x8c, 0x10, 
-	0x00, 0xa2, 0x8c, 0x10, 0x00, 0xeb, 0x8c, 0x10, 
-	0x00, 0x10, 0x8c, 0x59, 0x00, 0x59, 0x8c, 0x59, 
-	0x00, 0xa2, 0x8c, 0x59, 0x00, 0xeb, 0x8c, 0x59, 
-	0x00, 0x10, 0x8c, 0xa2, 0x00, 0x59, 0x8c, 0xa2, 
-	0x00, 0xa2, 0x8c, 0xa2, 0x00, 0xeb, 0x8c, 0xa2, 
-	0x00, 0x10, 0x8c, 0xeb, 0x00, 0x59, 0x8c, 0xeb, 
-	0x00, 0xa2, 0x8c, 0xeb, 0x00, 0xeb, 0x8c, 0xeb, 
-	0x00, 0x10, 0xab, 0x10, 0x00, 0x59, 0xab, 0x10, 
-	0x00, 0xa2, 0xab, 0x10, 0x00, 0xeb, 0xab, 0x10, 
-	0x00, 0x10, 0xab, 0x59, 0x00, 0x59, 0xab, 0x59, 
-	0x00, 0xa2, 0xab, 0x59, 0x00, 0xeb, 0xab, 0x59, 
-	0x00, 0x10, 0xab, 0xa2, 0x00, 0x59, 0xab, 0xa2, 
-	0x00, 0xa2, 0xab, 0xa2, 0x00, 0xeb, 0xab, 0xa2, 
-	0x00, 0x10, 0xab, 0xeb, 0x00, 0x59, 0xab, 0xeb, 
-	0x00, 0xa2, 0xab, 0xeb, 0x00, 0xeb, 0xab, 0xeb, 
-	0x00, 0x10, 0xca, 0x10, 0x00, 0x59, 0xca, 0x10, 
-	0x00, 0xa2, 0xca, 0x10, 0x00, 0xeb, 0xca, 0x10, 
-	0x00, 0x10, 0xca, 0x59, 0x00, 0x59, 0xca, 0x59, 
-	0x00, 0xa2, 0xca, 0x59, 0x00, 0xeb, 0xca, 0x59, 
-	0x00, 0x10, 0xca, 0xa2, 0x00, 0x59, 0xca, 0xa2, 
-	0x00, 0xa2, 0xca, 0xa2, 0x00, 0xeb, 0xca, 0xa2, 
-	0x00, 0x10, 0xca, 0xeb, 0x00, 0x59, 0xca, 0xeb, 
-	0x00, 0xa2, 0xca, 0xeb, 0x00, 0xeb, 0xca, 0xeb, 
-	0x00, 0x10, 0xe9, 0x10, 0x00, 0x59, 0xe9, 0x10, 
-	0x00, 0xa2, 0xe9, 0x10, 0x00, 0xeb, 0xe9, 0x10, 
-	0x00, 0x10, 0xe9, 0x59, 0x00, 0x59, 0xe9, 0x59, 
-	0x00, 0xa2, 0xe9, 0x59, 0x00, 0xeb, 0xe9, 0x59, 
-	0x00, 0x10, 0xe9, 0xa2, 0x00, 0x59, 0xe9, 0xa2, 
-	0x00, 0xa2, 0xe9, 0xa2, 0x00, 0xeb, 0xe9, 0xa2, 
-	0x00, 0x10, 0xe9, 0xeb, 0x00, 0x59, 0xe9, 0xeb, 
-	0x00, 0xa2, 0xe9, 0xeb, 0x00, 0xeb, 0xe9, 0xeb, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xff, 0xff, 0x24, 0xc0, 0xc1, 0x11, 0x11, 0x10, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0f, 0x6d, 0xbb, 0xeb, 
-	0x8e, 0x01, 0xea, 0x25, 0x04, 0xd0, 0x82, 0x49, 
-	0xed, 0x4c, 0x8f, 0xc2, 0x66, 0x0b, 0x65, 0xc5, 
-	0x0c, 0xc2, 0x41, 0x19, 0x07, 0xa8, 0x94, 0x13, 
-	0x42, 0x09, 0x27, 0xb5, 0x32, 0x3f, 0x09, 0x98, 
-	0x2d, 0x97, 0x14, 0x33, 0x09, 0x04, 0x64, 0x00, 
-	0xff, 0xff, 0x24, 0xc0, 0xe0, 0x11, 0x21, 0x00, 
-	0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x13, 0x8e, 0xf7, 0xe7, 
-	0x6e, 0x9c, 0x0c, 0xc3, 0xd2, 0xb4, 0x05, 0x16, 
-	0x3c, 0x8e, 0x82, 0xd4, 0x16, 0x5e, 0x9c, 0x0c, 
-	0xc3, 0xd2, 0xb4, 0x05, 0x16, 0x3c, 0x8e, 0x82, 
-	0xd4, 0x16, 0x5e, 0x9c, 0x0c, 0xc3, 0xd2, 0xb4, 
-	0x05, 0x16, 0x3c, 0x8e, 0x82, 0xd4, 0x16, 0x50, 
-	0xff, 0xff, 0x24, 0xc0, 0xd4, 0x11, 0x20, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0d, 0x4d, 0xf8, 0xd5, 
-	0x9e, 0x7f, 0x02, 0x22, 0x08, 0xa3, 0xbd, 0x94, 
-	0x53, 0x16, 0x79, 0xfc, 0x08, 0x88, 0x22, 0x8e, 
-	0xf6, 0x51, 0x4c, 0x59, 0xe7, 0xf0, 0x22, 0x20, 
-	0x8a, 0x3b, 0xd9, 0x45, 0x31, 0x67, 0x9f, 0xc0, 
-	0x88, 0x82, 0x28, 0xef, 0x65, 0x14, 0xc4, 0x00, 
-	0xff, 0xff, 0x24, 0xc0, 0xe8, 0x00, 0x10, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x14, 0x6d, 0xfb, 0x1d, 
-	0x77, 0xc1, 0x38, 0x81, 0xfb, 0xb1, 0xd7, 0x7c, 
-	0x13, 0x88, 0x1f, 0xbb, 0x1d, 0x77, 0xc1, 0x38, 
-	0x81, 0xfb, 0xb1, 0xd7, 0x7c, 0x13, 0x88, 0x1f, 
-	0xbb, 0x1d, 0x77, 0xc1, 0x38, 0x81, 0xfb, 0xb1, 
-	0xd7, 0x7c, 0x13, 0x88, 0x1f, 0x80, 0x00, 0x00, 
-	0xff, 0xff, 0x24, 0xc0, 0x9b, 0x00, 0x20, 0x00, 
-	0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x50, 0x3d, 0x75, 0xf7, 
-	0x14, 0x0a, 0xc3, 0x29, 0x9f, 0x51, 0xbc, 0xfb, 
-	0xdc, 0x7b, 0x8a, 0x05, 0x61, 0x94, 0xcf, 0xa8, 
-	0xde, 0x7d, 0xee, 0x3d, 0xc5, 0x02, 0xb0, 0xca, 
-	0x67, 0xd4, 0x6f, 0x3e, 0xf7, 0x1e, 0xe2, 0x81, 
-	0x58, 0x65, 0x33, 0xea, 0x37, 0x9f, 0x7b, 0x80, 
-	0xff, 0xff, 0x24, 0xc0, 0x12, 0xe0, 0x00, 0x00, 
-	0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xeb, 0x50, 0xfb, 0xe7, 
-	0x78, 0x1f, 0xde, 0xa1, 0x62, 0x99, 0x11, 0x36, 
-	0x02, 0x00, 0x97, 0xd6, 0x69, 0x98, 0x1f, 0xde, 
-	0xa1, 0x62, 0x99, 0x11, 0x36, 0x02, 0x00, 0x97, 
-	0xd6, 0x69, 0x98, 0x1f, 0xde, 0xa1, 0x62, 0x99, 
-	0x11, 0x36, 0x02, 0x00, 0x97, 0xd6, 0x69, 0x90, 
-	0xff, 0xff, 0x24, 0xc0, 0x11, 0xba, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xdf, 0x95, 0x03, 0xa1, 
-	0x49, 0xc5, 0x45, 0xe7, 0x96, 0xe6, 0x1d, 0xdc, 
-	0x0d, 0x50, 0xa4, 0xe2, 0xa2, 0xf3, 0xcb, 0x73, 
-	0x0e, 0xee, 0x06, 0xa8, 0x52, 0x71, 0x51, 0x79, 
-	0xe5, 0xb9, 0x87, 0x77, 0x03, 0x54, 0x29, 0x38, 
-	0xa8, 0xbc, 0xf2, 0xdc, 0xc3, 0xbb, 0x81, 0xa0, 
-	0xff, 0xff, 0x24, 0xc0, 0x11, 0x21, 0xc3, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xe7, 0xae, 0x35, 0x0d, 
-	0x42, 0x14, 0xc2, 0xf9, 0x4a, 0x13, 0x55, 0xa6, 
-	0x6e, 0xf4, 0x88, 0x53, 0x0b, 0xe5, 0x28, 0x4d, 
-	0x56, 0x99, 0xbb, 0xd2, 0x21, 0x4c, 0x2f, 0x94, 
-	0xa1, 0x35, 0x5a, 0x66, 0xef, 0x48, 0x85, 0x30, 
-	0xbe, 0x52, 0x84, 0xd5, 0x69, 0x9b, 0xbd, 0x20, 
-	0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0x48, 
-	0x2e, 0x08, 0x1f, 0x4c, 0x2e, 0x08, 0x1f, 0x50, 
-	0x2e, 0x08, 0x1f, 0x58, 0x2e, 0x08, 0x1f, 0x5c, 
-	0x2e, 0x08, 0x1f, 0x60, 0x6e, 0x00, 0x01, 0x00, 
-	0x6e, 0x00, 0x01, 0x00, 0x6e, 0x00, 0x01, 0x08, 
-	0x6e, 0x00, 0x01, 0x0c, 0x6e, 0x00, 0x01, 0x04, 
-	0x6e, 0x00, 0x01, 0x10, 0x6e, 0x00, 0x01, 0x14, 
-	0x2e, 0x08, 0x60, 0x58, 0x00, 0x00, 0x00, 0x0d, 
-	0x00, 0x00, 0x00, 0x00, 0xb0, 0x25, 0x00, 0x18, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x0d, 0x00, 
-	0x2e, 0x08, 0x1f, 0xac, 0x2e, 0x08, 0x1f, 0xb0, 
-	0x2e, 0x08, 0x1f, 0xb4, 0x2e, 0x08, 0x1f, 0xb8, 
-	0x70, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x04, 
-	0x70, 0x00, 0x00, 0x08, 0x70, 0x00, 0x00, 0x0c, 
-	0x70, 0x00, 0x00, 0x10, 0x70, 0x00, 0x00, 0x30, 
-	0x2e, 0x01, 0xcc, 0x09, 0x2e, 0x01, 0xcb, 0x99, 
-	0x2e, 0x01, 0xcb, 0x11, 0x2e, 0x01, 0xcb, 0x09, 
-	0x2e, 0x01, 0xcc, 0x41, 0x2e, 0x01, 0xcb, 0xd1, 
-	0x2e, 0x01, 0xcc, 0x85, 0x2e, 0x01, 0xcc, 0x7d, 
-	0x00, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x09, 0x80, 
-	0x80, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 
-	0xe0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 
-	0xf8, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 
-	0xfe, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 
-	0xff, 0x80, 0x00, 0x00, 0xff, 0xc0, 0x00, 0x00, 
-	0xff, 0xe0, 0x00, 0x00, 0xff, 0xf0, 0x00, 0x00, 
-	0xff, 0xf8, 0x00, 0x00, 0xff, 0xfc, 0x00, 0x00, 
-	0xff, 0xfe, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 
-	0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0xc0, 0x00, 
-	0xff, 0xff, 0xe0, 0x00, 0xff, 0xff, 0xf0, 0x00, 
-	0xff, 0xff, 0xf8, 0x00, 0xff, 0xff, 0xfc, 0x00, 
-	0xff, 0xff, 0xfe, 0x00, 0xff, 0xff, 0xff, 0x00, 
-	0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xc0, 
-	0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xf0, 
-	0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xfc, 
-	0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 
-	0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x7f, 0xef, 0xff, 0xff, 
-	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x40, 0x1f, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-};
-