Index: modules/analysis/common/src/test/org/apache/lucene/analysis/charfilter/JFlexHTMLStripCharFilterTest.java
===================================================================
--- modules/analysis/common/src/test/org/apache/lucene/analysis/charfilter/JFlexHTMLStripCharFilterTest.java	(revision 0)
+++ modules/analysis/common/src/test/org/apache/lucene/analysis/charfilter/JFlexHTMLStripCharFilterTest.java	(revision 0)
@@ -0,0 +1,440 @@
+package org.apache.lucene.analysis.charfilter;
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.*;
+
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.analysis.BaseTokenStreamTestCase;
+import org.apache.lucene.analysis.CharReader;
+import org.apache.lucene.analysis.MockTokenizer;
+import org.apache.lucene.analysis.Tokenizer;
+import org.junit.Ignore;
+
+public class JFlexHTMLStripCharFilterTest extends BaseTokenStreamTestCase {
+
+  //this is some text  here is a  link  and another  link . This is an entity: & plus a <.  Here is an &
+  //
+  public void test() throws IOException {
+    String html = "<div class=\"foo\">this is some text</div> here is a <a href=\"#bar\">link</a> and " +
+            "another <a href=\"http://lucene.apache.org/\">link</a>. " +
+            "This is an entity: &amp; plus a &lt;.  Here is an &. <!-- is a comment -->";
+    String gold = " this is some text  here is a  link  and " +
+            "another  link . " +
+            "This is an entity: & plus a <.  Here is an &. ";
+    JFlexHTMLStripCharFilter reader = new JFlexHTMLStripCharFilter(CharReader.get(new StringReader(html)));
+    StringBuilder builder = new StringBuilder();
+    int ch = -1;
+    char [] goldArray = gold.toCharArray();
+    int position = 0;
+    while ((ch = reader.read()) != -1){
+      char theChar = (char) ch;
+      builder.append(theChar);
+      assertTrue("\"" + theChar + "\"" + " at position: " + position + " does not equal: " + goldArray[position]
+              + " Buffer so far: " + builder + "<EOB>", theChar == goldArray[position]);
+      position++;
+    }
+    assertEquals(gold, builder.toString());
+  }
+
+  //Some sanity checks, but not a full-fledged check
+  public void testHTML() throws Exception {
+    InputStream stream = getClass().getResourceAsStream("htmlStripReaderTest.html");
+    JFlexHTMLStripCharFilter reader = new JFlexHTMLStripCharFilter(CharReader.get(new InputStreamReader(stream, "UTF-8")));
+    StringBuilder builder = new StringBuilder();
+    int ch = -1;
+    while ((ch = reader.read()) != -1){
+      builder.append((char)ch);
+    }
+    String str = builder.toString();
+    assertTrue("Entity not properly escaped", str.indexOf("&lt;") == -1);//there is one > in the text
+    assertTrue("Forrest should have been stripped out", str.indexOf("forrest") == -1 && str.indexOf("Forrest") == -1);
+    assertTrue("File should start with 'Welcome to Solr' after trimming", str.trim().startsWith("Welcome to Solr"));
+
+    assertTrue("File should start with 'Foundation.' after trimming", str.trim().endsWith("Foundation."));
+    
+  }
+
+  public void testGamma() throws Exception {
+    String test = "&Gamma;";
+    String gold = "\u0393";
+    Set<String> set = new HashSet<String>();
+    set.add("reserved");
+    Reader reader = new JFlexHTMLStripCharFilter(CharReader.get(new StringReader(test)), set);
+    StringBuilder builder = new StringBuilder();
+    int ch = 0;
+    while ((ch = reader.read()) != -1){
+      builder.append((char)ch);
+    }
+    String result = builder.toString();
+    // System.out.println("Resu: " + result + "<EOL>");
+    // System.out.println("Gold: " + gold + "<EOL>");
+    assertTrue(result + " is not equal to " + gold + "<EOS>", result.equals(gold) == true);
+  }
+
+  public void testEntities() throws Exception {
+    String test = "&nbsp; &lt;foo&gt; &Uuml;bermensch &#61; &Gamma; bar &#x393;";
+    String gold = "  <foo> \u00DCbermensch = \u0393 bar \u0393";
+    Set<String> set = new HashSet<String>();
+    set.add("reserved");
+    Reader reader = new JFlexHTMLStripCharFilter(CharReader.get(new StringReader(test)), set);
+    StringBuilder builder = new StringBuilder();
+    int ch = 0;
+    while ((ch = reader.read()) != -1){
+      builder.append((char)ch);
+    }
+    String result = builder.toString();
+    // System.out.println("Resu: " + result + "<EOL>");
+    // System.out.println("Gold: " + gold + "<EOL>");
+    assertTrue(result + " is not equal to " + gold + "<EOS>", result.equals(gold) == true);
+  }
+
+  public void testMoreEntities() throws Exception {
+    String test = "&nbsp; &lt;junk/&gt; &nbsp; &#33; &#64; and &#8217;";
+    String gold = "  <junk/>   ! @ and ’";
+    Set<String> set = new HashSet<String>();
+    set.add("reserved");
+    Reader reader = new JFlexHTMLStripCharFilter(CharReader.get(new StringReader(test)), set);
+    StringBuilder builder = new StringBuilder();
+    int ch = 0;
+    while ((ch = reader.read()) != -1){
+      builder.append((char)ch);
+    }
+    String result = builder.toString();
+    // System.out.println("Resu: " + result + "<EOL>");
+    // System.out.println("Gold: " + gold + "<EOL>");
+    assertTrue(result + " is not equal to " + gold, result.equals(gold) == true);
+  }
+
+  public void testReserved() throws Exception {
+    String test = "aaa bbb <reserved ccc=\"ddddd\"> eeee </reserved> ffff <reserved ggg=\"hhhh\"/> <other/>";
+    Set<String> set = new HashSet<String>();
+    set.add("reserved");
+    Reader reader = new JFlexHTMLStripCharFilter(CharReader.get(new StringReader(test)), set);
+    StringBuilder builder = new StringBuilder();
+    int ch = 0;
+    while ((ch = reader.read()) != -1){
+      builder.append((char)ch);
+    }
+    String result = builder.toString();
+    // System.out.println("Result: " + result);
+    assertTrue("Escaped tag not preserved: "  + result.indexOf("reserved"), result.indexOf("reserved") == 9);
+    assertTrue("Escaped tag not preserved: " + result.indexOf("reserved", 15), result.indexOf("reserved", 15) == 38);
+    assertTrue("Escaped tag not preserved: " + result.indexOf("reserved", 41), result.indexOf("reserved", 41) == 54);
+    assertTrue("Other tag should be removed", result.indexOf("other") == -1);
+  }
+
+  public void testMalformedHTML() throws Exception {
+    String test = "a <a hr<ef=aa<a>> </close</a>";
+    String gold = "a <a hr<ef=aa > </close ";
+    Reader reader = new JFlexHTMLStripCharFilter(CharReader.get(new StringReader(test)));
+    StringBuilder builder = new StringBuilder();
+    int ch = 0;
+    while ((ch = reader.read()) != -1){
+      builder.append((char)ch);
+    }
+    String result = builder.toString();
+    // System.out.println("Resu: " + result + "<EOL>");
+    // System.out.println("Gold: " + gold + "<EOL>");
+    assertTrue(result + " is not equal to " + gold + "<EOS>", result.equals(gold) == true);
+  }
+
+  public void testBufferOverflow() throws Exception {
+    StringBuilder testBuilder = new StringBuilder(JFlexHTMLStripCharFilter.getInitialBufferSize() + 50);
+    testBuilder.append("ah<?> ??????");
+    appendChars(testBuilder, JFlexHTMLStripCharFilter.getInitialBufferSize() + 500);
+    processBuffer(testBuilder.toString(), "Failed on pseudo proc. instr.");//processing instructions
+
+    testBuilder.setLength(0);
+    testBuilder.append("<!--");//comments
+    appendChars(testBuilder, 3 * JFlexHTMLStripCharFilter.getInitialBufferSize() + 500);//comments have two lookaheads
+
+    testBuilder.append("-->foo");
+    String gold = "foo";
+    Reader reader = new JFlexHTMLStripCharFilter(CharReader.get(new StringReader(testBuilder.toString())));
+    int ch = 0;
+    StringBuilder builder = new StringBuilder();
+    try {
+      while ((ch = reader.read()) != -1){
+        builder.append((char)ch);
+      }
+    } finally {
+      // System.out.println("String: " + builder.toString());
+    }
+    assertTrue(builder.toString() + " is not equal to " + gold, builder.toString().equals(gold));
+
+    testBuilder.setLength(0);
+    testBuilder.append("<?");
+    appendChars(testBuilder, JFlexHTMLStripCharFilter.getInitialBufferSize() + 500);
+    testBuilder.append("?>");
+    gold = "";
+    reader = new JFlexHTMLStripCharFilter(CharReader.get(new StringReader(testBuilder.toString())));
+    ch = 0;
+    builder = new StringBuilder();
+    try {
+      while ((ch = reader.read()) != -1){
+        builder.append((char)ch);
+      }
+    } finally {
+      // System.out.println("String: " + builder.toString());
+    }
+    assertTrue(builder.toString() + " is not equal to " + gold, builder.toString().equals(gold));
+    
+    testBuilder.setLength(0);
+    testBuilder.append("<b ");
+    appendChars(testBuilder, JFlexHTMLStripCharFilter.getInitialBufferSize() + 500);
+    testBuilder.append("/>");
+    gold = "";
+    reader = new JFlexHTMLStripCharFilter(CharReader.get(new StringReader(testBuilder.toString())));
+    ch = 0;
+    builder = new StringBuilder();
+    try {
+      while ((ch = reader.read()) != -1){
+        builder.append((char)ch);
+      }
+    } finally {
+      // System.out.println("String: " + builder.toString());
+    }
+    assertTrue(builder.toString() + " is not equal to " + gold, builder.toString().equals(gold));
+
+  }
+
+  private void appendChars(StringBuilder testBuilder, int numChars) {
+    int i1 = numChars / 2;
+    for (int i = 0; i < i1; i++){
+      testBuilder.append('a').append(' ');//tack on enough to go beyond the mark readahead limit, since <?> makes JFlexHTMLStripCharFilter think it is a processing instruction
+    }
+  }  
+
+
+  private void processBuffer(String test, String assertMsg) throws IOException {
+    // System.out.println("-------------------processBuffer----------");
+    Reader reader = new JFlexHTMLStripCharFilter(CharReader.get(new BufferedReader(new StringReader(test))));//force the use of BufferedReader
+    int ch = 0;
+    StringBuilder builder = new StringBuilder();
+    try {
+      while ((ch = reader.read()) != -1){
+        builder.append((char)ch);
+      }
+    } finally {
+      // System.out.println("String (trimmed): " + builder.toString().trim() + "<EOS>");
+    }
+    assertTrue(assertMsg + "::: " + builder.toString() + " is not equal to " + test, builder.toString().equals(test) == true);
+  }
+
+  public void testComment() throws Exception {
+
+    String test = "<!--- three dashes, still a valid comment ---> ";
+    String gold = " ";
+    Reader reader = new JFlexHTMLStripCharFilter(CharReader.get(new BufferedReader(new StringReader(test))));//force the use of BufferedReader
+    int ch = 0;
+    StringBuilder builder = new StringBuilder();
+    try {
+      while ((ch = reader.read()) != -1){
+        builder.append((char)ch);
+      }
+    } finally {
+      // System.out.println("String: " + builder.toString());
+    }
+    assertTrue(builder.toString() + " is not equal to " + gold + "<EOS>", builder.toString().equals(gold) == true);
+  }
+
+
+  public void doTestOffsets(String in) throws Exception {
+    JFlexHTMLStripCharFilter reader = new JFlexHTMLStripCharFilter(CharReader.get(new BufferedReader(new StringReader(in))));
+    int ch = 0;
+    int off = 0;     // offset in the reader
+    int strOff = -1; // offset in the original string
+    while ((ch = reader.read()) != -1) {
+      int correctedOff = reader.correctOffset(off);
+
+      if (ch == 'X') {
+        strOff = in.indexOf('X',strOff+1);
+        assertEquals(strOff, correctedOff);
+      }
+
+      off++;
+    }
+  }
+
+  public void testOffsets() throws Exception {
+    doTestOffsets("hello X how X are you");
+    doTestOffsets("hello <p> X<p> how <p>X are you");
+    doTestOffsets("X &amp; X &#40; X &lt; &gt; X");
+
+    // test backtracking
+    doTestOffsets("X < &zz >X &# < X > < &l > &g < X");
+  }
+
+  static void assertLegalOffsets(String in) throws Exception {
+    int length = in.length();
+    JFlexHTMLStripCharFilter reader = new JFlexHTMLStripCharFilter(CharReader.get(new BufferedReader(new StringReader(in))));
+    int ch = 0;
+    int off = 0;
+    while ((ch = reader.read()) != -1) {
+      int correction = reader.correctOffset(off);
+      assertTrue("invalid offset correction: " + off + "->" + correction + " for doc of length: " + length,
+          correction <= length);
+      off++;
+    }
+  }
+
+  public void testLegalOffsets() throws Exception {
+    assertLegalOffsets("hello world");
+    assertLegalOffsets("hello &#x world");
+  }
+
+  public void testRandom() throws Exception {
+    Analyzer analyzer = new Analyzer() {
+
+      @Override
+      protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
+        Tokenizer tokenizer = new MockTokenizer(reader, MockTokenizer.WHITESPACE, false);
+        return new TokenStreamComponents(tokenizer, tokenizer);
+      }
+
+      @Override
+      protected Reader initReader(Reader reader) {
+        return new JFlexHTMLStripCharFilter(CharReader.get(new BufferedReader(reader)));
+      }
+    };
+    
+    int numRounds = RANDOM_MULTIPLIER * 10000;
+    checkRandomData(random, analyzer, numRounds);
+  }
+  
+  public void testServerSideIncludes() throws Exception {
+    String test = "one<img src=\"image.png\"\n"
+        + " alt =  \"Alt: <!--#echo var='${IMAGE_CAPTION:<!--comment-->\\'Comment\\'}'  -->\"\n\n"
+        + " title=\"Title: <!--#echo var=\"IMAGE_CAPTION\"-->\">two";
+    String gold = "one two";
+    Reader reader = new JFlexHTMLStripCharFilter(CharReader.get(new StringReader(test)));
+    int ch = 0;
+    StringBuilder builder = new StringBuilder();
+    try {
+      while ((ch = reader.read()) != -1){
+        builder.append((char)ch);
+      }
+    } finally {
+      // System.out.println("String: " + builder.toString());
+    }
+    assertTrue(builder.toString() + " is not equal to " + gold, builder.toString().equals(gold));
+
+    test = "one<script><!-- <!--#config comment=\"<!-- \\\"comment\\\"-->\"--> --></script>two";
+    gold = "one two";
+    reader = new JFlexHTMLStripCharFilter(CharReader.get(new StringReader(test)));
+    ch = 0;
+    builder = new StringBuilder();
+    try {
+      while ((ch = reader.read()) != -1){
+        builder.append((char)ch);
+      }
+    } finally {
+      // System.out.println("String: " + builder.toString());
+    }
+    assertTrue(builder.toString() + " is not equal to " + gold, builder.toString().equals(gold));
+  }
+
+  public void testScriptQuotes() throws Exception {
+    String test = "one<script attr= bare><!-- action('<!-- comment -->', \"\\\"-->\\\"\"); --></script>two";
+    String gold = "one two";
+    Reader reader = new JFlexHTMLStripCharFilter(CharReader.get(new StringReader(test)));
+    int ch = 0;
+    StringBuilder builder = new StringBuilder();
+    try {
+      while ((ch = reader.read()) != -1){
+        builder.append((char)ch);
+      }
+    } finally {
+      // System.out.println("String: " + builder.toString());
+    }
+    assertTrue(builder.toString() + " is not equal to " + gold, builder.toString().equals(gold));
+
+    test = "hello<script><!-- f('<!--internal--></script>'); --></script>";
+    gold = "hello ";
+    reader = new JFlexHTMLStripCharFilter(CharReader.get(new StringReader(test)));
+    ch = 0;
+    builder = new StringBuilder();
+    try {
+      while ((ch = reader.read()) != -1){
+        builder.append((char)ch);
+      }
+    } finally {
+      // System.out.println("String: " + builder.toString());
+    }
+    assertTrue(builder.toString() + " is not equal to " + gold, builder.toString().equals(gold));
+  }
+
+  public void testEscapeScript() throws Exception {
+    String test = "one<script no-value-attr>callSomeMethod();</script>two";
+    String gold = "one<script no-value-attr></script>two";
+    Set<String> escapedTags = new HashSet<String>(Arrays.asList("SCRIPT"));
+    Reader reader = new JFlexHTMLStripCharFilter
+        (CharReader.get(new StringReader(test)), escapedTags);
+    int ch = 0;
+    StringBuilder builder = new StringBuilder();
+    try {
+      while ((ch = reader.read()) != -1){
+        builder.append((char)ch);
+      }
+    } finally {
+      // System.out.println("String: " + builder.toString());
+    }
+    assertTrue(builder.toString() + " is not equal to " + gold, builder.toString().equals(gold));
+  }
+
+  public void testEscapeBR() throws Exception {
+    String test = "one<BR class='whatever'>two</\nBR\n>";
+    String gold = "one<BR class='whatever'>two</\nBR\n>";
+    Set<String> escapedTags = new HashSet<String>(Arrays.asList("BR"));
+    Reader reader = new JFlexHTMLStripCharFilter
+        (CharReader.get(new StringReader(test)), escapedTags);
+    int ch = 0;
+    StringBuilder builder = new StringBuilder();
+    try {
+      while ((ch = reader.read()) != -1){
+        builder.append((char)ch);
+      }
+    } finally {
+      // System.out.println("String: " + builder.toString());
+    }
+    assertTrue(builder.toString() + " is not equal to " + gold, builder.toString().equals(gold));
+  }
+  
+  public void testInlineTagsNoSpace() throws Exception {
+    String test = "one<sPAn class=\"invisible\">two<sup>2<sup>e</sup></sup>.</SpaN>three";
+    String gold = "onetwo 2 e  .three";
+    Reader reader = new JFlexHTMLStripCharFilter(CharReader.get(new StringReader(test)));
+    int ch = 0;
+    StringBuilder builder = new StringBuilder();
+    try {
+      while ((ch = reader.read()) != -1){
+        builder.append((char)ch);
+      }
+    } finally {
+      // System.out.println("String: " + builder.toString());
+    }
+    assertTrue(builder.toString() + " is not equal to " + gold, builder.toString().equals(gold));
+  }
+}
Index: modules/analysis/common/src/java/org/apache/lucene/analysis/charfilter/JFlexHTMLStripCharFilter.java
===================================================================
--- modules/analysis/common/src/java/org/apache/lucene/analysis/charfilter/JFlexHTMLStripCharFilter.java	(revision 0)
+++ modules/analysis/common/src/java/org/apache/lucene/analysis/charfilter/JFlexHTMLStripCharFilter.java	(revision 0)
@@ -0,0 +1,2726 @@
+/* The following code was generated by JFlex 1.5.0-SNAPSHOT on 1/12/12 12:26 AM */
+
+package org.apache.lucene.analysis.charfilter;
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.IOException;
+import java.util.Set;
+
+import org.apache.lucene.util.Version;
+import org.apache.lucene.analysis.CharStream;
+import org.apache.lucene.analysis.util.CharArrayMap;
+import org.apache.lucene.analysis.util.CharArraySet;
+import org.apache.lucene.analysis.util.OpenStringBuilder;
+
+
+/**
+ * A CharFilter that wraps another Reader and attempts to strip out HTML constructs.
+ */
+
+public final class JFlexHTMLStripCharFilter extends BaseCharFilter {
+
+  /** This character denotes the end of file */
+  private static final int YYEOF = -1;
+
+  /** initial size of the lookahead buffer */
+  private static final int ZZ_BUFFERSIZE = 16384;
+
+  /** lexical states */
+  private static final int DOUBLE_QUOTED_STRING = 28;
+  private static final int CHARACTER_REFERENCE_TAIL = 6;
+  private static final int START_TAG_TAIL_EXCLUDE = 38;
+  private static final int SCRIPT = 14;
+  private static final int CDATA = 22;
+  private static final int LEFT_ANGLE_BRACKET = 8;
+  private static final int END_TAG_TAIL_EXCLUDE = 32;
+  private static final int SERVER_SIDE_INCLUDE = 24;
+  private static final int SINGLE_QUOTED_STRING = 26;
+  private static final int YYINITIAL = 0;
+  private static final int START_TAG_TAIL_INCLUDE = 36;
+  private static final int AMPERSAND = 2;
+  private static final int BANG = 10;
+  private static final int LEFT_ANGLE_BRACKET_SLASH = 18;
+  private static final int COMMENT = 12;
+  private static final int SCRIPT_COMMENT = 16;
+  private static final int LEFT_ANGLE_BRACKET_SPACE = 20;
+  private static final int START_TAG_TAIL_SUBSTITUTE_SPACE = 40;
+  private static final int NUMERIC_CHARACTER = 4;
+  private static final int END_TAG_TAIL_INCLUDE = 30;
+  private static final int END_TAG_TAIL_SUBSTITUTE_SPACE = 34;
+
+  /**
+   * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
+   * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l
+   *                  at the beginning of a line
+   * l is of the form l = 2*k, k a non negative integer
+   */
+  private static final int ZZ_LEXSTATE[] = { 
+     0,  0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  6,  7,  7, 
+     8,  8,  9,  9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 
+    16, 16, 17, 17, 18, 18, 19, 19, 20, 20
+  };
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\5\12\22\0\1\12\1\4\1\10\1\6\2\0\1\100\1\11"+
+    "\5\0\1\5\1\2\1\104\1\101\1\71\1\72\1\74\1\73\5\101"+
+    "\1\1\1\102\1\3\1\13\1\7\1\103\1\0\1\37\1\56\1\30"+
+    "\1\25\1\40\1\21\1\27\1\57\1\26\1\1\1\32\1\33\1\31"+
+    "\1\23\1\22\1\34\1\1\1\35\1\17\1\24\1\14\1\36\1\1"+
+    "\1\62\1\63\1\64\1\105\1\107\1\106\1\0\1\1\1\0\1\16"+
+    "\1\15\1\44\1\54\1\20\1\65\1\43\1\52\1\42\1\77\1\32"+
+    "\1\41\1\55\1\53\1\61\1\51\1\67\1\47\1\60\1\46\1\45"+
+    "\1\50\1\75\1\70\1\66\1\76\12\0\1\12\32\0\1\12\11\0"+
+    "\1\1\12\0\1\1\1\0\1\2\2\0\1\1\5\0\27\1\1\0"+
+    "\37\1\1\0\u01ca\1\4\0\14\1\16\0\5\1\7\0\1\1\1\0"+
+    "\1\1\21\0\160\2\5\1\1\0\2\1\3\0\3\1\10\0\1\1"+
+    "\1\2\3\1\1\0\1\1\1\0\24\1\1\0\123\1\1\0\213\1"+
+    "\1\0\5\2\2\0\236\1\11\0\46\1\2\0\1\1\7\0\47\1"+
+    "\11\0\55\2\1\0\1\2\1\0\2\2\1\0\2\2\1\0\1\2"+
+    "\10\0\33\1\5\0\3\1\35\0\13\2\5\0\53\1\37\2\4\0"+
+    "\2\1\1\2\143\1\1\0\1\1\7\2\2\0\6\2\2\1\2\2"+
+    "\1\0\4\2\2\1\12\2\3\1\2\0\1\1\20\0\1\1\1\2"+
+    "\36\1\33\2\2\0\131\1\13\2\1\1\16\0\12\2\41\1\11\2"+
+    "\2\1\4\0\1\1\5\0\26\1\4\2\1\1\11\2\1\1\3\2"+
+    "\1\1\5\2\22\0\31\1\3\2\244\0\4\2\66\1\3\2\1\1"+
+    "\22\2\1\1\7\2\12\1\2\2\2\0\12\2\1\0\7\1\1\0"+
+    "\7\1\1\0\3\2\1\0\10\1\2\0\2\1\2\0\26\1\1\0"+
+    "\7\1\1\0\1\1\3\0\4\1\2\0\1\2\1\1\7\2\2\0"+
+    "\2\2\2\0\3\2\1\1\10\0\1\2\4\0\2\1\1\0\3\1"+
+    "\2\2\2\0\12\2\2\1\17\0\3\2\1\0\6\1\4\0\2\1"+
+    "\2\0\26\1\1\0\7\1\1\0\2\1\1\0\2\1\1\0\2\1"+
+    "\2\0\1\2\1\0\5\2\4\0\2\2\2\0\3\2\3\0\1\2"+
+    "\7\0\4\1\1\0\1\1\7\0\14\2\3\1\1\2\13\0\3\2"+
+    "\1\0\11\1\1\0\3\1\1\0\26\1\1\0\7\1\1\0\2\1"+
+    "\1\0\5\1\2\0\1\2\1\1\10\2\1\0\3\2\1\0\3\2"+
+    "\2\0\1\1\17\0\2\1\2\2\2\0\12\2\21\0\3\2\1\0"+
+    "\10\1\2\0\2\1\2\0\26\1\1\0\7\1\1\0\2\1\1\0"+
+    "\5\1\2\0\1\2\1\1\7\2\2\0\2\2\2\0\3\2\10\0"+
+    "\2\2\4\0\2\1\1\0\3\1\2\2\2\0\12\2\1\0\1\1"+
+    "\20\0\1\2\1\1\1\0\6\1\3\0\3\1\1\0\4\1\3\0"+
+    "\2\1\1\0\1\1\1\0\2\1\3\0\2\1\3\0\3\1\3\0"+
+    "\14\1\4\0\5\2\3\0\3\2\1\0\4\2\2\0\1\1\6\0"+
+    "\1\2\16\0\12\2\21\0\3\2\1\0\10\1\1\0\3\1\1\0"+
+    "\27\1\1\0\12\1\1\0\5\1\3\0\1\1\7\2\1\0\3\2"+
+    "\1\0\4\2\7\0\2\2\1\0\2\1\6\0\2\1\2\2\2\0"+
+    "\12\2\22\0\2\2\1\0\10\1\1\0\3\1\1\0\27\1\1\0"+
+    "\12\1\1\0\5\1\2\0\1\2\1\1\7\2\1\0\3\2\1\0"+
+    "\4\2\7\0\2\2\7\0\1\1\1\0\2\1\2\2\2\0\12\2"+
+    "\1\0\2\1\17\0\2\2\1\0\10\1\1\0\3\1\1\0\51\1"+
+    "\2\0\1\1\7\2\1\0\3\2\1\0\4\2\1\1\10\0\1\2"+
+    "\10\0\2\1\2\2\2\0\12\2\12\0\6\1\2\0\2\2\1\0"+
+    "\22\1\3\0\30\1\1\0\11\1\1\0\1\1\2\0\7\1\3\0"+
+    "\1\2\4\0\6\2\1\0\1\2\1\0\10\2\22\0\2\2\15\0"+
+    "\60\1\1\2\1\1\10\2\5\0\7\1\10\2\1\0\12\2\47\0"+
+    "\2\1\1\0\1\1\2\0\2\1\1\0\1\1\2\0\1\1\6\0"+
+    "\4\1\1\0\7\1\1\0\3\1\1\0\1\1\1\0\1\1\2\0"+
+    "\2\1\1\0\4\1\1\2\1\1\7\2\1\0\2\2\1\1\2\0"+
+    "\5\1\1\0\1\1\1\0\6\2\2\0\12\2\2\0\2\1\42\0"+
+    "\1\1\27\0\2\2\6\0\12\2\13\0\1\2\1\0\1\2\1\0"+
+    "\1\2\4\0\2\2\10\1\1\0\44\1\4\0\24\2\1\0\2\2"+
+    "\5\1\13\2\1\0\44\2\11\0\1\2\71\0\53\1\24\2\1\1"+
+    "\12\2\6\0\6\1\4\2\4\1\3\2\1\1\3\2\2\1\7\2"+
+    "\3\1\4\2\15\1\14\2\1\1\17\2\2\0\46\1\12\0\53\1"+
+    "\1\0\1\1\3\0\u0149\1\1\0\4\1\2\0\7\1\1\0\1\1"+
+    "\1\0\4\1\2\0\51\1\1\0\4\1\2\0\41\1\1\0\4\1"+
+    "\2\0\7\1\1\0\1\1\1\0\4\1\2\0\17\1\1\0\71\1"+
+    "\1\0\4\1\2\0\103\1\2\0\3\2\11\0\11\2\16\0\20\1"+
+    "\20\0\125\1\14\0\u026c\1\2\0\21\1\1\12\32\1\5\0\113\1"+
+    "\3\0\3\1\17\0\15\1\1\0\4\1\3\2\13\0\22\1\3\2"+
+    "\13\0\22\1\2\2\14\0\15\1\1\0\3\1\1\0\2\2\14\0"+
+    "\64\1\2\0\36\2\3\0\1\1\4\0\1\1\1\2\2\0\12\2"+
+    "\41\0\3\2\1\12\1\0\12\2\6\0\130\1\10\0\51\1\1\2"+
+    "\1\1\5\0\106\1\12\0\35\1\3\0\14\2\4\0\14\2\12\0"+
+    "\12\2\36\1\2\0\5\1\13\0\54\1\4\0\21\2\7\1\2\2"+
+    "\6\0\13\2\45\0\27\1\5\2\4\0\65\1\12\2\1\0\35\2"+
+    "\2\0\13\2\6\0\12\2\15\0\1\1\130\0\5\2\57\1\21\2"+
+    "\7\1\4\0\12\2\21\0\11\2\14\0\3\2\36\1\12\2\3\0"+
+    "\2\1\12\2\6\0\46\1\16\2\14\0\44\1\24\2\10\0\12\2"+
+    "\3\0\3\1\12\2\44\1\122\0\3\2\1\0\25\2\4\1\1\2"+
+    "\4\1\1\2\15\0\300\1\47\2\25\0\4\2\u0116\1\2\0\6\1"+
+    "\2\0\46\1\2\0\6\1\2\0\10\1\1\0\1\1\1\0\1\1"+
+    "\1\0\1\1\1\0\37\1\2\0\65\1\1\0\7\1\1\0\1\1"+
+    "\3\0\3\1\1\0\7\1\3\0\4\1\2\0\6\1\4\0\15\1"+
+    "\5\0\3\1\1\0\7\1\3\0\13\12\35\0\2\12\5\0\1\12"+
+    "\17\0\2\2\23\0\1\2\12\0\1\12\21\0\1\1\15\0\1\1"+
+    "\20\0\15\1\63\0\15\2\4\0\1\2\3\0\14\2\21\0\1\1"+
+    "\4\0\1\1\2\0\12\1\1\0\1\1\2\0\6\1\6\0\1\1"+
+    "\1\0\1\1\1\0\1\1\1\0\20\1\2\0\4\1\5\0\5\1"+
+    "\4\0\1\1\21\0\51\1\u0a77\0\57\1\1\0\57\1\1\0\205\1"+
+    "\6\0\4\1\3\2\16\0\46\1\12\0\66\1\11\0\1\1\17\0"+
+    "\1\2\27\1\11\0\7\1\1\0\7\1\1\0\7\1\1\0\7\1"+
+    "\1\0\7\1\1\0\7\1\1\0\7\1\1\0\7\1\1\0\40\2"+
+    "\u0200\0\1\12\4\0\3\1\31\0\11\1\6\2\1\0\5\1\2\0"+
+    "\5\1\4\0\126\1\2\0\2\2\2\0\3\1\1\0\132\1\1\0"+
+    "\4\1\5\0\51\1\3\0\136\1\21\0\33\1\65\0\20\1\u0200\0"+
+    "\u19b6\1\112\0\u51cc\1\64\0\u048d\1\103\0\56\1\2\0\u010d\1\3\0"+
+    "\20\1\12\2\2\1\24\0\57\1\1\2\14\0\2\2\1\0\31\1"+
+    "\10\0\120\1\2\2\45\0\11\1\2\0\147\1\2\0\4\1\1\0"+
+    "\2\1\16\0\12\1\120\0\10\1\1\2\3\1\1\2\4\1\1\2"+
+    "\27\1\5\2\30\0\64\1\14\0\2\2\62\1\21\2\13\0\12\2"+
+    "\6\0\22\2\6\1\3\0\1\1\4\0\12\2\34\1\10\2\2\0"+
+    "\27\1\15\2\14\0\35\1\3\0\4\2\57\1\16\2\16\0\1\1"+
+    "\12\2\46\0\51\1\16\2\11\0\3\1\1\2\10\1\2\2\2\0"+
+    "\12\2\6\0\27\1\3\0\1\1\1\2\4\0\60\1\1\2\1\1"+
+    "\3\2\2\1\2\2\5\1\2\2\1\1\1\2\1\1\30\0\3\1"+
+    "\43\0\6\1\2\0\6\1\2\0\6\1\11\0\7\1\1\0\7\1"+
+    "\221\0\43\1\10\2\1\0\2\2\2\0\12\2\6\0\u2ba4\1\14\0"+
+    "\27\1\4\0\61\1\u2104\0\u012e\1\2\0\76\1\2\0\152\1\46\0"+
+    "\7\1\14\0\5\1\5\0\1\1\1\2\12\1\1\0\15\1\1\0"+
+    "\5\1\1\0\1\1\1\0\2\1\1\0\2\1\1\0\154\1\41\0"+
+    "\213\1\6\0\332\1\22\0\100\1\2\0\66\1\50\0\12\1\6\0"+
+    "\20\2\20\0\7\2\14\0\2\2\30\0\3\2\41\0\1\1\1\0"+
+    "\1\1\3\0\1\1\1\0\1\1\1\0\1\1\1\0\1\1\1\0"+
+    "\176\1\23\0\12\2\7\0\32\1\4\0\1\2\1\0\32\1\13\0"+
+    "\70\1\2\2\37\1\3\0\6\1\2\0\6\1\2\0\6\1\2\0"+
+    "\3\1\43\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\25\0\1\1\1\2\1\3\1\4\1\5\52\4\1\6"+
+    "\1\7\1\10\1\11\1\12\3\13\10\10\1\4\1\14"+
+    "\2\4\1\15\1\4\6\16\1\17\1\20\1\21\1\22"+
+    "\3\23\10\21\2\13\2\24\1\16\1\25\1\26\1\27"+
+    "\1\16\1\30\1\4\1\15\1\4\1\31\3\4\1\32"+
+    "\2\4\1\33\2\4\34\0\1\34\54\0\1\34\24\0"+
+    "\1\34\7\0\1\35\2\0\20\10\3\0\1\36\7\0"+
+    "\17\21\105\0\1\34\6\0\2\34\12\0\1\10\1\37"+
+    "\2\0\6\10\2\0\1\40\3\0\1\41\1\21\1\42"+
+    "\1\0\5\21\1\43\1\44\36\0\1\10\1\0\4\10"+
+    "\2\0\1\45\2\0\4\21\15\0\1\34\1\0\1\34"+
+    "\4\0\1\10\1\0\1\46\1\0\1\47\21\0\1\10"+
+    "\14\0\1\50\1\0\1\51\25\0\1\52\40\0\1\30"+
+    "\5\0\1\30\5\0\1\32\5\0\1\32\5\0\1\33"+
+    "\5\0\1\33\27\0\1\37\5\0\1\37\102\0\1\30"+
+    "\4\0\1\30\4\0\1\32\4\0\1\32\4\0\1\33"+
+    "\4\0\1\33\44\0\1\37\4\0\1\37\7\0\1\50"+
+    "\4\0\1\50\161\0\1\50\4\0\1\50\7\0\1\30"+
+    "\13\0\1\32\13\0\1\33\54\0\1\37\66\0\1\30"+
+    "\2\0\1\30\7\0\1\32\2\0\1\32\7\0\1\33"+
+    "\2\0\1\33\17\0\1\30\4\0\1\32\4\0\1\33"+
+    "\11\0\1\37\2\0\1\37\35\0\1\37\7\0\1\50"+
+    "\134\0\1\50\1\0\1\50\11\0\1\50\36\0";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[1249];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\110\0\220\0\330\0\u0120\0\u0168\0\u01b0\0\u01f8"+
+    "\0\u0240\0\u0288\0\u02d0\0\u0318\0\u0360\0\u03a8\0\u03f0\0\u0438"+
+    "\0\u0480\0\u04c8\0\u0510\0\u0558\0\u05a0\0\u05e8\0\u05e8\0\u05e8"+
+    "\0\u05e8\0\u05e8\0\u0630\0\u0678\0\u06c0\0\u0708\0\u0750\0\u0798"+
+    "\0\u07e0\0\u0828\0\u0870\0\u08b8\0\u0900\0\u0948\0\u0990\0\u09d8"+
+    "\0\u0a20\0\u0a68\0\u0ab0\0\u0af8\0\u0b40\0\u0b88\0\u0bd0\0\u0c18"+
+    "\0\u0c60\0\u0ca8\0\u0cf0\0\u0d38\0\u0d80\0\u0dc8\0\u0e10\0\u0e58"+
+    "\0\u0ea0\0\u0ee8\0\u0f30\0\u0f78\0\u0fc0\0\u1008\0\u1050\0\u1098"+
+    "\0\u10e0\0\u1128\0\u1170\0\u11b8\0\u1200\0\u05e8\0\u1248\0\u05e8"+
+    "\0\u1290\0\u1248\0\u12d8\0\u1320\0\u1368\0\u13b0\0\u13f8\0\u1440"+
+    "\0\u1488\0\u14d0\0\u1518\0\u1560\0\u15a8\0\u05e8\0\u15f0\0\u1638"+
+    "\0\u15f0\0\u1680\0\u05e8\0\u16c8\0\u1710\0\u1758\0\u17a0\0\u17e8"+
+    "\0\u05e8\0\u05e8\0\u1830\0\u1878\0\u1830\0\u18c0\0\u1908\0\u1950"+
+    "\0\u1998\0\u19e0\0\u1a28\0\u1a70\0\u1ab8\0\u1b00\0\u1b48\0\u1b90"+
+    "\0\u1bd8\0\u05e8\0\u1c20\0\u1c68\0\u05e8\0\u05e8\0\u05e8\0\u1cb0"+
+    "\0\u05e8\0\u1cf8\0\u05e8\0\u1d40\0\u05e8\0\u1d88\0\u1dd0\0\u1e18"+
+    "\0\u05e8\0\u1e60\0\u1ea8\0\u05e8\0\u1ef0\0\u1f38\0\u1f80\0\u1fc8"+
+    "\0\u2010\0\u2058\0\u20a0\0\u20e8\0\u2130\0\u2178\0\u21c0\0\u2208"+
+    "\0\u2250\0\u2298\0\u22e0\0\u2328\0\u2370\0\u23b8\0\u2400\0\u2448"+
+    "\0\u2490\0\u24d8\0\u2520\0\u2568\0\u25b0\0\u25f8\0\u2640\0\u2688"+
+    "\0\u26d0\0\u2718\0\u05e8\0\u0990\0\u0ee8\0\u2760\0\u27a8\0\u27f0"+
+    "\0\u2838\0\u2880\0\u0fc0\0\u28c8\0\u2910\0\u2958\0\u29a0\0\u29e8"+
+    "\0\u2a30\0\u2a78\0\u2ac0\0\u2b08\0\u2b50\0\u2b98\0\u2be0\0\u2c28"+
+    "\0\u2c70\0\u2cb8\0\u2d00\0\u2d48\0\u2d90\0\u2dd8\0\u2e20\0\u2e68"+
+    "\0\u2eb0\0\u2ef8\0\u2f40\0\u2f88\0\u2fd0\0\u3018\0\u3060\0\u30a8"+
+    "\0\u30f0\0\u3138\0\u3180\0\u31c8\0\u3210\0\u3258\0\u32a0\0\u32e8"+
+    "\0\u3330\0\u3378\0\u33c0\0\u3408\0\u3450\0\u3498\0\u34e0\0\u3528"+
+    "\0\u3570\0\u35b8\0\u3600\0\u3648\0\u3690\0\u36d8\0\u3720\0\u3768"+
+    "\0\u37b0\0\u37f8\0\u3840\0\u3888\0\u38d0\0\u3918\0\u3960\0\u39a8"+
+    "\0\u39f0\0\u3a38\0\u3a80\0\u3ac8\0\u11b8\0\u3b10\0\u3b58\0\u3ba0"+
+    "\0\u3be8\0\u3c30\0\u3c78\0\u3cc0\0\u3d08\0\u3d50\0\u3d98\0\u3de0"+
+    "\0\u3e28\0\u3e70\0\u3eb8\0\u3f00\0\u3f48\0\u3f90\0\u3fd8\0\u15a8"+
+    "\0\u4020\0\u15f0\0\u05e8\0\u4068\0\u40b0\0\u40f8\0\u4140\0\u4188"+
+    "\0\u41d0\0\u4218\0\u4260\0\u42a8\0\u42f0\0\u4338\0\u4380\0\u43c8"+
+    "\0\u4410\0\u4458\0\u44a0\0\u44e8\0\u4530\0\u4578\0\u45c0\0\u4608"+
+    "\0\u4650\0\u4698\0\u46e0\0\u1cf8\0\u1d40\0\u1d88\0\u4728\0\u1dd0"+
+    "\0\u1e18\0\u4770\0\u1e60\0\u1ea8\0\u47b8\0\u1ef0\0\u1f38\0\u4800"+
+    "\0\u4848\0\u4890\0\u48d8\0\u4920\0\u4968\0\u49b0\0\u49f8\0\u4a40"+
+    "\0\u4a88\0\u4ad0\0\u4b18\0\u4b60\0\u4ba8\0\u4bf0\0\u4c38\0\u4c80"+
+    "\0\u4cc8\0\u4d10\0\u4d58\0\u4da0\0\u4de8\0\u4e30\0\u4e78\0\u4ec0"+
+    "\0\u4f08\0\u4f50\0\u4f98\0\u4fe0\0\u5028\0\u5070\0\u50b8\0\u5100"+
+    "\0\u5148\0\u5190\0\u51d8\0\u5220\0\u5268\0\u52b0\0\u52f8\0\u5340"+
+    "\0\u5388\0\u53d0\0\u5418\0\u5460\0\u54a8\0\u54f0\0\u5538\0\u5580"+
+    "\0\u55c8\0\u5610\0\u5658\0\u56a0\0\u56e8\0\u5730\0\u2d90\0\u5778"+
+    "\0\u57c0\0\u5808\0\u5850\0\u5898\0\u58e0\0\u5928\0\u5970\0\u59b8"+
+    "\0\u5a00\0\u5a48\0\u5a90\0\u5ad8\0\u5b20\0\u5b68\0\u5bb0\0\u5bf8"+
+    "\0\u5c40\0\u5c88\0\u05e8\0\u5cd0\0\u5d18\0\u5d60\0\u5da8\0\u5df0"+
+    "\0\u5e38\0\u5e80\0\u5ec8\0\u5f10\0\u5f58\0\u05e8\0\u5fa0\0\u5fe8"+
+    "\0\u6030\0\u05e8\0\u6078\0\u05e8\0\u60c0\0\u6108\0\u6150\0\u6198"+
+    "\0\u61e0\0\u6228\0\u05e8\0\u05e8\0\u6270\0\u62b8\0\u6300\0\u6348"+
+    "\0\u6390\0\u63d8\0\u6420\0\u6468\0\u64b0\0\u64f8\0\u5928\0\u6540"+
+    "\0\u32e8\0\u6588\0\u65d0\0\u6618\0\u6660\0\u66a8\0\u66f0\0\u6738"+
+    "\0\u6780\0\u67c8\0\u6810\0\u6858\0\u68a0\0\u68e8\0\u6930\0\u6978"+
+    "\0\u69c0\0\u6a08\0\u6a50\0\u6a98\0\u6ae0\0\u6b28\0\u6b70\0\u6bb8"+
+    "\0\u6c00\0\u6c48\0\u05e8\0\u6c90\0\u6cd8\0\u6d20\0\u6d68\0\u6db0"+
+    "\0\u6df8\0\u6e40\0\u6e88\0\u6ed0\0\u6f18\0\u6f60\0\u6fa8\0\u6ff0"+
+    "\0\u7038\0\u7080\0\u70c8\0\u7110\0\u7158\0\u71a0\0\u64f8\0\u71e8"+
+    "\0\u5ad8\0\u7230\0\u7278\0\u72c0\0\u7308\0\u7350\0\u7398\0\u05e8"+
+    "\0\u73e0\0\u05e8\0\u7428\0\u7470\0\u74b8\0\u7500\0\u7548\0\u7590"+
+    "\0\u75d8\0\u7620\0\u7668\0\u76b0\0\u76f8\0\u7740\0\u7788\0\u77d0"+
+    "\0\u7818\0\u7860\0\u78a8\0\u78f0\0\u7938\0\u7980\0\u79c8\0\u7a10"+
+    "\0\u7a58\0\u7aa0\0\u7ae8\0\u7b30\0\u7b78\0\u7bc0\0\u7c08\0\u7c50"+
+    "\0\u05e8\0\u7c98\0\u15f0\0\u7ce0\0\u7d28\0\u7d70\0\u7db8\0\u7e00"+
+    "\0\u7e48\0\u7e90\0\u7ed8\0\u7f20\0\u7f68\0\u7fb0\0\u7ff8\0\u8040"+
+    "\0\u8088\0\u80d0\0\u8118\0\u8160\0\u81a8\0\u81f0\0\u8238\0\u8280"+
+    "\0\u05e8\0\u82c8\0\u8310\0\u8358\0\u83a0\0\u83e8\0\u8430\0\u8478"+
+    "\0\u84c0\0\u8508\0\u8550\0\u8598\0\u85e0\0\u8628\0\u8670\0\u86b8"+
+    "\0\u8700\0\u8748\0\u8790\0\u87d8\0\u8820\0\u8868\0\u88b0\0\u88f8"+
+    "\0\u8940\0\u8988\0\u89d0\0\u8a18\0\u8a60\0\u8aa8\0\u8af0\0\u8b38"+
+    "\0\u8b80\0\u8b38\0\u8bc8\0\u8c10\0\u8c58\0\u8ca0\0\u8ce8\0\u8ca0"+
+    "\0\u8d30\0\u8d78\0\u8dc0\0\u8e08\0\u8e50\0\u8e08\0\u8e98\0\u8ee0"+
+    "\0\u8f28\0\u8f70\0\u8fb8\0\u8f70\0\u9000\0\u9048\0\u9090\0\u90d8"+
+    "\0\u9120\0\u90d8\0\u9168\0\u91b0\0\u91f8\0\u9240\0\u9288\0\u9240"+
+    "\0\u92d0\0\u9318\0\u9360\0\u93a8\0\u93f0\0\u9438\0\u9480\0\u94c8"+
+    "\0\u9510\0\u9558\0\u95a0\0\u95e8\0\u9630\0\u9678\0\u96c0\0\u9708"+
+    "\0\u9750\0\u9798\0\u97e0\0\u9828\0\u9870\0\u98b8\0\u9900\0\u98b8"+
+    "\0\u9948\0\u9990\0\u99d8\0\u9a20\0\u9a68\0\u9a20\0\u9ab0\0\u9af8"+
+    "\0\u9b40\0\u9b88\0\u9bd0\0\u9c18\0\u9c60\0\u9ca8\0\u9cf0\0\u9d38"+
+    "\0\u9d80\0\u9dc8\0\u9e10\0\u9e58\0\u9ea0\0\u9ee8\0\u9f30\0\u9f78"+
+    "\0\u9fc0\0\ua008\0\ua050\0\ua098\0\ua0e0\0\ua128\0\ua170\0\ua1b8"+
+    "\0\ua200\0\ua248\0\ua290\0\ua2d8\0\ua320\0\ua368\0\ua3b0\0\ua3f8"+
+    "\0\ua440\0\ua488\0\ua4d0\0\ua518\0\ua560\0\ua5a8\0\ua5f0\0\ua638"+
+    "\0\ua680\0\ua6c8\0\ua710\0\ua758\0\ua7a0\0\ua7e8\0\ua830\0\ua878"+
+    "\0\ua8c0\0\ua908\0\ua950\0\ua998\0\ua9e0\0\uaa28\0\uaa70\0\uaab8"+
+    "\0\uab00\0\uab48\0\uab90\0\uabd8\0\uac20\0\uac68\0\uacb0\0\uacf8"+
+    "\0\u6e88\0\uad40\0\uad88\0\uadd0\0\uae18\0\u6ed0\0\uae60\0\uaea8"+
+    "\0\uaef0\0\uaf38\0\u6fa8\0\uaf80\0\uafc8\0\ub010\0\ub058\0\u6ff0"+
+    "\0\ub0a0\0\ub0e8\0\ub130\0\ub178\0\u70c8\0\ub1c0\0\ub208\0\ub250"+
+    "\0\ub298\0\u7110\0\ub2e0\0\ub328\0\ub370\0\ub3b8\0\ub400\0\ub448"+
+    "\0\ub490\0\ub4d8\0\ub520\0\ub568\0\ub5b0\0\ub5f8\0\ub640\0\ub688"+
+    "\0\ub6d0\0\ub718\0\ub760\0\ub7a8\0\ub7f0\0\ub838\0\ub880\0\ub8c8"+
+    "\0\ub910\0\ub958\0\ub9a0\0\ub9e8\0\uba30\0\uba78\0\ubac0\0\ubb08"+
+    "\0\ubb50\0\ubb98\0\ubbe0\0\ubc28\0\ubc70\0\ubcb8\0\u7818\0\ubd00"+
+    "\0\ubd48\0\ubd90\0\ubdd8\0\u7860\0\ube20\0\ube68\0\ubeb0\0\ubef8"+
+    "\0\ubf40\0\ubf88\0\ubfd0\0\ubf88\0\uc018\0\uc060\0\uc0a8\0\uc0f0"+
+    "\0\uc0a8\0\uc138\0\uc180\0\uc1c8\0\uc210\0\uc258\0\uc2a0\0\uc2e8"+
+    "\0\uc330\0\uc378\0\uc3c0\0\uc408\0\uc450\0\uc498\0\uc4e0\0\uc528"+
+    "\0\uc570\0\uc5b8\0\uc600\0\uc648\0\uc690\0\uc6d8\0\uc720\0\uc768"+
+    "\0\uc7b0\0\uc7f8\0\uc840\0\uc888\0\uc8d0\0\uc918\0\uc960\0\uc9a8"+
+    "\0\uc9f0\0\uca38\0\uca80\0\ucac8\0\ucb10\0\ucb58\0\ucba0\0\ucbe8"+
+    "\0\ucc30\0\ucc78\0\uccc0\0\ucd08\0\ucd50\0\ucd98\0\ucde0\0\uce28"+
+    "\0\uce70\0\uceb8\0\ucf00\0\ucf48\0\ucf90\0\ucfd8\0\ud020\0\ud068"+
+    "\0\ud0b0\0\ud0f8\0\ud140\0\ud188\0\ud1d0\0\ud218\0\ud260\0\ud2a8"+
+    "\0\ud2f0\0\ud338\0\ud380\0\ud3c8\0\ud410\0\ud458\0\ud4a0\0\ud4e8"+
+    "\0\ud530\0\ud578\0\ud5c0\0\ud608\0\ud650\0\ud698\0\ud6e0\0\ud728"+
+    "\0\ud770\0\ud7b8\0\ud800\0\ud848\0\ud890\0\ud8d8\0\ud920\0\ud968"+
+    "\0\ud9b0\0\ud9f8\0\uda40\0\uda88\0\udad0\0\udb18\0\udb60\0\udba8"+
+    "\0\udbf0\0\udc38\0\udc80\0\udcc8\0\udd10\0\udd58\0\udda0\0\udde8"+
+    "\0\ude30\0\ude78\0\udec0\0\udf08\0\udf50\0\udf98\0\udfe0\0\ue028"+
+    "\0\ue070\0\ue0b8\0\u8550\0\ue100\0\ue148\0\ue190\0\ue1d8\0\u8598"+
+    "\0\ue220\0\ue268\0\ue2b0\0\ue2f8\0\ue340\0\ue388\0\ue3d0\0\ue388"+
+    "\0\ue418\0\ue460\0\ue4a8\0\ue4f0\0\ue538\0\ue580\0\ue5c8\0\ue610"+
+    "\0\ue658\0\ue6a0\0\ue6e8\0\ue6a0\0\ue730\0\ue778\0\ue7c0\0\ue808"+
+    "\0\ue850\0\ue898\0\ue8e0\0\ue928\0\ue970\0\ue9b8\0\uea00\0\ue9b8"+
+    "\0\uea48\0\uea90\0\uead8\0\ueb20\0\ueb68\0\uebb0\0\uebf8\0\uec40"+
+    "\0\uec88\0\uecd0\0\ued18\0\ued60\0\ueda8\0\uedf0\0\uee38\0\uee80"+
+    "\0\ueec8\0\uef10\0\uef58\0\uefa0\0\uefe8\0\uf030\0\uf078\0\uf0c0"+
+    "\0\uf108\0\uf150\0\uf198\0\uf1e0\0\uf228\0\uf270\0\uf2b8\0\uf300"+
+    "\0\uf348\0\uf390\0\uf3d8\0\uf420\0\uf468\0\uf4b0\0\uf4f8\0\uf540"+
+    "\0\uf588\0\uf5d0\0\uf618\0\uf660\0\uf618\0\uf6a8\0\uf6f0\0\uf738"+
+    "\0\uf780\0\uf7c8\0\uf810\0\uf858\0\uf8a0\0\uf8e8\0\uf930\0\uf978"+
+    "\0\uf9c0\0\ufa08\0\ufa50\0\ufa98\0\ufae0\0\ufb28\0\ufb70\0\ufbb8"+
+    "\0\ufc00\0\ufc48\0\ufc90\0\ufcd8\0\ufd20\0\ufd68\0\ufdb0\0\ufdf8"+
+    "\0\ufe40\0\ufe88\0\ufed0\0\uff18\0\uff60\0\uffa8\0\ufff0\1\70"+
+    "\1\200\1\310\1\u0110\1\u0158\1\u01a0\1\u01e8\1\u0230\1\u0278"+
+    "\1\u02c0\1\u0308\1\u0350\1\u0398\1\u03e0\1\u0428\1\u0470\1\u04b8"+
+    "\1\u0500\1\u0548\1\u0590\0\ucfd8\1\u05d8\1\u0620\0\ud188\1\u0668"+
+    "\1\u06b0\1\u06f8\1\u0740\1\u0788\1\u07d0\1\u0818\0\ud1d0\1\u0860"+
+    "\1\u08a8\0\ud380\1\u08f0\1\u0938\1\u0980\1\u09c8\1\u0a10\1\u0a58"+
+    "\1\u0aa0\0\ud3c8\1\u0ae8\1\u0b30\0\ud578\1\u0b78\1\u0bc0\1\u0c08"+
+    "\1\u0c50\1\u0c98\1\u0ce0\1\u0d28\1\u0d70\1\u0db8\1\u0e00\1\u0e48"+
+    "\1\u0e90\1\u0ed8\1\u0f20\1\u0f68\0\uc1c8\1\u0fb0\1\u0ff8\1\u1040"+
+    "\1\u1088\0\uc330\1\u10d0\1\u1118\1\u1160\1\u11a8\0\uc498\1\u11f0"+
+    "\1\u1238\1\u1280\1\u12c8\1\u1310\1\u1358\1\u13a0\1\u13e8\1\u1430"+
+    "\0\udf08\1\u1478\1\u14c0\0\ue0b8\1\u1508\1\u1550\1\u1598\1\u15e0"+
+    "\1\u1628\1\u1670\1\u16b8\1\u1700\1\u1748\1\u1790\1\u17d8\1\u1820"+
+    "\1\u1868\1\u18b0\1\u18f8\1\u1940\1\u1988\1\u19d0\1\u1a18\1\u1a60"+
+    "\1\u1aa8\1\u1af0\1\u1b38\1\u1b80\1\u1bc8\1\u1c10\1\u1c58\1\u1ca0"+
+    "\1\u1ce8\0\ucd08\1\u1d30\1\u1d78\1\u1dc0\1\u1e08\1\u1e50\1\u1e98"+
+    "\1\u1ee0\1\u1e98\1\u1f28\1\u1f70\1\u1fb8\1\u2000\1\u2048\1\u2090"+
+    "\1\u20d8\1\u2120\1\u2168\1\u21b0\1\u21f8\1\u2240\1\u2288\1\u22d0"+
+    "\1\u2318\1\u2360\1\u23a8\1\u23f0\1\u2438\1\u2480\1\u24c8\1\u2510"+
+    "\1\u2558\1\u25a0\1\u25e8\1\u2630\1\u2678\1\u26c0\1\u2708\1\u2750"+
+    "\1\u2798\1\u27e0\1\u2828\1\u2870\1\u28b8\1\u2900\1\u2948\1\u2990"+
+    "\1\u29d8\1\u2a20\1\u2a68\1\u2ab0\1\u2af8\1\u2b40\1\u2b88\1\u2bd0"+
+    "\1\u2c18\1\u2c60\1\u2ca8\1\u2cf0\1\u2d38\1\u2d80\1\u2dc8\1\u2e10"+
+    "\1\u2e58\1\u2ea0\1\u2ee8\1\u2f30\1\u2f78\1\u2fc0\1\u3008\1\u3050"+
+    "\1\u3098\1\u30e0\1\u3128\1\u3170\1\u31b8\1\u3200\1\u3248\1\u3290"+
+    "\1\u32d8\1\u3320\1\u3368\1\u33b0\1\u33f8\1\u3440\1\u3488\1\u34d0"+
+    "\1\u3518\1\u3560\1\u35a8\1\u35f0\1\u3638\1\u3680\1\u36c8\1\u3710"+
+    "\1\u3758\1\u37a0\1\u37e8\1\u3830\1\u3878\1\u38c0\1\u0e48\1\u3908"+
+    "\1\u0f68\1\u3950\1\u3998\1\u39e0\1\u3a28\1\u3a70\1\u3ab8\1\u3b00"+
+    "\1\u3b48\1\u3b90\0\uf930\1\u3bd8\1\u3c20\1\u3c68\1\u3cb0\1\u3cf8"+
+    "\1\u3d40\1\u3d88\1\u3dd0\1\u3e18\1\u3e60\1\u3ea8\1\u3ef0\1\u3f38"+
+    "\1\u3f80\1\u3fc8\1\u4010\1\u4058\1\u40a0\1\u40e8\1\u4130\1\u4178"+
+    "\1\u41c0\1\u4208\1\u4250\1\u4298\1\u42e0\1\u4328\1\u4370\1\u43b8"+
+    "\1\u4400";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[1249];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\3\26\1\27\74\26\1\30\7\26\6\31\1\32\5\31"+
+    "\1\33\1\34\1\35\1\36\1\37\1\31\1\40\1\41"+
+    "\1\42\1\43\1\44\1\45\1\46\1\47\1\50\1\51"+
+    "\1\52\1\53\1\31\1\54\1\55\1\56\1\57\1\60"+
+    "\1\61\1\62\1\63\1\64\1\31\1\65\1\66\1\67"+
+    "\1\70\1\71\1\72\1\31\1\73\1\74\1\75\1\76"+
+    "\1\72\1\77\1\100\1\101\1\75\4\31\1\102\1\103"+
+    "\73\31\1\104\5\31\1\104\4\105\4\31\1\105\110\31"+
+    "\1\106\6\31\1\107\2\31\1\110\5\31\1\111\1\31"+
+    "\1\112\1\113\1\107\1\114\1\115\1\116\2\107\1\117"+
+    "\1\120\1\112\1\107\1\121\1\107\1\122\1\123\2\107"+
+    "\1\124\1\107\1\115\1\123\1\112\1\107\1\121\1\112"+
+    "\1\117\1\107\1\124\3\107\1\120\1\107\1\113\1\107"+
+    "\1\114\4\107\1\116\3\107\4\31\3\107\3\31\1\125"+
+    "\1\126\3\31\5\127\1\130\1\127\1\131\75\127\1\132"+
+    "\2\127\3\133\1\134\1\133\1\135\105\133\1\136\107\133"+
+    "\1\137\1\133\1\140\2\133\1\141\1\142\76\133\1\31"+
+    "\1\143\10\31\1\144\1\31\1\145\1\146\1\143\1\147"+
+    "\1\150\1\151\2\143\1\152\1\153\1\145\1\143\1\154"+
+    "\1\143\1\155\1\156\2\143\1\157\1\143\1\150\1\156"+
+    "\1\145\1\143\1\154\1\145\1\152\1\143\1\157\3\143"+
+    "\1\153\1\143\1\146\1\143\1\147\4\143\1\151\3\143"+
+    "\4\31\3\143\11\31\1\107\12\31\1\112\1\160\1\107"+
+    "\1\161\1\115\1\116\2\107\1\117\1\120\1\112\1\107"+
+    "\1\121\1\107\1\122\1\123\2\107\1\124\1\107\1\115"+
+    "\1\123\1\112\1\107\1\121\1\112\1\117\1\107\1\124"+
+    "\3\107\1\120\1\107\1\160\1\107\1\161\4\107\1\116"+
+    "\3\107\4\31\3\107\10\31\106\162\1\163\1\162\5\133"+
+    "\1\164\2\133\1\165\1\166\107\133\1\167\75\133\1\170"+
+    "\10\133\1\167\76\133\1\170\7\31\1\171\2\31\1\172"+
+    "\104\31\1\173\2\31\1\174\104\31\1\175\2\31\1\176"+
+    "\104\31\1\171\2\31\1\177\71\31\1\200\12\31\1\201"+
+    "\2\31\1\202\71\31\1\203\12\31\1\204\2\31\1\205"+
+    "\71\31\1\206\3\31\126\0\1\207\24\0\1\210\1\211"+
+    "\1\212\3\0\1\213\56\0\1\214\24\0\1\215\1\0"+
+    "\1\216\4\0\1\217\51\0\1\207\1\0\1\220\20\0"+
+    "\1\221\1\0\1\210\1\222\1\212\1\223\1\224\1\0"+
+    "\1\225\1\0\1\226\1\0\1\227\2\0\1\230\71\0"+
+    "\1\231\1\0\1\232\61\0\1\207\24\0\1\210\1\211"+
+    "\1\233\1\234\2\0\1\213\1\0\1\235\1\0\1\236"+
+    "\11\0\1\237\1\240\35\0\1\207\21\0\1\220\2\0"+
+    "\1\210\1\211\1\212\1\223\6\0\1\241\2\0\1\242"+
+    "\74\0\1\243\1\223\57\0\1\244\33\0\1\245\4\0"+
+    "\1\246\46\0\1\247\1\0\1\250\105\0\1\207\24\0"+
+    "\1\210\1\211\1\212\13\0\1\214\44\0\1\251\135\0"+
+    "\1\252\5\0\1\253\102\0\1\243\60\0\1\254\107\0"+
+    "\1\255\133\0\1\243\4\0\1\256\2\0\1\253\5\0"+
+    "\1\253\101\0\1\257\53\0\1\207\21\0\1\220\1\260"+
+    "\1\0\1\210\1\211\1\212\1\223\1\224\56\0\1\207"+
+    "\5\0\1\261\16\0\1\210\1\211\1\212\1\262\2\0"+
+    "\1\213\54\0\1\263\1\0\1\243\16\0\1\264\4\0"+
+    "\1\265\1\0\1\243\1\266\4\0\1\217\3\0\1\267"+
+    "\1\270\3\0\1\271\40\0\1\207\1\0\1\272\22\0"+
+    "\1\210\1\211\1\212\5\0\1\273\1\0\1\274\2\0"+
+    "\1\275\1\214\5\0\1\276\36\0\1\251\1\0\1\243"+
+    "\25\0\1\243\57\0\1\227\1\0\1\277\20\0\1\300"+
+    "\1\301\1\0\1\252\1\302\1\0\1\303\2\0\1\253"+
+    "\6\0\1\304\44\0\1\305\20\0\1\264\3\0\1\210"+
+    "\1\211\1\212\3\0\1\306\3\0\1\307\50\0\1\244"+
+    "\23\0\1\310\4\0\1\311\2\0\1\312\53\0\1\313"+
+    "\1\0\1\314\16\0\1\264\1\0\1\266\2\0\1\265"+
+    "\5\0\1\257\1\0\1\217\3\0\1\267\4\0\1\271"+
+    "\40\0\1\315\1\0\1\316\20\0\1\317\1\320\4\0"+
+    "\1\321\2\0\1\253\5\0\1\253\1\322\44\0\1\264"+
+    "\1\0\1\323\16\0\1\264\65\0\1\235\1\324\1\0"+
+    "\1\243\21\0\1\243\2\0\1\243\1\223\5\0\1\325"+
+    "\3\0\1\326\1\327\44\0\1\330\1\0\1\331\16\0"+
+    "\1\264\2\0\1\332\63\0\1\333\23\0\1\334\2\0"+
+    "\1\243\6\0\1\325\53\0\1\214\104\0\1\217\2\0"+
+    "\1\335\21\0\1\336\1\0\1\232\1\337\3\0\1\340"+
+    "\1\341\1\0\1\342\21\0\1\220\27\0\1\207\1\0"+
+    "\1\220\20\0\1\343\1\0\1\210\1\211\1\212\1\344"+
+    "\1\345\1\0\1\346\3\0\1\241\2\0\1\242\71\0"+
+    "\1\243\63\0\1\207\26\0\1\212\111\0\1\347\3\0"+
+    "\1\350\5\0\1\351\44\0\1\207\1\0\1\352\24\0"+
+    "\1\212\107\0\1\342\62\0\1\353\107\0\1\214\54\0"+
+    "\1\354\27\0\2\355\1\0\2\355\3\0\1\355\2\0"+
+    "\1\355\6\0\2\355\3\0\1\355\7\0\1\355\1\0"+
+    "\1\355\6\0\1\355\3\0\4\355\4\0\1\355\77\0"+
+    "\4\105\4\0\1\105\7\0\2\107\2\0\1\107\6\0"+
+    "\64\107\1\0\1\107\20\0\1\111\2\0\1\356\1\0"+
+    "\1\357\36\0\1\356\1\0\1\357\30\0\2\107\2\0"+
+    "\1\107\6\0\2\107\1\360\6\107\1\361\1\362\6\107"+
+    "\1\363\1\107\1\360\2\107\1\362\4\107\1\363\4\107"+
+    "\1\361\23\107\1\0\1\107\7\0\2\107\2\0\1\107"+
+    "\6\0\2\107\1\364\5\107\1\365\3\107\1\366\1\367"+
+    "\2\107\1\370\2\107\1\364\4\107\1\366\1\107\1\365"+
+    "\2\107\1\370\3\107\1\367\22\107\1\0\1\107\7\0"+
+    "\2\107\2\0\1\107\6\0\15\107\1\112\23\107\1\112"+
+    "\22\107\1\0\1\107\7\0\2\107\2\0\1\107\6\0"+
+    "\6\107\1\371\36\107\1\371\16\107\1\0\1\107\7\0"+
+    "\2\107\2\0\1\107\6\0\10\107\1\112\21\107\1\112"+
+    "\31\107\1\0\1\107\7\0\2\107\2\0\1\107\6\0"+
+    "\5\107\1\372\43\107\1\372\12\107\1\0\1\107\7\0"+
+    "\2\107\2\0\1\107\6\0\6\107\1\373\3\107\1\374"+
+    "\13\107\1\374\16\107\1\373\16\107\1\0\1\107\7\0"+
+    "\2\107\2\0\1\107\6\0\1\107\1\375\40\107\1\375"+
+    "\21\107\1\0\1\107\7\0\2\107\2\0\1\107\6\0"+
+    "\2\107\1\376\20\107\1\376\40\107\1\0\1\107\7\0"+
+    "\2\107\2\0\1\107\6\0\2\107\1\377\20\107\1\377"+
+    "\40\107\1\0\1\107\6\0\103\u0100\1\u0101\4\u0100\7\u0102"+
+    "\1\173\100\u0102\5\0\1\u0103\102\0\7\u0102\1\173\20\u0102"+
+    "\1\u0104\57\u0102\4\0\1\u0105\110\0\1\u0106\106\0\1\u0107"+
+    "\77\0\1\u0108\7\0\1\u0109\110\0\1\u010a\103\0\2\143"+
+    "\2\0\1\143\6\0\64\143\1\0\1\143\20\0\1\144"+
+    "\76\0\2\143\2\0\1\143\6\0\2\143\1\u010b\6\143"+
+    "\1\u010c\1\u010d\6\143\1\u010e\1\143\1\u010b\2\143\1\u010d"+
+    "\4\143\1\u010e\4\143\1\u010c\23\143\1\0\1\143\7\0"+
+    "\2\143\2\0\1\143\6\0\2\143\1\u010f\5\143\1\u0110"+
+    "\4\143\1\u0111\2\143\1\u0112\2\143\1\u010f\6\143\1\u0110"+
+    "\2\143\1\u0112\3\143\1\u0111\22\143\1\0\1\143\7\0"+
+    "\2\143\2\0\1\143\6\0\15\143\1\145\23\143\1\145"+
+    "\22\143\1\0\1\143\7\0\2\143\2\0\1\143\6\0"+
+    "\6\143\1\u0113\36\143\1\u0113\16\143\1\0\1\143\7\0"+
+    "\2\143\2\0\1\143\6\0\10\143\1\145\21\143\1\145"+
+    "\31\143\1\0\1\143\7\0\2\143\2\0\1\143\6\0"+
+    "\5\143\1\u0114\43\143\1\u0114\12\143\1\0\1\143\7\0"+
+    "\2\143\2\0\1\143\6\0\6\143\1\u0115\3\143\1\u0116"+
+    "\13\143\1\u0116\16\143\1\u0115\16\143\1\0\1\143\7\0"+
+    "\2\143\2\0\1\143\6\0\1\143\1\u0117\40\143\1\u0117"+
+    "\21\143\1\0\1\143\7\0\2\143\2\0\1\143\6\0"+
+    "\2\143\1\u0118\20\143\1\u0118\40\143\1\0\1\143\7\0"+
+    "\2\143\2\0\1\143\6\0\2\143\1\u0119\20\143\1\u0119"+
+    "\40\143\1\0\1\143\7\0\2\107\2\0\1\107\6\0"+
+    "\2\107\1\360\6\107\1\361\1\362\10\107\1\360\2\107"+
+    "\1\362\11\107\1\361\23\107\1\0\1\107\7\0\2\107"+
+    "\2\0\1\107\6\0\2\107\1\364\5\107\1\365\4\107"+
+    "\1\367\2\107\1\370\2\107\1\364\6\107\1\365\2\107"+
+    "\1\370\3\107\1\367\22\107\1\0\1\107\114\0\1\u011a"+
+    "\6\0\1\u011b\102\0\110\133\7\0\1\171\2\0\1\u011c"+
+    "\104\0\1\173\2\0\1\u011d\104\0\1\175\2\0\1\u011e"+
+    "\76\0\1\u011f\5\0\1\171\2\0\1\u0120\1\0\55\u011f"+
+    "\4\0\3\u011f\4\0\1\u0121\12\0\1\171\101\0\1\u0122"+
+    "\5\0\1\201\2\0\1\u0123\1\0\55\u0122\4\0\3\u0122"+
+    "\4\0\1\u0124\12\0\1\201\101\0\1\u0125\5\0\1\204"+
+    "\2\0\1\u0126\1\0\55\u0125\4\0\3\u0125\4\0\1\u0127"+
+    "\12\0\1\204\144\0\1\u0128\112\0\1\u0129\102\0\1\301"+
+    "\122\0\1\307\112\0\1\u012a\75\0\1\262\102\0\1\307"+
+    "\116\0\1\u012b\126\0\1\u012c\61\0\1\u012d\66\0\1\u012e"+
+    "\30\0\1\u012f\100\0\1\301\2\0\1\u0130\104\0\1\u0131"+
+    "\107\0\1\u0132\126\0\1\u0133\71\0\1\243\10\0\1\243"+
+    "\104\0\1\243\124\0\1\u0134\64\0\1\u0135\62\0\1\u0136"+
+    "\140\0\1\257\5\0\1\307\50\0\1\243\33\0\1\243"+
+    "\115\0\1\227\100\0\1\u0137\6\0\1\227\74\0\1\u0138"+
+    "\104\0\1\u0139\65\0\1\u013a\21\0\1\u013b\106\0\1\325"+
+    "\70\0\1\u013c\130\0\1\u013d\105\0\1\214\123\0\1\u0135"+
+    "\52\0\1\u013e\140\0\1\u013f\113\0\1\u0140\74\0\1\u0141"+
+    "\126\0\1\243\77\0\1\u012f\115\0\1\243\46\0\1\243"+
+    "\140\0\1\u0142\3\0\1\u0143\1\0\1\u0140\11\0\1\u012c"+
+    "\67\0\1\u0142\60\0\1\u0144\144\0\1\243\50\0\1\217"+
+    "\50\0\1\u012c\115\0\1\u0145\1\243\52\0\1\u0146\136\0"+
+    "\1\u0147\65\0\1\243\16\0\1\275\40\0\1\u0148\133\0"+
+    "\1\352\112\0\1\u0149\115\0\1\u014a\1\u0144\100\0\1\u014b"+
+    "\111\0\1\u014c\107\0\1\u014d\1\0\1\243\54\0\1\264"+
+    "\142\0\1\341\1\0\1\u0143\100\0\1\u0128\2\0\1\u0142"+
+    "\120\0\1\u014e\70\0\1\243\107\0\1\u014f\13\0\1\u0150"+
+    "\50\0\1\u014f\111\0\1\u0151\21\0\1\u0152\16\0\1\u0153"+
+    "\75\0\1\u0142\3\0\1\u0143\1\u0154\12\0\1\u012c\36\0"+
+    "\1\307\24\0\1\243\113\0\1\u0155\107\0\1\u0156\105\0"+
+    "\1\u0157\112\0\1\243\101\0\1\u0141\16\0\1\u0158\73\0"+
+    "\1\u0159\60\0\1\u015a\22\0\1\u015b\63\0\1\u015c\110\0"+
+    "\1\u015d\136\0\1\u015e\110\0\1\u015f\104\0\1\u013d\3\0"+
+    "\1\u0142\101\0\1\214\1\0\1\243\62\0\1\u0160\31\0"+
+    "\1\u0161\103\0\1\u0142\107\0\1\u0162\6\0\1\u0163\1\u0164"+
+    "\77\0\1\u014a\106\0\1\u0165\11\0\1\243\47\0\1\u0166"+
+    "\33\0\1\u0167\3\0\1\243\50\0\1\u0168\157\0\1\243"+
+    "\102\0\1\u014a\70\0\1\u0169\107\0\1\310\121\0\1\u016a"+
+    "\74\0\1\u0163\64\0\1\u016b\152\0\1\u016c\75\0\1\u016d"+
+    "\113\0\1\243\76\0\1\u016e\120\0\1\u016f\23\0\1\243"+
+    "\45\0\1\u0170\11\0\1\u0170\70\0\1\u0171\13\0\1\u0171"+
+    "\44\0\2\107\2\0\1\107\6\0\3\107\1\u0172\40\107"+
+    "\1\u0172\17\107\1\0\1\107\7\0\2\107\2\0\1\107"+
+    "\6\0\6\107\1\112\36\107\1\112\16\107\1\0\1\107"+
+    "\7\0\2\107\2\0\1\107\6\0\13\107\1\112\13\107"+
+    "\1\112\34\107\1\0\1\107\7\0\2\107\2\0\1\107"+
+    "\1\0\1\u0173\2\0\1\u0174\1\0\64\107\1\0\1\107"+
+    "\2\0\1\u0175\4\0\2\107\2\0\1\107\6\0\15\107"+
+    "\1\u0176\23\107\1\u0176\22\107\1\0\1\107\7\0\2\107"+
+    "\2\0\1\107\6\0\21\107\1\u0177\11\107\1\u0177\30\107"+
+    "\1\0\1\107\7\0\2\107\2\0\1\107\6\0\21\107"+
+    "\1\u0178\11\107\1\u0178\30\107\1\0\1\107\7\0\2\107"+
+    "\2\0\1\107\6\0\2\107\1\u0179\20\107\1\u0179\40\107"+
+    "\1\0\1\107\7\0\2\107\2\0\1\107\6\0\2\107"+
+    "\1\372\20\107\1\372\40\107\1\0\1\107\7\0\2\107"+
+    "\2\0\1\107\6\0\7\107\1\117\27\107\1\117\24\107"+
+    "\1\0\1\107\7\0\2\107\2\0\1\107\6\0\7\107"+
+    "\1\112\27\107\1\112\24\107\1\0\1\107\7\0\2\107"+
+    "\2\0\1\107\6\0\11\107\1\u017a\26\107\1\u017a\23\107"+
+    "\1\0\1\107\7\0\2\107\2\0\1\107\6\0\10\107"+
+    "\1\u017a\21\107\1\u017a\31\107\1\0\1\107\7\0\2\107"+
+    "\2\0\1\107\6\0\11\107\1\112\26\107\1\112\23\107"+
+    "\1\0\1\107\7\0\2\107\2\0\1\107\6\0\1\107"+
+    "\1\u017b\40\107\1\u017b\21\107\1\0\1\107\7\0\2\107"+
+    "\2\0\1\107\6\0\21\107\1\112\11\107\1\112\30\107"+
+    "\1\0\1\107\6\0\7\u0100\1\173\73\u0100\1\u0101\4\u0100"+
+    "\7\u0102\1\173\15\u0102\1\u017c\62\u0102\5\0\1\u017d\111\0"+
+    "\1\u017e\105\0\1\u017f\114\0\1\u0108\4\0\1\u0180\40\0"+
+    "\1\u0180\34\0\1\u0181\111\0\1\u0182\101\0\2\143\2\0"+
+    "\1\143\6\0\3\143\1\u0183\40\143\1\u0183\17\143\1\0"+
+    "\1\143\7\0\2\143\2\0\1\143\6\0\6\143\1\145"+
+    "\36\143\1\145\16\143\1\0\1\143\7\0\2\143\2\0"+
+    "\1\143\6\0\13\143\1\145\13\143\1\145\34\143\1\0"+
+    "\1\143\7\0\2\143\2\0\1\143\1\0\1\u0184\2\0"+
+    "\1\u0185\1\0\64\143\1\0\1\143\7\0\2\143\2\0"+
+    "\1\143\6\0\15\143\1\u0186\23\143\1\u0186\22\143\1\0"+
+    "\1\143\7\0\2\143\2\0\1\143\6\0\21\143\1\u0187"+
+    "\11\143\1\u0187\30\143\1\0\1\143\7\0\2\143\2\0"+
+    "\1\143\6\0\2\143\1\u0188\20\143\1\u0188\40\143\1\0"+
+    "\1\143\7\0\2\143\2\0\1\143\6\0\2\143\1\u0114"+
+    "\20\143\1\u0114\40\143\1\0\1\143\7\0\2\143\2\0"+
+    "\1\143\6\0\7\143\1\152\27\143\1\152\24\143\1\0"+
+    "\1\143\7\0\2\143\2\0\1\143\6\0\7\143\1\145"+
+    "\27\143\1\145\24\143\1\0\1\143\7\0\2\143\2\0"+
+    "\1\143\6\0\11\143\1\u0189\26\143\1\u0189\23\143\1\0"+
+    "\1\143\7\0\2\143\2\0\1\143\6\0\10\143\1\u0189"+
+    "\21\143\1\u0189\31\143\1\0\1\143\7\0\2\143\2\0"+
+    "\1\143\6\0\11\143\1\145\26\143\1\145\23\143\1\0"+
+    "\1\143\7\0\2\143\2\0\1\143\6\0\1\143\1\u018a"+
+    "\40\143\1\u018a\21\143\1\0\1\143\7\0\2\143\2\0"+
+    "\1\143\6\0\21\143\1\145\11\143\1\145\30\143\1\0"+
+    "\1\143\15\0\1\u018b\107\0\1\u018c\101\0\2\u011f\2\0"+
+    "\1\u011f\1\0\1\171\2\0\1\u018d\1\u018e\64\u011f\1\0"+
+    "\1\u011f\2\0\1\u0121\4\0\2\u0122\2\0\1\u0122\1\0"+
+    "\1\201\2\0\1\u018f\1\u0190\64\u0122\1\0\1\u0122\2\0"+
+    "\1\u0124\4\0\2\u0125\2\0\1\u0125\1\0\1\204\2\0"+
+    "\1\u0191\1\u0192\64\u0125\1\0\1\u0125\2\0\1\u0127\50\0"+
+    "\1\u0130\60\0\1\u0193\133\0\1\u0194\62\0\1\u0195\137\0"+
+    "\1\257\104\0\1\u0143\132\0\1\u0196\74\0\1\262\103\0"+
+    "\1\u0197\102\0\1\u014f\121\0\1\u0143\114\0\1\243\104\0"+
+    "\1\227\107\0\1\262\101\0\1\u0198\106\0\1\341\103\0"+
+    "\1\u0199\125\0\1\u014a\72\0\1\262\110\0\1\u0136\100\0"+
+    "\1\u019a\115\0\1\u019b\120\0\1\u0144\104\0\1\262\53\0"+
+    "\1\u019c\147\0\1\u0197\101\0\1\243\103\0\1\243\106\0"+
+    "\1\307\63\0\1\u0139\152\0\1\u019d\72\0\1\307\106\0"+
+    "\1\u0197\64\0\1\u0139\135\0\1\243\56\0\1\u0133\136\0"+
+    "\1\243\112\0\1\u019e\102\0\1\u019f\121\0\1\u0197\53\0"+
+    "\1\u0133\135\0\1\u01a0\1\u01a1\113\0\1\235\103\0\1\352"+
+    "\102\0\1\u014c\63\0\1\243\27\0\1\243\112\0\1\243"+
+    "\3\0\1\u0144\112\0\1\u01a2\100\0\1\243\2\0\1\243"+
+    "\106\0\1\u01a3\103\0\1\u01a4\101\0\1\u01a5\107\0\1\262"+
+    "\126\0\1\u01a6\44\0\1\243\147\0\1\u0133\74\0\1\u014f"+
+    "\114\0\1\257\105\0\1\u0133\116\0\1\342\110\0\1\u01a7"+
+    "\52\0\1\243\107\0\1\243\50\0\2\243\1\0\1\243"+
+    "\67\0\1\u0150\106\0\1\u0197\111\0\1\243\7\0\1\243"+
+    "\66\0\1\u01a8\13\0\1\307\114\0\1\243\40\0\1\215"+
+    "\111\0\1\u01a9\166\0\1\243\17\0\1\u0173\2\0\1\u0174"+
+    "\71\0\1\u0175\40\0\1\u01aa\11\0\1\u01aa\41\0\2\107"+
+    "\2\0\1\107\6\0\4\107\1\u01ab\17\107\1\u01ab\37\107"+
+    "\1\0\1\107\7\0\1\u01ac\5\0\1\u0173\2\0\1\u0174"+
+    "\1\0\55\u01ac\4\0\3\u01ac\4\0\1\u0175\12\0\1\u0173"+
+    "\101\0\2\107\2\0\1\107\6\0\20\107\1\112\14\107"+
+    "\1\112\26\107\1\0\1\107\7\0\2\107\2\0\1\107"+
+    "\6\0\6\107\1\u01ad\3\107\1\u01ae\13\107\1\u01ae\16\107"+
+    "\1\u01ad\16\107\1\0\1\107\7\0\2\107\2\0\1\107"+
+    "\6\0\12\107\1\u01af\13\107\1\u01af\35\107\1\0\1\107"+
+    "\7\0\2\107\2\0\1\107\6\0\17\107\1\u01b0\5\107"+
+    "\1\u01b0\36\107\1\0\1\107\7\0\2\107\2\0\1\107"+
+    "\6\0\4\107\1\112\17\107\1\112\37\107\1\0\1\107"+
+    "\7\0\2\107\2\0\1\107\6\0\4\107\1\u01b0\17\107"+
+    "\1\u01b0\37\107\1\0\1\107\6\0\7\u0102\1\173\27\u0102"+
+    "\1\u01b1\50\u0102\5\0\1\u01b2\107\0\1\u01b3\132\0\1\u01b4"+
+    "\13\0\1\u01b4\50\0\1\u01b5\103\0\2\143\2\0\1\143"+
+    "\6\0\4\143\1\u01b6\17\143\1\u01b6\37\143\1\0\1\143"+
+    "\15\0\1\u0184\2\0\1\u0185\76\0\2\143\2\0\1\143"+
+    "\6\0\20\143\1\145\14\143\1\145\26\143\1\0\1\143"+
+    "\7\0\2\143\2\0\1\143\6\0\6\143\1\u01b7\3\143"+
+    "\1\u01b8\13\143\1\u01b8\16\143\1\u01b7\16\143\1\0\1\143"+
+    "\7\0\2\143\2\0\1\143\6\0\17\143\1\u01b9\5\143"+
+    "\1\u01b9\36\143\1\0\1\143\7\0\2\143\2\0\1\143"+
+    "\6\0\4\143\1\145\17\143\1\145\37\143\1\0\1\143"+
+    "\7\0\2\143\2\0\1\143\6\0\4\143\1\u01b9\17\143"+
+    "\1\u01b9\37\143\1\0\1\143\7\0\1\u011f\5\0\1\171"+
+    "\2\0\1\u018d\1\u018e\55\u011f\4\0\3\u011f\4\0\1\u0121"+
+    "\3\0\3\u01ba\1\0\3\u01ba\1\171\1\u01bb\1\u01bc\1\u01bd"+
+    "\75\u01ba\1\0\1\u0122\5\0\1\201\2\0\1\u018f\1\u0190"+
+    "\55\u0122\4\0\3\u0122\4\0\1\u0124\3\0\3\u01be\1\0"+
+    "\3\u01be\1\201\1\u01bf\1\u01c0\1\u01c1\75\u01be\1\0\1\u0125"+
+    "\5\0\1\204\2\0\1\u0191\1\u0192\55\u0125\4\0\3\u0125"+
+    "\4\0\1\u0127\3\0\3\u01c2\1\0\3\u01c2\1\204\1\u01c3"+
+    "\1\u01c4\1\u01c5\75\u01c2\50\0\1\u0197\100\0\1\u0198\64\0"+
+    "\1\u0142\151\0\1\u01c6\110\0\1\352\51\0\1\243\104\0"+
+    "\1\u0142\143\0\1\262\114\0\1\u0142\46\0\1\352\130\0"+
+    "\1\u0198\10\0\1\243\53\0\1\u01c7\111\0\1\u01c8\144\0"+
+    "\1\352\106\0\1\243\101\0\1\u0133\103\0\1\227\117\0"+
+    "\1\243\53\0\1\u01c9\162\0\1\u01ca\2\0\1\u01c8\62\0"+
+    "\1\227\66\0\1\u01cb\13\0\1\u01cb\46\0\2\107\2\0"+
+    "\1\107\6\0\5\107\1\116\43\107\1\116\12\107\1\0"+
+    "\1\107\7\0\2\u01ac\2\0\1\u01ac\1\0\1\u0173\2\0"+
+    "\1\u01cc\1\u01cd\64\u01ac\1\0\1\u01ac\2\0\1\u0175\4\0"+
+    "\2\107\2\0\1\107\6\0\7\107\1\362\27\107\1\362"+
+    "\24\107\1\0\1\107\7\0\2\107\2\0\1\107\6\0"+
+    "\16\107\1\u017a\45\107\1\0\1\107\7\0\2\107\2\0"+
+    "\1\107\6\0\20\107\1\u01ce\14\107\1\u01ce\26\107\1\0"+
+    "\1\107\7\0\2\107\2\0\1\107\6\0\17\107\1\112"+
+    "\5\107\1\112\36\107\1\0\1\107\6\0\7\u0102\1\173"+
+    "\14\u0102\1\u01cf\63\u0102\6\0\1\u01d0\136\0\1\u01d1\11\0"+
+    "\1\u01d1\46\0\1\u01d2\102\0\2\143\2\0\1\143\6\0"+
+    "\5\143\1\151\43\143\1\151\12\143\1\0\1\143\7\0"+
+    "\2\143\2\0\1\143\6\0\7\143\1\u010d\27\143\1\u010d"+
+    "\24\143\1\0\1\143\7\0\2\143\2\0\1\143\6\0"+
+    "\16\143\1\u0189\45\143\1\0\1\143\7\0\2\143\2\0"+
+    "\1\143\6\0\17\143\1\145\5\143\1\145\36\143\1\0"+
+    "\1\143\6\0\3\u01ba\1\0\3\u01ba\1\171\2\0\1\u0120"+
+    "\75\u01ba\3\u01bb\1\u01d3\4\u01bb\1\u01d4\77\u01bb\3\u01bc\1\u01d5"+
+    "\5\u01bc\1\u01d4\76\u01bc\1\u01ba\1\u01d6\1\u01ba\1\0\3\u01ba"+
+    "\1\171\1\u01bb\1\u01bc\1\u01bd\1\u01ba\55\u01d6\4\u01ba\3\u01d6"+
+    "\10\u01ba\3\u01be\1\0\3\u01be\1\201\2\0\1\u0123\75\u01be"+
+    "\3\u01bf\1\u01d7\4\u01bf\1\u01d8\77\u01bf\3\u01c0\1\u01d9\5\u01c0"+
+    "\1\u01d8\76\u01c0\1\u01be\1\u01da\1\u01be\1\0\3\u01be\1\201"+
+    "\1\u01bf\1\u01c0\1\u01c1\1\u01be\55\u01da\4\u01be\3\u01da\10\u01be"+
+    "\3\u01c2\1\0\3\u01c2\1\204\2\0\1\u0126\75\u01c2\3\u01c3"+
+    "\1\u01db\4\u01c3\1\u01dc\77\u01c3\3\u01c4\1\u01dd\5\u01c4\1\u01dc"+
+    "\76\u01c4\1\u01c2\1\u01de\1\u01c2\1\0\3\u01c2\1\204\1\u01c3"+
+    "\1\u01c4\1\u01c5\1\u01c2\55\u01de\4\u01c2\3\u01de\10\u01c2\66\0"+
+    "\1\266\114\0\1\243\106\0\2\243\50\0\1\u01df\14\0"+
+    "\1\u01df\37\0\1\u01ac\5\0\1\u0173\2\0\1\u01cc\1\u01cd"+
+    "\55\u01ac\4\0\3\u01ac\4\0\1\u0175\3\0\3\u01e0\1\0"+
+    "\3\u01e0\1\u0173\1\u01e1\1\u01e2\1\u01e3\75\u01e0\1\0\2\107"+
+    "\2\0\1\107\6\0\10\107\1\u01e4\21\107\1\u01e4\31\107"+
+    "\1\0\1\107\6\0\7\u0102\1\173\27\u0102\1\u01e5\50\u0102"+
+    "\26\0\1\u01e6\13\0\1\u01e6\45\0\3\u01bb\1\u01d3\1\u01e7"+
+    "\3\u01bb\1\u01d4\77\u01bb\7\0\1\171\2\0\1\u0120\71\0"+
+    "\1\u0121\3\0\3\u01bc\1\u01d5\1\u01e8\4\u01bc\1\u01d4\76\u01bc"+
+    "\1\u01ba\2\u01d6\1\0\1\u01ba\1\u01d6\1\u01ba\1\171\2\0"+
+    "\1\u018d\1\u018e\64\u01d6\1\u01ba\1\u01d6\6\u01ba\3\u01bf\1\u01d7"+
+    "\1\u01e9\3\u01bf\1\u01d8\77\u01bf\7\0\1\201\2\0\1\u0123"+
+    "\71\0\1\u0124\3\0\3\u01c0\1\u01d9\1\u01ea\4\u01c0\1\u01d8"+
+    "\76\u01c0\1\u01be\2\u01da\1\0\1\u01be\1\u01da\1\u01be\1\201"+
+    "\2\0\1\u018f\1\u0190\64\u01da\1\u01be\1\u01da\6\u01be\3\u01c3"+
+    "\1\u01db\1\u01eb\3\u01c3\1\u01dc\77\u01c3\7\0\1\204\2\0"+
+    "\1\u0126\71\0\1\u0127\3\0\3\u01c4\1\u01dd\1\u01ec\4\u01c4"+
+    "\1\u01dc\76\u01c4\1\u01c2\2\u01de\1\0\1\u01c2\1\u01de\1\u01c2"+
+    "\1\204\2\0\1\u0191\1\u0192\64\u01de\1\u01c2\1\u01de\6\u01c2"+
+    "\24\0\1\u01ed\21\0\1\u01ed\41\0\3\u01e0\1\0\3\u01e0"+
+    "\1\u0173\2\0\1\u0174\75\u01e0\3\u01e1\1\u01ee\4\u01e1\1\u0170"+
+    "\77\u01e1\3\u01e2\1\u01ef\5\u01e2\1\u0170\76\u01e2\1\u01e0\1\u01f0"+
+    "\1\u01e0\1\0\3\u01e0\1\u0173\1\u01e1\1\u01e2\1\u01e3\1\u01e0"+
+    "\55\u01f0\4\u01e0\3\u01f0\10\u01e0\1\0\2\107\2\0\1\107"+
+    "\1\0\1\u01f1\2\0\1\u01f2\1\0\64\107\1\0\1\107"+
+    "\6\0\7\u0102\1\173\75\u0102\1\u01f3\2\u0102\34\0\1\u01f4"+
+    "\14\0\1\u01f4\36\0\3\u01bb\1\u01d3\1\u01bb\1\u01f5\2\u01bb"+
+    "\1\u01d4\77\u01bb\3\u01bc\1\u01d5\1\u01bc\1\u01f6\3\u01bc\1\u01d4"+
+    "\76\u01bc\3\u01bf\1\u01d7\1\u01bf\1\u01f7\2\u01bf\1\u01d8\77\u01bf"+
+    "\3\u01c0\1\u01d9\1\u01c0\1\u01f8\3\u01c0\1\u01d8\76\u01c0\3\u01c3"+
+    "\1\u01db\1\u01c3\1\u01f9\2\u01c3\1\u01dc\77\u01c3\3\u01c4\1\u01dd"+
+    "\1\u01c4\1\u01fa\3\u01c4\1\u01dc\76\u01c4\7\0\1\u01f1\2\0"+
+    "\1\u01f2\75\0\3\u01e1\1\u01ee\1\u01fb\3\u01e1\1\u0170\77\u01e1"+
+    "\3\u01e2\1\u01ef\1\u01fc\4\u01e2\1\u0170\76\u01e2\1\u01e0\2\u01f0"+
+    "\1\0\1\u01e0\1\u01f0\1\u01e0\1\u0173\2\0\1\u01cc\1\u01cd"+
+    "\64\u01f0\1\u01e0\1\u01f0\6\u01e0\1\0\1\u01fd\5\0\1\u01f1"+
+    "\2\0\1\u01f2\1\0\55\u01fd\4\0\3\u01fd\34\0\1\u01fe"+
+    "\21\0\1\u01fe\41\0\3\u01bb\1\u01d3\1\u01bb\1\u01ff\2\u01bb"+
+    "\1\u01d4\77\u01bb\3\u01bc\1\u01d5\1\u01bc\1\u0200\3\u01bc\1\u01d4"+
+    "\76\u01bc\3\u01bf\1\u01d7\1\u01bf\1\u0201\2\u01bf\1\u01d8\77\u01bf"+
+    "\3\u01c0\1\u01d9\1\u01c0\1\u0202\3\u01c0\1\u01d8\76\u01c0\3\u01c3"+
+    "\1\u01db\1\u01c3\1\u0203\2\u01c3\1\u01dc\77\u01c3\3\u01c4\1\u01dd"+
+    "\1\u01c4\1\u0204\3\u01c4\1\u01dc\76\u01c4\3\u01e1\1\u01ee\1\u01e1"+
+    "\1\u0205\2\u01e1\1\u0170\77\u01e1\3\u01e2\1\u01ef\1\u01e2\1\u0206"+
+    "\3\u01e2\1\u0170\76\u01e2\1\0\2\u01fd\2\0\1\u01fd\1\0"+
+    "\1\u01f1\2\0\1\u0207\1\u0208\64\u01fd\1\0\1\u01fd\15\0"+
+    "\1\u0209\2\0\1\u01fe\75\0\3\u01bb\1\u01d3\2\u01bb\1\u020a"+
+    "\1\u01bb\1\u01d4\77\u01bb\3\u01bc\1\u01d5\2\u01bc\1\u020b\2\u01bc"+
+    "\1\u01d4\76\u01bc\3\u01bf\1\u01d7\2\u01bf\1\u020c\1\u01bf\1\u01d8"+
+    "\77\u01bf\3\u01c0\1\u01d9\2\u01c0\1\u020d\2\u01c0\1\u01d8\76\u01c0"+
+    "\3\u01c3\1\u01db\2\u01c3\1\u020e\1\u01c3\1\u01dc\77\u01c3\3\u01c4"+
+    "\1\u01dd\2\u01c4\1\u020f\2\u01c4\1\u01dc\76\u01c4\3\u01e1\1\u01ee"+
+    "\1\u01e1\1\u0210\2\u01e1\1\u0170\77\u01e1\3\u01e2\1\u01ef\1\u01e2"+
+    "\1\u0211\3\u01e2\1\u0170\76\u01e2\1\0\1\u01fd\5\0\1\u01f1"+
+    "\2\0\1\u0207\1\u0208\55\u01fd\4\0\3\u01fd\10\0\3\u0212"+
+    "\1\0\3\u0212\1\u01f1\1\u0213\1\u0214\1\u0215\75\u0212\5\u020a"+
+    "\1\u0216\2\u020a\1\u0217\77\u020a\5\u020b\1\u0218\3\u020b\1\u0219"+
+    "\76\u020b\5\u020c\1\u021a\2\u020c\1\u021b\77\u020c\5\u020d\1\u021c"+
+    "\3\u020d\1\u021d\76\u020d\5\u020e\1\u021e\2\u020e\1\u021f\77\u020e"+
+    "\5\u020f\1\u0220\3\u020f\1\u0221\76\u020f\3\u01e1\1\u01ee\2\u01e1"+
+    "\1\u0222\1\u01e1\1\u0170\77\u01e1\3\u01e2\1\u01ef\2\u01e2\1\u0223"+
+    "\2\u01e2\1\u0170\76\u01e2\3\u0212\1\0\3\u0212\1\u01f1\2\0"+
+    "\1\u01f2\75\u0212\3\u0213\1\u0224\4\u0213\1\u01ed\77\u0213\3\u0214"+
+    "\1\u0225\5\u0214\1\u01ed\76\u0214\1\u0212\1\u0226\1\u0212\1\0"+
+    "\3\u0212\1\u01f1\1\u0213\1\u0214\1\u0215\1\u0212\55\u0226\4\u0212"+
+    "\3\u0226\10\u0212\5\u020a\1\u0227\2\u020a\1\u0217\77\u020a\5\u0228"+
+    "\1\u0229\1\u0228\1\u022a\2\u0228\1\u022b\71\u0228\1\u022c\3\u0228"+
+    "\5\u020b\1\u022d\3\u020b\1\u0219\76\u020b\5\u022e\1\u022f\1\u022e"+
+    "\1\u0230\2\u022e\1\u0231\71\u022e\1\u0232\3\u022e\5\u020c\1\u0233"+
+    "\2\u020c\1\u021b\77\u020c\5\u0234\1\u0235\1\u0234\1\u0236\2\u0234"+
+    "\1\u0237\71\u0234\1\u0238\3\u0234\5\u020d\1\u0239\3\u020d\1\u021d"+
+    "\76\u020d\5\u023a\1\u023b\1\u023a\1\u023c\2\u023a\1\u023d\71\u023a"+
+    "\1\u023e\3\u023a\5\u020e\1\u023f\2\u020e\1\u021f\77\u020e\5\u0240"+
+    "\1\u0241\1\u0240\1\u0242\2\u0240\1\u0243\71\u0240\1\u0244\3\u0240"+
+    "\5\u020f\1\u0245\3\u020f\1\u0221\76\u020f\5\u0246\1\u0247\1\u0246"+
+    "\1\u0248\2\u0246\1\u0249\71\u0246\1\u024a\3\u0246\5\u0222\1\u024b"+
+    "\2\u0222\1\u024c\77\u0222\5\u0223\1\u024d\3\u0223\1\u024e\76\u0223"+
+    "\3\u0213\1\u0224\1\u024f\3\u0213\1\u01ed\77\u0213\3\u0214\1\u0225"+
+    "\1\u0250\4\u0214\1\u01ed\76\u0214\1\u0212\2\u0226\1\0\1\u0212"+
+    "\1\u0226\1\u0212\1\u01f1\2\0\1\u0207\1\u0208\64\u0226\1\u0212"+
+    "\1\u0226\6\u0212\5\u020a\1\u0227\1\u020a\1\u01bb\1\u0217\77\u020a"+
+    "\5\u0228\1\u0229\107\u0228\1\u0251\103\u0228\1\u0252\3\u0228\1\u0229"+
+    "\1\u0228\1\u022a\2\u0228\1\u022b\1\u0228\55\u0252\4\u0228\3\u0252"+
+    "\4\u0228\1\u022c\10\u0228\1\u0229\1\u0228\1\u022a\100\u0228\5\u020b"+
+    "\1\u022d\1\u020b\1\u01bc\1\u020b\1\u0219\76\u020b\5\u022e\1\u022f"+
+    "\107\u022e\1\u0253\103\u022e\1\u0254\3\u022e\1\u022f\1\u022e\1\u0230"+
+    "\2\u022e\1\u0231\1\u022e\55\u0254\4\u022e\3\u0254\4\u022e\1\u0232"+
+    "\10\u022e\1\u022f\1\u022e\1\u0230\100\u022e\5\u020c\1\u0233\1\u020c"+
+    "\1\u01bf\1\u021b\77\u020c\5\u0234\1\u0235\107\u0234\1\u0255\103\u0234"+
+    "\1\u0256\3\u0234\1\u0235\1\u0234\1\u0236\2\u0234\1\u0237\1\u0234"+
+    "\55\u0256\4\u0234\3\u0256\4\u0234\1\u0238\10\u0234\1\u0235\1\u0234"+
+    "\1\u0236\100\u0234\5\u020d\1\u0239\1\u020d\1\u01c0\1\u020d\1\u021d"+
+    "\76\u020d\5\u023a\1\u023b\107\u023a\1\u0257\103\u023a\1\u0258\3\u023a"+
+    "\1\u023b\1\u023a\1\u023c\2\u023a\1\u023d\1\u023a\55\u0258\4\u023a"+
+    "\3\u0258\4\u023a\1\u023e\10\u023a\1\u023b\1\u023a\1\u023c\100\u023a"+
+    "\5\u020e\1\u023f\1\u020e\1\u01c3\1\u021f\77\u020e\5\u0240\1\u0241"+
+    "\107\u0240\1\u0259\103\u0240\1\u025a\3\u0240\1\u0241\1\u0240\1\u0242"+
+    "\2\u0240\1\u0243\1\u0240\55\u025a\4\u0240\3\u025a\4\u0240\1\u0244"+
+    "\10\u0240\1\u0241\1\u0240\1\u0242\100\u0240\5\u020f\1\u0245\1\u020f"+
+    "\1\u01c4\1\u020f\1\u0221\76\u020f\5\u0246\1\u0247\107\u0246\1\u025b"+
+    "\103\u0246\1\u025c\3\u0246\1\u0247\1\u0246\1\u0248\2\u0246\1\u0249"+
+    "\1\u0246\55\u025c\4\u0246\3\u025c\4\u0246\1\u024a\10\u0246\1\u0247"+
+    "\1\u0246\1\u0248\100\u0246\5\u0222\1\u025d\2\u0222\1\u024c\77\u0222"+
+    "\5\u025e\1\u025f\1\u025e\1\u0260\2\u025e\1\u0261\71\u025e\1\u0262"+
+    "\3\u025e\5\u0223\1\u0263\3\u0223\1\u024e\76\u0223\5\u0264\1\u0265"+
+    "\1\u0264\1\u0266\2\u0264\1\u0267\71\u0264\1\u0268\3\u0264\3\u0213"+
+    "\1\u0224\1\u0213\1\u0269\2\u0213\1\u01ed\77\u0213\3\u0214\1\u0225"+
+    "\1\u0214\1\u026a\3\u0214\1\u01ed\76\u0214\5\u0228\1\u0251\1\u0228"+
+    "\1\u01bb\101\u0228\2\u0252\2\u0228\1\u026b\1\u0228\1\u022a\2\u0228"+
+    "\1\u026c\1\u026d\64\u0252\1\u0228\1\u0252\2\u0228\1\u022c\3\u0228"+
+    "\5\u022e\1\u0253\1\u022e\1\u01bc\101\u022e\2\u0254\2\u022e\1\u026e"+
+    "\1\u022e\1\u0230\2\u022e\1\u026f\1\u0270\64\u0254\1\u022e\1\u0254"+
+    "\2\u022e\1\u0232\3\u022e\5\u0234\1\u0255\1\u0234\1\u01bf\101\u0234"+
+    "\2\u0256\2\u0234\1\u0271\1\u0234\1\u0236\2\u0234\1\u0272\1\u0273"+
+    "\64\u0256\1\u0234\1\u0256\2\u0234\1\u0238\3\u0234\5\u023a\1\u0257"+
+    "\1\u023a\1\u01c0\101\u023a\2\u0258\2\u023a\1\u0274\1\u023a\1\u023c"+
+    "\2\u023a\1\u0275\1\u0276\64\u0258\1\u023a\1\u0258\2\u023a\1\u023e"+
+    "\3\u023a\5\u0240\1\u0259\1\u0240\1\u01c3\101\u0240\2\u025a\2\u0240"+
+    "\1\u0277\1\u0240\1\u0242\2\u0240\1\u0278\1\u0279\64\u025a\1\u0240"+
+    "\1\u025a\2\u0240\1\u0244\3\u0240\5\u0246\1\u025b\1\u0246\1\u01c4"+
+    "\101\u0246\2\u025c\2\u0246\1\u027a\1\u0246\1\u0248\2\u0246\1\u027b"+
+    "\1\u027c\64\u025c\1\u0246\1\u025c\2\u0246\1\u024a\3\u0246\5\u0222"+
+    "\1\u025d\1\u0222\1\u01e1\1\u024c\77\u0222\5\u025e\1\u025f\107\u025e"+
+    "\1\u027d\103\u025e\1\u027e\3\u025e\1\u025f\1\u025e\1\u0260\2\u025e"+
+    "\1\u0261\1\u025e\55\u027e\4\u025e\3\u027e\4\u025e\1\u0262\10\u025e"+
+    "\1\u025f\1\u025e\1\u0260\100\u025e\5\u0223\1\u0263\1\u0223\1\u01e2"+
+    "\1\u0223\1\u024e\76\u0223\5\u0264\1\u0265\107\u0264\1\u027f\103\u0264"+
+    "\1\u0280\3\u0264\1\u0265\1\u0264\1\u0266\2\u0264\1\u0267\1\u0264"+
+    "\55\u0280\4\u0264\3\u0280\4\u0264\1\u0268\10\u0264\1\u0265\1\u0264"+
+    "\1\u0266\100\u0264\3\u0213\1\u0224\1\u0213\1\u0281\2\u0213\1\u01ed"+
+    "\77\u0213\3\u0214\1\u0225\1\u0214\1\u0282\3\u0214\1\u01ed\76\u0214"+
+    "\1\u0228\2\u0252\2\u0228\1\u0283\1\u0228\1\u022a\2\u0228\1\u026c"+
+    "\1\u026d\64\u0252\1\u0228\1\u0252\2\u0228\1\u022c\4\u0228\1\u0252"+
+    "\3\u0228\1\u0229\1\u0228\1\u022a\2\u0228\1\u026c\1\u026d\55\u0252"+
+    "\4\u0228\3\u0252\4\u0228\1\u022c\3\u0228\3\u0284\1\u0228\1\u0284"+
+    "\1\u0285\1\u0284\1\u022a\1\u020a\1\u0286\1\u0287\75\u0284\1\u022e"+
+    "\2\u0254\2\u022e\1\u0288\1\u022e\1\u0230\2\u022e\1\u026f\1\u0270"+
+    "\64\u0254\1\u022e\1\u0254\2\u022e\1\u0232\4\u022e\1\u0254\3\u022e"+
+    "\1\u022f\1\u022e\1\u0230\2\u022e\1\u026f\1\u0270\55\u0254\4\u022e"+
+    "\3\u0254\4\u022e\1\u0232\3\u022e\3\u0289\1\u022e\1\u0289\1\u028a"+
+    "\1\u0289\1\u0230\1\u028b\1\u020b\1\u028c\75\u0289\1\u0234\2\u0256"+
+    "\2\u0234\1\u028d\1\u0234\1\u0236\2\u0234\1\u0272\1\u0273\64\u0256"+
+    "\1\u0234\1\u0256\2\u0234\1\u0238\4\u0234\1\u0256\3\u0234\1\u0235"+
+    "\1\u0234\1\u0236\2\u0234\1\u0272\1\u0273\55\u0256\4\u0234\3\u0256"+
+    "\4\u0234\1\u0238\3\u0234\3\u028e\1\u0234\1\u028e\1\u028f\1\u028e"+
+    "\1\u0236\1\u020c\1\u0290\1\u0291\75\u028e\1\u023a\2\u0258\2\u023a"+
+    "\1\u0292\1\u023a\1\u023c\2\u023a\1\u0275\1\u0276\64\u0258\1\u023a"+
+    "\1\u0258\2\u023a\1\u023e\4\u023a\1\u0258\3\u023a\1\u023b\1\u023a"+
+    "\1\u023c\2\u023a\1\u0275\1\u0276\55\u0258\4\u023a\3\u0258\4\u023a"+
+    "\1\u023e\3\u023a\3\u0293\1\u023a\1\u0293\1\u0294\1\u0293\1\u023c"+
+    "\1\u0295\1\u020d\1\u0296\75\u0293\1\u0240\2\u025a\2\u0240\1\u0297"+
+    "\1\u0240\1\u0242\2\u0240\1\u0278\1\u0279\64\u025a\1\u0240\1\u025a"+
+    "\2\u0240\1\u0244\4\u0240\1\u025a\3\u0240\1\u0241\1\u0240\1\u0242"+
+    "\2\u0240\1\u0278\1\u0279\55\u025a\4\u0240\3\u025a\4\u0240\1\u0244"+
+    "\3\u0240\3\u0298\1\u0240\1\u0298\1\u0299\1\u0298\1\u0242\1\u020e"+
+    "\1\u029a\1\u029b\75\u0298\1\u0246\2\u025c\2\u0246\1\u029c\1\u0246"+
+    "\1\u0248\2\u0246\1\u027b\1\u027c\64\u025c\1\u0246\1\u025c\2\u0246"+
+    "\1\u024a\4\u0246\1\u025c\3\u0246\1\u0247\1\u0246\1\u0248\2\u0246"+
+    "\1\u027b\1\u027c\55\u025c\4\u0246\3\u025c\4\u0246\1\u024a\3\u0246"+
+    "\3\u029d\1\u0246\1\u029d\1\u029e\1\u029d\1\u0248\1\u029f\1\u020f"+
+    "\1\u02a0\75\u029d\5\u025e\1\u027d\1\u025e\1\u01e1\101\u025e\2\u027e"+
+    "\2\u025e\1\u02a1\1\u025e\1\u0260\2\u025e\1\u02a2\1\u02a3\64\u027e"+
+    "\1\u025e\1\u027e\2\u025e\1\u0262\3\u025e\5\u0264\1\u027f\1\u0264"+
+    "\1\u01e2\101\u0264\2\u0280\2\u0264\1\u02a4\1\u0264\1\u0266\2\u0264"+
+    "\1\u02a5\1\u02a6\64\u0280\1\u0264\1\u0280\2\u0264\1\u0268\3\u0264"+
+    "\3\u0213\1\u0224\2\u0213\1\u02a7\1\u0213\1\u01ed\77\u0213\3\u0214"+
+    "\1\u0225\2\u0214\1\u02a8\2\u0214\1\u01ed\76\u0214\1\u0228\2\u0252"+
+    "\2\u0228\1\u0283\1\u0228\1\u02a9\2\u0228\1\u026c\1\u026d\64\u0252"+
+    "\1\u0228\1\u0252\2\u0228\1\u022c\3\u0228\3\u0284\1\u0228\1\u0284"+
+    "\1\u0285\1\u0284\1\u022a\2\u0228\1\u022b\100\u0284\1\u0228\1\u0284"+
+    "\1\u02aa\1\u0284\1\u022a\2\u0228\1\u022b\75\u0284\3\u0286\1\u02ab"+
+    "\1\u0286\1\u02ac\3\u0286\1\u0217\76\u0286\1\u0284\1\u02ad\1\u0284"+
+    "\1\u0228\1\u0284\1\u0285\1\u0284\1\u022a\1\u020a\1\u0286\1\u0287"+
+    "\1\u0284\55\u02ad\4\u0284\3\u02ad\10\u0284\1\u022e\2\u0254\2\u022e"+
+    "\1\u0288\1\u022e\1\u02ae\2\u022e\1\u026f\1\u0270\64\u0254\1\u022e"+
+    "\1\u0254\2\u022e\1\u0232\3\u022e\3\u0289\1\u022e\1\u0289\1\u028a"+
+    "\1\u0289\1\u0230\2\u022e\1\u0231\100\u0289\1\u022e\1\u0289\1\u02af"+
+    "\1\u0289\1\u0230\2\u022e\1\u0231\75\u0289\3\u028b\1\u02b0\1\u028b"+
+    "\1\u02b1\2\u028b\1\u0219\77\u028b\1\u0289\1\u02b2\1\u0289\1\u022e"+
+    "\1\u0289\1\u028a\1\u0289\1\u0230\1\u028b\1\u020b\1\u028c\1\u0289"+
+    "\55\u02b2\4\u0289\3\u02b2\10\u0289\1\u0234\2\u0256\2\u0234\1\u028d"+
+    "\1\u0234\1\u02b3\2\u0234\1\u0272\1\u0273\64\u0256\1\u0234\1\u0256"+
+    "\2\u0234\1\u0238\3\u0234\3\u028e\1\u0234\1\u028e\1\u028f\1\u028e"+
+    "\1\u0236\2\u0234\1\u0237\100\u028e\1\u0234\1\u028e\1\u02b4\1\u028e"+
+    "\1\u0236\2\u0234\1\u0237\75\u028e\3\u0290\1\u02b5\1\u0290\1\u02b6"+
+    "\3\u0290\1\u021b\76\u0290\1\u028e\1\u02b7\1\u028e\1\u0234\1\u028e"+
+    "\1\u028f\1\u028e\1\u0236\1\u020c\1\u0290\1\u0291\1\u028e\55\u02b7"+
+    "\4\u028e\3\u02b7\10\u028e\1\u023a\2\u0258\2\u023a\1\u0292\1\u023a"+
+    "\1\u02b8\2\u023a\1\u0275\1\u0276\64\u0258\1\u023a\1\u0258\2\u023a"+
+    "\1\u023e\3\u023a\3\u0293\1\u023a\1\u0293\1\u0294\1\u0293\1\u023c"+
+    "\2\u023a\1\u023d\100\u0293\1\u023a\1\u0293\1\u02b9\1\u0293\1\u023c"+
+    "\2\u023a\1\u023d\75\u0293\3\u0295\1\u02ba\1\u0295\1\u02bb\2\u0295"+
+    "\1\u021d\77\u0295\1\u0293\1\u02bc\1\u0293\1\u023a\1\u0293\1\u0294"+
+    "\1\u0293\1\u023c\1\u0295\1\u020d\1\u0296\1\u0293\55\u02bc\4\u0293"+
+    "\3\u02bc\10\u0293\1\u0240\2\u025a\2\u0240\1\u0297\1\u0240\1\u02bd"+
+    "\2\u0240\1\u0278\1\u0279\64\u025a\1\u0240\1\u025a\2\u0240\1\u0244"+
+    "\3\u0240\3\u0298\1\u0240\1\u0298\1\u0299\1\u0298\1\u0242\2\u0240"+
+    "\1\u0243\100\u0298\1\u0240\1\u0298\1\u02be\1\u0298\1\u0242\2\u0240"+
+    "\1\u0243\75\u0298\3\u029a\1\u02bf\1\u029a\1\u02c0\3\u029a\1\u021f"+
+    "\76\u029a\1\u0298\1\u02c1\1\u0298\1\u0240\1\u0298\1\u0299\1\u0298"+
+    "\1\u0242\1\u020e\1\u029a\1\u029b\1\u0298\55\u02c1\4\u0298\3\u02c1"+
+    "\10\u0298\1\u0246\2\u025c\2\u0246\1\u029c\1\u0246\1\u02c2\2\u0246"+
+    "\1\u027b\1\u027c\64\u025c\1\u0246\1\u025c\2\u0246\1\u024a\3\u0246"+
+    "\3\u029d\1\u0246\1\u029d\1\u029e\1\u029d\1\u0248\2\u0246\1\u0249"+
+    "\100\u029d\1\u0246\1\u029d\1\u02c3\1\u029d\1\u0248\2\u0246\1\u0249"+
+    "\75\u029d\3\u029f\1\u02c4\1\u029f\1\u02c5\2\u029f\1\u0221\77\u029f"+
+    "\1\u029d\1\u02c6\1\u029d\1\u0246\1\u029d\1\u029e\1\u029d\1\u0248"+
+    "\1\u029f\1\u020f\1\u02a0\1\u029d\55\u02c6\4\u029d\3\u02c6\10\u029d"+
+    "\1\u025e\2\u027e\2\u025e\1\u02c7\1\u025e\1\u0260\2\u025e\1\u02a2"+
+    "\1\u02a3\64\u027e\1\u025e\1\u027e\2\u025e\1\u0262\4\u025e\1\u027e"+
+    "\3\u025e\1\u025f\1\u025e\1\u0260\2\u025e\1\u02a2\1\u02a3\55\u027e"+
+    "\4\u025e\3\u027e\4\u025e\1\u0262\3\u025e\3\u02c8\1\u025e\1\u02c8"+
+    "\1\u02c9\1\u02c8\1\u0260\1\u0222\1\u02ca\1\u02cb\75\u02c8\1\u0264"+
+    "\2\u0280\2\u0264\1\u02cc\1\u0264\1\u0266\2\u0264\1\u02a5\1\u02a6"+
+    "\64\u0280\1\u0264\1\u0280\2\u0264\1\u0268\4\u0264\1\u0280\3\u0264"+
+    "\1\u0265\1\u0264\1\u0266\2\u0264\1\u02a5\1\u02a6\55\u0280\4\u0264"+
+    "\3\u0280\4\u0264\1\u0268\3\u0264\3\u02cd\1\u0264\1\u02cd\1\u02ce"+
+    "\1\u02cd\1\u0266\1\u02cf\1\u0223\1\u02d0\75\u02cd\5\u02a7\1\u02d1"+
+    "\2\u02a7\1\u02d2\77\u02a7\5\u02a8\1\u02d3\3\u02a8\1\u02d4\76\u02a8"+
+    "\3\u0284\1\u0228\1\u0284\1\u02aa\1\u0284\1\u02a9\2\u0228\1\u022b"+
+    "\75\u0284\3\u0286\1\u02ab\1\u02d5\1\u02ac\3\u0286\1\u0217\101\u0286"+
+    "\1\u02ab\1\u0286\1\u02d6\3\u0286\1\u0217\76\u0286\1\u0284\2\u02ad"+
+    "\1\u0228\1\u0284\1\u02d7\1\u0284\1\u022a\2\u0228\1\u026c\1\u026d"+
+    "\64\u02ad\1\u0284\1\u02ad\6\u0284\3\u0289\1\u022e\1\u0289\1\u02af"+
+    "\1\u0289\1\u02ae\2\u022e\1\u0231\75\u0289\3\u028b\1\u02b0\1\u02d8"+
+    "\1\u02b1\2\u028b\1\u0219\102\u028b\1\u02b0\1\u028b\1\u02d9\2\u028b"+
+    "\1\u0219\77\u028b\1\u0289\2\u02b2\1\u022e\1\u0289\1\u02da\1\u0289"+
+    "\1\u0230\2\u022e\1\u026f\1\u0270\64\u02b2\1\u0289\1\u02b2\6\u0289"+
+    "\3\u028e\1\u0234\1\u028e\1\u02b4\1\u028e\1\u02b3\2\u0234\1\u0237"+
+    "\75\u028e\3\u0290\1\u02b5\1\u02db\1\u02b6\3\u0290\1\u021b\101\u0290"+
+    "\1\u02b5\1\u0290\1\u02dc\3\u0290\1\u021b\76\u0290\1\u028e\2\u02b7"+
+    "\1\u0234\1\u028e\1\u02dd\1\u028e\1\u0236\2\u0234\1\u0272\1\u0273"+
+    "\64\u02b7\1\u028e\1\u02b7\6\u028e\3\u0293\1\u023a\1\u0293\1\u02b9"+
+    "\1\u0293\1\u02b8\2\u023a\1\u023d\75\u0293\3\u0295\1\u02ba\1\u02de"+
+    "\1\u02bb\2\u0295\1\u021d\102\u0295\1\u02ba\1\u0295\1\u02df\2\u0295"+
+    "\1\u021d\77\u0295\1\u0293\2\u02bc\1\u023a\1\u0293\1\u02e0\1\u0293"+
+    "\1\u023c\2\u023a\1\u0275\1\u0276\64\u02bc\1\u0293\1\u02bc\6\u0293"+
+    "\3\u0298\1\u0240\1\u0298\1\u02be\1\u0298\1\u02bd\2\u0240\1\u0243"+
+    "\75\u0298\3\u029a\1\u02bf\1\u02e1\1\u02c0\3\u029a\1\u021f\101\u029a"+
+    "\1\u02bf\1\u029a\1\u02e2\3\u029a\1\u021f\76\u029a\1\u0298\2\u02c1"+
+    "\1\u0240\1\u0298\1\u02e3\1\u0298\1\u0242\2\u0240\1\u0278\1\u0279"+
+    "\64\u02c1\1\u0298\1\u02c1\6\u0298\3\u029d\1\u0246\1\u029d\1\u02c3"+
+    "\1\u029d\1\u02c2\2\u0246\1\u0249\75\u029d\3\u029f\1\u02c4\1\u02e4"+
+    "\1\u02c5\2\u029f\1\u0221\102\u029f\1\u02c4\1\u029f\1\u02e5\2\u029f"+
+    "\1\u0221\77\u029f\1\u029d\2\u02c6\1\u0246\1\u029d\1\u02e6\1\u029d"+
+    "\1\u0248\2\u0246\1\u027b\1\u027c\64\u02c6\1\u029d\1\u02c6\6\u029d"+
+    "\1\u025e\2\u027e\2\u025e\1\u02c7\1\u025e\1\u02e7\2\u025e\1\u02a2"+
+    "\1\u02a3\64\u027e\1\u025e\1\u027e\2\u025e\1\u0262\3\u025e\3\u02c8"+
+    "\1\u025e\1\u02c8\1\u02c9\1\u02c8\1\u0260\2\u025e\1\u0261\100\u02c8"+
+    "\1\u025e\1\u02c8\1\u02e8\1\u02c8\1\u0260\2\u025e\1\u0261\75\u02c8"+
+    "\3\u02ca\1\u02e9\1\u02ca\1\u02ea\3\u02ca\1\u024c\76\u02ca\1\u02c8"+
+    "\1\u02eb\1\u02c8\1\u025e\1\u02c8\1\u02c9\1\u02c8\1\u0260\1\u0222"+
+    "\1\u02ca\1\u02cb\1\u02c8\55\u02eb\4\u02c8\3\u02eb\10\u02c8\1\u0264"+
+    "\2\u0280\2\u0264\1\u02cc\1\u0264\1\u02ec\2\u0264\1\u02a5\1\u02a6"+
+    "\64\u0280\1\u0264\1\u0280\2\u0264\1\u0268\3\u0264\3\u02cd\1\u0264"+
+    "\1\u02cd\1\u02ce\1\u02cd\1\u0266\2\u0264\1\u0267\100\u02cd\1\u0264"+
+    "\1\u02cd\1\u02ed\1\u02cd\1\u0266\2\u0264\1\u0267\75\u02cd\3\u02cf"+
+    "\1\u02ee\1\u02cf\1\u02ef\2\u02cf\1\u024e\77\u02cf\1\u02cd\1\u02f0"+
+    "\1\u02cd\1\u0264\1\u02cd\1\u02ce\1\u02cd\1\u0266\1\u02cf\1\u0223"+
+    "\1\u02d0\1\u02cd\55\u02f0\4\u02cd\3\u02f0\10\u02cd\5\u02a7\1\u02f1"+
+    "\2\u02a7\1\u02d2\77\u02a7\5\u02f2\1\u02f3\1\u02f2\1\u02f4\2\u02f2"+
+    "\1\u02f5\75\u02f2\5\u02a8\1\u02f6\3\u02a8\1\u02d4\76\u02a8\5\u02f7"+
+    "\1\u02f8\1\u02f7\1\u02f9\2\u02f7\1\u02fa\75\u02f7\3\u0286\1\u02ab"+
+    "\1\u0286\1\u02fb\3\u0286\1\u0217\101\u0286\1\u02ab\1\u0286\1\u02d6"+
+    "\1\u0286\1\u02fc\1\u0286\1\u0217\76\u0286\1\u0284\2\u02ad\1\u0228"+
+    "\1\u0284\1\u02fd\1\u0284\1\u022a\2\u0228\1\u026c\1\u026d\64\u02ad"+
+    "\1\u0284\1\u02ad\6\u0284\3\u028b\1\u02b0\1\u028b\1\u02fe\2\u028b"+
+    "\1\u0219\102\u028b\1\u02b0\1\u028b\1\u02d9\1\u028b\1\u02fc\1\u0219"+
+    "\77\u028b\1\u0289\2\u02b2\1\u022e\1\u0289\1\u02ff\1\u0289\1\u0230"+
+    "\2\u022e\1\u026f\1\u0270\64\u02b2\1\u0289\1\u02b2\6\u0289\3\u0290"+
+    "\1\u02b5\1\u0290\1\u0300\3\u0290\1\u021b\101\u0290\1\u02b5\1\u0290"+
+    "\1\u02dc\1\u0290\1\u0301\1\u0290\1\u021b\76\u0290\1\u028e\2\u02b7"+
+    "\1\u0234\1\u028e\1\u0302\1\u028e\1\u0236\2\u0234\1\u0272\1\u0273"+
+    "\64\u02b7\1\u028e\1\u02b7\6\u028e\3\u0295\1\u02ba\1\u0295\1\u0303"+
+    "\2\u0295\1\u021d\102\u0295\1\u02ba\1\u0295\1\u02df\1\u0295\1\u0301"+
+    "\1\u021d\77\u0295\1\u0293\2\u02bc\1\u023a\1\u0293\1\u0304\1\u0293"+
+    "\1\u023c\2\u023a\1\u0275\1\u0276\64\u02bc\1\u0293\1\u02bc\6\u0293"+
+    "\3\u029a\1\u02bf\1\u029a\1\u0305\3\u029a\1\u021f\101\u029a\1\u02bf"+
+    "\1\u029a\1\u02e2\1\u029a\1\u0306\1\u029a\1\u021f\76\u029a\1\u0298"+
+    "\2\u02c1\1\u0240\1\u0298\1\u0307\1\u0298\1\u0242\2\u0240\1\u0278"+
+    "\1\u0279\64\u02c1\1\u0298\1\u02c1\6\u0298\3\u029f\1\u02c4\1\u029f"+
+    "\1\u0308\2\u029f\1\u0221\102\u029f\1\u02c4\1\u029f\1\u02e5\1\u029f"+
+    "\1\u0306\1\u0221\77\u029f\1\u029d\2\u02c6\1\u0246\1\u029d\1\u0309"+
+    "\1\u029d\1\u0248\2\u0246\1\u027b\1\u027c\64\u02c6\1\u029d\1\u02c6"+
+    "\6\u029d\3\u02c8\1\u025e\1\u02c8\1\u02e8\1\u02c8\1\u02e7\2\u025e"+
+    "\1\u0261\75\u02c8\3\u02ca\1\u02e9\1\u030a\1\u02ea\3\u02ca\1\u024c"+
+    "\101\u02ca\1\u02e9\1\u02ca\1\u030b\3\u02ca\1\u024c\76\u02ca\1\u02c8"+
+    "\2\u02eb\1\u025e\1\u02c8\1\u030c\1\u02c8\1\u0260\2\u025e\1\u02a2"+
+    "\1\u02a3\64\u02eb\1\u02c8\1\u02eb\6\u02c8\3\u02cd\1\u0264\1\u02cd"+
+    "\1\u02ed\1\u02cd\1\u02ec\2\u0264\1\u0267\75\u02cd\3\u02cf\1\u02ee"+
+    "\1\u030d\1\u02ef\2\u02cf\1\u024e\102\u02cf\1\u02ee\1\u02cf\1\u030e"+
+    "\2\u02cf\1\u024e\77\u02cf\1\u02cd\2\u02f0\1\u0264\1\u02cd\1\u030f"+
+    "\1\u02cd\1\u0266\2\u0264\1\u02a5\1\u02a6\64\u02f0\1\u02cd\1\u02f0"+
+    "\6\u02cd\5\u02a7\1\u02f1\1\u02a7\1\u0213\1\u02d2\77\u02a7\5\u02f2"+
+    "\1\u02f3\107\u02f2\1\u0310\103\u02f2\1\u0311\3\u02f2\1\u02f3\1\u02f2"+
+    "\1\u02f4\2\u02f2\1\u02f5\1\u02f2\55\u0311\4\u02f2\3\u0311\10\u02f2"+
+    "\5\u02a8\1\u02f6\1\u02a8\1\u0214\1\u02a8\1\u02d4\76\u02a8\5\u02f7"+
+    "\1\u02f8\107\u02f7\1\u0312\103\u02f7\1\u0313\3\u02f7\1\u02f8\1\u02f7"+
+    "\1\u02f9\2\u02f7\1\u02fa\1\u02f7\55\u0313\4\u02f7\3\u0313\10\u02f7"+
+    "\3\u0286\1\u02ab\1\u0286\1\u0314\3\u0286\1\u0217\76\u0286\3\u02fc"+
+    "\1\u0315\4\u02fc\1\u0316\1\u0317\76\u02fc\1\u0284\2\u02ad\1\u0228"+
+    "\1\u0284\1\u02fd\1\u0284\1\u02a9\2\u0228\1\u026c\1\u026d\64\u02ad"+
+    "\1\u0284\1\u02ad\6\u0284\3\u028b\1\u02b0\1\u028b\1\u0318\2\u028b"+
+    "\1\u0219\77\u028b\1\u0289\2\u02b2\1\u022e\1\u0289\1\u02ff\1\u0289"+
+    "\1\u02ae\2\u022e\1\u026f\1\u0270\64\u02b2\1\u0289\1\u02b2\6\u0289"+
+    "\3\u0290\1\u02b5\1\u0290\1\u0319\3\u0290\1\u021b\76\u0290\3\u0301"+
+    "\1\u031a\4\u0301\1\u031b\1\u031c\76\u0301\1\u028e\2\u02b7\1\u0234"+
+    "\1\u028e\1\u0302\1\u028e\1\u02b3\2\u0234\1\u0272\1\u0273\64\u02b7"+
+    "\1\u028e\1\u02b7\6\u028e\3\u0295\1\u02ba\1\u0295\1\u031d\2\u0295"+
+    "\1\u021d\77\u0295\1\u0293\2\u02bc\1\u023a\1\u0293\1\u0304\1\u0293"+
+    "\1\u02b8\2\u023a\1\u0275\1\u0276\64\u02bc\1\u0293\1\u02bc\6\u0293"+
+    "\3\u029a\1\u02bf\1\u029a\1\u031e\3\u029a\1\u021f\76\u029a\3\u0306"+
+    "\1\u031f\4\u0306\1\u0320\1\u0321\76\u0306\1\u0298\2\u02c1\1\u0240"+
+    "\1\u0298\1\u0307\1\u0298\1\u02bd\2\u0240\1\u0278\1\u0279\64\u02c1"+
+    "\1\u0298\1\u02c1\6\u0298\3\u029f\1\u02c4\1\u029f\1\u0322\2\u029f"+
+    "\1\u0221\77\u029f\1\u029d\2\u02c6\1\u0246\1\u029d\1\u0309\1\u029d"+
+    "\1\u02c2\2\u0246\1\u027b\1\u027c\64\u02c6\1\u029d\1\u02c6\6\u029d"+
+    "\3\u02ca\1\u02e9\1\u02ca\1\u0323\3\u02ca\1\u024c\101\u02ca\1\u02e9"+
+    "\1\u02ca\1\u030b\1\u02ca\1\u0324\1\u02ca\1\u024c\76\u02ca\1\u02c8"+
+    "\2\u02eb\1\u025e\1\u02c8\1\u0325\1\u02c8\1\u0260\2\u025e\1\u02a2"+
+    "\1\u02a3\64\u02eb\1\u02c8\1\u02eb\6\u02c8\3\u02cf\1\u02ee\1\u02cf"+
+    "\1\u0326\2\u02cf\1\u024e\102\u02cf\1\u02ee\1\u02cf\1\u030e\1\u02cf"+
+    "\1\u0324\1\u024e\77\u02cf\1\u02cd\2\u02f0\1\u0264\1\u02cd\1\u0327"+
+    "\1\u02cd\1\u0266\2\u0264\1\u02a5\1\u02a6\64\u02f0\1\u02cd\1\u02f0"+
+    "\6\u02cd\5\u02f2\1\u0310\1\u02f2\1\u0213\101\u02f2\2\u0311\2\u02f2"+
+    "\1\u0328\1\u02f2\1\u02f4\2\u02f2\1\u0329\1\u032a\64\u0311\1\u02f2"+
+    "\1\u0311\6\u02f2\5\u02f7\1\u0312\1\u02f7\1\u0214\101\u02f7\2\u0313"+
+    "\2\u02f7\1\u032b\1\u02f7\1\u02f9\2\u02f7\1\u032c\1\u032d\64\u0313"+
+    "\1\u02f7\1\u0313\6\u02f7\3\u0286\1\u02ab\1\u0286\1\u02d6\1\u032e"+
+    "\1\u02fc\1\u0286\1\u0217\76\u0286\3\u02fc\1\u0315\1\u032f\3\u02fc"+
+    "\1\u0316\1\u0317\76\u02fc\3\u01bc\1\u01d5\3\u01bc\1\u02ae\1\u01bc"+
+    "\1\u01d4\1\u0330\71\u01bc\1\u0331\3\u01bc\3\u01bb\1\u01d3\3\u01bb"+
+    "\1\u02a9\1\u01d4\1\u01bb\1\u0332\71\u01bb\1\u0333\3\u01bb\3\u028b"+
+    "\1\u02b0\1\u028b\1\u02d9\1\u0334\1\u02fc\1\u0219\77\u028b\3\u0290"+
+    "\1\u02b5\1\u0290\1\u02dc\1\u0335\1\u0301\1\u0290\1\u021b\76\u0290"+
+    "\3\u0301\1\u031a\1\u0336\3\u0301\1\u031b\1\u031c\76\u0301\3\u01c0"+
+    "\1\u01d9\3\u01c0\1\u02b8\1\u01c0\1\u01d8\1\u0337\71\u01c0\1\u0338"+
+    "\3\u01c0\3\u01bf\1\u01d7\3\u01bf\1\u02b3\1\u01d8\1\u01bf\1\u0339"+
+    "\71\u01bf\1\u033a\3\u01bf\3\u0295\1\u02ba\1\u0295\1\u02df\1\u033b"+
+    "\1\u0301\1\u021d\77\u0295\3\u029a\1\u02bf\1\u029a\1\u02e2\1\u033c"+
+    "\1\u0306\1\u029a\1\u021f\76\u029a\3\u0306\1\u031f\1\u033d\3\u0306"+
+    "\1\u0320\1\u0321\76\u0306\3\u01c4\1\u01dd\3\u01c4\1\u02c2\1\u01c4"+
+    "\1\u01dc\1\u033e\71\u01c4\1\u033f\3\u01c4\3\u01c3\1\u01db\3\u01c3"+
+    "\1\u02bd\1\u01dc\1\u01c3\1\u0340\71\u01c3\1\u0341\3\u01c3\3\u029f"+
+    "\1\u02c4\1\u029f\1\u02e5\1\u0342\1\u0306\1\u0221\77\u029f\3\u02ca"+
+    "\1\u02e9\1\u02ca\1\u0343\3\u02ca\1\u024c\76\u02ca\3\u0324\1\u0344"+
+    "\4\u0324\1\u0345\1\u0346\76\u0324\1\u02c8\2\u02eb\1\u025e\1\u02c8"+
+    "\1\u0325\1\u02c8\1\u02e7\2\u025e\1\u02a2\1\u02a3\64\u02eb\1\u02c8"+
+    "\1\u02eb\6\u02c8\3\u02cf\1\u02ee\1\u02cf\1\u0347\2\u02cf\1\u024e"+
+    "\77\u02cf\1\u02cd\2\u02f0\1\u0264\1\u02cd\1\u0327\1\u02cd\1\u02ec"+
+    "\2\u0264\1\u02a5\1\u02a6\64\u02f0\1\u02cd\1\u02f0\6\u02cd\1\u02f2"+
+    "\2\u0311\2\u02f2\1\u0348\1\u02f2\1\u02f4\2\u02f2\1\u0329\1\u032a"+
+    "\64\u0311\1\u02f2\1\u0311\7\u02f2\1\u0311\3\u02f2\1\u02f3\1\u02f2"+
+    "\1\u02f4\2\u02f2\1\u0329\1\u032a\55\u0311\4\u02f2\3\u0311\10\u02f2"+
+    "\3\u0349\1\u02f2\1\u0349\1\u034a\1\u0349\1\u02f4\1\u02a7\1\u034b"+
+    "\1\u034c\75\u0349\1\u02f7\2\u0313\2\u02f7\1\u034d\1\u02f7\1\u02f9"+
+    "\2\u02f7\1\u032c\1\u032d\64\u0313\1\u02f7\1\u0313\7\u02f7\1\u0313"+
+    "\3\u02f7\1\u02f8\1\u02f7\1\u02f9\2\u02f7\1\u032c\1\u032d\55\u0313"+
+    "\4\u02f7\3\u0313\10\u02f7\3\u034e\1\u02f7\1\u034e\1\u034f\1\u034e"+
+    "\1\u02f9\1\u0350\1\u02a8\1\u0351\75\u034e\5\u032e\1\u0352\3\u032e"+
+    "\1\u0353\76\u032e\3\u02fc\1\u0315\1\u02fc\1\u0354\2\u02fc\1\u0316"+
+    "\1\u0317\76\u02fc\1\u01bc\1\u0355\1\u01bc\1\u01d5\3\u01bc\1\u02ae"+
+    "\1\u01bc\1\u01d4\1\u0330\1\u01bc\55\u0355\4\u01bc\3\u0355\4\u01bc"+
+    "\1\u0331\6\u01bc\1\u01d5\3\u01bc\1\u02ae\1\u01bc\1\u01d4\76\u01bc"+
+    "\1\u01bb\1\u0356\1\u01bb\1\u01d3\3\u01bb\1\u02a9\1\u01d4\1\u01bb"+
+    "\1\u0332\1\u01bb\55\u0356\4\u01bb\3\u0356\4\u01bb\1\u0333\6\u01bb"+
+    "\1\u01d3\3\u01bb\1\u02a9\1\u01d4\77\u01bb\5\u0334\1\u0357\2\u0334"+
+    "\1\u0353\77\u0334\5\u0335\1\u0358\3\u0335\1\u0359\76\u0335\3\u0301"+
+    "\1\u031a\1\u0301\1\u035a\2\u0301\1\u031b\1\u031c\76\u0301\1\u01c0"+
+    "\1\u035b\1\u01c0\1\u01d9\3\u01c0\1\u02b8\1\u01c0\1\u01d8\1\u0337"+
+    "\1\u01c0\55\u035b\4\u01c0\3\u035b\4\u01c0\1\u0338\6\u01c0\1\u01d9"+
+    "\3\u01c0\1\u02b8\1\u01c0\1\u01d8\76\u01c0\1\u01bf\1\u035c\1\u01bf"+
+    "\1\u01d7\3\u01bf\1\u02b3\1\u01d8\1\u01bf\1\u0339\1\u01bf\55\u035c"+
+    "\4\u01bf\3\u035c\4\u01bf\1\u033a\6\u01bf\1\u01d7\3\u01bf\1\u02b3"+
+    "\1\u01d8\77\u01bf\5\u033b\1\u035d\2\u033b\1\u0359\77\u033b\5\u033c"+
+    "\1\u035e\3\u033c\1\u035f\76\u033c\3\u0306\1\u031f\1\u0306\1\u0360"+
+    "\2\u0306\1\u0320\1\u0321\76\u0306\1\u01c4\1\u0361\1\u01c4\1\u01dd"+
+    "\3\u01c4\1\u02c2\1\u01c4\1\u01dc\1\u033e\1\u01c4\55\u0361\4\u01c4"+
+    "\3\u0361\4\u01c4\1\u033f\6\u01c4\1\u01dd\3\u01c4\1\u02c2\1\u01c4"+
+    "\1\u01dc\76\u01c4\1\u01c3\1\u0362\1\u01c3\1\u01db\3\u01c3\1\u02bd"+
+    "\1\u01dc\1\u01c3\1\u0340\1\u01c3\55\u0362\4\u01c3\3\u0362\4\u01c3"+
+    "\1\u0341\6\u01c3\1\u01db\3\u01c3\1\u02bd\1\u01dc\77\u01c3\5\u0342"+
+    "\1\u0363\2\u0342\1\u035f\77\u0342\3\u02ca\1\u02e9\1\u02ca\1\u030b"+
+    "\1\u0364\1\u0324\1\u02ca\1\u024c\76\u02ca\3\u0324\1\u0344\1\u0365"+
+    "\3\u0324\1\u0345\1\u0346\76\u0324\3\u01e2\1\u01ef\3\u01e2\1\u02ec"+
+    "\1\u01e2\1\u0170\1\u0366\71\u01e2\1\u0367\3\u01e2\3\u01e1\1\u01ee"+
+    "\3\u01e1\1\u02e7\1\u0170\1\u01e1\1\u0368\71\u01e1\1\u0369\3\u01e1"+
+    "\3\u02cf\1\u02ee\1\u02cf\1\u030e\1\u036a\1\u0324\1\u024e\77\u02cf"+
+    "\1\u02f2\2\u0311\2\u02f2\1\u0348\1\u02f2\1\u036b\2\u02f2\1\u0329"+
+    "\1\u032a\64\u0311\1\u02f2\1\u0311\6\u02f2\3\u0349\1\u02f2\1\u0349"+
+    "\1\u034a\1\u0349\1\u02f4\2\u02f2\1\u02f5\100\u0349\1\u02f2\1\u0349"+
+    "\1\u036c\1\u0349\1\u02f4\2\u02f2\1\u02f5\75\u0349\3\u034b\1\u036d"+
+    "\1\u034b\1\u036e\3\u034b\1\u02d2\76\u034b\1\u0349\1\u036f\1\u0349"+
+    "\1\u02f2\1\u0349\1\u034a\1\u0349\1\u02f4\1\u02a7\1\u034b\1\u034c"+
+    "\1\u0349\55\u036f\4\u0349\3\u036f\10\u0349\1\u02f7\2\u0313\2\u02f7"+
+    "\1\u034d\1\u02f7\1\u0370\2\u02f7\1\u032c\1\u032d\64\u0313\1\u02f7"+
+    "\1\u0313\6\u02f7\3\u034e\1\u02f7\1\u034e\1\u034f\1\u034e\1\u02f9"+
+    "\2\u02f7\1\u02fa\100\u034e\1\u02f7\1\u034e\1\u0371\1\u034e\1\u02f9"+
+    "\2\u02f7\1\u02fa\75\u034e\3\u0350\1\u0372\1\u0350\1\u0373\2\u0350"+
+    "\1\u02d4\77\u0350\1\u034e\1\u0374\1\u034e\1\u02f7\1\u034e\1\u034f"+
+    "\1\u034e\1\u02f9\1\u0350\1\u02a8\1\u0351\1\u034e\55\u0374\4\u034e"+
+    "\3\u0374\10\u034e\5\u032e\1\u0375\3\u032e\1\u0353\76\u032e\5\u0376"+
+    "\1\u0377\1\u0376\1\u0378\2\u0376\1\u0379\71\u0376\1\u037a\3\u0376"+
+    "\3\u02fc\1\u0315\1\u02fc\1\u037b\2\u02fc\1\u0316\1\u0317\76\u02fc"+
+    "\1\u01bc\2\u0355\1\u01d5\1\u01bc\1\u0355\1\u01bc\1\u02ae\1\u01bc"+
+    "\1\u01d4\1\u037c\1\u037d\64\u0355\1\u01bc\1\u0355\2\u01bc\1\u0331"+
+    "\3\u01bc\1\u01bb\2\u0356\1\u01d3\1\u01bb\1\u0356\1\u01bb\1\u02a9"+
+    "\1\u01d4\1\u01bb\1\u037e\1\u037f\64\u0356\1\u01bb\1\u0356\2\u01bb"+
+    "\1\u0333\3\u01bb\5\u0334\1\u0380\2\u0334\1\u0353\77\u0334\5\u0335"+
+    "\1\u0381\3\u0335\1\u0359\76\u0335\5\u0382\1\u0383\1\u0382\1\u0384"+
+    "\2\u0382\1\u0385\71\u0382\1\u0386\3\u0382\3\u0301\1\u031a\1\u0301"+
+    "\1\u0387\2\u0301\1\u031b\1\u031c\76\u0301\1\u01c0\2\u035b\1\u01d9"+
+    "\1\u01c0\1\u035b\1\u01c0\1\u02b8\1\u01c0\1\u01d8\1\u0388\1\u0389"+
+    "\64\u035b\1\u01c0\1\u035b\2\u01c0\1\u0338\3\u01c0\1\u01bf\2\u035c"+
+    "\1\u01d7\1\u01bf\1\u035c\1\u01bf\1\u02b3\1\u01d8\1\u01bf\1\u038a"+
+    "\1\u038b\64\u035c\1\u01bf\1\u035c\2\u01bf\1\u033a\3\u01bf\5\u033b"+
+    "\1\u038c\2\u033b\1\u0359\77\u033b\5\u033c\1\u038d\3\u033c\1\u035f"+
+    "\76\u033c\5\u038e\1\u038f\1\u038e\1\u0390\2\u038e\1\u0391\71\u038e"+
+    "\1\u0392\3\u038e\3\u0306\1\u031f\1\u0306\1\u0393\2\u0306\1\u0320"+
+    "\1\u0321\76\u0306\1\u01c4\2\u0361\1\u01dd\1\u01c4\1\u0361\1\u01c4"+
+    "\1\u02c2\1\u01c4\1\u01dc\1\u0394\1\u0395\64\u0361\1\u01c4\1\u0361"+
+    "\2\u01c4\1\u033f\3\u01c4\1\u01c3\2\u0362\1\u01db\1\u01c3\1\u0362"+
+    "\1\u01c3\1\u02bd\1\u01dc\1\u01c3\1\u0396\1\u0397\64\u0362\1\u01c3"+
+    "\1\u0362\2\u01c3\1\u0341\3\u01c3\5\u0342\1\u0398\2\u0342\1\u035f"+
+    "\77\u0342\5\u0364\1\u0399\3\u0364\1\u039a\76\u0364\3\u0324\1\u0344"+
+    "\1\u0324\1\u039b\2\u0324\1\u0345\1\u0346\76\u0324\1\u01e2\1\u039c"+
+    "\1\u01e2\1\u01ef\3\u01e2\1\u02ec\1\u01e2\1\u0170\1\u0366\1\u01e2"+
+    "\55\u039c\4\u01e2\3\u039c\4\u01e2\1\u0367\6\u01e2\1\u01ef\3\u01e2"+
+    "\1\u02ec\1\u01e2\1\u0170\76\u01e2\1\u01e1\1\u039d\1\u01e1\1\u01ee"+
+    "\3\u01e1\1\u02e7\1\u0170\1\u01e1\1\u0368\1\u01e1\55\u039d\4\u01e1"+
+    "\3\u039d\4\u01e1\1\u0369\6\u01e1\1\u01ee\3\u01e1\1\u02e7\1\u0170"+
+    "\77\u01e1\5\u036a\1\u039e\2\u036a\1\u039a\77\u036a\3\u0349\1\u02f2"+
+    "\1\u0349\1\u036c\1\u0349\1\u036b\2\u02f2\1\u02f5\75\u0349\3\u034b"+
+    "\1\u036d\1\u039f\1\u036e\3\u034b\1\u02d2\101\u034b\1\u036d\1\u034b"+
+    "\1\u03a0\3\u034b\1\u02d2\76\u034b\1\u0349\2\u036f\1\u02f2\1\u0349"+
+    "\1\u03a1\1\u0349\1\u02f4\2\u02f2\1\u0329\1\u032a\64\u036f\1\u0349"+
+    "\1\u036f\6\u0349\3\u034e\1\u02f7\1\u034e\1\u0371\1\u034e\1\u0370"+
+    "\2\u02f7\1\u02fa\75\u034e\3\u0350\1\u0372\1\u03a2\1\u0373\2\u0350"+
+    "\1\u02d4\102\u0350\1\u0372\1\u0350\1\u03a3\2\u0350\1\u02d4\77\u0350"+
+    "\1\u034e\2\u0374\1\u02f7\1\u034e\1\u03a4\1\u034e\1\u02f9\2\u02f7"+
+    "\1\u032c\1\u032d\64\u0374\1\u034e\1\u0374\6\u034e\5\u032e\1\u0375"+
+    "\1\u032e\1\u02fc\1\u032e\1\u0353\76\u032e\5\u0376\1\u0377\107\u0376"+
+    "\1\u03a5\103\u0376\1\u03a6\3\u0376\1\u0377\1\u0376\1\u0378\2\u0376"+
+    "\1\u0379\1\u0376\55\u03a6\4\u0376\3\u03a6\4\u0376\1\u037a\10\u0376"+
+    "\1\u0377\1\u0376\1\u0378\100\u0376\3\u02fc\1\u0315\2\u02fc\1\u03a7"+
+    "\1\u02fc\1\u0316\1\u0317\76\u02fc\1\u01bc\1\u0355\1\u01bc\1\u01d5"+
+    "\3\u01bc\1\u02ae\1\u01bc\1\u01d4\1\u037c\1\u037d\55\u0355\4\u01bc"+
+    "\3\u0355\4\u01bc\1\u0331\3\u01bc\3\u03a8\1\u01d5\3\u03a8\1\u02ae"+
+    "\1\u02fc\1\u0316\1\u03a9\75\u03a8\1\u01bb\1\u0356\1\u01bb\1\u01d3"+
+    "\3\u01bb\1\u02a9\1\u01d4\1\u01bb\1\u037e\1\u037f\55\u0356\4\u01bb"+
+    "\3\u0356\4\u01bb\1\u0333\3\u01bb\3\u03aa\1\u01d3\3\u03aa\1\u02a9"+
+    "\1\u0317\1\u02fc\1\u03ab\75\u03aa\5\u0334\1\u0380\1\u0334\1\u02fc"+
+    "\1\u0353\77\u0334\5\u0335\1\u0381\1\u0335\1\u0301\1\u0335\1\u0359"+
+    "\76\u0335\5\u0382\1\u0383\107\u0382\1\u03ac\103\u0382\1\u03ad\3\u0382"+
+    "\1\u0383\1\u0382\1\u0384\2\u0382\1\u0385\1\u0382\55\u03ad\4\u0382"+
+    "\3\u03ad\4\u0382\1\u0386\10\u0382\1\u0383\1\u0382\1\u0384\100\u0382"+
+    "\3\u0301\1\u031a\2\u0301\1\u03ae\1\u0301\1\u031b\1\u031c\76\u0301"+
+    "\1\u01c0\1\u035b\1\u01c0\1\u01d9\3\u01c0\1\u02b8\1\u01c0\1\u01d8"+
+    "\1\u0388\1\u0389\55\u035b\4\u01c0\3\u035b\4\u01c0\1\u0338\3\u01c0"+
+    "\3\u03af\1\u01d9\3\u03af\1\u02b8\1\u0301\1\u031b\1\u03b0\75\u03af"+
+    "\1\u01bf\1\u035c\1\u01bf\1\u01d7\3\u01bf\1\u02b3\1\u01d8\1\u01bf"+
+    "\1\u038a\1\u038b\55\u035c\4\u01bf\3\u035c\4\u01bf\1\u033a\3\u01bf"+
+    "\3\u03b1\1\u01d7\3\u03b1\1\u02b3\1\u031c\1\u0301\1\u03b2\75\u03b1"+
+    "\5\u033b\1\u038c\1\u033b\1\u0301\1\u0359\77\u033b\5\u033c\1\u038d"+
+    "\1\u033c\1\u0306\1\u033c\1\u035f\76\u033c\5\u038e\1\u038f\107\u038e"+
+    "\1\u03b3\103\u038e\1\u03b4\3\u038e\1\u038f\1\u038e\1\u0390\2\u038e"+
+    "\1\u0391\1\u038e\55\u03b4\4\u038e\3\u03b4\4\u038e\1\u0392\10\u038e"+
+    "\1\u038f\1\u038e\1\u0390\100\u038e\3\u0306\1\u031f\2\u0306\1\u03b5"+
+    "\1\u0306\1\u0320\1\u0321\76\u0306\1\u01c4\1\u0361\1\u01c4\1\u01dd"+
+    "\3\u01c4\1\u02c2\1\u01c4\1\u01dc\1\u0394\1\u0395\55\u0361\4\u01c4"+
+    "\3\u0361\4\u01c4\1\u033f\3\u01c4\3\u03b6\1\u01dd\3\u03b6\1\u02c2"+
+    "\1\u0306\1\u0320\1\u03b7\75\u03b6\1\u01c3\1\u0362\1\u01c3\1\u01db"+
+    "\3\u01c3\1\u02bd\1\u01dc\1\u01c3\1\u0396\1\u0397\55\u0362\4\u01c3"+
+    "\3\u0362\4\u01c3\1\u0341\3\u01c3\3\u03b8\1\u01db\3\u03b8\1\u02bd"+
+    "\1\u0321\1\u0306\1\u03b9\75\u03b8\5\u0342\1\u0398\1\u0342\1\u0306"+
+    "\1\u035f\77\u0342\5\u0364\1\u03ba\3\u0364\1\u039a\76\u0364\5\u03bb"+
+    "\1\u03bc\1\u03bb\1\u03bd\2\u03bb\1\u03be\71\u03bb\1\u03bf\3\u03bb"+
+    "\3\u0324\1\u0344\1\u0324\1\u03c0\2\u0324\1\u0345\1\u0346\76\u0324"+
+    "\1\u01e2\2\u039c\1\u01ef\1\u01e2\1\u039c\1\u01e2\1\u02ec\1\u01e2"+
+    "\1\u0170\1\u03c1\1\u03c2\64\u039c\1\u01e2\1\u039c\2\u01e2\1\u0367"+
+    "\3\u01e2\1\u01e1\2\u039d\1\u01ee\1\u01e1\1\u039d\1\u01e1\1\u02e7"+
+    "\1\u0170\1\u01e1\1\u03c3\1\u03c4\64\u039d\1\u01e1\1\u039d\2\u01e1"+
+    "\1\u0369\3\u01e1\5\u036a\1\u03c5\2\u036a\1\u039a\77\u036a\3\u034b"+
+    "\1\u036d\1\u034b\1\u03c6\3\u034b\1\u02d2\101\u034b\1\u036d\1\u034b"+
+    "\1\u03a0\1\u034b\1\u03c7\1\u034b\1\u02d2\76\u034b\1\u0349\2\u036f"+
+    "\1\u02f2\1\u0349\1\u03c8\1\u0349\1\u02f4\2\u02f2\1\u0329\1\u032a"+
+    "\64\u036f\1\u0349\1\u036f\6\u0349\3\u0350\1\u0372\1\u0350\1\u03c9"+
+    "\2\u0350\1\u02d4\102\u0350\1\u0372\1\u0350\1\u03a3\1\u0350\1\u03c7"+
+    "\1\u02d4\77\u0350\1\u034e\2\u0374\1\u02f7\1\u034e\1\u03ca\1\u034e"+
+    "\1\u02f9\2\u02f7\1\u032c\1\u032d\64\u0374\1\u034e\1\u0374\6\u034e"+
+    "\5\u0376\1\u03a5\1\u0376\1\u02fc\101\u0376\2\u03a6\2\u0376\1\u03cb"+
+    "\1\u0376\1\u0378\2\u0376\1\u03cc\1\u03cd\64\u03a6\1\u0376\1\u03a6"+
+    "\2\u0376\1\u037a\3\u0376\5\u03a7\1\u03ce\2\u03a7\1\u03cf\1\u03d0"+
+    "\76\u03a7\3\u03a8\1\u01d5\3\u03a8\1\u02ae\1\u01bc\1\u01d4\1\u0330"+
+    "\76\u03a8\1\u03d1\1\u03a8\1\u01d5\3\u03a8\1\u02ae\1\u02fc\1\u0316"+
+    "\1\u03a9\1\u03a8\55\u03d1\4\u03a8\3\u03d1\10\u03a8\3\u03aa\1\u01d3"+
+    "\3\u03aa\1\u02a9\1\u01d4\1\u01bb\1\u0332\76\u03aa\1\u03d2\1\u03aa"+
+    "\1\u01d3\3\u03aa\1\u02a9\1\u0317\1\u02fc\1\u03ab\1\u03aa\55\u03d2"+
+    "\4\u03aa\3\u03d2\10\u03aa\5\u0382\1\u03ac\1\u0382\1\u0301\101\u0382"+
+    "\2\u03ad\2\u0382\1\u03d3\1\u0382\1\u0384\2\u0382\1\u03d4\1\u03d5"+
+    "\64\u03ad\1\u0382\1\u03ad\2\u0382\1\u0386\3\u0382\5\u03ae\1\u03d6"+
+    "\2\u03ae\1\u03d7\1\u03d8\76\u03ae\3\u03af\1\u01d9\3\u03af\1\u02b8"+
+    "\1\u01c0\1\u01d8\1\u0337\76\u03af\1\u03d9\1\u03af\1\u01d9\3\u03af"+
+    "\1\u02b8\1\u0301\1\u031b\1\u03b0\1\u03af\55\u03d9\4\u03af\3\u03d9"+
+    "\10\u03af\3\u03b1\1\u01d7\3\u03b1\1\u02b3\1\u01d8\1\u01bf\1\u0339"+
+    "\76\u03b1\1\u03da\1\u03b1\1\u01d7\3\u03b1\1\u02b3\1\u031c\1\u0301"+
+    "\1\u03b2\1\u03b1\55\u03da\4\u03b1\3\u03da\10\u03b1\5\u038e\1\u03b3"+
+    "\1\u038e\1\u0306\101\u038e\2\u03b4\2\u038e\1\u03db\1\u038e\1\u0390"+
+    "\2\u038e\1\u03dc\1\u03dd\64\u03b4\1\u038e\1\u03b4\2\u038e\1\u0392"+
+    "\3\u038e\5\u03b5\1\u03de\2\u03b5\1\u03df\1\u03e0\76\u03b5\3\u03b6"+
+    "\1\u01dd\3\u03b6\1\u02c2\1\u01c4\1\u01dc\1\u033e\76\u03b6\1\u03e1"+
+    "\1\u03b6\1\u01dd\3\u03b6\1\u02c2\1\u0306\1\u0320\1\u03b7\1\u03b6"+
+    "\55\u03e1\4\u03b6\3\u03e1\10\u03b6\3\u03b8\1\u01db\3\u03b8\1\u02bd"+
+    "\1\u01dc\1\u01c3\1\u0340\76\u03b8\1\u03e2\1\u03b8\1\u01db\3\u03b8"+
+    "\1\u02bd\1\u0321\1\u0306\1\u03b9\1\u03b8\55\u03e2\4\u03b8\3\u03e2"+
+    "\10\u03b8\5\u0364\1\u03ba\1\u0364\1\u0324\1\u0364\1\u039a\76\u0364"+
+    "\5\u03bb\1\u03bc\107\u03bb\1\u03e3\103\u03bb\1\u03e4\3\u03bb\1\u03bc"+
+    "\1\u03bb\1\u03bd\2\u03bb\1\u03be\1\u03bb\55\u03e4\4\u03bb\3\u03e4"+
+    "\4\u03bb\1\u03bf\10\u03bb\1\u03bc\1\u03bb\1\u03bd\100\u03bb\3\u0324"+
+    "\1\u0344\2\u0324\1\u03e5\1\u0324\1\u0345\1\u0346\76\u0324\1\u01e2"+
+    "\1\u039c\1\u01e2\1\u01ef\3\u01e2\1\u02ec\1\u01e2\1\u0170\1\u03c1"+
+    "\1\u03c2\55\u039c\4\u01e2\3\u039c\4\u01e2\1\u0367\3\u01e2\3\u03e6"+
+    "\1\u01ef\3\u03e6\1\u02ec\1\u0324\1\u0345\1\u03e7\75\u03e6\1\u01e1"+
+    "\1\u039d\1\u01e1\1\u01ee\3\u01e1\1\u02e7\1\u0170\1\u01e1\1\u03c3"+
+    "\1\u03c4\55\u039d\4\u01e1\3\u039d\4\u01e1\1\u0369\3\u01e1\3\u03e8"+
+    "\1\u01ee\3\u03e8\1\u02e7\1\u0346\1\u0324\1\u03e9\75\u03e8\5\u036a"+
+    "\1\u03c5\1\u036a\1\u0324\1\u039a\77\u036a\3\u034b\1\u036d\1\u034b"+
+    "\1\u03ea\3\u034b\1\u02d2\76\u034b\3\u03c7\1\u03eb\4\u03c7\1\u03ec"+
+    "\1\u03ed\76\u03c7\1\u0349\2\u036f\1\u02f2\1\u0349\1\u03c8\1\u0349"+
+    "\1\u036b\2\u02f2\1\u0329\1\u032a\64\u036f\1\u0349\1\u036f\6\u0349"+
+    "\3\u0350\1\u0372\1\u0350\1\u03ee\2\u0350\1\u02d4\77\u0350\1\u034e"+
+    "\2\u0374\1\u02f7\1\u034e\1\u03ca\1\u034e\1\u0370\2\u02f7\1\u032c"+
+    "\1\u032d\64\u0374\1\u034e\1\u0374\6\u034e\1\u0376\2\u03a6\2\u0376"+
+    "\1\u03ef\1\u0376\1\u0378\2\u0376\1\u03cc\1\u03cd\64\u03a6\1\u0376"+
+    "\1\u03a6\2\u0376\1\u037a\4\u0376\1\u03a6\3\u0376\1\u0377\1\u0376"+
+    "\1\u0378\2\u0376\1\u03cc\1\u03cd\55\u03a6\4\u0376\3\u03a6\4\u0376"+
+    "\1\u037a\3\u0376\3\u03f0\1\u0376\1\u03f0\1\u03f1\1\u03f0\1\u0378"+
+    "\1\u0334\1\u032e\1\u03f2\75\u03f0\5\u03a7\1\u03f3\2\u03a7\1\u03cf"+
+    "\1\u03d0\76\u03a7\5\u032e\1\u0352\1\u032e\1\u03f4\1\u032e\1\u0353"+
+    "\1\u03f5\71\u032e\1\u03f6\3\u032e\5\u0334\1\u0357\1\u0334\1\u03f7"+
+    "\1\u0353\1\u0334\1\u03f8\71\u0334\1\u03f9\3\u0334\1\u03a8\2\u03d1"+
+    "\1\u01d5\1\u03a8\1\u03d1\1\u03a8\1\u02ae\1\u01bc\1\u01d4\1\u037c"+
+    "\1\u037d\64\u03d1\1\u03a8\1\u03d1\6\u03a8\1\u03aa\2\u03d2\1\u01d3"+
+    "\1\u03aa\1\u03d2\1\u03aa\1\u02a9\1\u01d4\1\u01bb\1\u037e\1\u037f"+
+    "\64\u03d2\1\u03aa\1\u03d2\6\u03aa\1\u0382\2\u03ad\2\u0382\1\u03fa"+
+    "\1\u0382\1\u0384\2\u0382\1\u03d4\1\u03d5\64\u03ad\1\u0382\1\u03ad"+
+    "\2\u0382\1\u0386\4\u0382\1\u03ad\3\u0382\1\u0383\1\u0382\1\u0384"+
+    "\2\u0382\1\u03d4\1\u03d5\55\u03ad\4\u0382\3\u03ad\4\u0382\1\u0386"+
+    "\3\u0382\3\u03fb\1\u0382\1\u03fb\1\u03fc\1\u03fb\1\u0384\1\u033b"+
+    "\1\u0335\1\u03fd\75\u03fb\5\u03ae\1\u03fe\2\u03ae\1\u03d7\1\u03d8"+
+    "\76\u03ae\5\u0335\1\u0358\1\u0335\1\u03ff\1\u0335\1\u0359\1\u0400"+
+    "\71\u0335\1\u0401\3\u0335\5\u033b\1\u035d\1\u033b\1\u0402\1\u0359"+
+    "\1\u033b\1\u0403\71\u033b\1\u0404\3\u033b\1\u03af\2\u03d9\1\u01d9"+
+    "\1\u03af\1\u03d9\1\u03af\1\u02b8\1\u01c0\1\u01d8\1\u0388\1\u0389"+
+    "\64\u03d9\1\u03af\1\u03d9\6\u03af\1\u03b1\2\u03da\1\u01d7\1\u03b1"+
+    "\1\u03da\1\u03b1\1\u02b3\1\u01d8\1\u01bf\1\u038a\1\u038b\64\u03da"+
+    "\1\u03b1\1\u03da\6\u03b1\1\u038e\2\u03b4\2\u038e\1\u0405\1\u038e"+
+    "\1\u0390\2\u038e\1\u03dc\1\u03dd\64\u03b4\1\u038e\1\u03b4\2\u038e"+
+    "\1\u0392\4\u038e\1\u03b4\3\u038e\1\u038f\1\u038e\1\u0390\2\u038e"+
+    "\1\u03dc\1\u03dd\55\u03b4\4\u038e\3\u03b4\4\u038e\1\u0392\3\u038e"+
+    "\3\u0406\1\u038e\1\u0406\1\u0407\1\u0406\1\u0390\1\u0342\1\u033c"+
+    "\1\u0408\75\u0406\5\u03b5\1\u0409\2\u03b5\1\u03df\1\u03e0\76\u03b5"+
+    "\5\u033c\1\u035e\1\u033c\1\u040a\1\u033c\1\u035f\1\u040b\71\u033c"+
+    "\1\u040c\3\u033c\5\u0342\1\u0363\1\u0342\1\u040d\1\u035f\1\u0342"+
+    "\1\u040e\71\u0342\1\u040f\3\u0342\1\u03b6\2\u03e1\1\u01dd\1\u03b6"+
+    "\1\u03e1\1\u03b6\1\u02c2\1\u01c4\1\u01dc\1\u0394\1\u0395\64\u03e1"+
+    "\1\u03b6\1\u03e1\6\u03b6\1\u03b8\2\u03e2\1\u01db\1\u03b8\1\u03e2"+
+    "\1\u03b8\1\u02bd\1\u01dc\1\u01c3\1\u0396\1\u0397\64\u03e2\1\u03b8"+
+    "\1\u03e2\6\u03b8\5\u03bb\1\u03e3\1\u03bb\1\u0324\101\u03bb\2\u03e4"+
+    "\2\u03bb\1\u0410\1\u03bb\1\u03bd\2\u03bb\1\u0411\1\u0412\64\u03e4"+
+    "\1\u03bb\1\u03e4\2\u03bb\1\u03bf\3\u03bb\5\u03e5\1\u0413\2\u03e5"+
+    "\1\u0414\1\u0415\76\u03e5\3\u03e6\1\u01ef\3\u03e6\1\u02ec\1\u01e2"+
+    "\1\u0170\1\u0366\76\u03e6\1\u0416\1\u03e6\1\u01ef\3\u03e6\1\u02ec"+
+    "\1\u0324\1\u0345\1\u03e7\1\u03e6\55\u0416\4\u03e6\3\u0416\10\u03e6"+
+    "\3\u03e8\1\u01ee\3\u03e8\1\u02e7\1\u0170\1\u01e1\1\u0368\76\u03e8"+
+    "\1\u0417\1\u03e8\1\u01ee\3\u03e8\1\u02e7\1\u0346\1\u0324\1\u03e9"+
+    "\1\u03e8\55\u0417\4\u03e8\3\u0417\10\u03e8\3\u034b\1\u036d\1\u034b"+
+    "\1\u03a0\1\u0418\1\u03c7\1\u034b\1\u02d2\76\u034b\3\u03c7\1\u03eb"+
+    "\1\u0419\3\u03c7\1\u03ec\1\u03ed\76\u03c7\3\u0214\1\u0225\3\u0214"+
+    "\1\u0370\1\u0214\1\u01ed\1\u041a\75\u0214\3\u0213\1\u0224\3\u0213"+
+    "\1\u036b\1\u01ed\1\u0213\1\u041b\75\u0213\3\u0350\1\u0372\1\u0350"+
+    "\1\u03a3\1\u041c\1\u03c7\1\u02d4\77\u0350\1\u0376\2\u03a6\2\u0376"+
+    "\1\u03ef\1\u0376\1\u041d\2\u0376\1\u03cc\1\u03cd\64\u03a6\1\u0376"+
+    "\1\u03a6\2\u0376\1\u037a\3\u0376\3\u03f0\1\u0376\1\u03f0\1\u03f1"+
+    "\1\u03f0\1\u0378\2\u0376\1\u0379\100\u03f0\1\u0376\1\u03f0\1\u041e"+
+    "\1\u03f0\1\u0378\2\u0376\1\u0379\76\u03f0\1\u041f\1\u03f0\1\u0376"+
+    "\1\u03f0\1\u03f1\1\u03f0\1\u0378\1\u0334\1\u032e\1\u03f2\1\u03f0"+
+    "\55\u041f\4\u03f0\3\u041f\10\u03f0\5\u03a7\1\u03f3\1\u03a7\1\u02fc"+
+    "\1\u03cf\1\u03d0\76\u03a7\1\u032e\1\u0420\3\u032e\1\u0352\1\u032e"+
+    "\1\u03f4\1\u032e\1\u0353\1\u03f5\1\u032e\55\u0420\4\u032e\3\u0420"+
+    "\4\u032e\1\u03f6\10\u032e\1\u0352\1\u032e\1\u03f4\1\u032e\1\u0353"+
+    "\76\u032e\1\u0334\1\u0421\3\u0334\1\u0357\1\u0334\1\u03f7\1\u0353"+
+    "\1\u0334\1\u03f8\1\u0334\55\u0421\4\u0334\3\u0421\4\u0334\1\u03f9"+
+    "\10\u0334\1\u0357\1\u0334\1\u03f7\1\u0353\77\u0334\1\u0382\2\u03ad"+
+    "\2\u0382\1\u03fa\1\u0382\1\u0422\2\u0382\1\u03d4\1\u03d5\64\u03ad"+
+    "\1\u0382\1\u03ad\2\u0382\1\u0386\3\u0382\3\u03fb\1\u0382\1\u03fb"+
+    "\1\u03fc\1\u03fb\1\u0384\2\u0382\1\u0385\100\u03fb\1\u0382\1\u03fb"+
+    "\1\u0423\1\u03fb\1\u0384\2\u0382\1\u0385\76\u03fb\1\u0424\1\u03fb"+
+    "\1\u0382\1\u03fb\1\u03fc\1\u03fb\1\u0384\1\u033b\1\u0335\1\u03fd"+
+    "\1\u03fb\55\u0424\4\u03fb\3\u0424\10\u03fb\5\u03ae\1\u03fe\1\u03ae"+
+    "\1\u0301\1\u03d7\1\u03d8\76\u03ae\1\u0335\1\u0425\3\u0335\1\u0358"+
+    "\1\u0335\1\u03ff\1\u0335\1\u0359\1\u0400\1\u0335\55\u0425\4\u0335"+
+    "\3\u0425\4\u0335\1\u0401\10\u0335\1\u0358\1\u0335\1\u03ff\1\u0335"+
+    "\1\u0359\76\u0335\1\u033b\1\u0426\3\u033b\1\u035d\1\u033b\1\u0402"+
+    "\1\u0359\1\u033b\1\u0403\1\u033b\55\u0426\4\u033b\3\u0426\4\u033b"+
+    "\1\u0404\10\u033b\1\u035d\1\u033b\1\u0402\1\u0359\77\u033b\1\u038e"+
+    "\2\u03b4\2\u038e\1\u0405\1\u038e\1\u0427\2\u038e\1\u03dc\1\u03dd"+
+    "\64\u03b4\1\u038e\1\u03b4\2\u038e\1\u0392\3\u038e\3\u0406\1\u038e"+
+    "\1\u0406\1\u0407\1\u0406\1\u0390\2\u038e\1\u0391\100\u0406\1\u038e"+
+    "\1\u0406\1\u0428\1\u0406\1\u0390\2\u038e\1\u0391\76\u0406\1\u0429"+
+    "\1\u0406\1\u038e\1\u0406\1\u0407\1\u0406\1\u0390\1\u0342\1\u033c"+
+    "\1\u0408\1\u0406\55\u0429\4\u0406\3\u0429\10\u0406\5\u03b5\1\u0409"+
+    "\1\u03b5\1\u0306\1\u03df\1\u03e0\76\u03b5\1\u033c\1\u042a\3\u033c"+
+    "\1\u035e\1\u033c\1\u040a\1\u033c\1\u035f\1\u040b\1\u033c\55\u042a"+
+    "\4\u033c\3\u042a\4\u033c\1\u040c\10\u033c\1\u035e\1\u033c\1\u040a"+
+    "\1\u033c\1\u035f\76\u033c\1\u0342\1\u042b\3\u0342\1\u0363\1\u0342"+
+    "\1\u040d\1\u035f\1\u0342\1\u040e\1\u0342\55\u042b\4\u0342\3\u042b"+
+    "\4\u0342\1\u040f\10\u0342\1\u0363\1\u0342\1\u040d\1\u035f\77\u0342"+
+    "\1\u03bb\2\u03e4\2\u03bb\1\u042c\1\u03bb\1\u03bd\2\u03bb\1\u0411"+
+    "\1\u0412\64\u03e4\1\u03bb\1\u03e4\2\u03bb\1\u03bf\4\u03bb\1\u03e4"+
+    "\3\u03bb\1\u03bc\1\u03bb\1\u03bd\2\u03bb\1\u0411\1\u0412\55\u03e4"+
+    "\4\u03bb\3\u03e4\4\u03bb\1\u03bf\3\u03bb\3\u042d\1\u03bb\1\u042d"+
+    "\1\u042e\1\u042d\1\u03bd\1\u036a\1\u0364\1\u042f\75\u042d\5\u03e5"+
+    "\1\u0430\2\u03e5\1\u0414\1\u0415\76\u03e5\5\u0364\1\u0399\1\u0364"+
+    "\1\u0431\1\u0364\1\u039a\1\u0432\71\u0364\1\u0433\3\u0364\5\u036a"+
+    "\1\u039e\1\u036a\1\u0434\1\u039a\1\u036a\1\u0435\71\u036a\1\u0436"+
+    "\3\u036a\1\u03e6\2\u0416\1\u01ef\1\u03e6\1\u0416\1\u03e6\1\u02ec"+
+    "\1\u01e2\1\u0170\1\u03c1\1\u03c2\64\u0416\1\u03e6\1\u0416\6\u03e6"+
+    "\1\u03e8\2\u0417\1\u01ee\1\u03e8\1\u0417\1\u03e8\1\u02e7\1\u0170"+
+    "\1\u01e1\1\u03c3\1\u03c4\64\u0417\1\u03e8\1\u0417\6\u03e8\5\u0418"+
+    "\1\u0437\3\u0418\1\u0438\76\u0418\3\u03c7\1\u03eb\1\u03c7\1\u0439"+
+    "\2\u03c7\1\u03ec\1\u03ed\76\u03c7\1\u0214\1\u043a\1\u0214\1\u0225"+
+    "\3\u0214\1\u0370\1\u0214\1\u01ed\1\u041a\1\u0214\55\u043a\4\u0214"+
+    "\3\u043a\10\u0214\1\u0213\1\u043b\1\u0213\1\u0224\3\u0213\1\u036b"+
+    "\1\u01ed\1\u0213\1\u041b\1\u0213\55\u043b\4\u0213\3\u043b\10\u0213"+
+    "\5\u041c\1\u043c\2\u041c\1\u0438\77\u041c\3\u03f0\1\u0376\1\u03f0"+
+    "\1\u041e\1\u03f0\1\u041d\2\u0376\1\u0379\76\u03f0\2\u041f\1\u0376"+
+    "\1\u03f0\1\u043d\1\u03f0\1\u0378\2\u0376\1\u03cc\1\u03cd\64\u041f"+
+    "\1\u03f0\1\u041f\6\u03f0\1\u032e\2\u0420\2\u032e\1\u043e\1\u032e"+
+    "\1\u03f4\1\u032e\1\u0353\1\u043f\1\u0440\64\u0420\1\u032e\1\u0420"+
+    "\2\u032e\1\u03f6\3\u032e\1\u0334\2\u0421\2\u0334\1\u0441\1\u0334"+
+    "\1\u03f7\1\u0353\1\u0334\1\u0442\1\u0443\64\u0421\1\u0334\1\u0421"+
+    "\2\u0334\1\u03f9\3\u0334\3\u03fb\1\u0382\1\u03fb\1\u0423\1\u03fb"+
+    "\1\u0422\2\u0382\1\u0385\76\u03fb\2\u0424\1\u0382\1\u03fb\1\u0444"+
+    "\1\u03fb\1\u0384\2\u0382\1\u03d4\1\u03d5\64\u0424\1\u03fb\1\u0424"+
+    "\6\u03fb\1\u0335\2\u0425\2\u0335\1\u0445\1\u0335\1\u03ff\1\u0335"+
+    "\1\u0359\1\u0446\1\u0447\64\u0425\1\u0335\1\u0425\2\u0335\1\u0401"+
+    "\3\u0335\1\u033b\2\u0426\2\u033b\1\u0448\1\u033b\1\u0402\1\u0359"+
+    "\1\u033b\1\u0449\1\u044a\64\u0426\1\u033b\1\u0426\2\u033b\1\u0404"+
+    "\3\u033b\3\u0406\1\u038e\1\u0406\1\u0428\1\u0406\1\u0427\2\u038e"+
+    "\1\u0391\76\u0406\2\u0429\1\u038e\1\u0406\1\u044b\1\u0406\1\u0390"+
+    "\2\u038e\1\u03dc\1\u03dd\64\u0429\1\u0406\1\u0429\6\u0406\1\u033c"+
+    "\2\u042a\2\u033c\1\u044c\1\u033c\1\u040a\1\u033c\1\u035f\1\u044d"+
+    "\1\u044e\64\u042a\1\u033c\1\u042a\2\u033c\1\u040c\3\u033c\1\u0342"+
+    "\2\u042b\2\u0342\1\u044f\1\u0342\1\u040d\1\u035f\1\u0342\1\u0450"+
+    "\1\u0451\64\u042b\1\u0342\1\u042b\2\u0342\1\u040f\3\u0342\1\u03bb"+
+    "\2\u03e4\2\u03bb\1\u042c\1\u03bb\1\u0452\2\u03bb\1\u0411\1\u0412"+
+    "\64\u03e4\1\u03bb\1\u03e4\2\u03bb\1\u03bf\3\u03bb\3\u042d\1\u03bb"+
+    "\1\u042d\1\u042e\1\u042d\1\u03bd\2\u03bb\1\u03be\100\u042d\1\u03bb"+
+    "\1\u042d\1\u0453\1\u042d\1\u03bd\2\u03bb\1\u03be\76\u042d\1\u0454"+
+    "\1\u042d\1\u03bb\1\u042d\1\u042e\1\u042d\1\u03bd\1\u036a\1\u0364"+
+    "\1\u042f\1\u042d\55\u0454\4\u042d\3\u0454\10\u042d\5\u03e5\1\u0430"+
+    "\1\u03e5\1\u0324\1\u0414\1\u0415\76\u03e5\1\u0364\1\u0455\3\u0364"+
+    "\1\u0399\1\u0364\1\u0431\1\u0364\1\u039a\1\u0432\1\u0364\55\u0455"+
+    "\4\u0364\3\u0455\4\u0364\1\u0433\10\u0364\1\u0399\1\u0364\1\u0431"+
+    "\1\u0364\1\u039a\76\u0364\1\u036a\1\u0456\3\u036a\1\u039e\1\u036a"+
+    "\1\u0434\1\u039a\1\u036a\1\u0435\1\u036a\55\u0456\4\u036a\3\u0456"+
+    "\4\u036a\1\u0436\10\u036a\1\u039e\1\u036a\1\u0434\1\u039a\77\u036a"+
+    "\5\u0418\1\u0457\3\u0418\1\u0438\76\u0418\5\u0458\1\u0459\1\u0458"+
+    "\1\u045a\2\u0458\1\u045b\75\u0458\3\u03c7\1\u03eb\1\u03c7\1\u045c"+
+    "\2\u03c7\1\u03ec\1\u03ed\76\u03c7\1\u0214\2\u043a\1\u0225\1\u0214"+
+    "\1\u043a\1\u0214\1\u0370\1\u0214\1\u01ed\1\u045d\1\u045e\64\u043a"+
+    "\1\u0214\1\u043a\6\u0214\1\u0213\2\u043b\1\u0224\1\u0213\1\u043b"+
+    "\1\u0213\1\u036b\1\u01ed\1\u0213\1\u045f\1\u0460\64\u043b\1\u0213"+
+    "\1\u043b\6\u0213\5\u041c\1\u0461\2\u041c\1\u0438\77\u041c\1\u03f0"+
+    "\2\u041f\1\u0376\1\u03f0\1\u0462\1\u03f0\1\u0378\2\u0376\1\u03cc"+
+    "\1\u03cd\64\u041f\1\u03f0\1\u041f\6\u03f0\1\u032e\2\u0420\2\u032e"+
+    "\1\u0463\1\u032e\1\u03f4\1\u032e\1\u0353\1\u043f\1\u0440\64\u0420"+
+    "\1\u032e\1\u0420\2\u032e\1\u03f6\4\u032e\1\u0420\3\u032e\1\u0352"+
+    "\1\u032e\1\u03f4\1\u032e\1\u0353\1\u043f\1\u0440\55\u0420\4\u032e"+
+    "\3\u0420\4\u032e\1\u03f6\3\u032e\3\u0464\1\u032e\1\u0464\1\u0465"+
+    "\1\u0464\1\u03f4\1\u03a7\1\u03cf\1\u0466\75\u0464\1\u0334\2\u0421"+
+    "\2\u0334\1\u0467\1\u0334\1\u03f7\1\u0353\1\u0334\1\u0442\1\u0443"+
+    "\64\u0421\1\u0334\1\u0421\2\u0334\1\u03f9\4\u0334\1\u0421\3\u0334"+
+    "\1\u0357\1\u0334\1\u03f7\1\u0353\1\u0334\1\u0442\1\u0443\55\u0421"+
+    "\4\u0334\3\u0421\4\u0334\1\u03f9\3\u0334\3\u0468\1\u0334\1\u0468"+
+    "\1\u0469\1\u0468\1\u03f7\1\u03d0\1\u03a7\1\u046a\75\u0468\1\u03fb"+
+    "\2\u0424\1\u0382\1\u03fb\1\u046b\1\u03fb\1\u0384\2\u0382\1\u03d4"+
+    "\1\u03d5\64\u0424\1\u03fb\1\u0424\6\u03fb\1\u0335\2\u0425\2\u0335"+
+    "\1\u046c\1\u0335\1\u03ff\1\u0335\1\u0359\1\u0446\1\u0447\64\u0425"+
+    "\1\u0335\1\u0425\2\u0335\1\u0401\4\u0335\1\u0425\3\u0335\1\u0358"+
+    "\1\u0335\1\u03ff\1\u0335\1\u0359\1\u0446\1\u0447\55\u0425\4\u0335"+
+    "\3\u0425\4\u0335\1\u0401\3\u0335\3\u046d\1\u0335\1\u046d\1\u046e"+
+    "\1\u046d\1\u03ff\1\u03ae\1\u03d7\1\u046f\75\u046d\1\u033b\2\u0426"+
+    "\2\u033b\1\u0470\1\u033b\1\u0402\1\u0359\1\u033b\1\u0449\1\u044a"+
+    "\64\u0426\1\u033b\1\u0426\2\u033b\1\u0404\4\u033b\1\u0426\3\u033b"+
+    "\1\u035d\1\u033b\1\u0402\1\u0359\1\u033b\1\u0449\1\u044a\55\u0426"+
+    "\4\u033b\3\u0426\4\u033b\1\u0404\3\u033b\3\u0471\1\u033b\1\u0471"+
+    "\1\u0472\1\u0471\1\u0402\1\u03d8\1\u03ae\1\u0473\75\u0471\1\u0406"+
+    "\2\u0429\1\u038e\1\u0406\1\u0474\1\u0406\1\u0390\2\u038e\1\u03dc"+
+    "\1\u03dd\64\u0429\1\u0406\1\u0429\6\u0406\1\u033c\2\u042a\2\u033c"+
+    "\1\u0475\1\u033c\1\u040a\1\u033c\1\u035f\1\u044d\1\u044e\64\u042a"+
+    "\1\u033c\1\u042a\2\u033c\1\u040c\4\u033c\1\u042a\3\u033c\1\u035e"+
+    "\1\u033c\1\u040a\1\u033c\1\u035f\1\u044d\1\u044e\55\u042a\4\u033c"+
+    "\3\u042a\4\u033c\1\u040c\3\u033c\3\u0476\1\u033c\1\u0476\1\u0477"+
+    "\1\u0476\1\u040a\1\u03b5\1\u03df\1\u0478\75\u0476\1\u0342\2\u042b"+
+    "\2\u0342\1\u0479\1\u0342\1\u040d\1\u035f\1\u0342\1\u0450\1\u0451"+
+    "\64\u042b\1\u0342\1\u042b\2\u0342\1\u040f\4\u0342\1\u042b\3\u0342"+
+    "\1\u0363\1\u0342\1\u040d\1\u035f\1\u0342\1\u0450\1\u0451\55\u042b"+
+    "\4\u0342\3\u042b\4\u0342\1\u040f\3\u0342\3\u047a\1\u0342\1\u047a"+
+    "\1\u047b\1\u047a\1\u040d\1\u03e0\1\u03b5\1\u047c\75\u047a\3\u042d"+
+    "\1\u03bb\1\u042d\1\u0453\1\u042d\1\u0452\2\u03bb\1\u03be\76\u042d"+
+    "\2\u0454\1\u03bb\1\u042d\1\u047d\1\u042d\1\u03bd\2\u03bb\1\u0411"+
+    "\1\u0412\64\u0454\1\u042d\1\u0454\6\u042d\1\u0364\2\u0455\2\u0364"+
+    "\1\u047e\1\u0364\1\u0431\1\u0364\1\u039a\1\u047f\1\u0480\64\u0455"+
+    "\1\u0364\1\u0455\2\u0364\1\u0433\3\u0364\1\u036a\2\u0456\2\u036a"+
+    "\1\u0481\1\u036a\1\u0434\1\u039a\1\u036a\1\u0482\1\u0483\64\u0456"+
+    "\1\u036a\1\u0456\2\u036a\1\u0436\3\u036a\5\u0418\1\u0457\1\u0418"+
+    "\1\u03c7\1\u0418\1\u0438\76\u0418\5\u0458\1\u0459\107\u0458\1\u0484"+
+    "\103\u0458\1\u0485\3\u0458\1\u0459\1\u0458\1\u045a\2\u0458\1\u045b"+
+    "\1\u0458\55\u0485\4\u0458\3\u0485\10\u0458\3\u03c7\1\u03eb\2\u03c7"+
+    "\1\u0486\1\u03c7\1\u03ec\1\u03ed\76\u03c7\1\u0214\1\u043a\1\u0214"+
+    "\1\u0225\3\u0214\1\u0370\1\u0214\1\u01ed\1\u045d\1\u045e\55\u043a"+
+    "\4\u0214\3\u043a\10\u0214\3\u0487\1\u0225\3\u0487\1\u0370\1\u03c7"+
+    "\1\u03ec\1\u0488\75\u0487\1\u0213\1\u043b\1\u0213\1\u0224\3\u0213"+
+    "\1\u036b\1\u01ed\1\u0213\1\u045f\1\u0460\55\u043b\4\u0213\3\u043b"+
+    "\10\u0213\3\u0489\1\u0224\3\u0489\1\u036b\1\u03ed\1\u03c7\1\u048a"+
+    "\75\u0489\5\u041c\1\u0461\1\u041c\1\u03c7\1\u0438\77\u041c\1\u03f0"+
+    "\2\u041f\1\u0376\1\u03f0\1\u0462\1\u03f0\1\u041d\2\u0376\1\u03cc"+
+    "\1\u03cd\64\u041f\1\u03f0\1\u041f\6\u03f0\1\u032e\2\u0420\2\u032e"+
+    "\1\u0463\1\u032e\1\u041d\1\u032e\1\u0353\1\u043f\1\u0440\64\u0420"+
+    "\1\u032e\1\u0420\2\u032e\1\u03f6\3\u032e\3\u0464\1\u032e\1\u0464"+
+    "\1\u0465\1\u0464\1\u03f4\1\u032e\1\u0353\1\u03f5\100\u0464\1\u032e"+
+    "\1\u0464\1\u048b\1\u0464\1\u03f4\1\u032e\1\u0353\1\u03f5\76\u0464"+
+    "\1\u048c\1\u0464\1\u032e\1\u0464\1\u0465\1\u0464\1\u03f4\1\u03a7"+
+    "\1\u03cf\1\u0466\1\u0464\55\u048c\4\u0464\3\u048c\10\u0464\1\u0334"+
+    "\2\u0421\2\u0334\1\u0467\1\u0334\1\u041d\1\u0353\1\u0334\1\u0442"+
+    "\1\u0443\64\u0421\1\u0334\1\u0421\2\u0334\1\u03f9\3\u0334\3\u0468"+
+    "\1\u0334\1\u0468\1\u0469\1\u0468\1\u03f7\1\u0353\1\u0334\1\u03f8"+
+    "\100\u0468\1\u0334\1\u0468\1\u048d\1\u0468\1\u03f7\1\u0353\1\u0334"+
+    "\1\u03f8\76\u0468\1\u048e\1\u0468\1\u0334\1\u0468\1\u0469\1\u0468"+
+    "\1\u03f7\1\u03d0\1\u03a7\1\u046a\1\u0468\55\u048e\4\u0468\3\u048e"+
+    "\10\u0468\1\u03fb\2\u0424\1\u0382\1\u03fb\1\u046b\1\u03fb\1\u0422"+
+    "\2\u0382\1\u03d4\1\u03d5\64\u0424\1\u03fb\1\u0424\6\u03fb\1\u0335"+
+    "\2\u0425\2\u0335\1\u046c\1\u0335\1\u0422\1\u0335\1\u0359\1\u0446"+
+    "\1\u0447\64\u0425\1\u0335\1\u0425\2\u0335\1\u0401\3\u0335\3\u046d"+
+    "\1\u0335\1\u046d\1\u046e\1\u046d\1\u03ff\1\u0335\1\u0359\1\u0400"+
+    "\100\u046d\1\u0335\1\u046d\1\u048f\1\u046d\1\u03ff\1\u0335\1\u0359"+
+    "\1\u0400\76\u046d\1\u0490\1\u046d\1\u0335\1\u046d\1\u046e\1\u046d"+
+    "\1\u03ff\1\u03ae\1\u03d7\1\u046f\1\u046d\55\u0490\4\u046d\3\u0490"+
+    "\10\u046d\1\u033b\2\u0426\2\u033b\1\u0470\1\u033b\1\u0422\1\u0359"+
+    "\1\u033b\1\u0449\1\u044a\64\u0426\1\u033b\1\u0426\2\u033b\1\u0404"+
+    "\3\u033b\3\u0471\1\u033b\1\u0471\1\u0472\1\u0471\1\u0402\1\u0359"+
+    "\1\u033b\1\u0403\100\u0471\1\u033b\1\u0471\1\u0491\1\u0471\1\u0402"+
+    "\1\u0359\1\u033b\1\u0403\76\u0471\1\u0492\1\u0471\1\u033b\1\u0471"+
+    "\1\u0472\1\u0471\1\u0402\1\u03d8\1\u03ae\1\u0473\1\u0471\55\u0492"+
+    "\4\u0471\3\u0492\10\u0471\1\u0406\2\u0429\1\u038e\1\u0406\1\u0474"+
+    "\1\u0406\1\u0427\2\u038e\1\u03dc\1\u03dd\64\u0429\1\u0406\1\u0429"+
+    "\6\u0406\1\u033c\2\u042a\2\u033c\1\u0475\1\u033c\1\u0427\1\u033c"+
+    "\1\u035f\1\u044d\1\u044e\64\u042a\1\u033c\1\u042a\2\u033c\1\u040c"+
+    "\3\u033c\3\u0476\1\u033c\1\u0476\1\u0477\1\u0476\1\u040a\1\u033c"+
+    "\1\u035f\1\u040b\100\u0476\1\u033c\1\u0476\1\u0493\1\u0476\1\u040a"+
+    "\1\u033c\1\u035f\1\u040b\76\u0476\1\u0494\1\u0476\1\u033c\1\u0476"+
+    "\1\u0477\1\u0476\1\u040a\1\u03b5\1\u03df\1\u0478\1\u0476\55\u0494"+
+    "\4\u0476\3\u0494\10\u0476\1\u0342\2\u042b\2\u0342\1\u0479\1\u0342"+
+    "\1\u0427\1\u035f\1\u0342\1\u0450\1\u0451\64\u042b\1\u0342\1\u042b"+
+    "\2\u0342\1\u040f\3\u0342\3\u047a\1\u0342\1\u047a\1\u047b\1\u047a"+
+    "\1\u040d\1\u035f\1\u0342\1\u040e\100\u047a\1\u0342\1\u047a\1\u0495"+
+    "\1\u047a\1\u040d\1\u035f\1\u0342\1\u040e\76\u047a\1\u0496\1\u047a"+
+    "\1\u0342\1\u047a\1\u047b\1\u047a\1\u040d\1\u03e0\1\u03b5\1\u047c"+
+    "\1\u047a\55\u0496\4\u047a\3\u0496\10\u047a\1\u042d\2\u0454\1\u03bb"+
+    "\1\u042d\1\u0497\1\u042d\1\u03bd\2\u03bb\1\u0411\1\u0412\64\u0454"+
+    "\1\u042d\1\u0454\6\u042d\1\u0364\2\u0455\2\u0364\1\u0498\1\u0364"+
+    "\1\u0431\1\u0364\1\u039a\1\u047f\1\u0480\64\u0455\1\u0364\1\u0455"+
+    "\2\u0364\1\u0433\4\u0364\1\u0455\3\u0364\1\u0399\1\u0364\1\u0431"+
+    "\1\u0364\1\u039a\1\u047f\1\u0480\55\u0455\4\u0364\3\u0455\4\u0364"+
+    "\1\u0433\3\u0364\3\u0499\1\u0364\1\u0499\1\u049a\1\u0499\1\u0431"+
+    "\1\u03e5\1\u0414\1\u049b\75\u0499\1\u036a\2\u0456\2\u036a\1\u049c"+
+    "\1\u036a\1\u0434\1\u039a\1\u036a\1\u0482\1\u0483\64\u0456\1\u036a"+
+    "\1\u0456\2\u036a\1\u0436\4\u036a\1\u0456\3\u036a\1\u039e\1\u036a"+
+    "\1\u0434\1\u039a\1\u036a\1\u0482\1\u0483\55\u0456\4\u036a\3\u0456"+
+    "\4\u036a\1\u0436\3\u036a\3\u049d\1\u036a\1\u049d\1\u049e\1\u049d"+
+    "\1\u0434\1\u0415\1\u03e5\1\u049f\75\u049d\5\u0458\1\u0484\1\u0458"+
+    "\1\u03c7\101\u0458\2\u0485\2\u0458\1\u04a0\1\u0458\1\u045a\2\u0458"+
+    "\1\u04a1\1\u04a2\64\u0485\1\u0458\1\u0485\6\u0458\5\u0486\1\u04a3"+
+    "\2\u0486\1\u04a4\1\u04a5\76\u0486\3\u0487\1\u0225\3\u0487\1\u0370"+
+    "\1\u0214\1\u01ed\1\u041a\76\u0487\1\u04a6\1\u0487\1\u0225\3\u0487"+
+    "\1\u0370\1\u03c7\1\u03ec\1\u0488\1\u0487\55\u04a6\4\u0487\3\u04a6"+
+    "\10\u0487\3\u0489\1\u0224\3\u0489\1\u036b\1\u01ed\1\u0213\1\u041b"+
+    "\76\u0489\1\u04a7\1\u0489\1\u0224\3\u0489\1\u036b\1\u03ed\1\u03c7"+
+    "\1\u048a\1\u0489\55\u04a7\4\u0489\3\u04a7\10\u0489\3\u0464\1\u032e"+
+    "\1\u0464\1\u048b\1\u0464\1\u041d\1\u032e\1\u0353\1\u03f5\76\u0464"+
+    "\2\u048c\1\u032e\1\u0464\1\u04a8\1\u0464\1\u03f4\1\u032e\1\u0353"+
+    "\1\u043f\1\u0440\64\u048c\1\u0464\1\u048c\6\u0464\3\u0468\1\u0334"+
+    "\1\u0468\1\u048d\1\u0468\1\u041d\1\u0353\1\u0334\1\u03f8\76\u0468"+
+    "\2\u048e\1\u0334\1\u0468\1\u04a9\1\u0468\1\u03f7\1\u0353\1\u0334"+
+    "\1\u0442\1\u0443\64\u048e\1\u0468\1\u048e\6\u0468\3\u046d\1\u0335"+
+    "\1\u046d\1\u048f\1\u046d\1\u0422\1\u0335\1\u0359\1\u0400\76\u046d"+
+    "\2\u0490\1\u0335\1\u046d\1\u04aa\1\u046d\1\u03ff\1\u0335\1\u0359"+
+    "\1\u0446\1\u0447\64\u0490\1\u046d\1\u0490\6\u046d\3\u0471\1\u033b"+
+    "\1\u0471\1\u0491\1\u0471\1\u0422\1\u0359\1\u033b\1\u0403\76\u0471"+
+    "\2\u0492\1\u033b\1\u0471\1\u04ab\1\u0471\1\u0402\1\u0359\1\u033b"+
+    "\1\u0449\1\u044a\64\u0492\1\u0471\1\u0492\6\u0471\3\u0476\1\u033c"+
+    "\1\u0476\1\u0493\1\u0476\1\u0427\1\u033c\1\u035f\1\u040b\76\u0476"+
+    "\2\u0494\1\u033c\1\u0476\1\u04ac\1\u0476\1\u040a\1\u033c\1\u035f"+
+    "\1\u044d\1\u044e\64\u0494\1\u0476\1\u0494\6\u0476\3\u047a\1\u0342"+
+    "\1\u047a\1\u0495\1\u047a\1\u0427\1\u035f\1\u0342\1\u040e\76\u047a"+
+    "\2\u0496\1\u0342\1\u047a\1\u04ad\1\u047a\1\u040d\1\u035f\1\u0342"+
+    "\1\u0450\1\u0451\64\u0496\1\u047a\1\u0496\6\u047a\1\u042d\2\u0454"+
+    "\1\u03bb\1\u042d\1\u0497\1\u042d\1\u0452\2\u03bb\1\u0411\1\u0412"+
+    "\64\u0454\1\u042d\1\u0454\6\u042d\1\u0364\2\u0455\2\u0364\1\u0498"+
+    "\1\u0364\1\u0452\1\u0364\1\u039a\1\u047f\1\u0480\64\u0455\1\u0364"+
+    "\1\u0455\2\u0364\1\u0433\3\u0364\3\u0499\1\u0364\1\u0499\1\u049a"+
+    "\1\u0499\1\u0431\1\u0364\1\u039a\1\u0432\100\u0499\1\u0364\1\u0499"+
+    "\1\u04ae\1\u0499\1\u0431\1\u0364\1\u039a\1\u0432\76\u0499\1\u04af"+
+    "\1\u0499\1\u0364\1\u0499\1\u049a\1\u0499\1\u0431\1\u03e5\1\u0414"+
+    "\1\u049b\1\u0499\55\u04af\4\u0499\3\u04af\10\u0499\1\u036a\2\u0456"+
+    "\2\u036a\1\u049c\1\u036a\1\u0452\1\u039a\1\u036a\1\u0482\1\u0483"+
+    "\64\u0456\1\u036a\1\u0456\2\u036a\1\u0436\3\u036a\3\u049d\1\u036a"+
+    "\1\u049d\1\u049e\1\u049d\1\u0434\1\u039a\1\u036a\1\u0435\100\u049d"+
+    "\1\u036a\1\u049d\1\u04b0\1\u049d\1\u0434\1\u039a\1\u036a\1\u0435"+
+    "\76\u049d\1\u04b1\1\u049d\1\u036a\1\u049d\1\u049e\1\u049d\1\u0434"+
+    "\1\u0415\1\u03e5\1\u049f\1\u049d\55\u04b1\4\u049d\3\u04b1\10\u049d"+
+    "\1\u0458\2\u0485\2\u0458\1\u04b2\1\u0458\1\u045a\2\u0458\1\u04a1"+
+    "\1\u04a2\64\u0485\1\u0458\1\u0485\7\u0458\1\u0485\3\u0458\1\u0459"+
+    "\1\u0458\1\u045a\2\u0458\1\u04a1\1\u04a2\55\u0485\4\u0458\3\u0485"+
+    "\10\u0458\3\u04b3\1\u0458\1\u04b3\1\u04b4\1\u04b3\1\u045a\1\u041c"+
+    "\1\u0418\1\u04b5\75\u04b3\5\u0486\1\u04b6\2\u0486\1\u04a4\1\u04a5"+
+    "\76\u0486\5\u0418\1\u0437\1\u0418\1\u04b7\1\u0418\1\u0438\1\u04b8"+
+    "\75\u0418\5\u041c\1\u043c\1\u041c\1\u04b9\1\u0438\1\u041c\1\u04ba"+
+    "\75\u041c\1\u0487\2\u04a6\1\u0225\1\u0487\1\u04a6\1\u0487\1\u0370"+
+    "\1\u0214\1\u01ed\1\u045d\1\u045e\64\u04a6\1\u0487\1\u04a6\6\u0487"+
+    "\1\u0489\2\u04a7\1\u0224\1\u0489\1\u04a7\1\u0489\1\u036b\1\u01ed"+
+    "\1\u0213\1\u045f\1\u0460\64\u04a7\1\u0489\1\u04a7\6\u0489\1\u0464"+
+    "\2\u048c\1\u032e\1\u0464\1\u04bb\1\u0464\1\u03f4\1\u032e\1\u0353"+
+    "\1\u043f\1\u0440\64\u048c\1\u0464\1\u048c\6\u0464\1\u0468\2\u048e"+
+    "\1\u0334\1\u0468\1\u04bc\1\u0468\1\u03f7\1\u0353\1\u0334\1\u0442"+
+    "\1\u0443\64\u048e\1\u0468\1\u048e\6\u0468\1\u046d\2\u0490\1\u0335"+
+    "\1\u046d\1\u04bd\1\u046d\1\u03ff\1\u0335\1\u0359\1\u0446\1\u0447"+
+    "\64\u0490\1\u046d\1\u0490\6\u046d\1\u0471\2\u0492\1\u033b\1\u0471"+
+    "\1\u04be\1\u0471\1\u0402\1\u0359\1\u033b\1\u0449\1\u044a\64\u0492"+
+    "\1\u0471\1\u0492\6\u0471\1\u0476\2\u0494\1\u033c\1\u0476\1\u04bf"+
+    "\1\u0476\1\u040a\1\u033c\1\u035f\1\u044d\1\u044e\64\u0494\1\u0476"+
+    "\1\u0494\6\u0476\1\u047a\2\u0496\1\u0342\1\u047a\1\u04c0\1\u047a"+
+    "\1\u040d\1\u035f\1\u0342\1\u0450\1\u0451\64\u0496\1\u047a\1\u0496"+
+    "\6\u047a\3\u0499\1\u0364\1\u0499\1\u04ae\1\u0499\1\u0452\1\u0364"+
+    "\1\u039a\1\u0432\76\u0499\2\u04af\1\u0364\1\u0499\1\u04c1\1\u0499"+
+    "\1\u0431\1\u0364\1\u039a\1\u047f\1\u0480\64\u04af\1\u0499\1\u04af"+
+    "\6\u0499\3\u049d\1\u036a\1\u049d\1\u04b0\1\u049d\1\u0452\1\u039a"+
+    "\1\u036a\1\u0435\76\u049d\2\u04b1\1\u036a\1\u049d\1\u04c2\1\u049d"+
+    "\1\u0434\1\u039a\1\u036a\1\u0482\1\u0483\64\u04b1\1\u049d\1\u04b1"+
+    "\6\u049d\1\u0458\2\u0485\2\u0458\1\u04b2\1\u0458\1\u04c3\2\u0458"+
+    "\1\u04a1\1\u04a2\64\u0485\1\u0458\1\u0485\6\u0458\3\u04b3\1\u0458"+
+    "\1\u04b3\1\u04b4\1\u04b3\1\u045a\2\u0458\1\u045b\100\u04b3\1\u0458"+
+    "\1\u04b3\1\u04c4\1\u04b3\1\u045a\2\u0458\1\u045b\76\u04b3\1\u04c5"+
+    "\1\u04b3\1\u0458\1\u04b3\1\u04b4\1\u04b3\1\u045a\1\u041c\1\u0418"+
+    "\1\u04b5\1\u04b3\55\u04c5\4\u04b3\3\u04c5\10\u04b3\5\u0486\1\u04b6"+
+    "\1\u0486\1\u03c7\1\u04a4\1\u04a5\76\u0486\1\u0418\1\u04c6\3\u0418"+
+    "\1\u0437\1\u0418\1\u04b7\1\u0418\1\u0438\1\u04b8\1\u0418\55\u04c6"+
+    "\4\u0418\3\u04c6\10\u0418\1\u041c\1\u04c7\3\u041c\1\u043c\1\u041c"+
+    "\1\u04b9\1\u0438\1\u041c\1\u04ba\1\u041c\55\u04c7\4\u041c\3\u04c7"+
+    "\10\u041c\1\u0464\2\u048c\1\u032e\1\u0464\1\u04bb\1\u0464\1\u041d"+
+    "\1\u032e\1\u0353\1\u043f\1\u0440\64\u048c\1\u0464\1\u048c\6\u0464"+
+    "\1\u0468\2\u048e\1\u0334\1\u0468\1\u04bc\1\u0468\1\u041d\1\u0353"+
+    "\1\u0334\1\u0442\1\u0443\64\u048e\1\u0468\1\u048e\6\u0468\1\u046d"+
+    "\2\u0490\1\u0335\1\u046d\1\u04bd\1\u046d\1\u0422\1\u0335\1\u0359"+
+    "\1\u0446\1\u0447\64\u0490\1\u046d\1\u0490\6\u046d\1\u0471\2\u0492"+
+    "\1\u033b\1\u0471\1\u04be\1\u0471\1\u0422\1\u0359\1\u033b\1\u0449"+
+    "\1\u044a\64\u0492\1\u0471\1\u0492\6\u0471\1\u0476\2\u0494\1\u033c"+
+    "\1\u0476\1\u04bf\1\u0476\1\u0427\1\u033c\1\u035f\1\u044d\1\u044e"+
+    "\64\u0494\1\u0476\1\u0494\6\u0476\1\u047a\2\u0496\1\u0342\1\u047a"+
+    "\1\u04c0\1\u047a\1\u0427\1\u035f\1\u0342\1\u0450\1\u0451\64\u0496"+
+    "\1\u047a\1\u0496\6\u047a\1\u0499\2\u04af\1\u0364\1\u0499\1\u04c8"+
+    "\1\u0499\1\u0431\1\u0364\1\u039a\1\u047f\1\u0480\64\u04af\1\u0499"+
+    "\1\u04af\6\u0499\1\u049d\2\u04b1\1\u036a\1\u049d\1\u04c9\1\u049d"+
+    "\1\u0434\1\u039a\1\u036a\1\u0482\1\u0483\64\u04b1\1\u049d\1\u04b1"+
+    "\6\u049d\3\u04b3\1\u0458\1\u04b3\1\u04c4\1\u04b3\1\u04c3\2\u0458"+
+    "\1\u045b\76\u04b3\2\u04c5\1\u0458\1\u04b3\1\u04ca\1\u04b3\1\u045a"+
+    "\2\u0458\1\u04a1\1\u04a2\64\u04c5\1\u04b3\1\u04c5\6\u04b3\1\u0418"+
+    "\2\u04c6\2\u0418\1\u04cb\1\u0418\1\u04b7\1\u0418\1\u0438\1\u04cc"+
+    "\1\u04cd\64\u04c6\1\u0418\1\u04c6\6\u0418\1\u041c\2\u04c7\2\u041c"+
+    "\1\u04ce\1\u041c\1\u04b9\1\u0438\1\u041c\1\u04cf\1\u04d0\64\u04c7"+
+    "\1\u041c\1\u04c7\6\u041c\1\u0499\2\u04af\1\u0364\1\u0499\1\u04c8"+
+    "\1\u0499\1\u0452\1\u0364\1\u039a\1\u047f\1\u0480\64\u04af\1\u0499"+
+    "\1\u04af\6\u0499\1\u049d\2\u04b1\1\u036a\1\u049d\1\u04c9\1\u049d"+
+    "\1\u0452\1\u039a\1\u036a\1\u0482\1\u0483\64\u04b1\1\u049d\1\u04b1"+
+    "\6\u049d\1\u04b3\2\u04c5\1\u0458\1\u04b3\1\u04d1\1\u04b3\1\u045a"+
+    "\2\u0458\1\u04a1\1\u04a2\64\u04c5\1\u04b3\1\u04c5\6\u04b3\1\u0418"+
+    "\2\u04c6\2\u0418\1\u04d2\1\u0418\1\u04b7\1\u0418\1\u0438\1\u04cc"+
+    "\1\u04cd\64\u04c6\1\u0418\1\u04c6\7\u0418\1\u04c6\3\u0418\1\u0437"+
+    "\1\u0418\1\u04b7\1\u0418\1\u0438\1\u04cc\1\u04cd\55\u04c6\4\u0418"+
+    "\3\u04c6\10\u0418\3\u04d3\1\u0418\1\u04d3\1\u04d4\1\u04d3\1\u04b7"+
+    "\1\u0486\1\u04a4\1\u04d5\75\u04d3\1\u041c\2\u04c7\2\u041c\1\u04d6"+
+    "\1\u041c\1\u04b9\1\u0438\1\u041c\1\u04cf\1\u04d0\64\u04c7\1\u041c"+
+    "\1\u04c7\7\u041c\1\u04c7\3\u041c\1\u043c\1\u041c\1\u04b9\1\u0438"+
+    "\1\u041c\1\u04cf\1\u04d0\55\u04c7\4\u041c\3\u04c7\10\u041c\3\u04d7"+
+    "\1\u041c\1\u04d7\1\u04d8\1\u04d7\1\u04b9\1\u04a5\1\u0486\1\u04d9"+
+    "\75\u04d7\1\u04b3\2\u04c5\1\u0458\1\u04b3\1\u04d1\1\u04b3\1\u04c3"+
+    "\2\u0458\1\u04a1\1\u04a2\64\u04c5\1\u04b3\1\u04c5\6\u04b3\1\u0418"+
+    "\2\u04c6\2\u0418\1\u04d2\1\u0418\1\u04c3\1\u0418\1\u0438\1\u04cc"+
+    "\1\u04cd\64\u04c6\1\u0418\1\u04c6\6\u0418\3\u04d3\1\u0418\1\u04d3"+
+    "\1\u04d4\1\u04d3\1\u04b7\1\u0418\1\u0438\1\u04b8\100\u04d3\1\u0418"+
+    "\1\u04d3\1\u04da\1\u04d3\1\u04b7\1\u0418\1\u0438\1\u04b8\76\u04d3"+
+    "\1\u04db\1\u04d3\1\u0418\1\u04d3\1\u04d4\1\u04d3\1\u04b7\1\u0486"+
+    "\1\u04a4\1\u04d5\1\u04d3\55\u04db\4\u04d3\3\u04db\10\u04d3\1\u041c"+
+    "\2\u04c7\2\u041c\1\u04d6\1\u041c\1\u04c3\1\u0438\1\u041c\1\u04cf"+
+    "\1\u04d0\64\u04c7\1\u041c\1\u04c7\6\u041c\3\u04d7\1\u041c\1\u04d7"+
+    "\1\u04d8\1\u04d7\1\u04b9\1\u0438\1\u041c\1\u04ba\100\u04d7\1\u041c"+
+    "\1\u04d7\1\u04dc\1\u04d7\1\u04b9\1\u0438\1\u041c\1\u04ba\76\u04d7"+
+    "\1\u04dd\1\u04d7\1\u041c\1\u04d7\1\u04d8\1\u04d7\1\u04b9\1\u04a5"+
+    "\1\u0486\1\u04d9\1\u04d7\55\u04dd\4\u04d7\3\u04dd\10\u04d7\3\u04d3"+
+    "\1\u0418\1\u04d3\1\u04da\1\u04d3\1\u04c3\1\u0418\1\u0438\1\u04b8"+
+    "\76\u04d3\2\u04db\1\u0418\1\u04d3\1\u04de\1\u04d3\1\u04b7\1\u0418"+
+    "\1\u0438\1\u04cc\1\u04cd\64\u04db\1\u04d3\1\u04db\6\u04d3\3\u04d7"+
+    "\1\u041c\1\u04d7\1\u04dc\1\u04d7\1\u04c3\1\u0438\1\u041c\1\u04ba"+
+    "\76\u04d7\2\u04dd\1\u041c\1\u04d7\1\u04df\1\u04d7\1\u04b9\1\u0438"+
+    "\1\u041c\1\u04cf\1\u04d0\64\u04dd\1\u04d7\1\u04dd\6\u04d7\1\u04d3"+
+    "\2\u04db\1\u0418\1\u04d3\1\u04e0\1\u04d3\1\u04b7\1\u0418\1\u0438"+
+    "\1\u04cc\1\u04cd\64\u04db\1\u04d3\1\u04db\6\u04d3\1\u04d7\2\u04dd"+
+    "\1\u041c\1\u04d7\1\u04e1\1\u04d7\1\u04b9\1\u0438\1\u041c\1\u04cf"+
+    "\1\u04d0\64\u04dd\1\u04d7\1\u04dd\6\u04d7\1\u04d3\2\u04db\1\u0418"+
+    "\1\u04d3\1\u04e0\1\u04d3\1\u04c3\1\u0418\1\u0438\1\u04cc\1\u04cd"+
+    "\64\u04db\1\u04d3\1\u04db\6\u04d3\1\u04d7\2\u04dd\1\u041c\1\u04d7"+
+    "\1\u04e1\1\u04d7\1\u04c3\1\u0438\1\u041c\1\u04cf\1\u04d0\64\u04dd"+
+    "\1\u04d7\1\u04dd\6\u04d7";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[83016];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\25\0\5\11\53\1\1\11\1\1\1\11\15\1\1\11"+
+    "\4\1\1\11\5\1\2\11\17\1\1\11\2\1\3\11"+
+    "\1\1\1\11\1\1\1\11\1\1\1\11\3\1\1\11"+
+    "\2\1\1\11\2\1\34\0\1\11\54\0\1\1\24\0"+
+    "\1\1\7\0\1\1\2\0\20\1\3\0\1\11\7\0"+
+    "\17\1\105\0\1\1\6\0\2\1\12\0\1\1\1\11"+
+    "\2\0\6\1\2\0\1\11\3\0\1\11\1\1\1\11"+
+    "\1\0\5\1\2\11\36\0\1\1\1\0\4\1\2\0"+
+    "\1\11\2\0\4\1\15\0\1\1\1\0\1\1\4\0"+
+    "\1\1\1\0\1\11\1\0\1\11\21\0\1\1\14\0"+
+    "\1\11\1\0\1\1\25\0\1\11\40\0\1\1\5\0"+
+    "\1\1\5\0\1\1\5\0\1\1\5\0\1\1\5\0"+
+    "\1\1\27\0\1\1\5\0\1\1\102\0\1\1\4\0"+
+    "\1\1\4\0\1\1\4\0\1\1\4\0\1\1\4\0"+
+    "\1\1\44\0\1\1\4\0\1\1\7\0\1\1\4\0"+
+    "\1\1\161\0\1\1\4\0\1\1\7\0\1\1\13\0"+
+    "\1\1\13\0\1\1\54\0\1\1\66\0\1\1\2\0"+
+    "\1\1\7\0\1\1\2\0\1\1\7\0\1\1\2\0"+
+    "\1\1\17\0\1\1\4\0\1\1\4\0\1\1\11\0"+
+    "\1\1\2\0\1\1\35\0\1\1\7\0\1\1\134\0"+
+    "\1\1\1\0\1\1\11\0\1\1\36\0";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[1249];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[] = new char[ZZ_BUFFERSIZE];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** number of newlines encountered up to the start of the matched text */
+  private int yyline;
+
+  /** the number of characters up to the start of the matched text */
+  private int yychar;
+
+  /**
+   * the number of characters from the last newline up to the start of the 
+   * matched text
+   */
+  private int yycolumn;
+
+  /** 
+   * zzAtBOL == true <=> the scanner is currently at the beginning of a line
+   */
+  private boolean zzAtBOL = true;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /** denotes if the user-EOF-code has already been executed */
+  private boolean zzEOFDone;
+
+  /* user code: */
+  private static final CharArrayMap<Character> entityValues
+      = new CharArrayMap<Character>(Version.LUCENE_40, 253, false);
+  static {
+    String[] entities = {
+      "AElig", "\u00C6", "Aacute", "\u00C1", "Acirc", "\u00C2",
+      "Agrave", "\u00C0", "Alpha", "\u0391", "Aring", "\u00C5",
+      "Atilde", "\u00C3", "Auml", "\u00C4", "Beta", "\u0392",
+      "Ccedil", "\u00C7", "Chi", "\u03A7", "Dagger", "\u2021",
+      "Delta", "\u0394", "ETH", "\u00D0", "Eacute", "\u00C9",
+      "Ecirc", "\u00CA", "Egrave", "\u00C8", "Epsilon", "\u0395",
+      "Eta", "\u0397", "Euml", "\u00CB", "Gamma", "\u0393", "Iacute", "\u00CD",
+      "Icirc", "\u00CE", "Igrave", "\u00CC", "Iota", "\u0399",
+      "Iuml", "\u00CF", "Kappa", "\u039A", "Lambda", "\u039B", "Mu", "\u039C",
+      "Ntilde", "\u00D1", "Nu", "\u039D", "OElig", "\u0152",
+      "Oacute", "\u00D3", "Ocirc", "\u00D4", "Ograve", "\u00D2",
+      "Omega", "\u03A9", "Omicron", "\u039F", "Oslash", "\u00D8",
+      "Otilde", "\u00D5", "Ouml", "\u00D6", "Phi", "\u03A6", "Pi", "\u03A0",
+      "Prime", "\u2033", "Psi", "\u03A8", "Rho", "\u03A1", "Scaron", "\u0160",
+      "Sigma", "\u03A3", "THORN", "\u00DE", "Tau", "\u03A4", "Theta", "\u0398",
+      "Uacute", "\u00DA", "Ucirc", "\u00DB", "Ugrave", "\u00D9",
+      "Upsilon", "\u03A5", "Uuml", "\u00DC", "Xi", "\u039E",
+      "Yacute", "\u00DD", "Yuml", "\u0178", "Zeta", "\u0396",
+      "aacute", "\u00E1", "acirc", "\u00E2", "acute", "\u00B4",
+      "aelig", "\u00E6", "agrave", "\u00E0", "alefsym", "\u2135",
+      "alpha", "\u03B1", "amp", "\u0026", "and", "\u2227", "ang", "\u2220",
+      "apos", "\u0027", "aring", "\u00E5", "asymp", "\u2248",
+      "atilde", "\u00E3", "auml", "\u00E4", "bdquo", "\u201E",
+      "beta", "\u03B2", "brvbar", "\u00A6", "bull", "\u2022", "cap", "\u2229",
+      "ccedil", "\u00E7", "cedil", "\u00B8", "cent", "\u00A2", "chi", "\u03C7",
+      "circ", "\u02C6", "clubs", "\u2663", "cong", "\u2245", "copy", "\u00A9",
+      "crarr", "\u21B5", "cup", "\u222A", "curren", "\u00A4", "dArr", "\u21D3",
+      "dagger", "\u2020", "darr", "\u2193", "deg", "\u00B0", "delta", "\u03B4",
+      "diams", "\u2666", "divide", "\u00F7", "eacute", "\u00E9",
+      "ecirc", "\u00EA", "egrave", "\u00E8", "empty", "\u2205",
+      "emsp", "\u2003", "ensp", "\u2002", "epsilon", "\u03B5",
+      "equiv", "\u2261", "eta", "\u03B7", "eth", "\u00F0", "euml", "\u00EB",
+      "euro", "\u20AC", "exist", "\u2203", "fnof", "\u0192",
+      "forall", "\u2200", "frac12", "\u00BD", "frac14", "\u00BC",
+      "frac34", "\u00BE", "frasl", "\u2044", "gamma", "\u03B3", "ge", "\u2265",
+      "gt", "\u003E", "hArr", "\u21D4", "harr", "\u2194", "hearts", "\u2665",
+      "hellip", "\u2026", "iacute", "\u00ED", "icirc", "\u00EE",
+      "iexcl", "\u00A1", "igrave", "\u00EC", "image", "\u2111",
+      "infin", "\u221E", "int", "\u222B", "iota", "\u03B9", "iquest", "\u00BF",
+      "isin", "\u2208", "iuml", "\u00EF", "kappa", "\u03BA", "lArr", "\u21D0",
+      "lambda", "\u03BB", "lang", "\u2329", "laquo", "\u00AB",
+      "larr", "\u2190", "lceil", "\u2308", "ldquo", "\u201C", "le", "\u2264",
+      "lfloor", "\u230A", "lowast", "\u2217", "loz", "\u25CA", "lrm", "\u200E",
+      "lsaquo", "\u2039", "lsquo", "\u2018", "lt", "\u003C", "macr", "\u00AF",
+      "mdash", "\u2014", "micro", "\u00B5", "middot", "\u00B7",
+      "minus", "\u2212", "mu", "\u03BC", "nabla", "\u2207", "nbsp", " ",
+      "ndash", "\u2013", "ne", "\u2260", "ni", "\u220B", "not", "\u00AC",
+      "notin", "\u2209", "nsub", "\u2284", "ntilde", "\u00F1", "nu", "\u03BD",
+      "oacute", "\u00F3", "ocirc", "\u00F4", "oelig", "\u0153",
+      "ograve", "\u00F2", "oline", "\u203E", "omega", "\u03C9",
+      "omicron", "\u03BF", "oplus", "\u2295", "or", "\u2228", "ordf", "\u00AA",
+      "ordm", "\u00BA", "oslash", "\u00F8", "otilde", "\u00F5",
+      "otimes", "\u2297", "ouml", "\u00F6", "para", "\u00B6", "part", "\u2202",
+      "permil", "\u2030", "perp", "\u22A5", "phi", "\u03C6", "pi", "\u03C0",
+      "piv", "\u03D6", "plusmn", "\u00B1", "pound", "\u00A3",
+      "prime", "\u2032", "prod", "\u220F", "prop", "\u221D", "psi", "\u03C8",
+      "quot", "\"", "rArr", "\u21D2", "radic", "\u221A", "rang", "\u232A",
+      "raquo", "\u00BB", "rarr", "\u2192", "rceil", "\u2309",
+      "rdquo", "\u201D", "real", "\u211C", "reg", "\u00AE", "rfloor", "\u230B",
+      "rho", "\u03C1", "rlm", "\u200F", "rsaquo", "\u203A", "rsquo", "\u2019",
+      "sbquo", "\u201A", "scaron", "\u0161", "sdot", "\u22C5",
+      "sect", "\u00A7", "shy", "\u00AD", "sigma", "\u03C3", "sigmaf", "\u03C2",
+      "sim", "\u223C", "spades", "\u2660", "sub", "\u2282", "sube", "\u2286",
+      "sum", "\u2211", "sup", "\u2283", "sup1", "\u00B9", "sup2", "\u00B2",
+      "sup3", "\u00B3", "supe", "\u2287", "szlig", "\u00DF", "tau", "\u03C4",
+      "there4", "\u2234", "theta", "\u03B8", "thetasym", "\u03D1",
+      "thinsp", "\u2009", "thorn", "\u00FE", "tilde", "\u02DC",
+      "times", "\u00D7", "trade", "\u2122", "uArr", "\u21D1",
+      "uacute", "\u00FA", "uarr", "\u2191", "ucirc", "\u00FB",
+      "ugrave", "\u00F9", "uml", "\u00A8", "upsih", "\u03D2",
+      "upsilon", "\u03C5", "uuml", "\u00FC", "weierp", "\u2118",
+      "xi", "\u03BE", "yacute", "\u00FD", "yen", "\u00A5", "yuml", "\u00FF",
+      "zeta", "\u03B6", "zwj", "\u200D", "zwnj", "\u200C"
+    };
+    for (int i = 0 ; i < entities.length ; i += 2) {
+      entityValues.put(entities[i], new Character(entities[i + 1].charAt(0)));
+    }
+  }
+  private static final int INITIAL_INPUT_SEGMENT_SIZE = 1024;
+
+  private CharArraySet escapedTags = null;
+  private int inputStart;
+  private int cumulativeDiff;
+  private boolean escapeBR = false;
+  private boolean escapeSCRIPT = false;
+  private int restoreState;
+  private int previousRestoreState;
+  private int outputCharCount;
+  private TextSegment inputSegment
+      = new TextSegment(INITIAL_INPUT_SEGMENT_SIZE);
+  private TextSegment outputSegment = inputSegment;
+  private TextSegment entitySegment = new TextSegment(2);
+
+  /**
+   * @param source
+   */
+  public JFlexHTMLStripCharFilter(CharStream source) {
+    super(source);
+    this.zzReader = source;
+  }
+
+  /**
+   * @param source
+   * @param escapedTags Tags in this set (both start and end tags)
+   *  will not be filtered out.
+   */
+  public JFlexHTMLStripCharFilter(CharStream source, Set<String> escapedTags) {
+    super(source);
+    this.zzReader = source;
+    if (null != escapedTags) {
+      for (String tag : escapedTags) {
+        if (tag.equalsIgnoreCase("BR")) {
+          escapeBR = true;
+        } else if (tag.equalsIgnoreCase("SCRIPT")) {
+          escapeSCRIPT = true;
+        } else {
+          if (null == this.escapedTags) {
+            this.escapedTags = new CharArraySet(Version.LUCENE_40, 16, true);
+          }
+          this.escapedTags.add(tag);
+        }
+      }
+    }
+  }
+
+  @Override
+  public int read() throws IOException {
+    if (outputSegment.isRead()) {
+      if (zzAtEOF) {
+        return -1;
+      }
+      // yylex() returns true when input stream character(s) have been
+      // consumed and EOF has not been reached. However, there may be no
+      // output chars. Keep consuming input until output chars have been
+      // produced or EOF is reached.
+      do {
+        if (yylex() == OutputSource.DIRECT) {
+          ++outputCharCount;
+          return zzBuffer[zzStartRead];
+        }
+        if (zzAtEOF) {
+          break;
+        }
+      } while (outputSegment.isRead());
+      if (outputSegment.isRead()) {
+        return -1;
+      }
+    }
+    ++outputCharCount;
+    return outputSegment.nextChar();
+  }
+
+  @Override
+  public int read(char cbuf[], int off, int len) throws IOException {
+    int i = 0;
+    for ( ; i < len ; ++i) {
+      int ch = read();
+      if (ch == -1) break;
+      cbuf[off++] = (char)ch;
+    }
+    return i > 0 ? i : (len == 0 ? 0 : -1);
+  }
+
+  @Override
+  public void close() throws IOException {
+    yyclose();
+  }
+
+  static int getInitialBufferSize() {  // Package private, for testing purposes
+    return ZZ_BUFFERSIZE;
+  }
+
+  private class TextSegment extends OpenStringBuilder {
+    /** The position from which the next char will be read. */
+    int pos = 0;
+
+    /** Wraps the given buffer and sets this.len to the given length. */
+    TextSegment(char[] buffer, int length) {
+      super(buffer, length);
+    }
+
+    /** Allocates an internal buffer of the given size. */
+    TextSegment(int size) {
+      super(size);
+    }
+
+    /** Sets len = 0 and pos = 0. */
+    void clear() {
+      reset();
+      restart();
+    }
+
+    /** Sets pos = 0 */
+    void restart() {
+      pos = 0;
+    }
+
+    /** Returns the next char in the segment. */
+    int nextChar() {
+      assert (! isRead()): "Attempting to read past the end of a segment.";
+      return buf[pos++];
+    }
+
+    /** Returns true when all characters in the text segment have been read */
+    boolean isRead() {
+      return pos >= len;
+    }
+  }
+
+  private enum OutputSource { DIRECT, INDIRECT }
+
+
+  
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 2224) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Refills the input buffer.
+   *
+   * @return      <code>false</code>, iff there was new input.
+   * 
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  private boolean zzRefill() throws java.io.IOException {
+
+    /* first: make room (if you can) */
+    if (zzStartRead > 0) {
+      System.arraycopy(zzBuffer, zzStartRead,
+                       zzBuffer, 0,
+                       zzEndRead-zzStartRead);
+
+      /* translate stored positions */
+      zzEndRead-= zzStartRead;
+      zzCurrentPos-= zzStartRead;
+      zzMarkedPos-= zzStartRead;
+      zzStartRead = 0;
+    }
+
+    /* is the buffer big enough? */
+    if (zzCurrentPos >= zzBuffer.length) {
+      /* if not: blow it up */
+      char newBuffer[] = new char[zzCurrentPos*2];
+      System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length);
+      zzBuffer = newBuffer;
+    }
+
+    /* finally: fill the buffer with new input */
+    int numRead = zzReader.read(zzBuffer, zzEndRead,
+                                            zzBuffer.length-zzEndRead);
+
+    if (numRead > 0) {
+      zzEndRead+= numRead;
+      return false;
+    }
+    // unlikely but not impossible: read 0 characters, but not at end of stream    
+    if (numRead == 0) {
+      int c = zzReader.read();
+      if (c == -1) {
+        return true;
+      } else {
+        zzBuffer[zzEndRead++] = (char) c;
+        return false;
+      }     
+    }
+
+	// numRead < 0
+    return true;
+  }
+
+    
+  /**
+   * Closes the input stream.
+   */
+  private final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Resets the scanner to read from a new input stream.
+   * Does not close the old reader.
+   *
+   * All internal variables are reset, the old input stream 
+   * <b>cannot</b> be reused (internal buffer is discarded and lost).
+   * Lexical state is set to <tt>ZZ_INITIAL</tt>.
+   *
+   * Internal scan buffer is resized down to its initial length, if it has grown.
+   *
+   * @param reader   the new input stream 
+   */
+  private final void yyreset(java.io.Reader reader) {
+    zzReader = reader;
+    zzAtBOL  = true;
+    zzAtEOF  = false;
+    zzEOFDone = false;
+    zzEndRead = zzStartRead = 0;
+    zzCurrentPos = zzMarkedPos = 0;
+    yyline = yychar = yycolumn = 0;
+    zzLexicalState = YYINITIAL;
+    if (zzBuffer.length > ZZ_BUFFERSIZE)
+      zzBuffer = new char[ZZ_BUFFERSIZE];
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  private final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  private final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  private final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  private final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  private final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  private void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Contains user EOF-code, which will be executed exactly once,
+   * when the end of file is reached
+   */
+  private void zzDoEOF() {
+    if (!zzEOFDone) {
+      zzEOFDone = true;
+      switch (zzLexicalState) {
+    case SCRIPT:
+    case COMMENT:
+    case SCRIPT_COMMENT:
+    case SINGLE_QUOTED_STRING:
+    case DOUBLE_QUOTED_STRING:
+    case END_TAG_TAIL_EXCLUDE:
+    case END_TAG_TAIL_SUBSTITUTE_SPACE:
+    case START_TAG_TAIL_EXCLUDE:
+    case START_TAG_TAIL_SUBSTITUTE_SPACE: { // Exclude
+      cumulativeDiff += yychar - inputStart;
+      addOffCorrectMap(outputCharCount, cumulativeDiff);
+      outputSegment.clear();
+      break;
+    }
+    case CHARACTER_REFERENCE_TAIL: {        // Substitute
+      // At end of file, allow char refs without semicolons
+      cumulativeDiff += inputSegment.length() - outputSegment.length();
+      addOffCorrectMap(outputCharCount, cumulativeDiff);
+      break;
+    }
+    case BANG:
+    case CDATA:
+    case AMPERSAND:
+    case NUMERIC_CHARACTER:
+    case END_TAG_TAIL_INCLUDE:
+    case START_TAG_TAIL_INCLUDE:
+    case LEFT_ANGLE_BRACKET:
+    case LEFT_ANGLE_BRACKET_SLASH:
+    case LEFT_ANGLE_BRACKET_SPACE: {        // Include
+      outputSegment = inputSegment;
+      break;
+    }
+  }
+
+    }
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  private OutputSource yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      yychar+= zzMarkedPosL-zzStartRead;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = ZZ_LEXSTATE[zzLexicalState];
+
+      // set up zzAction for empty match case:
+      int zzAttributes = zzAttrL[zzState];
+      if ( (zzAttributes & 1) == 1 ) {
+        zzAction = zzState;
+      }
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 14: 
+          { 
+          }
+        case 43: break;
+        case 25: 
+          { cumulativeDiff += inputSegment.length() + yylength() - 1;
+    addOffCorrectMap(outputCharCount + 1, cumulativeDiff);
+    zzBuffer[zzStartRead] = ' ';
+    inputSegment.clear();
+    yybegin(YYINITIAL);
+    return OutputSource.DIRECT;
+          }
+        case 44: break;
+        case 28: 
+          { int length = yylength();
+    inputSegment.write(zzBuffer, zzStartRead, length);
+    entitySegment.clear();
+    char ch = entityValues.get(zzBuffer, zzStartRead, length).charValue();
+    entitySegment.append(ch);
+    outputSegment = entitySegment;
+    yybegin(CHARACTER_REFERENCE_TAIL);
+          }
+        case 45: break;
+        case 3: 
+          { inputStart = yychar;
+  inputSegment.clear();
+  inputSegment.append('&');
+  yybegin(AMPERSAND);
+          }
+        case 46: break;
+        case 26: 
+          { cumulativeDiff += inputSegment.length() + yylength();
+    addOffCorrectMap(outputCharCount, cumulativeDiff);
+    inputSegment.clear();
+    outputSegment = inputSegment;
+    yybegin(YYINITIAL);
+          }
+        case 47: break;
+        case 40: 
+          { yybegin(SCRIPT);
+    if (escapeSCRIPT) {
+      inputSegment.write(zzBuffer, zzStartRead, yylength());
+      outputSegment = inputSegment;
+      inputStart += 1 + yylength();
+      return OutputSource.INDIRECT;
+    }
+          }
+        case 48: break;
+        case 2: 
+          { inputStart = yychar;
+  inputSegment.clear();
+  inputSegment.append('<');
+  yybegin(LEFT_ANGLE_BRACKET);
+          }
+        case 49: break;
+        case 32: 
+          { cumulativeDiff += yychar - inputStart + yylength();
+    addOffCorrectMap(outputCharCount, cumulativeDiff);
+    inputSegment.clear();
+    yybegin(YYINITIAL);
+          }
+        case 50: break;
+        case 41: 
+          { cumulativeDiff += inputSegment.length() + yylength();
+    addOffCorrectMap(outputCharCount, cumulativeDiff);
+    inputSegment.clear();
+    yybegin(CDATA);
+          }
+        case 51: break;
+        case 34: 
+          { yybegin(YYINITIAL);
+    if (escapeBR) {
+      inputSegment.write(zzBuffer, zzStartRead, yylength());
+      outputSegment = inputSegment;
+      return OutputSource.INDIRECT;
+    } else {
+      cumulativeDiff
+          += inputSegment.length() + yylength() - outputSegment.length();
+      addOffCorrectMap(outputCharCount + outputSegment.length(), cumulativeDiff);
+      zzBuffer[zzStartRead] = '\n';
+      return OutputSource.DIRECT;
+    }
+          }
+        case 52: break;
+        case 5: 
+          { inputSegment.append('#'); yybegin(NUMERIC_CHARACTER);
+          }
+        case 53: break;
+        case 22: 
+          { previousRestoreState = restoreState;
+    restoreState = SERVER_SIDE_INCLUDE;
+    yybegin(SINGLE_QUOTED_STRING);
+          }
+        case 54: break;
+        case 10: 
+          { inputSegment.write(zzBuffer, zzStartRead, yylength());
+    yybegin(LEFT_ANGLE_BRACKET_SPACE);
+          }
+        case 55: break;
+        case 20: 
+          { inputSegment.append(zzBuffer[zzStartRead]);
+          }
+        case 56: break;
+        case 33: 
+          { yybegin(SCRIPT);
+          }
+        case 57: break;
+        case 38: 
+          { restoreState = COMMENT; yybegin(SERVER_SIDE_INCLUDE);
+          }
+        case 58: break;
+        case 9: 
+          { inputSegment.append('!'); yybegin(BANG);
+          }
+        case 59: break;
+        case 37: 
+          { yybegin(SCRIPT_COMMENT);
+          }
+        case 60: break;
+        case 6: 
+          { int matchLength = yylength();
+    inputSegment.write(zzBuffer, zzStartRead, matchLength);
+    if (matchLength <= 7) { // 0x10FFFF = 1114111: max 7 decimal chars
+      String decimalCharRef = yytext();
+      try {
+        int codePoint = Integer.parseInt(decimalCharRef);
+        if (codePoint <= 0x10FFFF) {
+          outputSegment = entitySegment;
+          outputSegment.clear();
+          outputSegment.setLength
+              (Character.toChars(codePoint, outputSegment.getArray(), 0));
+          yybegin(CHARACTER_REFERENCE_TAIL);
+        } else {
+          outputSegment = inputSegment;
+          yybegin(YYINITIAL);
+          return OutputSource.INDIRECT;
+        }
+      } catch(NumberFormatException e) {
+        assert false: "NumberFormatException parsing code point '"
+                      + decimalCharRef + "'";
+      } catch(IllegalArgumentException e) {
+        assert false: "IllegalArgumentException getting chars for code point '"
+                      + decimalCharRef + "'";
+      }
+    } else {
+      outputSegment = inputSegment;
+      yybegin(YYINITIAL);
+      return OutputSource.INDIRECT;
+    }
+          }
+        case 61: break;
+        case 39: 
+          { restoreState = SCRIPT_COMMENT; yybegin(SERVER_SIDE_INCLUDE);
+          }
+        case 62: break;
+        case 13: 
+          { cumulativeDiff += inputSegment.length() + yylength();
+    addOffCorrectMap(outputCharCount, cumulativeDiff);
+    inputSegment.clear();
+    yybegin(YYINITIAL);
+          }
+        case 63: break;
+        case 11: 
+          { inputSegment.write(zzBuffer, zzStartRead, yylength());
+    if (null != escapedTags
+        && escapedTags.contains(zzBuffer, zzStartRead, yylength())) {
+      yybegin(START_TAG_TAIL_INCLUDE);
+    } else {
+      yybegin(START_TAG_TAIL_EXCLUDE);
+    }
+          }
+        case 64: break;
+        case 12: 
+          { inputSegment.append('/');
+    yybegin(LEFT_ANGLE_BRACKET_SLASH);
+          }
+        case 65: break;
+        case 24: 
+          { inputSegment.write(zzBuffer, zzStartRead, yylength());
+     outputSegment = inputSegment;
+     yybegin(YYINITIAL);
+     return OutputSource.INDIRECT;
+          }
+        case 66: break;
+        case 42: 
+          { inputSegment.clear();
+    yybegin(YYINITIAL);
+    cumulativeDiff += yychar - inputStart;
+    int outputEnd = outputCharCount;
+    OutputSource returnValue;
+    if (escapeSCRIPT) {
+      inputSegment.write(zzBuffer, zzStartRead, yylength());
+      outputSegment = inputSegment;
+      returnValue = OutputSource.INDIRECT;
+    } else {
+      cumulativeDiff += yylength() - 1;
+      zzBuffer[zzStartRead] = ' ';
+      ++outputEnd;
+      returnValue = OutputSource.DIRECT;
+    }
+    addOffCorrectMap(outputEnd, cumulativeDiff);
+    return returnValue;
+          }
+        case 67: break;
+        case 15: 
+          { restoreState = SCRIPT_COMMENT; yybegin(DOUBLE_QUOTED_STRING);
+          }
+        case 68: break;
+        case 4: 
+          { yypushback(1);
+    outputSegment = inputSegment;
+    outputSegment.restart();
+    yybegin(YYINITIAL);
+    return OutputSource.INDIRECT;
+          }
+        case 69: break;
+        case 16: 
+          { restoreState = SCRIPT_COMMENT; yybegin(SINGLE_QUOTED_STRING);
+          }
+        case 70: break;
+        case 17: 
+          { inputSegment.write(zzBuffer, zzStartRead, yylength());
+    if (null != escapedTags
+        && escapedTags.contains(zzBuffer, zzStartRead, yylength())) {
+      yybegin(END_TAG_TAIL_INCLUDE);
+    } else {
+      yybegin(END_TAG_TAIL_SUBSTITUTE_SPACE);
+    }
+          }
+        case 71: break;
+        case 19: 
+          { inputSegment.write(zzBuffer, zzStartRead, yylength());
+    if (null != escapedTags
+        && escapedTags.contains(zzBuffer, zzStartRead, yylength())) {
+      yybegin(END_TAG_TAIL_INCLUDE);
+    } else {
+      yybegin(END_TAG_TAIL_EXCLUDE);
+    }
+          }
+        case 72: break;
+        case 21: 
+          { previousRestoreState = restoreState;
+    restoreState = SERVER_SIDE_INCLUDE;
+    yybegin(DOUBLE_QUOTED_STRING);
+          }
+        case 73: break;
+        case 7: 
+          { cumulativeDiff
+        += inputSegment.length() + yylength() - outputSegment.length();
+    addOffCorrectMap(outputCharCount + outputSegment.length(), cumulativeDiff);
+    yybegin(YYINITIAL);
+    return OutputSource.INDIRECT;
+          }
+        case 74: break;
+        case 35: 
+          { cumulativeDiff += yylength();
+    addOffCorrectMap(outputCharCount + inputSegment.length(), cumulativeDiff);
+    outputSegment = inputSegment;
+    yybegin(YYINITIAL);
+    return OutputSource.INDIRECT;
+          }
+        case 75: break;
+        case 36: 
+          { yybegin(restoreState);
+          }
+        case 76: break;
+        case 1: 
+          { return OutputSource.DIRECT;
+          }
+        case 77: break;
+        case 29: 
+          { int matchLength = yylength();
+    inputSegment.write(zzBuffer, zzStartRead, matchLength);
+    if (matchLength <= 6) { // 10FFFF: max 6 hex chars
+      String hexCharRef
+          = new String(zzBuffer, zzStartRead + 1, matchLength - 1);
+      try {
+        int codePoint = Integer.parseInt(hexCharRef, 16);
+        if (codePoint <= 0x10FFFF) {
+          outputSegment = entitySegment;
+          outputSegment.clear();
+          outputSegment.setLength
+              (Character.toChars(codePoint, outputSegment.getArray(), 0));
+          yybegin(CHARACTER_REFERENCE_TAIL);
+        } else {
+          outputSegment = inputSegment;
+          yybegin(YYINITIAL);
+          return OutputSource.INDIRECT;
+        }
+      } catch(NumberFormatException e) {
+        assert false: "NumberFormatException parsing hex code point '"
+                      + hexCharRef + "'";
+      } catch(IllegalArgumentException e) {
+        assert false: "IllegalArgumentException getting chars "
+                      + "for hex code point '" + hexCharRef + "'";
+      }
+    } else {
+      outputSegment = inputSegment;
+      yybegin(YYINITIAL);
+      return OutputSource.INDIRECT;
+    }
+          }
+        case 78: break;
+        case 18: 
+          { inputSegment.write(zzBuffer, zzStartRead, yylength());
+          }
+        case 79: break;
+        case 27: 
+          { cumulativeDiff += inputSegment.length() + yylength() - 1;
+    addOffCorrectMap(outputCharCount + 1, cumulativeDiff);
+    inputSegment.clear();
+    zzBuffer[zzStartRead] = ' ';
+    yybegin(YYINITIAL);
+    return OutputSource.DIRECT;
+          }
+        case 80: break;
+        case 8: 
+          { inputSegment.write(zzBuffer, zzStartRead, yylength());
+    if (null != escapedTags
+        && escapedTags.contains(zzBuffer, zzStartRead, yylength())) {
+      yybegin(START_TAG_TAIL_INCLUDE);
+    } else {
+      yybegin(START_TAG_TAIL_SUBSTITUTE_SPACE);
+    }
+          }
+        case 81: break;
+        case 23: 
+          { yybegin(restoreState); restoreState = previousRestoreState;
+          }
+        case 82: break;
+        case 31: 
+          { yybegin(YYINITIAL);
+    if (escapeBR) {
+      inputSegment.write(zzBuffer, zzStartRead, yylength());
+      outputSegment = inputSegment;
+      return OutputSource.INDIRECT;
+    } else {
+      cumulativeDiff
+          += inputSegment.length() + yylength() - outputSegment.length();
+      addOffCorrectMap(outputCharCount + 1, cumulativeDiff);
+      zzBuffer[zzStartRead] = '\n';
+      return OutputSource.DIRECT;
+    }
+          }
+        case 83: break;
+        case 30: 
+          { yybegin(COMMENT);
+          }
+        case 84: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            zzDoEOF();
+              {   return OutputSource.INDIRECT;
+ }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: modules/analysis/common/src/java/org/apache/lucene/analysis/charfilter/htmlentity.py
===================================================================
--- modules/analysis/common/src/java/org/apache/lucene/analysis/charfilter/htmlentity.py	(revision 0)
+++ modules/analysis/common/src/java/org/apache/lucene/analysis/charfilter/htmlentity.py	(revision 0)
@@ -0,0 +1,518 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import re
+
+# A simple python script to generate an HTML entity map and a regex alternation
+# for inclusion in JFlexHTMLStripCharFilter.jflex.
+
+def main():
+  print get_apache_license()
+  codes = {}
+  regex = re.compile(r'\s*<!ENTITY\s+(\S+)\s+"&(?:#38;)?#(\d+);"')
+  for line in get_entity_text().split('\n'):
+    match = regex.match(line)
+    if match:
+      key = match.group(1)
+      if   key == 'quot': codes[key] = r'\"'
+      elif key == 'nbsp': codes[key] = ' ';
+      else              : codes[key] = r'\u%04X' % int(match.group(2))
+
+  keys = sorted(codes)
+
+  first_entry = True
+  output_line = 'CharacterEntities = ( '
+  for key in keys:
+    new_entry = ('"%s"' if first_entry else ' | "%s"') % key
+    first_entry = False
+    if len(output_line) + len(new_entry) >= 80:
+      print output_line
+      output_line = '                   '
+    output_line += new_entry
+  print output_line, ')'
+
+  print '%{'
+  print '  private static final CharArrayMap<Character> entityValues'
+  print '      = new CharArrayMap<Character>(Version.LUCENE_40, %i, false);' % len(keys)
+  print '  static {'
+  print '    String[] entities = {'
+  output_line = '     '
+  for key in keys:
+    new_entry = ' "%s", "%s",' % (key, codes[key])
+    if len(output_line) + len(new_entry) >= 80:
+      print output_line
+      output_line = '     '
+    output_line += new_entry
+  print output_line[:-1]
+  print '    };'
+  print '    for (int i = 0 ; i < entities.length ; i += 2) {'
+  print '      entityValues.put(entities[i], new Character(entities[i + 1].charAt(0)));'
+  print '    }'
+  print "  }"
+  print "%}"
+
+def get_entity_text():
+# The text below is taken verbatim from
+# <http://www.w3.org/TR/REC-html40/sgml/entities.html>:
+  text = r"""
+F.1. XHTML Character Entities
+
+XHTML DTDs make available a standard collection of named character entities. Those entities are defined in this section.
+F.1.1. XHTML Latin 1 Character Entities
+
+You can download this version of this file from http://www.w3.org/TR/2010/REC-xhtml-modularization/DTD/xhtml-lat1.ent. The latest version is available at http://www.w3.org/MarkUp/DTD/xhtml-lat1.ent.
+
+<!-- ...................................................................... -->
+<!-- XML-compatible ISO Latin 1 Character Entity Set for XHTML ............ -->
+<!-- file: xhtml-lat1.ent
+
+     Typical invocation:
+
+       <!ENTITY % xhtml-lat1
+           PUBLIC "-//W3C//ENTITIES Latin 1 for XHTML//EN"
+                  "xhtml-lat1.ent" >
+       %xhtml-lat1;
+
+     This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+       PUBLIC "-//W3C//ENTITIES Latin 1 for XHTML//EN"
+       SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-lat1.ent"
+
+     Revision:  $Id: xhtml-lat1.ent,v 4.1 2001/04/10 09:34:14 altheim Exp $ SMI
+
+     Portions (C) International Organization for Standardization 1986:
+     Permission to copy in any form is granted for use with conforming
+     SGML systems and applications as defined in ISO 8879, provided
+     this notice is included in all copies.
+-->
+
+<!ENTITY nbsp   "&#160;" ><!-- no-break space = non-breaking space, U+00A0 ISOnum -->
+<!ENTITY iexcl  "&#161;" ><!-- inverted exclamation mark, U+00A1 ISOnum -->
+<!ENTITY cent   "&#162;" ><!-- cent sign, U+00A2 ISOnum -->
+<!ENTITY pound  "&#163;" ><!-- pound sign, U+00A3 ISOnum -->
+<!ENTITY curren "&#164;" ><!-- currency sign, U+00A4 ISOnum -->
+<!ENTITY yen    "&#165;" ><!-- yen sign = yuan sign, U+00A5 ISOnum -->
+<!ENTITY brvbar "&#166;" ><!-- broken bar = broken vertical bar, U+00A6 ISOnum -->
+<!ENTITY sect   "&#167;" ><!-- section sign, U+00A7 ISOnum -->
+<!ENTITY uml    "&#168;" ><!-- diaeresis = spacing diaeresis, U+00A8 ISOdia -->
+<!ENTITY copy   "&#169;" ><!-- copyright sign, U+00A9 ISOnum -->
+<!ENTITY ordf   "&#170;" ><!-- feminine ordinal indicator, U+00AA ISOnum -->
+<!ENTITY laquo  "&#171;" ><!-- left-pointing double angle quotation mark = left pointing guillemet, U+00AB ISOnum -->
+<!ENTITY not    "&#172;" ><!-- not sign, U+00AC ISOnum -->
+<!ENTITY shy    "&#173;" ><!-- soft hyphen = discretionary hyphen, U+00AD ISOnum -->
+<!ENTITY reg    "&#174;" ><!-- registered sign = registered trade mark sign, U+00AE ISOnum -->
+<!ENTITY macr   "&#175;" ><!-- macron = spacing macron = overline = APL overbar, U+00AF ISOdia -->
+<!ENTITY deg    "&#176;" ><!-- degree sign, U+00B0 ISOnum -->
+<!ENTITY plusmn "&#177;" ><!-- plus-minus sign = plus-or-minus sign, U+00B1 ISOnum -->
+<!ENTITY sup2   "&#178;" ><!-- superscript two = superscript digit two = squared, U+00B2 ISOnum -->
+<!ENTITY sup3   "&#179;" ><!-- superscript three = superscript digit three = cubed, U+00B3 ISOnum -->
+<!ENTITY acute  "&#180;" ><!-- acute accent = spacing acute, U+00B4 ISOdia -->
+<!ENTITY micro  "&#181;" ><!-- micro sign, U+00B5 ISOnum -->
+<!ENTITY para   "&#182;" ><!-- pilcrow sign = paragraph sign, U+00B6 ISOnum -->
+<!ENTITY middot "&#183;" ><!-- middle dot = Georgian comma = Greek middle dot, U+00B7 ISOnum -->
+<!ENTITY cedil  "&#184;" ><!-- cedilla = spacing cedilla, U+00B8 ISOdia -->
+<!ENTITY sup1   "&#185;" ><!-- superscript one = superscript digit one, U+00B9 ISOnum -->
+<!ENTITY ordm   "&#186;" ><!-- masculine ordinal indicator, U+00BA ISOnum -->
+<!ENTITY raquo  "&#187;" ><!-- right-pointing double angle quotation mark = right pointing guillemet, U+00BB ISOnum -->
+<!ENTITY frac14 "&#188;" ><!-- vulgar fraction one quarter = fraction one quarter, U+00BC ISOnum -->
+<!ENTITY frac12 "&#189;" ><!-- vulgar fraction one half = fraction one half, U+00BD ISOnum -->
+<!ENTITY frac34 "&#190;" ><!-- vulgar fraction three quarters = fraction three quarters, U+00BE ISOnum -->
+<!ENTITY iquest "&#191;" ><!-- inverted question mark = turned question mark, U+00BF ISOnum -->
+<!ENTITY Agrave "&#192;" ><!-- latin capital A with grave = latin capital A grave, U+00C0 ISOlat1 -->
+<!ENTITY Aacute "&#193;" ><!-- latin capital A with acute, U+00C1 ISOlat1 -->
+<!ENTITY Acirc  "&#194;" ><!-- latin capital A with circumflex, U+00C2 ISOlat1 -->
+<!ENTITY Atilde "&#195;" ><!-- latin capital A with tilde, U+00C3 ISOlat1 -->
+<!ENTITY Auml   "&#196;" ><!-- latin capital A with diaeresis, U+00C4 ISOlat1 -->
+<!ENTITY Aring  "&#197;" ><!-- latin capital A with ring above = latin capital A ring, U+00C5 ISOlat1 -->
+<!ENTITY AElig  "&#198;" ><!-- latin capital AE = latin capital ligature AE, U+00C6 ISOlat1 -->
+<!ENTITY Ccedil "&#199;" ><!-- latin capital C with cedilla, U+00C7 ISOlat1 -->
+<!ENTITY Egrave "&#200;" ><!-- latin capital E with grave, U+00C8 ISOlat1 -->
+<!ENTITY Eacute "&#201;" ><!-- latin capital E with acute, U+00C9 ISOlat1 -->
+<!ENTITY Ecirc  "&#202;" ><!-- latin capital E with circumflex, U+00CA ISOlat1 -->
+<!ENTITY Euml   "&#203;" ><!-- latin capital E with diaeresis, U+00CB ISOlat1 -->
+<!ENTITY Igrave "&#204;" ><!-- latin capital I with grave, U+00CC ISOlat1 -->
+<!ENTITY Iacute "&#205;" ><!-- latin capital I with acute, U+00CD ISOlat1 -->
+<!ENTITY Icirc  "&#206;" ><!-- latin capital I with circumflex, U+00CE ISOlat1 -->
+<!ENTITY Iuml   "&#207;" ><!-- latin capital I with diaeresis, U+00CF ISOlat1 -->
+<!ENTITY ETH    "&#208;" ><!-- latin capital ETH, U+00D0 ISOlat1 -->
+<!ENTITY Ntilde "&#209;" ><!-- latin capital N with tilde, U+00D1 ISOlat1 -->
+<!ENTITY Ograve "&#210;" ><!-- latin capital O with grave, U+00D2 ISOlat1 -->
+<!ENTITY Oacute "&#211;" ><!-- latin capital O with acute, U+00D3 ISOlat1 -->
+<!ENTITY Ocirc  "&#212;" ><!-- latin capital O with circumflex, U+00D4 ISOlat1 -->
+<!ENTITY Otilde "&#213;" ><!-- latin capital O with tilde, U+00D5 ISOlat1 -->
+<!ENTITY Ouml   "&#214;" ><!-- latin capital O with diaeresis, U+00D6 ISOlat1 -->
+<!ENTITY times  "&#215;" ><!-- multiplication sign, U+00D7 ISOnum -->
+<!ENTITY Oslash "&#216;" ><!-- latin capital O with stroke = latin capital O slash, U+00D8 ISOlat1 -->
+<!ENTITY Ugrave "&#217;" ><!-- latin capital U with grave, U+00D9 ISOlat1 -->
+<!ENTITY Uacute "&#218;" ><!-- latin capital U with acute, U+00DA ISOlat1 -->
+<!ENTITY Ucirc  "&#219;" ><!-- latin capital U with circumflex, U+00DB ISOlat1 -->
+<!ENTITY Uuml   "&#220;" ><!-- latin capital U with diaeresis, U+00DC ISOlat1 -->
+<!ENTITY Yacute "&#221;" ><!-- latin capital Y with acute, U+00DD ISOlat1 -->
+<!ENTITY THORN  "&#222;" ><!-- latin capital THORN, U+00DE ISOlat1 -->
+<!ENTITY szlig  "&#223;" ><!-- latin small sharp s = ess-zed, U+00DF ISOlat1 -->
+<!ENTITY agrave "&#224;" ><!-- latin small a with grave = latin small a grave, U+00E0 ISOlat1 -->
+<!ENTITY aacute "&#225;" ><!-- latin small a with acute, U+00E1 ISOlat1 -->
+<!ENTITY acirc  "&#226;" ><!-- latin small a with circumflex, U+00E2 ISOlat1 -->
+<!ENTITY atilde "&#227;" ><!-- latin small a with tilde, U+00E3 ISOlat1 -->
+<!ENTITY auml   "&#228;" ><!-- latin small a with diaeresis, U+00E4 ISOlat1 -->
+<!ENTITY aring  "&#229;" ><!-- latin small a with ring above = latin small a ring, U+00E5 ISOlat1 -->
+<!ENTITY aelig  "&#230;" ><!-- latin small ae = latin small ligature ae, U+00E6 ISOlat1 -->
+<!ENTITY ccedil "&#231;" ><!-- latin small c with cedilla, U+00E7 ISOlat1 -->
+<!ENTITY egrave "&#232;" ><!-- latin small e with grave, U+00E8 ISOlat1 -->
+<!ENTITY eacute "&#233;" ><!-- latin small e with acute, U+00E9 ISOlat1 -->
+<!ENTITY ecirc  "&#234;" ><!-- latin small e with circumflex, U+00EA ISOlat1 -->
+<!ENTITY euml   "&#235;" ><!-- latin small e with diaeresis, U+00EB ISOlat1 -->
+<!ENTITY igrave "&#236;" ><!-- latin small i with grave, U+00EC ISOlat1 -->
+<!ENTITY iacute "&#237;" ><!-- latin small i with acute, U+00ED ISOlat1 -->
+<!ENTITY icirc  "&#238;" ><!-- latin small i with circumflex, U+00EE ISOlat1 -->
+<!ENTITY iuml   "&#239;" ><!-- latin small i with diaeresis, U+00EF ISOlat1 -->
+<!ENTITY eth    "&#240;" ><!-- latin small eth, U+00F0 ISOlat1 -->
+<!ENTITY ntilde "&#241;" ><!-- latin small n with tilde, U+00F1 ISOlat1 -->
+<!ENTITY ograve "&#242;" ><!-- latin small o with grave, U+00F2 ISOlat1 -->
+<!ENTITY oacute "&#243;" ><!-- latin small o with acute, U+00F3 ISOlat1 -->
+<!ENTITY ocirc  "&#244;" ><!-- latin small o with circumflex, U+00F4 ISOlat1 -->
+<!ENTITY otilde "&#245;" ><!-- latin small o with tilde, U+00F5 ISOlat1 -->
+<!ENTITY ouml   "&#246;" ><!-- latin small o with diaeresis, U+00F6 ISOlat1 -->
+<!ENTITY divide "&#247;" ><!-- division sign, U+00F7 ISOnum -->
+<!ENTITY oslash "&#248;" ><!-- latin small o with stroke, = latin small o slash, U+00F8 ISOlat1 -->
+<!ENTITY ugrave "&#249;" ><!-- latin small u with grave, U+00F9 ISOlat1 -->
+<!ENTITY uacute "&#250;" ><!-- latin small u with acute, U+00FA ISOlat1 -->
+<!ENTITY ucirc  "&#251;" ><!-- latin small u with circumflex, U+00FB ISOlat1 -->
+<!ENTITY uuml   "&#252;" ><!-- latin small u with diaeresis, U+00FC ISOlat1 -->
+<!ENTITY yacute "&#253;" ><!-- latin small y with acute, U+00FD ISOlat1 -->
+<!ENTITY thorn  "&#254;" ><!-- latin small thorn with, U+00FE ISOlat1 -->
+<!ENTITY yuml   "&#255;" ><!-- latin small y with diaeresis, U+00FF ISOlat1 -->
+<!-- end of xhtml-lat1.ent -->
+
+F.1.2. XHTML Special Characters
+
+You can download this version of this file from http://www.w3.org/TR/2010/REC-xhtml-modularization/DTD/xhtml-special.ent. The latest version is available at http://www.w3.org/MarkUp/DTD/xhtml-special.ent.
+
+<!-- ...................................................................... -->
+<!-- XML-compatible ISO Special Character Entity Set for XHTML ............ -->
+<!-- file: xhtml-special.ent
+
+     Typical invocation:
+
+       <!ENTITY % xhtml-special
+           PUBLIC "-//W3C//ENTITIES Special for XHTML//EN"
+                  "xhtml-special.ent" >
+       %xhtml-special;
+
+     This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+       PUBLIC "-//W3C//ENTITIES Special for XHTML//EN"
+       SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-special.ent"
+
+     Revision:  $Id: xhtml-special.ent,v 4.1 2001/04/10 09:34:14 altheim Exp $ SMI
+
+     Portions (C) International Organization for Standardization 1986:
+     Permission to copy in any form is granted for use with conforming
+     SGML systems and applications as defined in ISO 8879, provided
+     this notice is included in all copies.
+
+     Revisions:
+2000-10-28: added &apos; and altered XML Predefined Entities for compatibility
+-->
+
+<!-- Relevant ISO entity set is given unless names are newly introduced.
+     New names (i.e., not in ISO 8879 [SGML] list) do not clash with
+     any existing ISO 8879 entity names. ISO 10646 [ISO10646] character
+     numbers are given for each character, in hex. Entity values are
+     decimal conversions of the ISO 10646 values and refer to the
+     document character set. Names are Unicode [UNICODE] names.
+-->
+
+<!-- C0 Controls and Basic Latin -->
+<!ENTITY lt      "&#38;#60;" ><!-- less-than sign, U+003C ISOnum -->
+<!ENTITY gt      "&#62;" ><!-- greater-than sign, U+003E ISOnum -->
+<!ENTITY amp     "&#38;#38;" ><!-- ampersand, U+0026 ISOnum -->
+<!ENTITY apos    "&#39;" ><!-- The Apostrophe (Apostrophe Quote, APL Quote), U+0027 ISOnum -->
+<!ENTITY quot    "&#34;" ><!-- quotation mark (Quote Double), U+0022 ISOnum -->
+
+<!-- Latin Extended-A -->
+<!ENTITY OElig   "&#338;" ><!-- latin capital ligature OE, U+0152 ISOlat2 -->
+<!ENTITY oelig   "&#339;" ><!-- latin small ligature oe, U+0153 ISOlat2 -->
+
+<!-- ligature is a misnomer, this is a separate character in some languages -->
+<!ENTITY Scaron  "&#352;" ><!-- latin capital letter S with caron, U+0160 ISOlat2 -->
+<!ENTITY scaron  "&#353;" ><!-- latin small letter s with caron, U+0161 ISOlat2 -->
+<!ENTITY Yuml    "&#376;" ><!-- latin capital letter Y with diaeresis, U+0178 ISOlat2 -->
+
+<!-- Spacing Modifier Letters -->
+<!ENTITY circ    "&#710;" ><!-- modifier letter circumflex accent, U+02C6 ISOpub -->
+<!ENTITY tilde   "&#732;" ><!-- small tilde, U+02DC ISOdia -->
+
+<!-- General Punctuation -->
+<!ENTITY ensp    "&#8194;" ><!-- en space, U+2002 ISOpub -->
+<!ENTITY emsp    "&#8195;" ><!-- em space, U+2003 ISOpub -->
+<!ENTITY thinsp  "&#8201;" ><!-- thin space, U+2009 ISOpub -->
+<!ENTITY zwnj    "&#8204;" ><!-- zero width non-joiner, U+200C NEW RFC 2070 -->
+<!ENTITY zwj     "&#8205;" ><!-- zero width joiner, U+200D NEW RFC 2070 -->
+<!ENTITY lrm     "&#8206;" ><!-- left-to-right mark, U+200E NEW RFC 2070 -->
+<!ENTITY rlm     "&#8207;" ><!-- right-to-left mark, U+200F NEW RFC 2070 -->
+<!ENTITY ndash   "&#8211;" ><!-- en dash, U+2013 ISOpub -->
+<!ENTITY mdash   "&#8212;" ><!-- em dash, U+2014 ISOpub -->
+<!ENTITY lsquo   "&#8216;" ><!-- left single quotation mark, U+2018 ISOnum -->
+<!ENTITY rsquo   "&#8217;" ><!-- right single quotation mark, U+2019 ISOnum -->
+<!ENTITY sbquo   "&#8218;" ><!-- single low-9 quotation mark, U+201A NEW -->
+<!ENTITY ldquo   "&#8220;" ><!-- left double quotation mark, U+201C ISOnum -->
+<!ENTITY rdquo   "&#8221;" ><!-- right double quotation mark, U+201D ISOnum -->
+<!ENTITY bdquo   "&#8222;" ><!-- double low-9 quotation mark, U+201E NEW -->
+<!ENTITY dagger  "&#8224;" ><!-- dagger, U+2020 ISOpub -->
+<!ENTITY Dagger  "&#8225;" ><!-- double dagger, U+2021 ISOpub -->
+<!ENTITY permil  "&#8240;" ><!-- per mille sign, U+2030 ISOtech -->
+
+<!-- lsaquo is proposed but not yet ISO standardized -->
+<!ENTITY lsaquo  "&#8249;" ><!-- single left-pointing angle quotation mark, U+2039 ISO proposed -->
+<!-- rsaquo is proposed but not yet ISO standardized -->
+<!ENTITY rsaquo  "&#8250;" ><!-- single right-pointing angle quotation mark, U+203A ISO proposed -->
+<!ENTITY euro    "&#8364;" ><!-- euro sign, U+20AC NEW -->
+
+<!-- end of xhtml-special.ent -->
+
+F.1.3. XHTML Mathematical, Greek, and Symbolic Characters
+
+You can download this version of this file from http://www.w3.org/TR/2010/REC-xhtml-modularization/DTD/xhtml-symbol.ent. The latest version is available at http://www.w3.org/MarkUp/DTD/xhtml-symbol.ent.
+
+<!-- ...................................................................... -->
+<!-- ISO Math, Greek and Symbolic Character Entity Set for XHTML .......... -->
+<!-- file: xhtml-symbol.ent
+
+     Typical invocation:
+
+       <!ENTITY % xhtml-symbol
+           PUBLIC "-//W3C//ENTITIES Symbols for XHTML//EN"
+                  "xhtml-symbol.ent" >
+       %xhtml-symbol;
+
+     This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+       PUBLIC "-//W3C//ENTITIES Symbols for XHTML//EN"
+       SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-symbol.ent"
+
+     Revision:  $Id: xhtml-symbol.ent,v 4.1 2001/04/10 09:34:14 altheim Exp $ SMI
+
+     Portions (C) International Organization for Standardization 1986:
+     Permission to copy in any form is granted for use with conforming
+     SGML systems and applications as defined in ISO 8879, provided
+     this notice is included in all copies.
+-->
+
+<!-- Relevant ISO entity set is given unless names are newly introduced.
+     New names (i.e., not in ISO 8879 [SGML] list) do not clash with
+     any existing ISO 8879 entity names. ISO 10646 [ISO10646] character
+     numbers are given for each character, in hex. Entity values are
+     decimal conversions of the ISO 10646 values and refer to the
+     document character set. Names are Unicode [UNICODE] names.
+-->
+
+<!-- Latin Extended-B -->
+<!ENTITY fnof     "&#402;" ><!-- latin small f with hook = function
+                              = florin, U+0192 ISOtech -->
+
+<!-- Greek -->
+<!ENTITY Alpha    "&#913;" ><!-- greek capital letter alpha, U+0391 -->
+<!ENTITY Beta     "&#914;" ><!-- greek capital letter beta, U+0392 -->
+<!ENTITY Gamma    "&#915;" ><!-- greek capital letter gamma, U+0393 ISOgrk3 -->
+<!ENTITY Delta    "&#916;" ><!-- greek capital letter delta, U+0394 ISOgrk3 -->
+<!ENTITY Epsilon  "&#917;" ><!-- greek capital letter epsilon, U+0395 -->
+<!ENTITY Zeta     "&#918;" ><!-- greek capital letter zeta, U+0396 -->
+<!ENTITY Eta      "&#919;" ><!-- greek capital letter eta, U+0397 -->
+<!ENTITY Theta    "&#920;" ><!-- greek capital letter theta, U+0398 ISOgrk3 -->
+<!ENTITY Iota     "&#921;" ><!-- greek capital letter iota, U+0399 -->
+<!ENTITY Kappa    "&#922;" ><!-- greek capital letter kappa, U+039A -->
+<!ENTITY Lambda   "&#923;" ><!-- greek capital letter lambda, U+039B ISOgrk3 -->
+<!ENTITY Mu       "&#924;" ><!-- greek capital letter mu, U+039C -->
+<!ENTITY Nu       "&#925;" ><!-- greek capital letter nu, U+039D -->
+<!ENTITY Xi       "&#926;" ><!-- greek capital letter xi, U+039E ISOgrk3 -->
+<!ENTITY Omicron  "&#927;" ><!-- greek capital letter omicron, U+039F -->
+<!ENTITY Pi       "&#928;" ><!-- greek capital letter pi, U+03A0 ISOgrk3 -->
+<!ENTITY Rho      "&#929;" ><!-- greek capital letter rho, U+03A1 -->
+<!-- there is no Sigmaf, and no U+03A2 character either -->
+<!ENTITY Sigma    "&#931;" ><!-- greek capital letter sigma, U+03A3 ISOgrk3 -->
+<!ENTITY Tau      "&#932;" ><!-- greek capital letter tau, U+03A4 -->
+<!ENTITY Upsilon  "&#933;" ><!-- greek capital letter upsilon,
+                              U+03A5 ISOgrk3 -->
+<!ENTITY Phi      "&#934;" ><!-- greek capital letter phi, U+03A6 ISOgrk3 -->
+<!ENTITY Chi      "&#935;" ><!-- greek capital letter chi, U+03A7 -->
+<!ENTITY Psi      "&#936;" ><!-- greek capital letter psi, U+03A8 ISOgrk3 -->
+<!ENTITY Omega    "&#937;" ><!-- greek capital letter omega, U+03A9 ISOgrk3 -->
+<!ENTITY alpha    "&#945;" ><!-- greek small letter alpha, U+03B1 ISOgrk3 -->
+<!ENTITY beta     "&#946;" ><!-- greek small letter beta, U+03B2 ISOgrk3 -->
+<!ENTITY gamma    "&#947;" ><!-- greek small letter gamma, U+03B3 ISOgrk3 -->
+<!ENTITY delta    "&#948;" ><!-- greek small letter delta, U+03B4 ISOgrk3 -->
+<!ENTITY epsilon  "&#949;" ><!-- greek small letter epsilon, U+03B5 ISOgrk3 -->
+<!ENTITY zeta     "&#950;" ><!-- greek small letter zeta, U+03B6 ISOgrk3 -->
+<!ENTITY eta      "&#951;" ><!-- greek small letter eta, U+03B7 ISOgrk3 -->
+<!ENTITY theta    "&#952;" ><!-- greek small letter theta, U+03B8 ISOgrk3 -->
+<!ENTITY iota     "&#953;" ><!-- greek small letter iota, U+03B9 ISOgrk3 -->
+<!ENTITY kappa    "&#954;" ><!-- greek small letter kappa, U+03BA ISOgrk3 -->
+<!ENTITY lambda   "&#955;" ><!-- greek small letter lambda, U+03BB ISOgrk3 -->
+<!ENTITY mu       "&#956;" ><!-- greek small letter mu, U+03BC ISOgrk3 -->
+<!ENTITY nu       "&#957;" ><!-- greek small letter nu, U+03BD ISOgrk3 -->
+<!ENTITY xi       "&#958;" ><!-- greek small letter xi, U+03BE ISOgrk3 -->
+<!ENTITY omicron  "&#959;" ><!-- greek small letter omicron, U+03BF NEW -->
+<!ENTITY pi       "&#960;" ><!-- greek small letter pi, U+03C0 ISOgrk3 -->
+<!ENTITY rho      "&#961;" ><!-- greek small letter rho, U+03C1 ISOgrk3 -->
+<!ENTITY sigmaf   "&#962;" ><!-- greek small letter final sigma, U+03C2 ISOgrk3 -->
+<!ENTITY sigma    "&#963;" ><!-- greek small letter sigma, U+03C3 ISOgrk3 -->
+<!ENTITY tau      "&#964;" ><!-- greek small letter tau, U+03C4 ISOgrk3 -->
+<!ENTITY upsilon  "&#965;" ><!-- greek small letter upsilon, U+03C5 ISOgrk3 -->
+<!ENTITY phi      "&#966;" ><!-- greek small letter phi, U+03C6 ISOgrk3 -->
+<!ENTITY chi      "&#967;" ><!-- greek small letter chi, U+03C7 ISOgrk3 -->
+<!ENTITY psi      "&#968;" ><!-- greek small letter psi, U+03C8 ISOgrk3 -->
+<!ENTITY omega    "&#969;" ><!-- greek small letter omega, U+03C9 ISOgrk3 -->
+<!ENTITY thetasym "&#977;" ><!-- greek small letter theta symbol, U+03D1 NEW -->
+<!ENTITY upsih    "&#978;" ><!-- greek upsilon with hook symbol, U+03D2 NEW -->
+<!ENTITY piv      "&#982;" ><!-- greek pi symbol, U+03D6 ISOgrk3 -->
+
+<!-- General Punctuation -->
+<!ENTITY bull     "&#8226;" ><!-- bullet = black small circle, U+2022 ISOpub  -->
+<!-- bullet is NOT the same as bullet operator, U+2219 -->
+<!ENTITY hellip   "&#8230;" ><!-- horizontal ellipsis = three dot leader, U+2026 ISOpub  -->
+<!ENTITY prime    "&#8242;" ><!-- prime = minutes = feet, U+2032 ISOtech -->
+<!ENTITY Prime    "&#8243;" ><!-- double prime = seconds = inches, U+2033 ISOtech -->
+<!ENTITY oline    "&#8254;" ><!-- overline = spacing overscore, U+203E NEW -->
+<!ENTITY frasl    "&#8260;" ><!-- fraction slash, U+2044 NEW -->
+
+<!-- Letterlike Symbols -->
+<!ENTITY weierp   "&#8472;" ><!-- script capital P = power set = Weierstrass p, U+2118 ISOamso -->
+<!ENTITY image    "&#8465;" ><!-- blackletter capital I = imaginary part, U+2111 ISOamso -->
+<!ENTITY real     "&#8476;" ><!-- blackletter capital R = real part symbol, U+211C ISOamso -->
+<!ENTITY trade    "&#8482;" ><!-- trade mark sign, U+2122 ISOnum -->
+<!ENTITY alefsym  "&#8501;" ><!-- alef symbol = first transfinite cardinal, U+2135 NEW -->
+<!-- alef symbol is NOT the same as hebrew letter alef, U+05D0 although
+     the same glyph could be used to depict both characters -->
+
+<!-- Arrows -->
+<!ENTITY larr     "&#8592;" ><!-- leftwards arrow, U+2190 ISOnum -->
+<!ENTITY uarr     "&#8593;" ><!-- upwards arrow, U+2191 ISOnum-->
+<!ENTITY rarr     "&#8594;" ><!-- rightwards arrow, U+2192 ISOnum -->
+<!ENTITY darr     "&#8595;" ><!-- downwards arrow, U+2193 ISOnum -->
+<!ENTITY harr     "&#8596;" ><!-- left right arrow, U+2194 ISOamsa -->
+<!ENTITY crarr    "&#8629;" ><!-- downwards arrow with corner leftwards
+                               = carriage return, U+21B5 NEW -->
+<!ENTITY lArr     "&#8656;" ><!-- leftwards double arrow, U+21D0 ISOtech -->
+<!-- Unicode does not say that lArr is the same as the 'is implied by' arrow
+    but also does not have any other character for that function. So ? lArr can
+    be used for 'is implied by' as ISOtech suggests -->
+<!ENTITY uArr     "&#8657;" ><!-- upwards double arrow, U+21D1 ISOamsa -->
+<!ENTITY rArr     "&#8658;" ><!-- rightwards double arrow, U+21D2 ISOtech -->
+<!-- Unicode does not say this is the 'implies' character but does not have
+     another character with this function so ?
+     rArr can be used for 'implies' as ISOtech suggests -->
+<!ENTITY dArr     "&#8659;" ><!-- downwards double arrow, U+21D3 ISOamsa -->
+<!ENTITY hArr     "&#8660;" ><!-- left right double arrow, U+21D4 ISOamsa -->
+
+<!-- Mathematical Operators -->
+<!ENTITY forall   "&#8704;" ><!-- for all, U+2200 ISOtech -->
+<!ENTITY part     "&#8706;" ><!-- partial differential, U+2202 ISOtech  -->
+<!ENTITY exist    "&#8707;" ><!-- there exists, U+2203 ISOtech -->
+<!ENTITY empty    "&#8709;" ><!-- empty set = null set, U+2205 ISOamso -->
+<!ENTITY nabla    "&#8711;" ><!-- nabla = backward difference, U+2207 ISOtech -->
+<!ENTITY isin     "&#8712;" ><!-- element of, U+2208 ISOtech -->
+<!ENTITY notin    "&#8713;" ><!-- not an element of, U+2209 ISOtech -->
+<!ENTITY ni       "&#8715;" ><!-- contains as member, U+220B ISOtech -->
+<!-- should there be a more memorable name than 'ni'? -->
+<!ENTITY prod     "&#8719;" ><!-- n-ary product = product sign, U+220F ISOamsb -->
+<!-- prod is NOT the same character as U+03A0 'greek capital letter pi' though
+     the same glyph might be used for both -->
+<!ENTITY sum      "&#8721;" ><!-- n-ary sumation, U+2211 ISOamsb -->
+<!-- sum is NOT the same character as U+03A3 'greek capital letter sigma'
+     though the same glyph might be used for both -->
+<!ENTITY minus    "&#8722;" ><!-- minus sign, U+2212 ISOtech -->
+<!ENTITY lowast   "&#8727;" ><!-- asterisk operator, U+2217 ISOtech -->
+<!ENTITY radic    "&#8730;" ><!-- square root = radical sign, U+221A ISOtech -->
+<!ENTITY prop     "&#8733;" ><!-- proportional to, U+221D ISOtech -->
+<!ENTITY infin    "&#8734;" ><!-- infinity, U+221E ISOtech -->
+<!ENTITY ang      "&#8736;" ><!-- angle, U+2220 ISOamso -->
+<!ENTITY and      "&#8743;" ><!-- logical and = wedge, U+2227 ISOtech -->
+<!ENTITY or       "&#8744;" ><!-- logical or = vee, U+2228 ISOtech -->
+<!ENTITY cap      "&#8745;" ><!-- intersection = cap, U+2229 ISOtech -->
+<!ENTITY cup      "&#8746;" ><!-- union = cup, U+222A ISOtech -->
+<!ENTITY int      "&#8747;" ><!-- integral, U+222B ISOtech -->
+<!ENTITY there4   "&#8756;" ><!-- therefore, U+2234 ISOtech -->
+<!ENTITY sim      "&#8764;" ><!-- tilde operator = varies with = similar to, U+223C ISOtech -->
+<!-- tilde operator is NOT the same character as the tilde, U+007E,
+     although the same glyph might be used to represent both  -->
+<!ENTITY cong     "&#8773;" ><!-- approximately equal to, U+2245 ISOtech -->
+<!ENTITY asymp    "&#8776;" ><!-- almost equal to = asymptotic to, U+2248 ISOamsr -->
+<!ENTITY ne       "&#8800;" ><!-- not equal to, U+2260 ISOtech -->
+<!ENTITY equiv    "&#8801;" ><!-- identical to, U+2261 ISOtech -->
+<!ENTITY le       "&#8804;" ><!-- less-than or equal to, U+2264 ISOtech -->
+<!ENTITY ge       "&#8805;" ><!-- greater-than or equal to, U+2265 ISOtech -->
+<!ENTITY sub      "&#8834;" ><!-- subset of, U+2282 ISOtech -->
+<!ENTITY sup      "&#8835;" ><!-- superset of, U+2283 ISOtech -->
+<!-- note that nsup, 'not a superset of, U+2283' is not covered by the Symbol
+     font encoding and is not included. Should it be, for symmetry?
+     It is in ISOamsn  -->
+<!ENTITY nsub     "&#8836;" ><!-- not a subset of, U+2284 ISOamsn -->
+<!ENTITY sube     "&#8838;" ><!-- subset of or equal to, U+2286 ISOtech -->
+<!ENTITY supe     "&#8839;" ><!-- superset of or equal to, U+2287 ISOtech -->
+<!ENTITY oplus    "&#8853;" ><!-- circled plus = direct sum, U+2295 ISOamsb -->
+<!ENTITY otimes   "&#8855;" ><!-- circled times = vector product, U+2297 ISOamsb -->
+<!ENTITY perp     "&#8869;" ><!-- up tack = orthogonal to = perpendicular, U+22A5 ISOtech -->
+<!ENTITY sdot     "&#8901;" ><!-- dot operator, U+22C5 ISOamsb -->
+<!-- dot operator is NOT the same character as U+00B7 middle dot -->
+
+<!-- Miscellaneous Technical -->
+<!ENTITY lceil    "&#8968;" ><!-- left ceiling = apl upstile, U+2308 ISOamsc  -->
+<!ENTITY rceil    "&#8969;" ><!-- right ceiling, U+2309 ISOamsc  -->
+<!ENTITY lfloor   "&#8970;" ><!-- left floor = apl downstile, U+230A ISOamsc  -->
+<!ENTITY rfloor   "&#8971;" ><!-- right floor, U+230B ISOamsc  -->
+<!ENTITY lang     "&#9001;" ><!-- left-pointing angle bracket = bra, U+2329 ISOtech -->
+<!-- lang is NOT the same character as U+003C 'less than'
+     or U+2039 'single left-pointing angle quotation mark' -->
+<!ENTITY rang     "&#9002;" ><!-- right-pointing angle bracket = ket, U+232A ISOtech -->
+<!-- rang is NOT the same character as U+003E 'greater than'
+     or U+203A 'single right-pointing angle quotation mark' -->
+
+<!-- Geometric Shapes -->
+<!ENTITY loz      "&#9674;" ><!-- lozenge, U+25CA ISOpub -->
+
+<!-- Miscellaneous Symbols -->
+<!ENTITY spades   "&#9824;" ><!-- black spade suit, U+2660 ISOpub -->
+<!-- black here seems to mean filled as opposed to hollow -->
+<!ENTITY clubs    "&#9827;" ><!-- black club suit = shamrock, U+2663 ISOpub -->
+<!ENTITY hearts   "&#9829;" ><!-- black heart suit = valentine, U+2665 ISOpub -->
+<!ENTITY diams    "&#9830;" ><!-- black diamond suit, U+2666 ISOpub -->
+
+<!-- end of xhtml-symbol.ent -->
+"""
+  return text
+
+def get_apache_license():
+  license = r"""/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+"""
+  return license
+
+main()
Index: modules/analysis/common/src/java/org/apache/lucene/analysis/charfilter/JFlexHTMLStripCharFilter.jflex
===================================================================
--- modules/analysis/common/src/java/org/apache/lucene/analysis/charfilter/JFlexHTMLStripCharFilter.jflex	(revision 0)
+++ modules/analysis/common/src/java/org/apache/lucene/analysis/charfilter/JFlexHTMLStripCharFilter.jflex	(revision 0)
@@ -0,0 +1,672 @@
+package org.apache.lucene.analysis.charfilter;
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.IOException;
+import java.util.Set;
+
+import org.apache.lucene.util.Version;
+import org.apache.lucene.analysis.CharStream;
+import org.apache.lucene.analysis.util.CharArrayMap;
+import org.apache.lucene.analysis.util.CharArraySet;
+import org.apache.lucene.analysis.util.OpenStringBuilder;
+
+
+/**
+ * A CharFilter that wraps another Reader and attempts to strip out HTML constructs.
+ */
+%%
+
+%unicode 6.0
+%apiprivate
+%type OutputSource
+%final
+%public
+%char
+%class JFlexHTMLStripCharFilter
+%extends BaseCharFilter
+%xstate AMPERSAND, NUMERIC_CHARACTER, CHARACTER_REFERENCE_TAIL
+%xstate LEFT_ANGLE_BRACKET, BANG, COMMENT, SCRIPT, SCRIPT_COMMENT
+%xstate LEFT_ANGLE_BRACKET_SLASH, LEFT_ANGLE_BRACKET_SPACE, CDATA
+%xstate SERVER_SIDE_INCLUDE, SINGLE_QUOTED_STRING, DOUBLE_QUOTED_STRING
+%xstate END_TAG_TAIL_INCLUDE, END_TAG_TAIL_EXCLUDE, END_TAG_TAIL_SUBSTITUTE_SPACE
+%xstate START_TAG_TAIL_INCLUDE, START_TAG_TAIL_EXCLUDE, START_TAG_TAIL_SUBSTITUTE_SPACE
+
+// From XML 1.0 <http://www.w3.org/TR/xml/>:
+//
+//    [4]  NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [...]
+//    [4a] NameChar      ::= NameStartChar | "-" | "." | [0-9] | [...]
+//    [5]  Name          ::= NameStartChar (NameChar)*
+//
+// From UAX #31: Unicode Identifier and Pattern Syntax
+// <http://unicode.org/reports/tr31/>:
+//
+//    D1. Default Identifier Syntax
+//
+//        <identifier> := <ID_Start> <ID_Continue>*
+//
+//        [...]
+//
+//        The XID_Start and XID_Continue properties are improved lexical
+//        classes that incorporate the changes described in Section 5.1,
+//        NFKC Modifications. They are recommended for most purposes,
+//        especially for security, over the original ID_Start and
+//        ID_Continue properties.
+//
+Name = ( [:_\p{XID_Start}] [-.:_\p{XID_Continue}]* )
+
+// From Apache httpd mod_include documentation
+// <http://httpd.apache.org/docs/current/mod/mod_include.html>:
+//
+// Basic Elements
+//
+//    The document is parsed as an HTML document, with special commands
+//    embedded as SGML comments. A command has the syntax:
+//
+//       <!--#element attribute=value attribute=value ... -->
+//
+//    The value will often be enclosed in double quotes, but single quotes (')
+//    and backticks (`) are also possible. Many commands only allow a single
+//    attribute-value pair. Note that the comment terminator (-->) should be
+//    preceded by whitespace to ensure that it isn't considered part of an SSI
+//    token. Note that the leading <!--# is one token and may not contain any
+//    whitespaces.
+//
+ServerSideInclude = ( "<!--#" ~"-->" )
+AttributeValue = ( "\"" ( {ServerSideInclude} | [^\"])* "\""
+                 | "'"  ( {ServerSideInclude} | [^\'])* "'"
+                 | [^\"\'\s<>]* )
+Attribute = ( {Name} (\s* "=" \s* {AttributeValue})? )
+
+InlineElementNoSpace = ( [bBiIsSuU]                       |
+                         [bB][aA][sS][eE][fF][oO][nN][tT] |
+                         [bB][dD][oO]                     |
+                         [bB][iI][gG]                     |
+                         [cC][iI][tT][eE]                 |
+                         [cC][oO][dD][eE]                 |
+                         [dD][fF][nN]                     |
+                         [eE][mM]                         |
+                         [fF][oO][nN][tT]                 |
+                         [kK][bB][dD]                     |
+                         [lL][aA][bB][eE][lL]             |
+                         [sS][aA][mM][pP]                 |
+                         [sS][mM][aA][lL][lL]             |
+                         [sS][pP][aA][nN]                 |
+                         [sS][tT][rR][iI][kK][eE]         |
+                         [sS][tT][rR][oO][nN][gG]         |
+                         [tT][tT]                         |
+                         [vV][aA][rR]                     )
+
+
+%include src/java/org/apache/lucene/analysis/charfilter/HTMLCharacterEntities.jflex
+
+%{
+  private static final int INITIAL_INPUT_SEGMENT_SIZE = 1024;
+
+  private CharArraySet escapedTags = null;
+  private int inputStart;
+  private int cumulativeDiff;
+  private boolean escapeBR = false;
+  private boolean escapeSCRIPT = false;
+  private int restoreState;
+  private int previousRestoreState;
+  private int outputCharCount;
+  private TextSegment inputSegment
+      = new TextSegment(INITIAL_INPUT_SEGMENT_SIZE);
+  private TextSegment outputSegment = inputSegment;
+  private TextSegment entitySegment = new TextSegment(2);
+
+  /**
+   * @param source
+   */
+  public JFlexHTMLStripCharFilter(CharStream source) {
+    super(source);
+    this.zzReader = source;
+  }
+
+  /**
+   * @param source
+   * @param escapedTags Tags in this set (both start and end tags)
+   *  will not be filtered out.
+   */
+  public JFlexHTMLStripCharFilter(CharStream source, Set<String> escapedTags) {
+    super(source);
+    this.zzReader = source;
+    if (null != escapedTags) {
+      for (String tag : escapedTags) {
+        if (tag.equalsIgnoreCase("BR")) {
+          escapeBR = true;
+        } else if (tag.equalsIgnoreCase("SCRIPT")) {
+          escapeSCRIPT = true;
+        } else {
+          if (null == this.escapedTags) {
+            this.escapedTags = new CharArraySet(Version.LUCENE_40, 16, true);
+          }
+          this.escapedTags.add(tag);
+        }
+      }
+    }
+  }
+
+  @Override
+  public int read() throws IOException {
+    if (outputSegment.isRead()) {
+      if (zzAtEOF) {
+        return -1;
+      }
+      // yylex() returns true when input stream character(s) have been
+      // consumed and EOF has not been reached. However, there may be no
+      // output chars. Keep consuming input until output chars have been
+      // produced or EOF is reached.
+      do {
+        if (yylex() == OutputSource.DIRECT) {
+          ++outputCharCount;
+          return zzBuffer[zzStartRead];
+        }
+        if (zzAtEOF) {
+          break;
+        }
+      } while (outputSegment.isRead());
+      if (outputSegment.isRead()) {
+        return -1;
+      }
+    }
+    ++outputCharCount;
+    return outputSegment.nextChar();
+  }
+
+  @Override
+  public int read(char cbuf[], int off, int len) throws IOException {
+    int i = 0;
+    for ( ; i < len ; ++i) {
+      int ch = read();
+      if (ch == -1) break;
+      cbuf[off++] = (char)ch;
+    }
+    return i > 0 ? i : (len == 0 ? 0 : -1);
+  }
+
+  @Override
+  public void close() throws IOException {
+    yyclose();
+  }
+
+  static int getInitialBufferSize() {  // Package private, for testing purposes
+    return ZZ_BUFFERSIZE;
+  }
+
+  private class TextSegment extends OpenStringBuilder {
+    /** The position from which the next char will be read. */
+    int pos = 0;
+
+    /** Wraps the given buffer and sets this.len to the given length. */
+    TextSegment(char[] buffer, int length) {
+      super(buffer, length);
+    }
+
+    /** Allocates an internal buffer of the given size. */
+    TextSegment(int size) {
+      super(size);
+    }
+
+    /** Sets len = 0 and pos = 0. */
+    void clear() {
+      reset();
+      restart();
+    }
+
+    /** Sets pos = 0 */
+    void restart() {
+      pos = 0;
+    }
+
+    /** Returns the next char in the segment. */
+    int nextChar() {
+      assert (! isRead()): "Attempting to read past the end of a segment.";
+      return buf[pos++];
+    }
+
+    /** Returns true when all characters in the text segment have been read */
+    boolean isRead() {
+      return pos >= len;
+    }
+  }
+
+  private enum OutputSource { DIRECT, INDIRECT }
+%}
+
+%eofval{
+  return OutputSource.INDIRECT;
+%eofval}
+%eof{
+  switch (zzLexicalState) {
+    case SCRIPT:
+    case COMMENT:
+    case SCRIPT_COMMENT:
+    case SINGLE_QUOTED_STRING:
+    case DOUBLE_QUOTED_STRING:
+    case END_TAG_TAIL_EXCLUDE:
+    case END_TAG_TAIL_SUBSTITUTE_SPACE:
+    case START_TAG_TAIL_EXCLUDE:
+    case START_TAG_TAIL_SUBSTITUTE_SPACE: { // Exclude
+      cumulativeDiff += yychar - inputStart;
+      addOffCorrectMap(outputCharCount, cumulativeDiff);
+      outputSegment.clear();
+      break;
+    }
+    case CHARACTER_REFERENCE_TAIL: {        // Substitute
+      // At end of file, allow char refs without semicolons
+      cumulativeDiff += inputSegment.length() - outputSegment.length();
+      addOffCorrectMap(outputCharCount, cumulativeDiff);
+      break;
+    }
+    case BANG:
+    case CDATA:
+    case AMPERSAND:
+    case NUMERIC_CHARACTER:
+    case END_TAG_TAIL_INCLUDE:
+    case START_TAG_TAIL_INCLUDE:
+    case LEFT_ANGLE_BRACKET:
+    case LEFT_ANGLE_BRACKET_SLASH:
+    case LEFT_ANGLE_BRACKET_SPACE: {        // Include
+      outputSegment = inputSegment;
+      break;
+    }
+  }
+%eof}
+
+%%
+
+"&" {
+  inputStart = yychar;
+  inputSegment.clear();
+  inputSegment.append('&');
+  yybegin(AMPERSAND);
+}
+
+"<" {
+  inputStart = yychar;
+  inputSegment.clear();
+  inputSegment.append('<');
+  yybegin(LEFT_ANGLE_BRACKET);
+}
+
+<AMPERSAND> {
+  {CharacterEntities} {
+    int length = yylength();
+    inputSegment.write(zzBuffer, zzStartRead, length);
+    entitySegment.clear();
+    char ch = entityValues.get(zzBuffer, zzStartRead, length).charValue();
+    entitySegment.append(ch);
+    outputSegment = entitySegment;
+    yybegin(CHARACTER_REFERENCE_TAIL);
+  }
+  "#" { inputSegment.append('#'); yybegin(NUMERIC_CHARACTER); }
+}
+
+<NUMERIC_CHARACTER> {
+  [xX] [0-9A-Fa-f]+ {
+    int matchLength = yylength();
+    inputSegment.write(zzBuffer, zzStartRead, matchLength);
+    if (matchLength <= 6) { // 10FFFF: max 6 hex chars
+      String hexCharRef
+          = new String(zzBuffer, zzStartRead + 1, matchLength - 1);
+      try {
+        int codePoint = Integer.parseInt(hexCharRef, 16);
+        if (codePoint <= 0x10FFFF) {
+          outputSegment = entitySegment;
+          outputSegment.clear();
+          outputSegment.setLength
+              (Character.toChars(codePoint, outputSegment.getArray(), 0));
+          yybegin(CHARACTER_REFERENCE_TAIL);
+        } else {
+          outputSegment = inputSegment;
+          yybegin(YYINITIAL);
+          return OutputSource.INDIRECT;
+        }
+      } catch(NumberFormatException e) {
+        assert false: "NumberFormatException parsing hex code point '"
+                      + hexCharRef + "'";
+      } catch(IllegalArgumentException e) {
+        assert false: "IllegalArgumentException getting chars "
+                      + "for hex code point '" + hexCharRef + "'";
+      }
+    } else {
+      outputSegment = inputSegment;
+      yybegin(YYINITIAL);
+      return OutputSource.INDIRECT;
+    }
+  }
+  [0-9]+ {
+    int matchLength = yylength();
+    inputSegment.write(zzBuffer, zzStartRead, matchLength);
+    if (matchLength <= 7) { // 0x10FFFF = 1114111: max 7 decimal chars
+      String decimalCharRef = yytext();
+      try {
+        int codePoint = Integer.parseInt(decimalCharRef);
+        if (codePoint <= 0x10FFFF) {
+          outputSegment = entitySegment;
+          outputSegment.clear();
+          outputSegment.setLength
+              (Character.toChars(codePoint, outputSegment.getArray(), 0));
+          yybegin(CHARACTER_REFERENCE_TAIL);
+        } else {
+          outputSegment = inputSegment;
+          yybegin(YYINITIAL);
+          return OutputSource.INDIRECT;
+        }
+      } catch(NumberFormatException e) {
+        assert false: "NumberFormatException parsing code point '"
+                      + decimalCharRef + "'";
+      } catch(IllegalArgumentException e) {
+        assert false: "IllegalArgumentException getting chars for code point '"
+                      + decimalCharRef + "'";
+      }
+    } else {
+      outputSegment = inputSegment;
+      yybegin(YYINITIAL);
+      return OutputSource.INDIRECT;
+    }
+  }
+}
+
+<CHARACTER_REFERENCE_TAIL> {
+  ";" {
+    cumulativeDiff
+        += inputSegment.length() + yylength() - outputSegment.length();
+    addOffCorrectMap(outputCharCount + outputSegment.length(), cumulativeDiff);
+    yybegin(YYINITIAL);
+    return OutputSource.INDIRECT;
+  }
+}
+
+<LEFT_ANGLE_BRACKET_SLASH> {
+  \s+ { inputSegment.write(zzBuffer, zzStartRead, yylength()); }
+  [bB][rR] \s* ">" {
+    yybegin(YYINITIAL);
+    if (escapeBR) {
+      inputSegment.write(zzBuffer, zzStartRead, yylength());
+      outputSegment = inputSegment;
+      return OutputSource.INDIRECT;
+    } else {
+      cumulativeDiff
+          += inputSegment.length() + yylength() - outputSegment.length();
+      addOffCorrectMap(outputCharCount + outputSegment.length(), cumulativeDiff);
+      zzBuffer[zzStartRead] = '\n';
+      return OutputSource.DIRECT;
+    }
+  }
+  {InlineElementNoSpace} {
+    inputSegment.write(zzBuffer, zzStartRead, yylength());
+    if (null != escapedTags
+        && escapedTags.contains(zzBuffer, zzStartRead, yylength())) {
+      yybegin(END_TAG_TAIL_INCLUDE);
+    } else {
+      yybegin(END_TAG_TAIL_EXCLUDE);
+    }
+  }
+  {Name} {
+    inputSegment.write(zzBuffer, zzStartRead, yylength());
+    if (null != escapedTags
+        && escapedTags.contains(zzBuffer, zzStartRead, yylength())) {
+      yybegin(END_TAG_TAIL_INCLUDE);
+    } else {
+      yybegin(END_TAG_TAIL_SUBSTITUTE_SPACE);
+    }
+  }
+}
+
+<END_TAG_TAIL_INCLUDE> {
+   \s* ">" {
+     inputSegment.write(zzBuffer, zzStartRead, yylength());
+     outputSegment = inputSegment;
+     yybegin(YYINITIAL);
+     return OutputSource.INDIRECT;
+   }
+}
+
+<END_TAG_TAIL_EXCLUDE> {
+  \s* ">" {
+    cumulativeDiff += inputSegment.length() + yylength();
+    addOffCorrectMap(outputCharCount, cumulativeDiff);
+    inputSegment.clear();
+    yybegin(YYINITIAL);
+  }
+}
+
+<END_TAG_TAIL_SUBSTITUTE_SPACE> {
+  \s* ">" {
+    cumulativeDiff += inputSegment.length() + yylength() - 1;
+    addOffCorrectMap(outputCharCount + 1, cumulativeDiff);
+    zzBuffer[zzStartRead] = ' ';
+    inputSegment.clear();
+    yybegin(YYINITIAL);
+    return OutputSource.DIRECT;
+  }
+}
+
+<LEFT_ANGLE_BRACKET> {
+  \s+ {
+    inputSegment.write(zzBuffer, zzStartRead, yylength());
+    yybegin(LEFT_ANGLE_BRACKET_SPACE);
+  }
+  "!" { inputSegment.append('!'); yybegin(BANG); }
+  "?" ~"?>" {
+    cumulativeDiff += inputSegment.length() + yylength();
+    addOffCorrectMap(outputCharCount, cumulativeDiff);
+    inputSegment.clear();
+    yybegin(YYINITIAL);
+  }
+  "/" {
+    inputSegment.append('/');
+    yybegin(LEFT_ANGLE_BRACKET_SLASH);
+  }
+  \s* [bB][rR] ( \s+ {Attribute} )* \s* "/"? ">" {
+    yybegin(YYINITIAL);
+    if (escapeBR) {
+      inputSegment.write(zzBuffer, zzStartRead, yylength());
+      outputSegment = inputSegment;
+      return OutputSource.INDIRECT;
+    } else {
+      cumulativeDiff
+          += inputSegment.length() + yylength() - outputSegment.length();
+      addOffCorrectMap(outputCharCount + 1, cumulativeDiff);
+      zzBuffer[zzStartRead] = '\n';
+      return OutputSource.DIRECT;
+    }
+  }
+
+  \s* [sS][cC][rR][iI][pP][tT] ( \s+ {Attribute} )* \s* ">" {
+    yybegin(SCRIPT);
+    if (escapeSCRIPT) {
+      inputSegment.write(zzBuffer, zzStartRead, yylength());
+      outputSegment = inputSegment;
+      inputStart += 1 + yylength();
+      return OutputSource.INDIRECT;
+    }
+  }
+}
+
+<LEFT_ANGLE_BRACKET, LEFT_ANGLE_BRACKET_SPACE> {
+  {InlineElementNoSpace} {
+    inputSegment.write(zzBuffer, zzStartRead, yylength());
+    if (null != escapedTags
+        && escapedTags.contains(zzBuffer, zzStartRead, yylength())) {
+      yybegin(START_TAG_TAIL_INCLUDE);
+    } else {
+      yybegin(START_TAG_TAIL_EXCLUDE);
+    }
+  }
+  {Name} {
+    inputSegment.write(zzBuffer, zzStartRead, yylength());
+    if (null != escapedTags
+        && escapedTags.contains(zzBuffer, zzStartRead, yylength())) {
+      yybegin(START_TAG_TAIL_INCLUDE);
+    } else {
+      yybegin(START_TAG_TAIL_SUBSTITUTE_SPACE);
+    }
+  }
+}
+
+<START_TAG_TAIL_INCLUDE> {
+   ( \s+ {Attribute} )* \s*  "/"? ">" {
+     inputSegment.write(zzBuffer, zzStartRead, yylength());
+     outputSegment = inputSegment;
+     yybegin(YYINITIAL);
+     return OutputSource.INDIRECT;
+   }
+}
+
+<START_TAG_TAIL_EXCLUDE> {
+  ( \s+ {Attribute} )* \s* "/"? ">" {
+    cumulativeDiff += inputSegment.length() + yylength();
+    addOffCorrectMap(outputCharCount, cumulativeDiff);
+    inputSegment.clear();
+    outputSegment = inputSegment;
+    yybegin(YYINITIAL);
+  }
+}
+
+<START_TAG_TAIL_SUBSTITUTE_SPACE> {
+  ( \s+ {Attribute} )* \s* "/"? ">" {
+    cumulativeDiff += inputSegment.length() + yylength() - 1;
+    addOffCorrectMap(outputCharCount + 1, cumulativeDiff);
+    inputSegment.clear();
+    zzBuffer[zzStartRead] = ' ';
+    yybegin(YYINITIAL);
+    return OutputSource.DIRECT;
+  }
+}
+
+<BANG> {
+  "--" { yybegin(COMMENT); }
+  ">" | [^-] ~">" {
+    cumulativeDiff += inputSegment.length() + yylength();
+    addOffCorrectMap(outputCharCount, cumulativeDiff);
+    inputSegment.clear();
+    yybegin(YYINITIAL);
+  }
+  // From XML 1.0 <http://www.w3.org/TR/xml/>:
+  //
+  // [18] CDSect  ::= CDStart CData CDEnd
+  // [19] CDStart ::= '<![CDATA['
+  // [20] CData   ::= (Char* - (Char* ']]>' Char*))
+  // [21] CDEnd   ::= ']]>'
+  //
+  "[CDATA[" {
+    cumulativeDiff += inputSegment.length() + yylength();
+    addOffCorrectMap(outputCharCount, cumulativeDiff);
+    inputSegment.clear();
+    yybegin(CDATA);
+  }
+}
+
+<CDATA> {
+  "]]>" {
+    cumulativeDiff += yylength();
+    addOffCorrectMap(outputCharCount + inputSegment.length(), cumulativeDiff);
+    outputSegment = inputSegment;
+    yybegin(YYINITIAL);
+    return OutputSource.INDIRECT;
+  }
+  [^] { inputSegment.append(zzBuffer[zzStartRead]); }
+}
+
+<COMMENT> {
+  "<!--#" { restoreState = COMMENT; yybegin(SERVER_SIDE_INCLUDE); }
+  "-->" {
+    cumulativeDiff += yychar - inputStart + yylength();
+    addOffCorrectMap(outputCharCount, cumulativeDiff);
+    inputSegment.clear();
+    yybegin(YYINITIAL);
+  }
+  [^] { }
+}
+
+<SERVER_SIDE_INCLUDE> {
+  "-->" { yybegin(restoreState); }
+  "'" {
+    previousRestoreState = restoreState;
+    restoreState = SERVER_SIDE_INCLUDE;
+    yybegin(SINGLE_QUOTED_STRING);
+  }
+  "\"" {
+    previousRestoreState = restoreState;
+    restoreState = SERVER_SIDE_INCLUDE;
+    yybegin(DOUBLE_QUOTED_STRING);
+  }
+  [^] { }
+}
+
+<SCRIPT_COMMENT> {
+  "<!--#" { restoreState = SCRIPT_COMMENT; yybegin(SERVER_SIDE_INCLUDE); }
+  "'"     { restoreState = SCRIPT_COMMENT; yybegin(SINGLE_QUOTED_STRING); }
+  "\""    { restoreState = SCRIPT_COMMENT; yybegin(DOUBLE_QUOTED_STRING); }
+  "-->"   { yybegin(SCRIPT); }
+  [^] { }
+}
+
+<SINGLE_QUOTED_STRING> {
+  "\\" [^] { }
+  "'" { yybegin(restoreState); restoreState = previousRestoreState; }
+  [^] { }
+}
+
+<DOUBLE_QUOTED_STRING> {
+  "\\" [^] { }
+  "\"" { yybegin(restoreState); restoreState = previousRestoreState; }
+  [^] { }
+}
+
+<SCRIPT> {
+  "<!--" { yybegin(SCRIPT_COMMENT); }
+  "</" \s* [sS][cC][rR][iI][pP][tT] \s* ">" {
+    inputSegment.clear();
+    yybegin(YYINITIAL);
+    cumulativeDiff += yychar - inputStart;
+    int outputEnd = outputCharCount;
+    OutputSource returnValue;
+    if (escapeSCRIPT) {
+      inputSegment.write(zzBuffer, zzStartRead, yylength());
+      outputSegment = inputSegment;
+      returnValue = OutputSource.INDIRECT;
+    } else {
+      cumulativeDiff += yylength() - 1;
+      zzBuffer[zzStartRead] = ' ';
+      ++outputEnd;
+      returnValue = OutputSource.DIRECT;
+    }
+    addOffCorrectMap(outputEnd, cumulativeDiff);
+    return returnValue;
+  }
+  [^] { }
+}
+
+<AMPERSAND,NUMERIC_CHARACTER,CHARACTER_REFERENCE_TAIL,LEFT_ANGLE_BRACKET_SLASH,END_TAG_TAIL_INCLUDE,END_TAG_TAIL_EXCLUDE,END_TAG_TAIL_SUBSTITUTE_SPACE,LEFT_ANGLE_BRACKET,LEFT_ANGLE_BRACKET_SPACE,START_TAG_TAIL_INCLUDE,START_TAG_TAIL_EXCLUDE,START_TAG_TAIL_SUBSTITUTE_SPACE,BANG> {
+  [^] {
+    yypushback(1);
+    outputSegment = inputSegment;
+    outputSegment.restart();
+    yybegin(YYINITIAL);
+    return OutputSource.INDIRECT;
+  }
+}
+
+[^] {
+  return OutputSource.DIRECT;
+}

Property changes on: modules/analysis/common/src/java/org/apache/lucene/analysis/charfilter/JFlexHTMLStripCharFilter.jflex
___________________________________________________________________
Added: svn:executable
   + *

Index: modules/analysis/common/src/java/org/apache/lucene/analysis/charfilter/HTMLCharacterEntities.jflex
===================================================================
--- modules/analysis/common/src/java/org/apache/lucene/analysis/charfilter/HTMLCharacterEntities.jflex	(revision 0)
+++ modules/analysis/common/src/java/org/apache/lucene/analysis/charfilter/HTMLCharacterEntities.jflex	(revision 0)
@@ -0,0 +1,146 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+CharacterEntities = ( "AElig" | "Aacute" | "Acirc" | "Agrave" | "Alpha"
+                    | "Aring" | "Atilde" | "Auml" | "Beta" | "Ccedil" | "Chi"
+                    | "Dagger" | "Delta" | "ETH" | "Eacute" | "Ecirc"
+                    | "Egrave" | "Epsilon" | "Eta" | "Euml" | "Gamma"
+                    | "Iacute" | "Icirc" | "Igrave" | "Iota" | "Iuml" | "Kappa"
+                    | "Lambda" | "Mu" | "Ntilde" | "Nu" | "OElig" | "Oacute"
+                    | "Ocirc" | "Ograve" | "Omega" | "Omicron" | "Oslash"
+                    | "Otilde" | "Ouml" | "Phi" | "Pi" | "Prime" | "Psi"
+                    | "Rho" | "Scaron" | "Sigma" | "THORN" | "Tau" | "Theta"
+                    | "Uacute" | "Ucirc" | "Ugrave" | "Upsilon" | "Uuml" | "Xi"
+                    | "Yacute" | "Yuml" | "Zeta" | "aacute" | "acirc" | "acute"
+                    | "aelig" | "agrave" | "alefsym" | "alpha" | "amp" | "and"
+                    | "ang" | "apos" | "aring" | "asymp" | "atilde" | "auml"
+                    | "bdquo" | "beta" | "brvbar" | "bull" | "cap" | "ccedil"
+                    | "cedil" | "cent" | "chi" | "circ" | "clubs" | "cong"
+                    | "copy" | "crarr" | "cup" | "curren" | "dArr" | "dagger"
+                    | "darr" | "deg" | "delta" | "diams" | "divide" | "eacute"
+                    | "ecirc" | "egrave" | "empty" | "emsp" | "ensp"
+                    | "epsilon" | "equiv" | "eta" | "eth" | "euml" | "euro"
+                    | "exist" | "fnof" | "forall" | "frac12" | "frac14"
+                    | "frac34" | "frasl" | "gamma" | "ge" | "gt" | "hArr"
+                    | "harr" | "hearts" | "hellip" | "iacute" | "icirc"
+                    | "iexcl" | "igrave" | "image" | "infin" | "int" | "iota"
+                    | "iquest" | "isin" | "iuml" | "kappa" | "lArr" | "lambda"
+                    | "lang" | "laquo" | "larr" | "lceil" | "ldquo" | "le"
+                    | "lfloor" | "lowast" | "loz" | "lrm" | "lsaquo" | "lsquo"
+                    | "lt" | "macr" | "mdash" | "micro" | "middot" | "minus"
+                    | "mu" | "nabla" | "nbsp" | "ndash" | "ne" | "ni" | "not"
+                    | "notin" | "nsub" | "ntilde" | "nu" | "oacute" | "ocirc"
+                    | "oelig" | "ograve" | "oline" | "omega" | "omicron"
+                    | "oplus" | "or" | "ordf" | "ordm" | "oslash" | "otilde"
+                    | "otimes" | "ouml" | "para" | "part" | "permil" | "perp"
+                    | "phi" | "pi" | "piv" | "plusmn" | "pound" | "prime"
+                    | "prod" | "prop" | "psi" | "quot" | "rArr" | "radic"
+                    | "rang" | "raquo" | "rarr" | "rceil" | "rdquo" | "real"
+                    | "reg" | "rfloor" | "rho" | "rlm" | "rsaquo" | "rsquo"
+                    | "sbquo" | "scaron" | "sdot" | "sect" | "shy" | "sigma"
+                    | "sigmaf" | "sim" | "spades" | "sub" | "sube" | "sum"
+                    | "sup" | "sup1" | "sup2" | "sup3" | "supe" | "szlig"
+                    | "tau" | "there4" | "theta" | "thetasym" | "thinsp"
+                    | "thorn" | "tilde" | "times" | "trade" | "uArr" | "uacute"
+                    | "uarr" | "ucirc" | "ugrave" | "uml" | "upsih" | "upsilon"
+                    | "uuml" | "weierp" | "xi" | "yacute" | "yen" | "yuml"
+                    | "zeta" | "zwj" | "zwnj" )
+%{
+  private static final CharArrayMap<Character> entityValues
+      = new CharArrayMap<Character>(Version.LUCENE_40, 253, false);
+  static {
+    String[] entities = {
+      "AElig", "\u00C6", "Aacute", "\u00C1", "Acirc", "\u00C2",
+      "Agrave", "\u00C0", "Alpha", "\u0391", "Aring", "\u00C5",
+      "Atilde", "\u00C3", "Auml", "\u00C4", "Beta", "\u0392",
+      "Ccedil", "\u00C7", "Chi", "\u03A7", "Dagger", "\u2021",
+      "Delta", "\u0394", "ETH", "\u00D0", "Eacute", "\u00C9",
+      "Ecirc", "\u00CA", "Egrave", "\u00C8", "Epsilon", "\u0395",
+      "Eta", "\u0397", "Euml", "\u00CB", "Gamma", "\u0393", "Iacute", "\u00CD",
+      "Icirc", "\u00CE", "Igrave", "\u00CC", "Iota", "\u0399",
+      "Iuml", "\u00CF", "Kappa", "\u039A", "Lambda", "\u039B", "Mu", "\u039C",
+      "Ntilde", "\u00D1", "Nu", "\u039D", "OElig", "\u0152",
+      "Oacute", "\u00D3", "Ocirc", "\u00D4", "Ograve", "\u00D2",
+      "Omega", "\u03A9", "Omicron", "\u039F", "Oslash", "\u00D8",
+      "Otilde", "\u00D5", "Ouml", "\u00D6", "Phi", "\u03A6", "Pi", "\u03A0",
+      "Prime", "\u2033", "Psi", "\u03A8", "Rho", "\u03A1", "Scaron", "\u0160",
+      "Sigma", "\u03A3", "THORN", "\u00DE", "Tau", "\u03A4", "Theta", "\u0398",
+      "Uacute", "\u00DA", "Ucirc", "\u00DB", "Ugrave", "\u00D9",
+      "Upsilon", "\u03A5", "Uuml", "\u00DC", "Xi", "\u039E",
+      "Yacute", "\u00DD", "Yuml", "\u0178", "Zeta", "\u0396",
+      "aacute", "\u00E1", "acirc", "\u00E2", "acute", "\u00B4",
+      "aelig", "\u00E6", "agrave", "\u00E0", "alefsym", "\u2135",
+      "alpha", "\u03B1", "amp", "\u0026", "and", "\u2227", "ang", "\u2220",
+      "apos", "\u0027", "aring", "\u00E5", "asymp", "\u2248",
+      "atilde", "\u00E3", "auml", "\u00E4", "bdquo", "\u201E",
+      "beta", "\u03B2", "brvbar", "\u00A6", "bull", "\u2022", "cap", "\u2229",
+      "ccedil", "\u00E7", "cedil", "\u00B8", "cent", "\u00A2", "chi", "\u03C7",
+      "circ", "\u02C6", "clubs", "\u2663", "cong", "\u2245", "copy", "\u00A9",
+      "crarr", "\u21B5", "cup", "\u222A", "curren", "\u00A4", "dArr", "\u21D3",
+      "dagger", "\u2020", "darr", "\u2193", "deg", "\u00B0", "delta", "\u03B4",
+      "diams", "\u2666", "divide", "\u00F7", "eacute", "\u00E9",
+      "ecirc", "\u00EA", "egrave", "\u00E8", "empty", "\u2205",
+      "emsp", "\u2003", "ensp", "\u2002", "epsilon", "\u03B5",
+      "equiv", "\u2261", "eta", "\u03B7", "eth", "\u00F0", "euml", "\u00EB",
+      "euro", "\u20AC", "exist", "\u2203", "fnof", "\u0192",
+      "forall", "\u2200", "frac12", "\u00BD", "frac14", "\u00BC",
+      "frac34", "\u00BE", "frasl", "\u2044", "gamma", "\u03B3", "ge", "\u2265",
+      "gt", "\u003E", "hArr", "\u21D4", "harr", "\u2194", "hearts", "\u2665",
+      "hellip", "\u2026", "iacute", "\u00ED", "icirc", "\u00EE",
+      "iexcl", "\u00A1", "igrave", "\u00EC", "image", "\u2111",
+      "infin", "\u221E", "int", "\u222B", "iota", "\u03B9", "iquest", "\u00BF",
+      "isin", "\u2208", "iuml", "\u00EF", "kappa", "\u03BA", "lArr", "\u21D0",
+      "lambda", "\u03BB", "lang", "\u2329", "laquo", "\u00AB",
+      "larr", "\u2190", "lceil", "\u2308", "ldquo", "\u201C", "le", "\u2264",
+      "lfloor", "\u230A", "lowast", "\u2217", "loz", "\u25CA", "lrm", "\u200E",
+      "lsaquo", "\u2039", "lsquo", "\u2018", "lt", "\u003C", "macr", "\u00AF",
+      "mdash", "\u2014", "micro", "\u00B5", "middot", "\u00B7",
+      "minus", "\u2212", "mu", "\u03BC", "nabla", "\u2207", "nbsp", " ",
+      "ndash", "\u2013", "ne", "\u2260", "ni", "\u220B", "not", "\u00AC",
+      "notin", "\u2209", "nsub", "\u2284", "ntilde", "\u00F1", "nu", "\u03BD",
+      "oacute", "\u00F3", "ocirc", "\u00F4", "oelig", "\u0153",
+      "ograve", "\u00F2", "oline", "\u203E", "omega", "\u03C9",
+      "omicron", "\u03BF", "oplus", "\u2295", "or", "\u2228", "ordf", "\u00AA",
+      "ordm", "\u00BA", "oslash", "\u00F8", "otilde", "\u00F5",
+      "otimes", "\u2297", "ouml", "\u00F6", "para", "\u00B6", "part", "\u2202",
+      "permil", "\u2030", "perp", "\u22A5", "phi", "\u03C6", "pi", "\u03C0",
+      "piv", "\u03D6", "plusmn", "\u00B1", "pound", "\u00A3",
+      "prime", "\u2032", "prod", "\u220F", "prop", "\u221D", "psi", "\u03C8",
+      "quot", "\"", "rArr", "\u21D2", "radic", "\u221A", "rang", "\u232A",
+      "raquo", "\u00BB", "rarr", "\u2192", "rceil", "\u2309",
+      "rdquo", "\u201D", "real", "\u211C", "reg", "\u00AE", "rfloor", "\u230B",
+      "rho", "\u03C1", "rlm", "\u200F", "rsaquo", "\u203A", "rsquo", "\u2019",
+      "sbquo", "\u201A", "scaron", "\u0161", "sdot", "\u22C5",
+      "sect", "\u00A7", "shy", "\u00AD", "sigma", "\u03C3", "sigmaf", "\u03C2",
+      "sim", "\u223C", "spades", "\u2660", "sub", "\u2282", "sube", "\u2286",
+      "sum", "\u2211", "sup", "\u2283", "sup1", "\u00B9", "sup2", "\u00B2",
+      "sup3", "\u00B3", "supe", "\u2287", "szlig", "\u00DF", "tau", "\u03C4",
+      "there4", "\u2234", "theta", "\u03B8", "thetasym", "\u03D1",
+      "thinsp", "\u2009", "thorn", "\u00FE", "tilde", "\u02DC",
+      "times", "\u00D7", "trade", "\u2122", "uArr", "\u21D1",
+      "uacute", "\u00FA", "uarr", "\u2191", "ucirc", "\u00FB",
+      "ugrave", "\u00F9", "uml", "\u00A8", "upsih", "\u03D2",
+      "upsilon", "\u03C5", "uuml", "\u00FC", "weierp", "\u2118",
+      "xi", "\u03BE", "yacute", "\u00FD", "yen", "\u00A5", "yuml", "\u00FF",
+      "zeta", "\u03B6", "zwj", "\u200D", "zwnj", "\u200C"
+    };
+    for (int i = 0 ; i < entities.length ; i += 2) {
+      entityValues.put(entities[i], new Character(entities[i + 1].charAt(0)));
+    }
+  }
+%}
Index: modules/analysis/common/src/java/org/apache/lucene/analysis/charfilter/BaseCharFilter.java
===================================================================
--- modules/analysis/common/src/java/org/apache/lucene/analysis/charfilter/BaseCharFilter.java	(revision 1230401)
+++ modules/analysis/common/src/java/org/apache/lucene/analysis/charfilter/BaseCharFilter.java	(working copy)
@@ -20,6 +20,8 @@
 import org.apache.lucene.analysis.CharStream;
 import org.apache.lucene.util.ArrayUtil;
 
+import java.util.Arrays;
+
 /**
  * Base utility class for implementing a {@link CharFilter}.
  * You subclass this, and then record mappings by calling
@@ -71,6 +73,48 @@
       0 : diffs[size-1];
   }
 
+  /**
+   * <p>
+   *   Adds an offset correction mapping at the given output stream offset.
+   * </p>
+   * <p>
+   *   CharFilters modify an input stream via a series of substring
+   *   replacements (including deletions and insertions) to produce an output
+   *   stream. There are three possible replacement cases: the replacement
+   *   string has the same length as the original substring; the replacement
+   *   is shorter; and the replacement is longer. In the latter two cases
+   *   (when the replacement has a different length than the original),
+   *   one or more offset correction mappings are required.
+   * </p>
+   * <p>
+   *   When the replacement is shorter than the original (e.g. when the
+   *   replacement is the empty string), a single offset correction mapping
+   *   should be added at the replacement's end offset in the output stream.
+   *   cumulativeDiff will be the sum of all previous replacement offset
+   *   adjustments, with the addition of the difference between the lengths
+   *   of the original substring and the replacement string - this will be
+   *   a positive value.
+   * </p>
+   * <p>
+   *   When the replacement is longer than the original (e.g. when the
+   *   original is the empty string), you should add as many offset
+   *   correction mappings as the difference between the lengths of the
+   *   replacement string and the original substring, starting at the
+   *   end offset the original substring would have had in the output stream.
+   *   cumulativeDiff will be the sum of all previous replacement offset
+   *   adjustments, with the addition of the difference between the lengths
+   *   of the original substring and the replacement string so far - these
+   *   will be negative values.
+   * </p>
+   * <p>
+   *   Assumption: the offset given with each successive call to this method
+   *   will not be smaller than the offset given at the previous invocation.
+   * </p>
+   *
+   * @param off The output stream offset at which to apply the correction
+   * @param cumulativeDiff The input offset is given by adding this
+   *                       to the output offset
+   */
   protected void addOffCorrectMap(int off, int cumulativeDiff) {
     if (offsets == null) {
       offsets = new int[64];
@@ -80,7 +124,15 @@
       diffs = ArrayUtil.grow(diffs);
     }
     
-    offsets[size] = off;
-    diffs[size++] = cumulativeDiff; 
+    assert (size == 0 || off >= offsets[size])
+        : "Offset #" + size + "(" + off + ") is less than the last recorded offset "
+          + offsets[size] + "\n" + Arrays.toString(offsets) + "\n" + Arrays.toString(diffs);
+    
+    if (size == 0 || off != offsets[size - 1]) {
+      offsets[size] = off;
+      diffs[size++] = cumulativeDiff;
+    } else { // Overwrite the diff at the last recorded offset
+      diffs[size - 1] = cumulativeDiff;
+    }
   }
 }
Index: modules/analysis/common/build.xml
===================================================================
--- modules/analysis/common/build.xml	(revision 1230401)
+++ modules/analysis/common/build.xml	(working copy)
@@ -31,14 +31,38 @@
   <target name="compile-core" depends="jflex-notice, common.compile-core"/>
 
   <target name="jflex" depends="jflex-check,clean-jflex,gen-uax29-supp-macros,
-                                jflex-StandardAnalyzer,jflex-UAX29URLEmailTokenizer,jflex-wiki-tokenizer"/>
+                                jflex-StandardAnalyzer,jflex-UAX29URLEmailTokenizer,
+                                jflex-wiki-tokenizer,jflex-JFlexHTMLStripCharFilter"/>
 
   <target name="gen-uax29-supp-macros">
     <subant target="gen-uax29-supp-macros">
        <fileset dir="../icu" includes="build.xml"/>
     </subant>
   </target>
-  
+
+  <target name="jflex-JFlexHTMLStripCharFilter"
+          depends="init,jflex-check,generate-jflex-html-char-entities"
+          if="jflex.present">
+    <taskdef classname="jflex.anttask.JFlexTask" name="jflex">
+      <classpath refid="jflex.classpath"/>
+    </taskdef>
+    <jflex file="src/java/org/apache/lucene/analysis/charfilter/JFlexHTMLStripCharFilter.jflex"
+           outdir="src/java/org/apache/lucene/analysis/charfilter"
+           nobak="on"/>
+    <!-- Remove the inappropriate JFlex-generated constructors -->
+    <replaceregexp file="src/java/org/apache/lucene/analysis/charfilter/JFlexHTMLStripCharFilter.java"
+                   match="/\*\*\s*\*\s*Creates a new scanner.*this\(new java\.io\.InputStreamReader\(in\)\);\s*\}"
+                   replace="" flags="sg"/>
+  </target>
+
+  <target name="generate-jflex-html-char-entities">
+    <exec dir="src/java/org/apache/lucene/analysis/charfilter"
+          output="src/java/org/apache/lucene/analysis/charfilter/HTMLCharacterEntities.jflex"
+          executable="${python.exe}" failonerror="true" logerror="true">
+      <arg value="htmlentity.py"/>
+    </exec>
+  </target>
+
   <target name="jflex-wiki-tokenizer" depends="init,jflex-check" if="jflex.present">
     <taskdef classname="jflex.anttask.JFlexTask" name="jflex">
       <classpath refid="jflex.classpath"/>
